78 lines
2.5 KiB
TypeScript
78 lines
2.5 KiB
TypeScript
/** 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 output(generateObject)不穩,優先走 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;
|
||
} |