fix(providers): correct stale/broken provider metadata (#5487, #5461, #5534, #5470) (#5790)

- #5487 Qoder: replace the untranslated i18n stubs (personalAccessTokenLabel,
  qoderPatHint, qoderPatPlaceholder) with real copy; extend the STUB_KEYS guard.
- #5461 Scaleway: website pointed at scaleway.com/en/ai/generative-apis (HTTP 404);
  repoint at the live docs URL /en/docs/ai-data/generative-apis/.
- #5534 Microsoft 365 Copilot: rewrite the vague authHint with concrete DevTools
  WebSocket steps (the token lives on the Chathub WS URL, not an Authorization header).
- #5470 Together AI: retired the $25 signup credit and is now fully prepaid (min $5);
  hasFree false + a prepaid notice instead of the stale free-tier freeNote (verified live).

Regression guards: tests/unit/provider-metadata-5461-5470-5534.test.ts + Qoder keys
added to tests/unit/provider-add-ux-i18n-import-warning.test.ts.
This commit is contained in:
Diego Rodrigues de Sa e Souza
2026-07-01 04:26:23 -03:00
committed by GitHub
parent 3ef5f271d7
commit 1c4c7caf06
6 changed files with 60 additions and 8 deletions

View File

@@ -4632,9 +4632,9 @@
"perplexitySearchSharedKeyInfo": "Perplexity Search Shared Key Info",
"perplexityWebCookieHint": "Perplexity Web Cookie Hint",
"perplexityWebCookiePlaceholder": "Perplexity Web Cookie Placeholder",
"personalAccessTokenLabel": "Personal Access Token Label",
"qoderPatHint": "Qoder Pat Hint",
"qoderPatPlaceholder": "Qoder Pat Placeholder",
"personalAccessTokenLabel": "Personal Access Token",
"qoderPatHint": "Paste your Qoder Personal Access Token (PAT). Generate one from Qoder → Settings → Personal Access Tokens.",
"qoderPatPlaceholder": "Your Qoder personal access token",
"rateLimitOverridesSection": "Rate Limit Overrides",
"rateLimitOverridesMaxConcurrentHint": "Max concurrent requests override for this connection. Overrides the account-level cap.",
"rateLimitOverridesMaxConcurrentLabel": "Max Concurrent (Rate Limit)",

View File

@@ -143,7 +143,7 @@ export const APIKEY_PROVIDERS_ENTERPRISE = {
icon: "cloud",
color: "#4F0599",
textIcon: "SCW",
website: "https://www.scaleway.com/en/ai/generative-apis",
website: "https://www.scaleway.com/en/docs/ai-data/generative-apis/",
hasFree: true,
freeNote: "1M free tokens for new accounts — EU/GDPR compliant (Paris), Qwen3 235B & Llama 70B",
},

View File

@@ -11,9 +11,11 @@ export const APIKEY_PROVIDERS_INFERENCE = {
color: "#0F6FFF",
textIcon: "TG",
website: "https://www.together.ai",
hasFree: true,
freeNote:
"$25 signup credits + 3 permanently free models: Llama 3.3 70B, Vision, DeepSeek-R1 distill",
hasFree: false,
notice: {
text: "No free tier — Together AI is fully prepaid and requires a minimum $5 credit purchase (valid payment method) before API calls work. The former $25 signup credit was retired.",
apiKeyUrl: "https://api.together.ai/settings/api-keys",
},
},
fireworks: {
id: "fireworks",

View File

@@ -125,7 +125,7 @@ export const WEB_COOKIE_PROVIDERS = {
textIcon: "M365",
website: "https://m365.cloud.microsoft/chat",
authHint:
"Paste the access_token and account-specific Chathub path from the Microsoft 365 Copilot WebSocket URL.",
"Sign in at m365.cloud.microsoft/chat, then open DevTools → Network → filter 'WS' → click the Chathub WebSocket connection. Copy both the access_token query parameter AND the account-specific Chathub path segment from its request URL (wss://…/Chathub/<path>?…&access_token=…). It is NOT an Authorization: Bearer header on an XHR/Fetch request. The token is short-lived; this is an unofficial integration.",
subscriptionRisk: true,
riskNoticeVariant: "webCookie",
},

View File

@@ -26,6 +26,10 @@ const STUB_KEYS: Array<[string, string]> = [
["accountIdLabel", "Account Id Label"],
["accountIdPlaceholder", "Account Id Placeholder"],
["accountIdHint", "Account Id Hint"],
// #5487 — Qoder PAT form keys shipped the same auto-generated stub placeholders.
["personalAccessTokenLabel", "Personal Access Token Label"],
["qoderPatHint", "Qoder Pat Hint"],
["qoderPatPlaceholder", "Qoder Pat Placeholder"],
];
for (const [key, stub] of STUB_KEYS) {

View File

@@ -0,0 +1,46 @@
import test from "node:test";
import assert from "node:assert/strict";
const { APIKEY_PROVIDERS_ENTERPRISE } = await import(
"../../src/shared/constants/providers/apikey/enterprise-cloud.ts"
);
const { APIKEY_PROVIDERS_INFERENCE } = await import(
"../../src/shared/constants/providers/apikey/inference-hosts.ts"
);
const { WEB_COOKIE_PROVIDERS } = await import("../../src/shared/constants/providers/web-cookie.ts");
// #5461 — Scaleway's `website` pointed at https://www.scaleway.com/en/ai/generative-apis
// which returns HTTP 404. The live docs page is /en/docs/ai-data/generative-apis/.
test("#5461 Scaleway website points at a live docs URL, not the 404 marketing path", () => {
const scaleway = (APIKEY_PROVIDERS_ENTERPRISE as Record<string, any>).scaleway;
assert.ok(scaleway, "scaleway provider must exist");
assert.equal(scaleway.website, "https://www.scaleway.com/en/docs/ai-data/generative-apis/");
assert.ok(
!scaleway.website.includes("/en/ai/generative-apis"),
"must not keep the 404 marketing URL"
);
});
// #5470 — Together AI retired its $25 signup credit and is now fully prepaid
// (minimum $5 purchase). The catalog claimed a free tier, so the "Free" badge lied.
test("#5470 Together AI no longer advertises a free tier and warns about the prepaid minimum", () => {
const together = (APIKEY_PROVIDERS_INFERENCE as Record<string, any>).together;
assert.ok(together, "together provider must exist");
assert.equal(together.hasFree, false, "Together is prepaid-only — hasFree must be false");
assert.ok(!together.freeNote, "the stale $25/free-models freeNote must be gone");
const noticeText: string = together.notice?.text || "";
assert.ok(noticeText.length > 0, "a prepaid notice must be present");
assert.ok(!noticeText.includes("$25 signup credits"), "must not repeat the retired $25 claim");
assert.ok(/prepaid|\$5/i.test(noticeText), "notice must mention the prepaid / $5 minimum");
});
// #5534 — the M365 Copilot authHint gave no concrete steps and the reporter's guessed
// method (Authorization header) is wrong; the credential lives on the Chathub WS URL.
test("#5534 M365 Copilot authHint gives concrete DevTools WebSocket steps", () => {
const m365 = (WEB_COOKIE_PROVIDERS as Record<string, any>)["copilot-m365-web"];
assert.ok(m365, "copilot-m365-web provider must exist");
const hint: string = m365.authHint || "";
assert.ok(/websocket|\bWS\b/i.test(hint), "hint must point at the WebSocket (WS) tab");
assert.ok(/DevTools/i.test(hint), "hint must reference DevTools");
assert.ok(/access_token/.test(hint), "hint must name the access_token");
});