fix(translator): ESM-safe registry + tool-id pairing + responses max_tokens; add real-creds tests
- translator/index.js: replace require() with static side-effect imports (ESM-safe), lazy-init registry maps to survive circular import order - openai-responses->openai: map max_output_tokens -> max_tokens (avoid leaking field upstream) - gemini/antigravity -> openai: derive deterministic tool_call id from name so functionCall/functionResponse pair correctly (fixes provider tool-pairing 400s) - add offline unit tests (finish-reason, usage, session-manager, ollama malformed args, const guard) - add real-creds integration tests (provider-cases + all-formats matrix: 6 inbound formats x 4 scenarios) Includes co-located provider registry refactor (pricing/capabilities/media providers) and sessionManager updates. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
45
open-sse/providers/registry/aws-polly.js
Normal file
45
open-sse/providers/registry/aws-polly.js
Normal file
@@ -0,0 +1,45 @@
|
||||
export default {
|
||||
id: "aws-polly",
|
||||
alias: "polly",
|
||||
display: {
|
||||
name: "AWS Polly",
|
||||
icon: "record_voice_over",
|
||||
color: "#FF9900",
|
||||
textIcon: "PL",
|
||||
website: "https://aws.amazon.com/polly/",
|
||||
notice: {
|
||||
text: "Use AWS Secret Access Key as API key; set providerSpecificData.accessKeyId and optional region.",
|
||||
apiKeyUrl: "https://console.aws.amazon.com/iam/home#/security_credentials"
|
||||
}
|
||||
},
|
||||
category: "apikey",
|
||||
authType: "apikey",
|
||||
serviceKinds: [
|
||||
"tts"
|
||||
],
|
||||
ttsConfig: {
|
||||
baseUrl: "https://polly.{region}.amazonaws.com/v1/speech",
|
||||
authType: "apikey",
|
||||
authHeader: "aws-sigv4",
|
||||
format: "aws-polly",
|
||||
models: [
|
||||
{
|
||||
id: "standard",
|
||||
name: "Standard"
|
||||
},
|
||||
{
|
||||
id: "neural",
|
||||
name: "Neural"
|
||||
},
|
||||
{
|
||||
id: "long-form",
|
||||
name: "Long-form"
|
||||
},
|
||||
{
|
||||
id: "generative",
|
||||
name: "Generative"
|
||||
}
|
||||
]
|
||||
},
|
||||
hasProviderSpecificData: true
|
||||
};
|
||||
35
open-sse/providers/registry/brave-search.js
Normal file
35
open-sse/providers/registry/brave-search.js
Normal file
@@ -0,0 +1,35 @@
|
||||
export default {
|
||||
id: "brave-search",
|
||||
alias: "brave",
|
||||
display: {
|
||||
name: "Brave Search",
|
||||
icon: "travel_explore",
|
||||
color: "#FB542B",
|
||||
textIcon: "BR",
|
||||
website: "https://brave.com/search/api",
|
||||
notice: {
|
||||
apiKeyUrl: "https://api-dashboard.search.brave.com/app/keys"
|
||||
}
|
||||
},
|
||||
category: "apikey",
|
||||
authType: "apikey",
|
||||
serviceKinds: [
|
||||
"webSearch"
|
||||
],
|
||||
searchConfig: {
|
||||
baseUrl: "https://api.search.brave.com/res/v1",
|
||||
method: "GET",
|
||||
authType: "apikey",
|
||||
authHeader: "x-subscription-token",
|
||||
costPerQuery: 0.005,
|
||||
freeMonthlyQuota: 1000,
|
||||
searchTypes: [
|
||||
"web",
|
||||
"news"
|
||||
],
|
||||
defaultMaxResults: 5,
|
||||
maxMaxResults: 20,
|
||||
timeoutMs: 10000,
|
||||
cacheTTLMs: 300000
|
||||
}
|
||||
};
|
||||
@@ -1,6 +1,6 @@
|
||||
export default {
|
||||
id: "byteplus",
|
||||
priority: 150,
|
||||
priority: 70,
|
||||
alias: "byteplus",
|
||||
aliases: [
|
||||
"bpm",
|
||||
|
||||
36
open-sse/providers/registry/cartesia.js
Normal file
36
open-sse/providers/registry/cartesia.js
Normal file
@@ -0,0 +1,36 @@
|
||||
export default {
|
||||
id: "cartesia",
|
||||
alias: "cartesia",
|
||||
display: {
|
||||
name: "Cartesia",
|
||||
icon: "spatial_audio",
|
||||
color: "#FF4F8B",
|
||||
textIcon: "CA",
|
||||
website: "https://cartesia.ai",
|
||||
notice: {
|
||||
apiKeyUrl: "https://play.cartesia.ai/keys"
|
||||
}
|
||||
},
|
||||
category: "apikey",
|
||||
authType: "apikey",
|
||||
serviceKinds: [
|
||||
"tts"
|
||||
],
|
||||
ttsConfig: {
|
||||
baseUrl: "https://api.cartesia.ai/tts/bytes",
|
||||
authType: "apikey",
|
||||
authHeader: "x-api-key",
|
||||
format: "cartesia",
|
||||
models: [
|
||||
{
|
||||
id: "sonic-2",
|
||||
name: "Sonic 2"
|
||||
},
|
||||
{
|
||||
id: "sonic-3",
|
||||
name: "Sonic 3"
|
||||
}
|
||||
]
|
||||
},
|
||||
hidden: true
|
||||
};
|
||||
@@ -1,6 +1,6 @@
|
||||
export default {
|
||||
id: "cline",
|
||||
priority: 70,
|
||||
priority: 80,
|
||||
alias: "cl",
|
||||
uiAlias: "cl",
|
||||
display: {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
export default {
|
||||
id: "cloudflare-ai",
|
||||
priority: 20,
|
||||
priority: 60,
|
||||
hasFree: true,
|
||||
alias: "cloudflare-ai",
|
||||
aliases: [
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
export default {
|
||||
id: "codebuddy",
|
||||
priority: 80,
|
||||
hidden: true,
|
||||
priority: 90,
|
||||
display: {
|
||||
name: "CodeBuddy",
|
||||
icon: "smart_toy",
|
||||
|
||||
30
open-sse/providers/registry/coqui.js
Normal file
30
open-sse/providers/registry/coqui.js
Normal file
@@ -0,0 +1,30 @@
|
||||
export default {
|
||||
id: "coqui",
|
||||
alias: "coqui",
|
||||
display: {
|
||||
name: "Coqui TTS",
|
||||
icon: "record_voice_over",
|
||||
color: "#10B981",
|
||||
textIcon: "CQ",
|
||||
website: "https://github.com/coqui-ai/TTS"
|
||||
},
|
||||
category: "freeTier",
|
||||
authType: "none",
|
||||
serviceKinds: [
|
||||
"tts"
|
||||
],
|
||||
noAuth: true,
|
||||
ttsConfig: {
|
||||
baseUrl: "http://localhost:5002/api/tts",
|
||||
authType: "none",
|
||||
authHeader: "none",
|
||||
format: "coqui",
|
||||
models: [
|
||||
{
|
||||
id: "tts_models/en/ljspeech/tacotron2-DDC",
|
||||
name: "Tacotron2 DDC (LJSpeech)"
|
||||
}
|
||||
]
|
||||
},
|
||||
hidden: true
|
||||
};
|
||||
@@ -1,6 +1,6 @@
|
||||
export default {
|
||||
id: "cursor",
|
||||
priority: 40,
|
||||
priority: 50,
|
||||
alias: "cu",
|
||||
uiAlias: "cu",
|
||||
display: {
|
||||
|
||||
24
open-sse/providers/registry/edge-tts.js
Normal file
24
open-sse/providers/registry/edge-tts.js
Normal file
@@ -0,0 +1,24 @@
|
||||
export default {
|
||||
id: "edge-tts",
|
||||
alias: "edge-tts",
|
||||
display: {
|
||||
name: "Edge TTS",
|
||||
icon: "record_voice_over",
|
||||
color: "#0078D4",
|
||||
textIcon: "ET"
|
||||
},
|
||||
category: "freeTier",
|
||||
authType: "none",
|
||||
serviceKinds: [
|
||||
"tts"
|
||||
],
|
||||
mediaPriority: 5,
|
||||
noAuth: true,
|
||||
ttsConfig: {
|
||||
baseUrl: "edge-tts",
|
||||
authType: "none",
|
||||
authHeader: "none",
|
||||
format: "edge-tts",
|
||||
models: []
|
||||
}
|
||||
};
|
||||
35
open-sse/providers/registry/elevenlabs.js
Normal file
35
open-sse/providers/registry/elevenlabs.js
Normal file
@@ -0,0 +1,35 @@
|
||||
export default {
|
||||
id: "elevenlabs",
|
||||
alias: "el",
|
||||
display: {
|
||||
name: "ElevenLabs",
|
||||
icon: "record_voice_over",
|
||||
color: "#6C47FF",
|
||||
textIcon: "EL",
|
||||
website: "https://elevenlabs.io",
|
||||
notice: {
|
||||
apiKeyUrl: "https://elevenlabs.io/app/settings/api-keys"
|
||||
}
|
||||
},
|
||||
category: "apikey",
|
||||
authType: "apikey",
|
||||
serviceKinds: [
|
||||
"tts"
|
||||
],
|
||||
ttsConfig: {
|
||||
baseUrl: "https://api.elevenlabs.io/v1/text-to-speech",
|
||||
authType: "apikey",
|
||||
authHeader: "xi-api-key",
|
||||
format: "elevenlabs",
|
||||
models: [
|
||||
{
|
||||
id: "eleven_multilingual_v2",
|
||||
name: "Eleven Multilingual v2"
|
||||
},
|
||||
{
|
||||
id: "eleven_turbo_v2_5",
|
||||
name: "Eleven Turbo v2.5"
|
||||
}
|
||||
]
|
||||
}
|
||||
};
|
||||
50
open-sse/providers/registry/exa.js
Normal file
50
open-sse/providers/registry/exa.js
Normal file
@@ -0,0 +1,50 @@
|
||||
export default {
|
||||
id: "exa",
|
||||
alias: "exa",
|
||||
display: {
|
||||
name: "Exa",
|
||||
icon: "manage_search",
|
||||
color: "#2563EB",
|
||||
textIcon: "EX",
|
||||
website: "https://exa.ai",
|
||||
notice: {
|
||||
apiKeyUrl: "https://dashboard.exa.ai/api-keys"
|
||||
}
|
||||
},
|
||||
category: "apikey",
|
||||
authType: "apikey",
|
||||
serviceKinds: [
|
||||
"webSearch",
|
||||
"webFetch"
|
||||
],
|
||||
searchConfig: {
|
||||
baseUrl: "https://api.exa.ai/search",
|
||||
method: "POST",
|
||||
authType: "apikey",
|
||||
authHeader: "x-api-key",
|
||||
costPerQuery: 0.007,
|
||||
freeMonthlyQuota: 1000,
|
||||
searchTypes: [
|
||||
"web",
|
||||
"news"
|
||||
],
|
||||
defaultMaxResults: 5,
|
||||
maxMaxResults: 100,
|
||||
timeoutMs: 10000,
|
||||
cacheTTLMs: 300000
|
||||
},
|
||||
fetchConfig: {
|
||||
baseUrl: "https://api.exa.ai/contents",
|
||||
method: "POST",
|
||||
authType: "apikey",
|
||||
authHeader: "x-api-key",
|
||||
costPerQuery: 0.001,
|
||||
freeMonthlyQuota: 1000,
|
||||
formats: [
|
||||
"text",
|
||||
"markdown"
|
||||
],
|
||||
maxCharacters: 100000,
|
||||
timeoutMs: 15000
|
||||
}
|
||||
};
|
||||
34
open-sse/providers/registry/firecrawl.js
Normal file
34
open-sse/providers/registry/firecrawl.js
Normal file
@@ -0,0 +1,34 @@
|
||||
export default {
|
||||
id: "firecrawl",
|
||||
alias: "firecrawl",
|
||||
display: {
|
||||
name: "Firecrawl",
|
||||
icon: "local_fire_department",
|
||||
color: "#F59E0B",
|
||||
textIcon: "FC",
|
||||
website: "https://firecrawl.dev",
|
||||
notice: {
|
||||
apiKeyUrl: "https://www.firecrawl.dev/app/api-keys"
|
||||
}
|
||||
},
|
||||
category: "apikey",
|
||||
authType: "apikey",
|
||||
serviceKinds: [
|
||||
"webFetch"
|
||||
],
|
||||
fetchConfig: {
|
||||
baseUrl: "https://api.firecrawl.dev/v1/scrape",
|
||||
method: "POST",
|
||||
authType: "apikey",
|
||||
authHeader: "bearer",
|
||||
costPerQuery: 0.002,
|
||||
freeMonthlyQuota: 500,
|
||||
formats: [
|
||||
"markdown",
|
||||
"html",
|
||||
"text"
|
||||
],
|
||||
maxCharacters: 200000,
|
||||
timeoutMs: 30000
|
||||
}
|
||||
};
|
||||
@@ -2,7 +2,7 @@ import { GOOGLE_OAUTH_CLIENT } from "../shared.js";
|
||||
|
||||
export default {
|
||||
id: "gemini-cli",
|
||||
priority: 130,
|
||||
priority: 20,
|
||||
hasFree: true,
|
||||
alias: "gc",
|
||||
uiAlias: "gc",
|
||||
|
||||
@@ -2,7 +2,7 @@ import { GOOGLE_OAUTH_CLIENT } from "../shared.js";
|
||||
|
||||
export default {
|
||||
id: "gemini",
|
||||
priority: 10,
|
||||
priority: 50,
|
||||
hasFree: true,
|
||||
alias: "gemini",
|
||||
display: {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
export default {
|
||||
id: "github",
|
||||
priority: 50,
|
||||
priority: 40,
|
||||
alias: "gh",
|
||||
uiAlias: "gh",
|
||||
display: {
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
export default {
|
||||
id: "gitlab",
|
||||
priority: 120,
|
||||
hidden: true,
|
||||
priority: 100,
|
||||
display: {
|
||||
name: "GitLab Duo",
|
||||
icon: "code",
|
||||
|
||||
35
open-sse/providers/registry/google-pse.js
Normal file
35
open-sse/providers/registry/google-pse.js
Normal file
@@ -0,0 +1,35 @@
|
||||
export default {
|
||||
id: "google-pse",
|
||||
alias: "gpse",
|
||||
display: {
|
||||
name: "Google PSE",
|
||||
icon: "search",
|
||||
color: "#4285F4",
|
||||
textIcon: "GP",
|
||||
website: "https://programmablesearchengine.google.com",
|
||||
notice: {
|
||||
apiKeyUrl: "https://programmablesearchengine.google.com/controlpanel/create"
|
||||
}
|
||||
},
|
||||
category: "apikey",
|
||||
authType: "apikey",
|
||||
serviceKinds: [
|
||||
"webSearch"
|
||||
],
|
||||
searchConfig: {
|
||||
baseUrl: "https://www.googleapis.com/customsearch/v1",
|
||||
method: "GET",
|
||||
authType: "apikey",
|
||||
authHeader: "key",
|
||||
costPerQuery: 0.005,
|
||||
freeMonthlyQuota: 3000,
|
||||
searchTypes: [
|
||||
"web",
|
||||
"news"
|
||||
],
|
||||
defaultMaxResults: 5,
|
||||
maxMaxResults: 10,
|
||||
timeoutMs: 10000,
|
||||
cacheTTLMs: 300000
|
||||
}
|
||||
};
|
||||
24
open-sse/providers/registry/google-tts.js
Normal file
24
open-sse/providers/registry/google-tts.js
Normal file
@@ -0,0 +1,24 @@
|
||||
export default {
|
||||
id: "google-tts",
|
||||
alias: "google-tts",
|
||||
display: {
|
||||
name: "Google TTS",
|
||||
icon: "record_voice_over",
|
||||
color: "#4285F4",
|
||||
textIcon: "GT"
|
||||
},
|
||||
category: "freeTier",
|
||||
authType: "none",
|
||||
serviceKinds: [
|
||||
"tts"
|
||||
],
|
||||
mediaPriority: 5,
|
||||
noAuth: true,
|
||||
ttsConfig: {
|
||||
baseUrl: "google-tts",
|
||||
authType: "none",
|
||||
authHeader: "none",
|
||||
format: "google-tts",
|
||||
models: []
|
||||
}
|
||||
};
|
||||
@@ -1,6 +1,7 @@
|
||||
export default {
|
||||
id: "iflow",
|
||||
priority: 170,
|
||||
hidden: true,
|
||||
priority: 110,
|
||||
alias: "if",
|
||||
display: {
|
||||
name: "iFlow AI",
|
||||
|
||||
@@ -1,75 +1,98 @@
|
||||
// Auto-generated: static imports of all registry entries
|
||||
import p0 from './alicode-intl.js';
|
||||
import p1 from './alicode.js';
|
||||
import p2 from './anthropic.js';
|
||||
import p3 from './antigravity.js';
|
||||
import p4 from './assemblyai.js';
|
||||
import p5 from './azure.js';
|
||||
import p6 from './black-forest-labs.js';
|
||||
import p7 from './blackbox.js';
|
||||
import p8 from './byteplus.js';
|
||||
import p9 from './cerebras.js';
|
||||
import p10 from './chutes.js';
|
||||
import p11 from './claude.js';
|
||||
import p12 from './cline.js';
|
||||
import p13 from './cloudflare-ai.js';
|
||||
import p14 from './codebuddy.js';
|
||||
import p15 from './codex.js';
|
||||
import p16 from './cohere.js';
|
||||
import p17 from './comfyui.js';
|
||||
import p18 from './commandcode.js';
|
||||
import p19 from './cursor.js';
|
||||
import p20 from './deepgram.js';
|
||||
import p21 from './deepseek.js';
|
||||
import p22 from './fal-ai.js';
|
||||
import p23 from './fireworks.js';
|
||||
import p24 from './gemini-cli.js';
|
||||
import p25 from './gemini.js';
|
||||
import p26 from './github.js';
|
||||
import p27 from './gitlab.js';
|
||||
import p28 from './glm-cn.js';
|
||||
import p29 from './glm.js';
|
||||
import p30 from './grok-web.js';
|
||||
import p31 from './groq.js';
|
||||
import p32 from './huggingface.js';
|
||||
import p33 from './hyperbolic.js';
|
||||
import p34 from './iflow.js';
|
||||
import p35 from './kilocode.js';
|
||||
import p36 from './kimi-coding.js';
|
||||
import p37 from './kimi.js';
|
||||
import p38 from './kiro.js';
|
||||
import p39 from './mimo-free.js';
|
||||
import p40 from './minimax-cn.js';
|
||||
import p41 from './minimax.js';
|
||||
import p42 from './mistral.js';
|
||||
import p43 from './mmf.js';
|
||||
import p44 from './nanobanana.js';
|
||||
import p45 from './nebius.js';
|
||||
import p46 from './nvidia.js';
|
||||
import p47 from './ollama-local.js';
|
||||
import p48 from './ollama.js';
|
||||
import p49 from './openai.js';
|
||||
import p50 from './opencode-go.js';
|
||||
import p51 from './opencode.js';
|
||||
import p52 from './openrouter.js';
|
||||
import p53 from './perplexity-web.js';
|
||||
import p54 from './perplexity.js';
|
||||
import p55 from './qoder.js';
|
||||
import p56 from './qwen.js';
|
||||
import p57 from './recraft.js';
|
||||
import p58 from './runwayml.js';
|
||||
import p59 from './sdwebui.js';
|
||||
import p60 from './siliconflow.js';
|
||||
import p61 from './stability-ai.js';
|
||||
import p62 from './together.js';
|
||||
import p63 from './vercel-ai-gateway.js';
|
||||
import p64 from './vertex-partner.js';
|
||||
import p65 from './vertex.js';
|
||||
import p66 from './volcengine-ark.js';
|
||||
import p67 from './voyage-ai.js';
|
||||
import p68 from './xai.js';
|
||||
import p69 from './xiaomi-mimo.js';
|
||||
import p70 from './xiaomi-tokenplan.js';
|
||||
import p0 from "./alicode.js";
|
||||
import p1 from "./alicode-intl.js";
|
||||
import p2 from "./anthropic.js";
|
||||
import p3 from "./antigravity.js";
|
||||
import p4 from "./assemblyai.js";
|
||||
import p5 from "./aws-polly.js";
|
||||
import p6 from "./azure.js";
|
||||
import p7 from "./black-forest-labs.js";
|
||||
import p8 from "./blackbox.js";
|
||||
import p9 from "./brave-search.js";
|
||||
import p10 from "./byteplus.js";
|
||||
import p11 from "./cartesia.js";
|
||||
import p12 from "./cerebras.js";
|
||||
import p13 from "./chutes.js";
|
||||
import p14 from "./claude.js";
|
||||
import p15 from "./cline.js";
|
||||
import p16 from "./cloudflare-ai.js";
|
||||
import p17 from "./codebuddy.js";
|
||||
import p18 from "./codex.js";
|
||||
import p19 from "./cohere.js";
|
||||
import p20 from "./comfyui.js";
|
||||
import p21 from "./commandcode.js";
|
||||
import p22 from "./coqui.js";
|
||||
import p23 from "./cursor.js";
|
||||
import p24 from "./deepgram.js";
|
||||
import p25 from "./deepseek.js";
|
||||
import p26 from "./edge-tts.js";
|
||||
import p27 from "./elevenlabs.js";
|
||||
import p28 from "./exa.js";
|
||||
import p29 from "./fal-ai.js";
|
||||
import p30 from "./firecrawl.js";
|
||||
import p31 from "./fireworks.js";
|
||||
import p32 from "./gemini.js";
|
||||
import p33 from "./gemini-cli.js";
|
||||
import p34 from "./github.js";
|
||||
import p35 from "./gitlab.js";
|
||||
import p36 from "./glm.js";
|
||||
import p37 from "./glm-cn.js";
|
||||
import p38 from "./google-pse.js";
|
||||
import p39 from "./google-tts.js";
|
||||
import p40 from "./grok-web.js";
|
||||
import p41 from "./groq.js";
|
||||
import p42 from "./huggingface.js";
|
||||
import p43 from "./hyperbolic.js";
|
||||
import p44 from "./iflow.js";
|
||||
import p45 from "./inworld.js";
|
||||
import p46 from "./jina-ai.js";
|
||||
import p47 from "./jina-reader.js";
|
||||
import p48 from "./kilocode.js";
|
||||
import p49 from "./kimi.js";
|
||||
import p50 from "./kimi-coding.js";
|
||||
import p51 from "./kiro.js";
|
||||
import p52 from "./linkup.js";
|
||||
import p53 from "./local-device.js";
|
||||
import p54 from "./mimo-free.js";
|
||||
import p55 from "./minimax.js";
|
||||
import p56 from "./minimax-cn.js";
|
||||
import p57 from "./mistral.js";
|
||||
import p58 from "./mmf.js";
|
||||
import p59 from "./nanobanana.js";
|
||||
import p60 from "./nebius.js";
|
||||
import p61 from "./nvidia.js";
|
||||
import p62 from "./ollama.js";
|
||||
import p63 from "./ollama-local.js";
|
||||
import p64 from "./openai.js";
|
||||
import p65 from "./opencode.js";
|
||||
import p66 from "./opencode-go.js";
|
||||
import p67 from "./openrouter.js";
|
||||
import p68 from "./perplexity.js";
|
||||
import p69 from "./perplexity-web.js";
|
||||
import p70 from "./playht.js";
|
||||
import p71 from "./qoder.js";
|
||||
import p72 from "./qwen.js";
|
||||
import p73 from "./recraft.js";
|
||||
import p74 from "./runwayml.js";
|
||||
import p75 from "./sdwebui.js";
|
||||
import p76 from "./searchapi.js";
|
||||
import p77 from "./searxng.js";
|
||||
import p78 from "./serper.js";
|
||||
import p79 from "./siliconflow.js";
|
||||
import p80 from "./stability-ai.js";
|
||||
import p81 from "./tavily.js";
|
||||
import p82 from "./together.js";
|
||||
import p83 from "./topaz.js";
|
||||
import p84 from "./tortoise.js";
|
||||
import p85 from "./vercel-ai-gateway.js";
|
||||
import p86 from "./vertex.js";
|
||||
import p87 from "./vertex-partner.js";
|
||||
import p88 from "./volcengine-ark.js";
|
||||
import p89 from "./voyage-ai.js";
|
||||
import p90 from "./xai.js";
|
||||
import p91 from "./xiaomi-mimo.js";
|
||||
import p92 from "./xiaomi-tokenplan.js";
|
||||
import p93 from "./youcom.js";
|
||||
|
||||
export default [
|
||||
p0,
|
||||
@@ -142,5 +165,28 @@ export default [
|
||||
p67,
|
||||
p68,
|
||||
p69,
|
||||
p70
|
||||
p70,
|
||||
p71,
|
||||
p72,
|
||||
p73,
|
||||
p74,
|
||||
p75,
|
||||
p76,
|
||||
p77,
|
||||
p78,
|
||||
p79,
|
||||
p80,
|
||||
p81,
|
||||
p82,
|
||||
p83,
|
||||
p84,
|
||||
p85,
|
||||
p86,
|
||||
p87,
|
||||
p88,
|
||||
p89,
|
||||
p90,
|
||||
p91,
|
||||
p92,
|
||||
p93
|
||||
];
|
||||
|
||||
36
open-sse/providers/registry/inworld.js
Normal file
36
open-sse/providers/registry/inworld.js
Normal file
@@ -0,0 +1,36 @@
|
||||
export default {
|
||||
id: "inworld",
|
||||
alias: "inworld",
|
||||
display: {
|
||||
name: "Inworld TTS",
|
||||
icon: "record_voice_over",
|
||||
color: "#FF6B6B",
|
||||
textIcon: "IW",
|
||||
website: "https://inworld.ai",
|
||||
notice: {
|
||||
text: "Free tier: 40 minutes/month TTS. Paid: TTS-1.5 Mini $0.01/min ($15/1M chars), TTS-1.5 Max $0.025/min ($30/1M chars). 270+ voices, 15 languages.",
|
||||
apiKeyUrl: "https://platform.inworld.ai/api-keys"
|
||||
}
|
||||
},
|
||||
category: "apikey",
|
||||
authType: "apikey",
|
||||
serviceKinds: [
|
||||
"tts"
|
||||
],
|
||||
ttsConfig: {
|
||||
baseUrl: "https://api.inworld.ai/tts/v1/voice",
|
||||
authType: "apikey",
|
||||
authHeader: "basic",
|
||||
format: "inworld",
|
||||
models: [
|
||||
{
|
||||
id: "inworld-tts-1.5-mini",
|
||||
name: "Inworld TTS 1.5 Mini ($0.01/min)"
|
||||
},
|
||||
{
|
||||
id: "inworld-tts-1.5-max",
|
||||
name: "Inworld TTS 1.5 Max ($0.025/min)"
|
||||
}
|
||||
]
|
||||
}
|
||||
};
|
||||
42
open-sse/providers/registry/jina-ai.js
Normal file
42
open-sse/providers/registry/jina-ai.js
Normal file
@@ -0,0 +1,42 @@
|
||||
export default {
|
||||
id: "jina-ai",
|
||||
alias: "jina",
|
||||
display: {
|
||||
name: "Jina AI",
|
||||
icon: "blur_on",
|
||||
color: "#2563EB",
|
||||
textIcon: "JA",
|
||||
website: "https://jina.ai",
|
||||
notice: {
|
||||
text: "10M free tokens on signup (non-commercial), no credit card required.",
|
||||
apiKeyUrl: "https://jina.ai/?sui=apikey"
|
||||
}
|
||||
},
|
||||
category: "apikey",
|
||||
authType: "apikey",
|
||||
serviceKinds: [
|
||||
"embedding"
|
||||
],
|
||||
embeddingConfig: {
|
||||
baseUrl: "https://api.jina.ai/v1/embeddings",
|
||||
authType: "apikey",
|
||||
authHeader: "bearer",
|
||||
models: [
|
||||
{
|
||||
id: "jina-embeddings-v3",
|
||||
name: "Jina Embeddings v3",
|
||||
dimensions: 1024
|
||||
},
|
||||
{
|
||||
id: "jina-embeddings-v2-base-en",
|
||||
name: "Jina Embeddings v2 Base EN",
|
||||
dimensions: 768
|
||||
},
|
||||
{
|
||||
id: "jina-embeddings-v2-base-code",
|
||||
name: "Jina Embeddings v2 Base Code",
|
||||
dimensions: 768
|
||||
}
|
||||
]
|
||||
}
|
||||
};
|
||||
34
open-sse/providers/registry/jina-reader.js
Normal file
34
open-sse/providers/registry/jina-reader.js
Normal file
@@ -0,0 +1,34 @@
|
||||
export default {
|
||||
id: "jina-reader",
|
||||
alias: "jina-reader",
|
||||
display: {
|
||||
name: "Jina Reader",
|
||||
icon: "menu_book",
|
||||
color: "#000000",
|
||||
textIcon: "JR",
|
||||
website: "https://jina.ai/reader",
|
||||
notice: {
|
||||
apiKeyUrl: "https://jina.ai/?sui=apikey"
|
||||
}
|
||||
},
|
||||
category: "apikey",
|
||||
authType: "apikey",
|
||||
serviceKinds: [
|
||||
"webFetch"
|
||||
],
|
||||
fetchConfig: {
|
||||
baseUrl: "https://r.jina.ai",
|
||||
method: "GET",
|
||||
authType: "apikey",
|
||||
authHeader: "bearer",
|
||||
costPerQuery: 0,
|
||||
freeMonthlyQuota: 1000000,
|
||||
formats: [
|
||||
"markdown",
|
||||
"text",
|
||||
"html"
|
||||
],
|
||||
maxCharacters: 200000,
|
||||
timeoutMs: 30000
|
||||
}
|
||||
};
|
||||
@@ -1,6 +1,6 @@
|
||||
export default {
|
||||
id: "kilocode",
|
||||
priority: 60,
|
||||
priority: 70,
|
||||
alias: "kc",
|
||||
uiAlias: "kc",
|
||||
display: {
|
||||
|
||||
@@ -2,7 +2,8 @@ import { CLAUDE_API_HEADERS, KIMI_CODING_BASE_URL } from "../shared.js";
|
||||
|
||||
export default {
|
||||
id: "kimi-coding",
|
||||
priority: 180,
|
||||
hidden: true,
|
||||
priority: 120,
|
||||
alias: "kmc",
|
||||
display: {
|
||||
name: "Kimi Coding",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
export default {
|
||||
id: "kiro",
|
||||
priority: 80,
|
||||
priority: 10,
|
||||
alias: "kr",
|
||||
uiAlias: "kr",
|
||||
display: {
|
||||
|
||||
34
open-sse/providers/registry/linkup.js
Normal file
34
open-sse/providers/registry/linkup.js
Normal file
@@ -0,0 +1,34 @@
|
||||
export default {
|
||||
id: "linkup",
|
||||
alias: "linkup",
|
||||
display: {
|
||||
name: "Linkup",
|
||||
icon: "link",
|
||||
color: "#0EA5E9",
|
||||
textIcon: "LK",
|
||||
website: "https://linkup.so",
|
||||
notice: {
|
||||
apiKeyUrl: "https://app.linkup.so/api-keys"
|
||||
}
|
||||
},
|
||||
category: "apikey",
|
||||
authType: "apikey",
|
||||
serviceKinds: [
|
||||
"webSearch"
|
||||
],
|
||||
searchConfig: {
|
||||
baseUrl: "https://api.linkup.so/v1/search",
|
||||
method: "POST",
|
||||
authType: "apikey",
|
||||
authHeader: "bearer",
|
||||
costPerQuery: 0.005,
|
||||
freeMonthlyQuota: 1000,
|
||||
searchTypes: [
|
||||
"web"
|
||||
],
|
||||
defaultMaxResults: 5,
|
||||
maxMaxResults: 50,
|
||||
timeoutMs: 10000,
|
||||
cacheTTLMs: 300000
|
||||
}
|
||||
};
|
||||
24
open-sse/providers/registry/local-device.js
Normal file
24
open-sse/providers/registry/local-device.js
Normal file
@@ -0,0 +1,24 @@
|
||||
export default {
|
||||
id: "local-device",
|
||||
alias: "local-device",
|
||||
display: {
|
||||
name: "Local Device",
|
||||
icon: "speaker",
|
||||
color: "#64748B",
|
||||
textIcon: "LD"
|
||||
},
|
||||
category: "freeTier",
|
||||
authType: "none",
|
||||
serviceKinds: [
|
||||
"tts"
|
||||
],
|
||||
mediaPriority: 5,
|
||||
noAuth: true,
|
||||
ttsConfig: {
|
||||
baseUrl: "local-device",
|
||||
authType: "none",
|
||||
authHeader: "none",
|
||||
format: "local-device",
|
||||
models: []
|
||||
}
|
||||
};
|
||||
@@ -1,6 +1,6 @@
|
||||
export default {
|
||||
id: "mimo-free",
|
||||
priority: 120,
|
||||
priority: 50,
|
||||
hasFree: true,
|
||||
alias: "mmf",
|
||||
uiAlias: "mmf",
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
export default {
|
||||
id: "mmf",
|
||||
hidden: true,
|
||||
priority: 200,
|
||||
display: {
|
||||
name: "MMF",
|
||||
|
||||
@@ -27,7 +27,7 @@ export default {
|
||||
{ id: "nanobanana-flash", name: "NanoBanana Flash", params: ["n","size"], kind: "image" },
|
||||
{ id: "nanobanana-pro", name: "NanoBanana Pro", params: ["n","size"], kind: "image" },
|
||||
],
|
||||
serviceKinds: ["llm","image"],
|
||||
serviceKinds: ["image"],
|
||||
imageConfig: {
|
||||
baseUrl: "https://api.nanobananaapi.ai/api/v1/nanobanana/generate",
|
||||
pollUrl: "https://api.nanobananaapi.ai/api/v1/nanobanana/record-info",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
export default {
|
||||
id: "nvidia",
|
||||
priority: 100,
|
||||
priority: 20,
|
||||
hasFree: true,
|
||||
alias: "nvidia",
|
||||
display: {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
export default {
|
||||
id: "ollama",
|
||||
priority: 40,
|
||||
priority: 30,
|
||||
hasFree: true,
|
||||
alias: "ollama",
|
||||
display: {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
export default {
|
||||
id: "opencode",
|
||||
priority: 110,
|
||||
priority: 40,
|
||||
hasFree: true,
|
||||
alias: "oc",
|
||||
uiAlias: "oc",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
export default {
|
||||
id: "openrouter",
|
||||
priority: 30,
|
||||
priority: 10,
|
||||
hasFree: true,
|
||||
alias: "openrouter",
|
||||
display: {
|
||||
|
||||
36
open-sse/providers/registry/playht.js
Normal file
36
open-sse/providers/registry/playht.js
Normal file
@@ -0,0 +1,36 @@
|
||||
export default {
|
||||
id: "playht",
|
||||
alias: "playht",
|
||||
display: {
|
||||
name: "PlayHT",
|
||||
icon: "play_circle",
|
||||
color: "#00B4D8",
|
||||
textIcon: "PH",
|
||||
website: "https://play.ht",
|
||||
notice: {
|
||||
apiKeyUrl: "https://play.ht/studio/api-access"
|
||||
}
|
||||
},
|
||||
category: "apikey",
|
||||
authType: "apikey",
|
||||
serviceKinds: [
|
||||
"tts"
|
||||
],
|
||||
ttsConfig: {
|
||||
baseUrl: "https://api.play.ht/api/v2/tts/stream",
|
||||
authType: "apikey",
|
||||
authHeader: "playht",
|
||||
format: "playht",
|
||||
models: [
|
||||
{
|
||||
id: "PlayDialog",
|
||||
name: "PlayDialog"
|
||||
},
|
||||
{
|
||||
id: "Play3.0-mini",
|
||||
name: "Play 3.0 Mini"
|
||||
}
|
||||
]
|
||||
},
|
||||
hidden: true
|
||||
};
|
||||
@@ -1,6 +1,6 @@
|
||||
export default {
|
||||
id: "qoder",
|
||||
priority: 230,
|
||||
priority: 30,
|
||||
alias: "qd",
|
||||
uiAlias: "qd",
|
||||
display: {
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
export default {
|
||||
id: "qwen",
|
||||
priority: 240,
|
||||
hidden: true,
|
||||
priority: 130,
|
||||
alias: "qw",
|
||||
display: {
|
||||
name: "Qwen Code",
|
||||
|
||||
35
open-sse/providers/registry/searchapi.js
Normal file
35
open-sse/providers/registry/searchapi.js
Normal file
@@ -0,0 +1,35 @@
|
||||
export default {
|
||||
id: "searchapi",
|
||||
alias: "searchapi",
|
||||
display: {
|
||||
name: "SearchAPI",
|
||||
icon: "search",
|
||||
color: "#0EA5A4",
|
||||
textIcon: "SA",
|
||||
website: "https://www.searchapi.io",
|
||||
notice: {
|
||||
apiKeyUrl: "https://www.searchapi.io/dashboard"
|
||||
}
|
||||
},
|
||||
category: "apikey",
|
||||
authType: "apikey",
|
||||
serviceKinds: [
|
||||
"webSearch"
|
||||
],
|
||||
searchConfig: {
|
||||
baseUrl: "https://www.searchapi.io/api/v1/search",
|
||||
method: "GET",
|
||||
authType: "apikey",
|
||||
authHeader: "api_key",
|
||||
costPerQuery: 0.004,
|
||||
freeMonthlyQuota: 100,
|
||||
searchTypes: [
|
||||
"web",
|
||||
"news"
|
||||
],
|
||||
defaultMaxResults: 5,
|
||||
maxMaxResults: 100,
|
||||
timeoutMs: 10000,
|
||||
cacheTTLMs: 300000
|
||||
}
|
||||
};
|
||||
33
open-sse/providers/registry/searxng.js
Normal file
33
open-sse/providers/registry/searxng.js
Normal file
@@ -0,0 +1,33 @@
|
||||
export default {
|
||||
id: "searxng",
|
||||
alias: "searxng",
|
||||
display: {
|
||||
name: "SearXNG",
|
||||
icon: "saved_search",
|
||||
color: "#3B82F6",
|
||||
textIcon: "SX",
|
||||
website: "https://docs.searxng.org"
|
||||
},
|
||||
category: "freeTier",
|
||||
authType: "none",
|
||||
serviceKinds: [
|
||||
"webSearch"
|
||||
],
|
||||
noAuth: true,
|
||||
searchConfig: {
|
||||
baseUrl: "http://localhost:8888/search",
|
||||
method: "GET",
|
||||
authType: "none",
|
||||
authHeader: "none",
|
||||
costPerQuery: 0,
|
||||
freeMonthlyQuota: 999999,
|
||||
searchTypes: [
|
||||
"web",
|
||||
"news"
|
||||
],
|
||||
defaultMaxResults: 5,
|
||||
maxMaxResults: 50,
|
||||
timeoutMs: 10000,
|
||||
cacheTTLMs: 180000
|
||||
}
|
||||
};
|
||||
35
open-sse/providers/registry/serper.js
Normal file
35
open-sse/providers/registry/serper.js
Normal file
@@ -0,0 +1,35 @@
|
||||
export default {
|
||||
id: "serper",
|
||||
alias: "serper",
|
||||
display: {
|
||||
name: "Serper",
|
||||
icon: "search",
|
||||
color: "#4F46E5",
|
||||
textIcon: "SP",
|
||||
website: "https://serper.dev",
|
||||
notice: {
|
||||
apiKeyUrl: "https://serper.dev/api-key"
|
||||
}
|
||||
},
|
||||
category: "apikey",
|
||||
authType: "apikey",
|
||||
serviceKinds: [
|
||||
"webSearch"
|
||||
],
|
||||
searchConfig: {
|
||||
baseUrl: "https://google.serper.dev",
|
||||
method: "POST",
|
||||
authType: "apikey",
|
||||
authHeader: "x-api-key",
|
||||
costPerQuery: 0.001,
|
||||
freeMonthlyQuota: 2500,
|
||||
searchTypes: [
|
||||
"web",
|
||||
"news"
|
||||
],
|
||||
defaultMaxResults: 5,
|
||||
maxMaxResults: 100,
|
||||
timeoutMs: 10000,
|
||||
cacheTTLMs: 300000
|
||||
}
|
||||
};
|
||||
50
open-sse/providers/registry/tavily.js
Normal file
50
open-sse/providers/registry/tavily.js
Normal file
@@ -0,0 +1,50 @@
|
||||
export default {
|
||||
id: "tavily",
|
||||
alias: "tavily",
|
||||
display: {
|
||||
name: "Tavily",
|
||||
icon: "search",
|
||||
color: "#5B21B6",
|
||||
textIcon: "TV",
|
||||
website: "https://tavily.com",
|
||||
notice: {
|
||||
apiKeyUrl: "https://app.tavily.com/home"
|
||||
}
|
||||
},
|
||||
category: "apikey",
|
||||
authType: "apikey",
|
||||
serviceKinds: [
|
||||
"webSearch",
|
||||
"webFetch"
|
||||
],
|
||||
searchConfig: {
|
||||
baseUrl: "https://api.tavily.com/search",
|
||||
method: "POST",
|
||||
authType: "apikey",
|
||||
authHeader: "bearer",
|
||||
costPerQuery: 0.008,
|
||||
freeMonthlyQuota: 1000,
|
||||
searchTypes: [
|
||||
"web",
|
||||
"news"
|
||||
],
|
||||
defaultMaxResults: 5,
|
||||
maxMaxResults: 20,
|
||||
timeoutMs: 10000,
|
||||
cacheTTLMs: 300000
|
||||
},
|
||||
fetchConfig: {
|
||||
baseUrl: "https://api.tavily.com/extract",
|
||||
method: "POST",
|
||||
authType: "apikey",
|
||||
authHeader: "bearer",
|
||||
costPerQuery: 0.008,
|
||||
freeMonthlyQuota: 1000,
|
||||
formats: [
|
||||
"markdown",
|
||||
"text"
|
||||
],
|
||||
maxCharacters: 100000,
|
||||
timeoutMs: 15000
|
||||
}
|
||||
};
|
||||
19
open-sse/providers/registry/topaz.js
Normal file
19
open-sse/providers/registry/topaz.js
Normal file
@@ -0,0 +1,19 @@
|
||||
export default {
|
||||
id: "topaz",
|
||||
alias: "topaz",
|
||||
display: {
|
||||
name: "Topaz",
|
||||
icon: "image",
|
||||
color: "#059669",
|
||||
textIcon: "TP",
|
||||
website: "https://topazlabs.com",
|
||||
notice: {
|
||||
apiKeyUrl: "https://topazlabs.com/account"
|
||||
}
|
||||
},
|
||||
category: "apikey",
|
||||
authType: "apikey",
|
||||
serviceKinds: [
|
||||
"image"
|
||||
]
|
||||
};
|
||||
30
open-sse/providers/registry/tortoise.js
Normal file
30
open-sse/providers/registry/tortoise.js
Normal file
@@ -0,0 +1,30 @@
|
||||
export default {
|
||||
id: "tortoise",
|
||||
alias: "tortoise",
|
||||
display: {
|
||||
name: "Tortoise TTS",
|
||||
icon: "record_voice_over",
|
||||
color: "#7C3AED",
|
||||
textIcon: "TT",
|
||||
website: "https://github.com/neonbjb/tortoise-tts"
|
||||
},
|
||||
category: "freeTier",
|
||||
authType: "none",
|
||||
serviceKinds: [
|
||||
"tts"
|
||||
],
|
||||
noAuth: true,
|
||||
ttsConfig: {
|
||||
baseUrl: "http://localhost:5000/api/tts",
|
||||
authType: "none",
|
||||
authHeader: "none",
|
||||
format: "tortoise",
|
||||
models: [
|
||||
{
|
||||
id: "tortoise-v2",
|
||||
name: "Tortoise v2"
|
||||
}
|
||||
]
|
||||
},
|
||||
hidden: true
|
||||
};
|
||||
@@ -1,6 +1,6 @@
|
||||
export default {
|
||||
id: "vertex",
|
||||
priority: 140,
|
||||
priority: 40,
|
||||
alias: "vertex",
|
||||
aliases: [
|
||||
"vx",
|
||||
|
||||
@@ -12,7 +12,7 @@ export default {
|
||||
apiKeyUrl: "https://console.x.ai",
|
||||
},
|
||||
},
|
||||
category: "apikey",
|
||||
category: "oauth",
|
||||
authModes: [
|
||||
"oauth",
|
||||
"apikey",
|
||||
|
||||
35
open-sse/providers/registry/youcom.js
Normal file
35
open-sse/providers/registry/youcom.js
Normal file
@@ -0,0 +1,35 @@
|
||||
export default {
|
||||
id: "youcom",
|
||||
alias: "youcom",
|
||||
display: {
|
||||
name: "You.com Search",
|
||||
icon: "search",
|
||||
color: "#7C3AED",
|
||||
textIcon: "YC",
|
||||
website: "https://you.com",
|
||||
notice: {
|
||||
apiKeyUrl: "https://api.you.com"
|
||||
}
|
||||
},
|
||||
category: "apikey",
|
||||
authType: "apikey",
|
||||
serviceKinds: [
|
||||
"webSearch"
|
||||
],
|
||||
searchConfig: {
|
||||
baseUrl: "https://ydc-index.io/v1/search",
|
||||
method: "GET",
|
||||
authType: "apikey",
|
||||
authHeader: "x-api-key",
|
||||
costPerQuery: 0.005,
|
||||
freeMonthlyQuota: 0,
|
||||
searchTypes: [
|
||||
"web",
|
||||
"news"
|
||||
],
|
||||
defaultMaxResults: 5,
|
||||
maxMaxResults: 100,
|
||||
timeoutMs: 10000,
|
||||
cacheTTLMs: 300000
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user