diff --git a/CHANGELOG.md b/CHANGELOG.md index d67ed16ee6..21bc85eae7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ - **feat(providers):** add **Yuanbao (web)** as a cookie-session provider ([#6196](https://github.com/diegosouzapw/OmniRoute/issues/6196)) — `yuanbao-web` (Tencent Yuanbao, `yuanbao.tencent.com`) with cookie-only auth (`hy_user`/`hy_token` + public agent id), SSE→OpenAI translation incl. `reasoning_content`, exposing DeepSeek V3/R1 + Hunyuan / Hunyuan-T1. Regression guard: `tests/unit/providers-yuanbao-web.test.ts`. `together-web` was **deferred** (no verifiable web-session endpoint — needs a captured request) and `huggingchat-web` **dropped** (the existing `huggingchat` already is a web-cookie provider). (thanks @chirag127) - **feat(providers):** route the built-in **agentrouter** through the dynamic Claude-Code wire image ([#6056](https://github.com/diegosouzapw/OmniRoute/issues/6056)) — a small static allow-set (`CC_WIRE_IMAGE_BUILTINS` in `open-sse/services/ccWireImageBuiltins.ts`), consulted by `isClaudeCodeCompatible` / `isClaudeCodeCompatibleProvider` / `applyFingerprint`, makes agentrouter adopt the CC wire-image headers + fingerprint **while guarding the CC baseUrl/auth branches** so it keeps its own registry `baseUrl` and `x-api-key` auth. Regression guard: `tests/unit/agentrouter-cc-wire-image.test.ts` (asserts the wire image is applied AND agentrouter's baseUrl/auth are preserved). Live WAF-acceptance against agentrouter.org is a VPS validation follow-up (Hard Rule #18). +- **feat(providers):** **bulk-add API keys for Cloudflare Workers AI** ([#6174](https://github.com/diegosouzapw/OmniRoute/issues/6174)) — `cloudflare-ai` is removed from the bulk-add exclusion list and the bulk parser gains a 3-field `name|accountId|apiKey` mode; the bulk route now builds a **per-entry** `providerSpecificData` so each key carries its own `accountId` (fixing the previous shared-object reuse), and both the create + key-validation paths receive it. Regression guard: `tests/unit/bulk-api-key-parser-cloudflare.test.ts`. (thanks @muflifadla38) ### 🐛 Bug Fixes diff --git a/src/app/(dashboard)/dashboard/providers/[id]/components/modals/AddApiKeyModal.tsx b/src/app/(dashboard)/dashboard/providers/[id]/components/modals/AddApiKeyModal.tsx index fd112a3b0c..ef0c741b89 100644 --- a/src/app/(dashboard)/dashboard/providers/[id]/components/modals/AddApiKeyModal.tsx +++ b/src/app/(dashboard)/dashboard/providers/[id]/components/modals/AddApiKeyModal.tsx @@ -348,7 +348,7 @@ export default function AddApiKeyModal({ const handleBulkSubmit = async () => { if (!provider) return; - const parsed = parseBulkApiKeys(bulkText); + const parsed = parseBulkApiKeys(bulkText, { withAccountId: isCloudflare }); setBulkWarnings(parsed.warnings); if (parsed.entries.length === 0) return; @@ -378,7 +378,11 @@ export default function AddApiKeyModal({ headers: { "Content-Type": "application/json" }, body: JSON.stringify({ provider, - entries: parsed.entries.map((e) => ({ name: e.name, apiKey: e.apiKey })), + entries: parsed.entries.map((e) => ({ + name: e.name, + apiKey: e.apiKey, + ...(e.accountId ? { accountId: e.accountId } : {}), + })), priority: formData.priority || 1, providerSpecificData, validateKeys: bulkValidateKeys, @@ -457,12 +461,18 @@ export default function AddApiKeyModal({ {bulkSupported && mode === "bulk" && (
{t("bulkAddFormatHint")}
++ {isCloudflare ? t("bulkAddFormatHintCloudflare") : t("bulkAddFormatHint")} +
{openRouterPreset.input} {freeModelsToggle}