haixunMaster/lib/ai/opencode-go-settings.ts

78 lines
2.5 KiB
TypeScript
Raw Normal View History

2026-06-21 12:50:31 +00:00
/** OpenCode Go 模型特性與呼叫設定(對照 https://opencode.ai/docs/go/ */
export const OPENCODE_GO_MESSAGES_MODELS = new Set([
"minimax-m3",
"minimax-m2.7",
"minimax-m2.5",
"qwen3.7-max",
"qwen3.7-plus",
"qwen3.6-plus",
"qwen3.5-plus",
]);
/** Kimi 只接受 temperature = 1 */
export const OPENCODE_GO_KIMI_MODELS = new Set(["kimi-k2.7-code", "kimi-k2.6", "kimi-k2.5"]);
/** structured outputgenerateObject不穩優先走 JSON 文字解析 */
export const OPENCODE_GO_TEXT_FIRST_MODELS = new Set([
"deepseek-v4-flash",
"deepseek-v4-pro",
"glm-5.1",
"glm-5",
"kimi-k2.7-code",
"kimi-k2.6",
"kimi-k2.5",
"mimo-v2.5",
"mimo-v2.5-pro",
"minimax-m3",
"minimax-m2.7",
"minimax-m2.5",
"qwen3.7-max",
"qwen3.7-plus",
"qwen3.6-plus",
"qwen3.5-plus",
]);
export function isOpenCodeGoProvider(provider: string): boolean {
return provider === "opencode-go";
}
export function getOpenCodeGenerationSettings(provider: string, modelId: string) {
if (!isOpenCodeGoProvider(provider)) return {};
if (OPENCODE_GO_KIMI_MODELS.has(modelId)) {
return { temperature: 1 as const };
}
return {};
}
export function prefersOpenCodeTextFirst(provider: string, modelId: string): boolean {
return isOpenCodeGoProvider(provider) && OPENCODE_GO_TEXT_FIRST_MODELS.has(modelId);
}
/** 將 OpenCode Go / provider 常見 API 錯誤轉成可讀訊息 */
export function explainProviderApiError(message: string, responseBody?: string): string | null {
const combined = `${message} ${responseBody ?? ""}`.toLowerCase();
if (
combined.includes("temperature") &&
(combined.includes("kimi") || combined.includes("only support"))
) {
return "Kimi 模型只接受 temperature=1。請重新整理頁面後再試或暫時改用 DeepSeek / GLM。";
}
if (
combined.includes("invalid api key") ||
combined.includes("incorrect api key") ||
combined.includes("unauthorized") ||
combined.includes("authentication")
) {
return "OpenCode Go API key 無效或未設定,請到設定頁填入從 opencode.ai/auth 取得的 key。";
}
if (combined.includes("rate limit") || combined.includes("quota") || combined.includes("usage limit")) {
return "OpenCode Go 用量已達上限,請到 opencode.ai/auth 查看配額或更換模型。";
}
if (combined.includes("model") && (combined.includes("not found") || combined.includes("does not exist"))) {
return "選用的模型不存在或已下架,請到設定頁更換 OpenCode Go 模型。";
}
return null;
}