diff --git a/.gitignore b/.gitignore index 013de38f..84df4477 100644 --- a/.gitignore +++ b/.gitignore @@ -55,6 +55,8 @@ logs/* # analysis directories (generated, not tracked) .analysis/ antigravity-manager-analysis/ +.sisyphus/ +.plans/ # docs (allow specific tracked files) docs/* diff --git a/open-sse/config/providerRegistry.ts b/open-sse/config/providerRegistry.ts index 7029b972..3519f917 100644 --- a/open-sse/config/providerRegistry.ts +++ b/open-sse/config/providerRegistry.ts @@ -537,6 +537,32 @@ export const REGISTRY: Record = { ], }, + "bailian-coding-plan": { + id: "bailian-coding-plan", + alias: "bcp", + format: "claude", + executor: "default", + baseUrl: "https://coding-intl.dashscope.aliyuncs.com/apps/anthropic/v1/messages", + chatPath: "/messages", + urlSuffix: "?beta=true", + authType: "apikey", + authHeader: "x-api-key", + headers: { + "Anthropic-Version": "2023-06-01", + "Anthropic-Beta": "claude-code-20250219,interleaved-thinking-2025-05-14", + }, + models: [ + { id: "qwen3.5-plus", name: "Qwen3.5 Plus" }, + { id: "qwen3-max-2026-01-23", name: "Qwen3 Max (2026-01-23)" }, + { id: "qwen3-coder-next", name: "Qwen3 Coder Next" }, + { id: "qwen3-coder-plus", name: "Qwen3 Coder Plus" }, + { id: "MiniMax-M2.5", name: "MiniMax M2.5" }, + { id: "glm-5", name: "GLM 5" }, + { id: "glm-4.7", name: "GLM 4.7" }, + { id: "kimi-k2.5", name: "Kimi K2.5" }, + ], + }, + zai: { id: "zai", alias: "zai", diff --git a/open-sse/executors/default.ts b/open-sse/executors/default.ts index fa52037a..cc597bda 100644 --- a/open-sse/executors/default.ts +++ b/open-sse/executors/default.ts @@ -54,6 +54,7 @@ export class DefaultExecutor extends BaseExecutor { break; case "glm": case "kimi-coding": + case "bailian-coding-plan": case "kimi-coding-apikey": case "minimax": case "minimax-cn": diff --git a/src/app/(dashboard)/dashboard/providers/[id]/page.tsx b/src/app/(dashboard)/dashboard/providers/[id]/page.tsx index ff770ed0..56e8217b 100644 --- a/src/app/(dashboard)/dashboard/providers/[id]/page.tsx +++ b/src/app/(dashboard)/dashboard/providers/[id]/page.tsx @@ -286,9 +286,13 @@ export default function ProviderDetailPage() { if (res.ok) { await fetchConnections(); setShowEditModal(false); + return null; } + const data = await res.json().catch(() => ({})); + return data.error?.message || data.error || t("failedSaveConnection"); } catch (error) { console.log("Error updating connection:", error); + return t("failedSaveConnectionRetry"); } }; @@ -2618,10 +2622,14 @@ function AddApiKeyModal({ onClose, }) { const t = useTranslations("providers"); + const isBailian = provider === "bailian-coding-plan"; + const defaultBailianUrl = "https://coding-intl.dashscope.aliyuncs.com/apps/anthropic/v1"; + const [formData, setFormData] = useState({ name: "", apiKey: "", priority: 1, + baseUrl: isBailian ? defaultBailianUrl : "", }); const [validating, setValidating] = useState(false); const [validationResult, setValidationResult] = useState(null); @@ -2652,6 +2660,16 @@ function AddApiKeyModal({ setSaving(true); setSaveError(null); try { + let validatedBailianBaseUrl = null; + if (isBailian) { + const checked = normalizeAndValidateHttpBaseUrl(formData.baseUrl, defaultBailianUrl); + if (checked.error) { + setSaveError(checked.error); + return; + } + validatedBailianBaseUrl = checked.value; + } + let isValid = false; try { setValidating(true); @@ -2675,12 +2693,22 @@ function AddApiKeyModal({ return; } - const error = await onSave({ + const payload = { name: formData.name, apiKey: formData.apiKey, priority: formData.priority, testStatus: "active", - }); + providerSpecificData: undefined, + }; + + // Include baseUrl in providerSpecificData for bailian-coding-plan + if (isBailian) { + payload.providerSpecificData = { + baseUrl: validatedBailianBaseUrl, + }; + } + + const error = await onSave(payload); if (error) { setSaveError(typeof error === "string" ? error : t("failedSaveConnection")); } @@ -2751,6 +2779,15 @@ function AddApiKeyModal({ setFormData({ ...formData, priority: Number.parseInt(e.target.value) || 1 }) } /> + {isBailian && ( + setFormData({ ...formData, baseUrl: e.target.value })} + placeholder={defaultBailianUrl} + hint="Optional: Custom base URL for bailian-coding-plan provider" + /> + )}