From 5cdcf67484c7f84b616ae1f9bd79f727d3631a92 Mon Sep 17 00:00:00 2001 From: Rizkal Date: Fri, 10 Jul 2026 12:05:51 +0700 Subject: [PATCH] fix(cloudflare-ai): support accountId in bulk key import (#2449) Bulk import now parses name|apiKey|accountId lines for Cloudflare AI and forwards accountId via providerSpecificData, with a provider-specific placeholder and format hint. --- .../providers/[id]/AddApiKeyModal.js | 34 ++++++++++++++++--- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/src/app/(dashboard)/dashboard/providers/[id]/AddApiKeyModal.js b/src/app/(dashboard)/dashboard/providers/[id]/AddApiKeyModal.js index 77fd9c07..0a272045 100644 --- a/src/app/(dashboard)/dashboard/providers/[id]/AddApiKeyModal.js +++ b/src/app/(dashboard)/dashboard/providers/[id]/AddApiKeyModal.js @@ -41,6 +41,10 @@ export default function AddApiKeyModal({ isOpen, provider, providerName, isCompa const [validating, setValidating] = useState(false); const [validationResult, setValidationResult] = useState(null); const [saving, setSaving] = useState(false); + const bulkPlaceholder = isCloudflareAi + ? `name1|sk-key1|acc123456\nname2|sk-key2|def789012\nsk-key-only-auto-named` + : BULK_PLACEHOLDER; + const [mode, setMode] = useState("single"); // "single" | "bulk" const [bulkText, setBulkText] = useState(""); const [bulkResult, setBulkResult] = useState(null); // { success, failed } @@ -135,14 +139,31 @@ export default function AddApiKeyModal({ isOpen, provider, providerName, isCompa let failed = 0; for (let i = 0; i < lines.length; i++) { const parts = lines[i].split("|"); - const apiKey = parts.length >= 2 ? parts.slice(1).join("|").trim() : parts[0].trim(); const baseName = parts.length >= 2 ? parts[0].trim() : "Key"; const name = `${baseName} ${i + 1}`; + + let apiKey; + let providerSpecificData; + if (isCloudflareAi && parts.length >= 3) { + // Format: name|apiKey|accountId + apiKey = parts.slice(1, -1).join("|").trim(); + providerSpecificData = { accountId: parts[parts.length - 1].trim() }; + } else { + apiKey = parts.length >= 2 ? parts.slice(1).join("|").trim() : parts[0].trim(); + } + try { const res = await fetch("/api/providers", { method: "POST", headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ provider, apiKey, name, priority: 1, testStatus: "unknown" }), + body: JSON.stringify({ + provider, + apiKey, + name, + priority: 1, + testStatus: "unknown", + ...(providerSpecificData ? { providerSpecificData } : {}), + }), }); if (res.ok) success++; else failed++; @@ -168,10 +189,15 @@ export default function AddApiKeyModal({ isOpen, provider, providerName, isCompa {mode === "bulk" && (
-

One key per line. Format: name|apiKey or just apiKey (auto-named by index).

+

+ {isCloudflareAi + ? <>One key per line. Format: name|apiKey|accountId or just apiKey (auto-named by index). + : <>One key per line. Format: name|apiKey or just apiKey (auto-named by index). + } +