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:
decolua
2026-06-15 11:38:43 +07:00
parent 24a2d19bd7
commit aba4c45da6
76 changed files with 2115 additions and 479 deletions

View 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
};

View 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
}
};

View File

@@ -1,6 +1,6 @@
export default {
id: "byteplus",
priority: 150,
priority: 70,
alias: "byteplus",
aliases: [
"bpm",

View 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
};

View File

@@ -1,6 +1,6 @@
export default {
id: "cline",
priority: 70,
priority: 80,
alias: "cl",
uiAlias: "cl",
display: {

View File

@@ -1,6 +1,6 @@
export default {
id: "cloudflare-ai",
priority: 20,
priority: 60,
hasFree: true,
alias: "cloudflare-ai",
aliases: [

View File

@@ -1,6 +1,7 @@
export default {
id: "codebuddy",
priority: 80,
hidden: true,
priority: 90,
display: {
name: "CodeBuddy",
icon: "smart_toy",

View 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
};

View File

@@ -1,6 +1,6 @@
export default {
id: "cursor",
priority: 40,
priority: 50,
alias: "cu",
uiAlias: "cu",
display: {

View 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: []
}
};

View 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"
}
]
}
};

View 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
}
};

View 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
}
};

View File

@@ -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",

View File

@@ -2,7 +2,7 @@ import { GOOGLE_OAUTH_CLIENT } from "../shared.js";
export default {
id: "gemini",
priority: 10,
priority: 50,
hasFree: true,
alias: "gemini",
display: {

View File

@@ -1,6 +1,6 @@
export default {
id: "github",
priority: 50,
priority: 40,
alias: "gh",
uiAlias: "gh",
display: {

View File

@@ -1,6 +1,7 @@
export default {
id: "gitlab",
priority: 120,
hidden: true,
priority: 100,
display: {
name: "GitLab Duo",
icon: "code",

View 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
}
};

View 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: []
}
};

View File

@@ -1,6 +1,7 @@
export default {
id: "iflow",
priority: 170,
hidden: true,
priority: 110,
alias: "if",
display: {
name: "iFlow AI",

View File

@@ -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
];

View 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)"
}
]
}
};

View 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
}
]
}
};

View 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
}
};

View File

@@ -1,6 +1,6 @@
export default {
id: "kilocode",
priority: 60,
priority: 70,
alias: "kc",
uiAlias: "kc",
display: {

View File

@@ -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",

View File

@@ -1,6 +1,6 @@
export default {
id: "kiro",
priority: 80,
priority: 10,
alias: "kr",
uiAlias: "kr",
display: {

View 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
}
};

View 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: []
}
};

View File

@@ -1,6 +1,6 @@
export default {
id: "mimo-free",
priority: 120,
priority: 50,
hasFree: true,
alias: "mmf",
uiAlias: "mmf",

View File

@@ -1,5 +1,6 @@
export default {
id: "mmf",
hidden: true,
priority: 200,
display: {
name: "MMF",

View File

@@ -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",

View File

@@ -1,6 +1,6 @@
export default {
id: "nvidia",
priority: 100,
priority: 20,
hasFree: true,
alias: "nvidia",
display: {

View File

@@ -1,6 +1,6 @@
export default {
id: "ollama",
priority: 40,
priority: 30,
hasFree: true,
alias: "ollama",
display: {

View File

@@ -1,6 +1,6 @@
export default {
id: "opencode",
priority: 110,
priority: 40,
hasFree: true,
alias: "oc",
uiAlias: "oc",

View File

@@ -1,6 +1,6 @@
export default {
id: "openrouter",
priority: 30,
priority: 10,
hasFree: true,
alias: "openrouter",
display: {

View 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
};

View File

@@ -1,6 +1,6 @@
export default {
id: "qoder",
priority: 230,
priority: 30,
alias: "qd",
uiAlias: "qd",
display: {

View File

@@ -1,6 +1,7 @@
export default {
id: "qwen",
priority: 240,
hidden: true,
priority: 130,
alias: "qw",
display: {
name: "Qwen Code",

View 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
}
};

View 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
}
};

View 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
}
};

View 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
}
};

View 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"
]
};

View 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
};

View File

@@ -1,6 +1,6 @@
export default {
id: "vertex",
priority: 140,
priority: 40,
alias: "vertex",
aliases: [
"vx",

View File

@@ -12,7 +12,7 @@ export default {
apiKeyUrl: "https://console.x.ai",
},
},
category: "apikey",
category: "oauth",
authModes: [
"oauth",
"apikey",

View 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
}
};