diff --git a/open-sse/handlers/embeddingProviders/openai.js b/open-sse/handlers/embeddingProviders/openai.js index 7e2b6f9a..7d61c7e4 100644 --- a/open-sse/handlers/embeddingProviders/openai.js +++ b/open-sse/handlers/embeddingProviders/openai.js @@ -4,7 +4,6 @@ import { PROVIDER_MEDIA } from "../../providers/index.js"; // media-only providers without a registry file keep URL here; rest derive from registry media.embeddingConfig.baseUrl const ENDPOINTS = { - "voyage-ai": "https://api.voyageai.com/v1/embeddings", "jina-ai": "https://api.jina.ai/v1/embeddings", }; diff --git a/open-sse/handlers/imageProviders/blackForestLabs.js b/open-sse/handlers/imageProviders/blackForestLabs.js index c1e73675..051e35ab 100644 --- a/open-sse/handlers/imageProviders/blackForestLabs.js +++ b/open-sse/handlers/imageProviders/blackForestLabs.js @@ -1,7 +1,8 @@ // Black Forest Labs (FLUX) — async submit + polling_url import { sleep, nowSec, POLL_INTERVAL_MS, POLL_TIMEOUT_MS } from "./_base.js"; +import { PROVIDER_MEDIA } from "../../providers/index.js"; -const BASE_URL = "https://api.bfl.ai/v1"; +const BASE_URL = PROVIDER_MEDIA["black-forest-labs"]?.imageConfig?.baseUrl; export default { async: true, diff --git a/open-sse/handlers/imageProviders/cloudflareAi.js b/open-sse/handlers/imageProviders/cloudflareAi.js index 9b0d2ef5..d7ecef88 100644 --- a/open-sse/handlers/imageProviders/cloudflareAi.js +++ b/open-sse/handlers/imageProviders/cloudflareAi.js @@ -1,6 +1,7 @@ import { nowSec, urlToBase64 } from "./_base.js"; +import { PROVIDER_MEDIA } from "../../providers/index.js"; -const BASE_URL = "https://api.cloudflare.com/client/v4/accounts"; +const BASE_URL = PROVIDER_MEDIA["cloudflare-ai"]?.imageConfig?.baseUrl; const MULTIPART_MODELS = new Set([ "@cf/black-forest-labs/flux-2-dev", diff --git a/open-sse/handlers/imageProviders/comfyui.js b/open-sse/handlers/imageProviders/comfyui.js index 6a37a44b..767d7de3 100644 --- a/open-sse/handlers/imageProviders/comfyui.js +++ b/open-sse/handlers/imageProviders/comfyui.js @@ -1,7 +1,11 @@ // ComfyUI — local, noAuth (placeholder; full graph workflow not implemented) +import { PROVIDER_MEDIA } from "../../providers/index.js"; + +const BASE_URL = PROVIDER_MEDIA["comfyui"]?.imageConfig?.baseUrl; + export default { noAuth: true, - buildUrl: () => "http://localhost:8188", + buildUrl: () => BASE_URL, buildHeaders: () => ({ "Content-Type": "application/json" }), buildBody: (_model, body) => ({ prompt: body.prompt }), normalize: (responseBody) => responseBody, diff --git a/open-sse/handlers/imageProviders/falAi.js b/open-sse/handlers/imageProviders/falAi.js index 191d9a89..874c635d 100644 --- a/open-sse/handlers/imageProviders/falAi.js +++ b/open-sse/handlers/imageProviders/falAi.js @@ -1,7 +1,8 @@ // Fal.ai — async submit + queue polling import { sleep, nowSec, sizeToAspectRatio, POLL_INTERVAL_MS, POLL_TIMEOUT_MS } from "./_base.js"; +import { PROVIDER_MEDIA } from "../../providers/index.js"; -const BASE_URL = "https://queue.fal.run"; +const BASE_URL = PROVIDER_MEDIA["fal-ai"]?.imageConfig?.baseUrl; export default { async: true, diff --git a/open-sse/handlers/imageProviders/gemini.js b/open-sse/handlers/imageProviders/gemini.js index 3a52ea95..f1f6a996 100644 --- a/open-sse/handlers/imageProviders/gemini.js +++ b/open-sse/handlers/imageProviders/gemini.js @@ -1,7 +1,8 @@ // Google Gemini adapter (Nano Banana models) import { nowSec } from "./_base.js"; +import { PROVIDER_MEDIA } from "../../providers/index.js"; -const BASE_URL = "https://generativelanguage.googleapis.com/v1beta/models"; +const BASE_URL = PROVIDER_MEDIA["gemini"]?.imageConfig?.baseUrl; export default { buildUrl: (model, creds) => { diff --git a/open-sse/handlers/imageProviders/huggingface.js b/open-sse/handlers/imageProviders/huggingface.js index 9b3a03b3..2093d9c3 100644 --- a/open-sse/handlers/imageProviders/huggingface.js +++ b/open-sse/handlers/imageProviders/huggingface.js @@ -1,7 +1,8 @@ // HuggingFace Inference API — returns binary image import { nowSec } from "./_base.js"; +import { PROVIDER_MEDIA } from "../../providers/index.js"; -const BASE_URL = "https://api-inference.huggingface.co/models"; +const BASE_URL = PROVIDER_MEDIA["huggingface"]?.imageConfig?.baseUrl; export default { buildUrl: (model) => `${BASE_URL}/${model}`, diff --git a/open-sse/handlers/imageProviders/nanobanana.js b/open-sse/handlers/imageProviders/nanobanana.js index 6bb18fc1..4685fde6 100644 --- a/open-sse/handlers/imageProviders/nanobanana.js +++ b/open-sse/handlers/imageProviders/nanobanana.js @@ -1,8 +1,10 @@ // NanoBanana API — async submit + poll record-info import { sleep, nowSec, sizeToAspectRatio, POLL_INTERVAL_MS, POLL_TIMEOUT_MS } from "./_base.js"; +import { PROVIDER_MEDIA } from "../../providers/index.js"; -const SUBMIT_URL = "https://api.nanobananaapi.ai/api/v1/nanobanana/generate"; -const POLL_BASE = "https://api.nanobananaapi.ai/api/v1/nanobanana/record-info"; +const IMG_CFG = PROVIDER_MEDIA["nanobanana"]?.imageConfig || {}; +const SUBMIT_URL = IMG_CFG.baseUrl; +const POLL_BASE = IMG_CFG.pollUrl; export default { async: true, diff --git a/open-sse/handlers/imageProviders/openai.js b/open-sse/handlers/imageProviders/openai.js index e3886e22..5744aa5e 100644 --- a/open-sse/handlers/imageProviders/openai.js +++ b/open-sse/handlers/imageProviders/openai.js @@ -1,13 +1,8 @@ // OpenAI-compatible adapter (used by openai, minimax, openrouter, recraft) import { PROVIDER_MEDIA } from "../../providers/index.js"; -// media-only providers without a registry file keep their URL here; rest derive from registry media.imageConfig.baseUrl -const ENDPOINTS = { - recraft: "https://external.api.recraft.ai/v1/images/generations", -}; - const imageCfg = (id) => PROVIDER_MEDIA[id]?.imageConfig || {}; -const imageUrl = (id) => imageCfg(id).baseUrl || ENDPOINTS[id]; +const imageUrl = (id) => imageCfg(id).baseUrl; export default function createOpenAIAdapter(providerId) { const cfg = imageCfg(providerId); diff --git a/open-sse/handlers/imageProviders/runwayml.js b/open-sse/handlers/imageProviders/runwayml.js index 229e9a36..7eabadb5 100644 --- a/open-sse/handlers/imageProviders/runwayml.js +++ b/open-sse/handlers/imageProviders/runwayml.js @@ -1,7 +1,8 @@ // Runway ML — async submit + /tasks/{id} polling import { sleep, nowSec, sizeToAspectRatio, POLL_INTERVAL_MS, POLL_TIMEOUT_MS } from "./_base.js"; +import { PROVIDER_MEDIA } from "../../providers/index.js"; -const BASE_URL = "https://api.dev.runwayml.com/v1"; +const BASE_URL = PROVIDER_MEDIA["runwayml"]?.imageConfig?.baseUrl; export default { async: true, diff --git a/open-sse/handlers/imageProviders/sdwebui.js b/open-sse/handlers/imageProviders/sdwebui.js index ecabfe55..33e3a696 100644 --- a/open-sse/handlers/imageProviders/sdwebui.js +++ b/open-sse/handlers/imageProviders/sdwebui.js @@ -1,9 +1,12 @@ // SD WebUI (AUTOMATIC1111) — local, noAuth import { nowSec } from "./_base.js"; +import { PROVIDER_MEDIA } from "../../providers/index.js"; + +const BASE_URL = PROVIDER_MEDIA["sdwebui"]?.imageConfig?.baseUrl; export default { noAuth: true, - buildUrl: () => "http://localhost:7860/sdapi/v1/txt2img", + buildUrl: () => BASE_URL, buildHeaders: () => ({ "Content-Type": "application/json" }), buildBody: (_model, body) => { const { prompt, n = 1, size = "1024x1024" } = body; diff --git a/open-sse/handlers/imageProviders/stabilityAi.js b/open-sse/handlers/imageProviders/stabilityAi.js index f5f3fe83..79f93d55 100644 --- a/open-sse/handlers/imageProviders/stabilityAi.js +++ b/open-sse/handlers/imageProviders/stabilityAi.js @@ -1,7 +1,8 @@ // Stability AI v2 — sync, returns { image: "" } import { nowSec, sizeToAspectRatio } from "./_base.js"; +import { PROVIDER_MEDIA } from "../../providers/index.js"; -const BASE_URL = "https://api.stability.ai/v2beta/stable-image/generate"; +const BASE_URL = PROVIDER_MEDIA["stability-ai"]?.imageConfig?.baseUrl; // Map model id → endpoint segment function modelToEndpoint(model) { diff --git a/open-sse/handlers/search/chatSearch.js b/open-sse/handlers/search/chatSearch.js index 80ca4ca7..a8a7841e 100644 --- a/open-sse/handlers/search/chatSearch.js +++ b/open-sse/handlers/search/chatSearch.js @@ -4,8 +4,10 @@ */ import { PROVIDER_MEDIA } from "../../providers/index.js"; -// Default search model derives from registry searchViaChat (single source) +// Default search model + endpoint derive from registry searchViaChat (single source) const searchModel = (id) => PROVIDER_MEDIA[id]?.searchViaChat?.defaultModel; +const searchEndpoint = (id, model) => + (PROVIDER_MEDIA[id]?.searchViaChat?.endpoint || "").replace("{model}", model || ""); const REQUEST_TIMEOUT_MS = 15000; const DEFAULT_MAX_RESULTS = 10; @@ -47,8 +49,7 @@ function normalizeCitation(c) { */ const CHAT_SEARCH_CONFIG = { gemini: { - endpoint: (model) => - `https://generativelanguage.googleapis.com/v1beta/models/${model}:generateContent`, + endpoint: (model) => searchEndpoint("gemini", model), buildBody: (query) => ({ contents: [{ role: "user", parts: [{ text: query }] }], tools: [{ google_search: {} }] @@ -73,7 +74,7 @@ const CHAT_SEARCH_CONFIG = { }, openai: { - endpoint: () => "https://api.openai.com/v1/chat/completions", + endpoint: () => searchEndpoint("openai"), buildBody: (query, model) => { const body = { model, @@ -107,7 +108,7 @@ const CHAT_SEARCH_CONFIG = { }, xai: { - endpoint: () => "https://api.x.ai/v1/responses", + endpoint: () => searchEndpoint("xai"), buildBody: (query, model) => ({ model, input: [{ role: "user", content: query }], @@ -146,7 +147,7 @@ const CHAT_SEARCH_CONFIG = { }, kimi: { - endpoint: () => "https://api.moonshot.cn/v1/chat/completions", + endpoint: () => searchEndpoint("kimi"), buildBody: (query, model) => ({ model, messages: [{ role: "user", content: query }], @@ -195,7 +196,7 @@ const CHAT_SEARCH_CONFIG = { }, minimax: { - endpoint: () => "https://api.minimaxi.com/v1/text/chatcompletion_v2", + endpoint: () => searchEndpoint("minimax"), buildBody: (query, model) => ({ model, messages: [{ role: "user", content: query }], @@ -253,7 +254,7 @@ const CHAT_SEARCH_CONFIG = { }, perplexity: { - endpoint: () => "https://api.perplexity.ai/chat/completions", + endpoint: () => searchEndpoint("perplexity"), buildBody: (query, model) => ({ model, messages: [{ role: "user", content: query }] diff --git a/open-sse/handlers/ttsProviders/gemini.js b/open-sse/handlers/ttsProviders/gemini.js index 604b2813..1b0cd565 100644 --- a/open-sse/handlers/ttsProviders/gemini.js +++ b/open-sse/handlers/ttsProviders/gemini.js @@ -2,7 +2,9 @@ import { Buffer } from "node:buffer"; import { PROVIDER_MEDIA } from "../../providers/index.js"; -const KNOWN_MODELS = (PROVIDER_MEDIA["gemini"]?.ttsConfig?.models || []).map((m) => m.id); +const TTS_CFG = PROVIDER_MEDIA["gemini"]?.ttsConfig || {}; +const TTS_BASE = TTS_CFG.baseUrl; +const KNOWN_MODELS = (TTS_CFG.models || []).map((m) => m.id); const DEFAULT_MODEL = KNOWN_MODELS[0]; const DEFAULT_VOICE = "Kore"; @@ -52,7 +54,7 @@ export default { async synthesize(text, model, credentials, _responseFormat, opts = {}) { if (!credentials?.apiKey) throw new Error("No Gemini API key configured"); const { modelId, voiceId } = parseGeminiModelVoice(model); - const url = `https://generativelanguage.googleapis.com/v1beta/models/${modelId}:generateContent?key=${credentials.apiKey}`; + const url = `${TTS_BASE}/${modelId}:generateContent?key=${credentials.apiKey}`; const res = await fetch(url, { method: "POST", headers: { "Content-Type": "application/json" }, diff --git a/open-sse/handlers/ttsProviders/openrouter.js b/open-sse/handlers/ttsProviders/openrouter.js index 0b2d932b..84fac0cb 100644 --- a/open-sse/handlers/ttsProviders/openrouter.js +++ b/open-sse/handlers/ttsProviders/openrouter.js @@ -1,10 +1,14 @@ // OpenRouter TTS — via chat completions + audio modality (SSE stream) +import { PROVIDER_MEDIA } from "../../providers/index.js"; + +const TTS_CFG = PROVIDER_MEDIA["openrouter"]?.ttsConfig || {}; + export default { async synthesize(text, model, credentials) { if (!credentials?.apiKey) throw new Error("No OpenRouter API key configured"); // model format: "tts-model/voice" e.g. "openai/gpt-4o-mini-tts/alloy" - let ttsModel = "openai/gpt-4o-mini-tts"; + let ttsModel = TTS_CFG.defaultModel; let voice = "alloy"; if (model && model.includes("/")) { const lastSlash = model.lastIndexOf("/"); @@ -20,13 +24,12 @@ export default { voice = model; } - const res = await fetch("https://openrouter.ai/api/v1/chat/completions", { + const res = await fetch(TTS_CFG.baseUrl, { method: "POST", headers: { "Content-Type": "application/json", "Authorization": `Bearer ${credentials.apiKey}`, - "HTTP-Referer": "https://endpoint-proxy.local", - "X-Title": "Endpoint Proxy", + ...(TTS_CFG.headers || {}), }, body: JSON.stringify({ model: ttsModel, diff --git a/open-sse/providers/registry/black-forest-labs.js b/open-sse/providers/registry/black-forest-labs.js index c8c9cbd5..f29bb298 100644 --- a/open-sse/providers/registry/black-forest-labs.js +++ b/open-sse/providers/registry/black-forest-labs.js @@ -17,6 +17,10 @@ export default { authType: "apikey", aliases: ["bfl"], "transport": null, + media: { + serviceKinds: ["image"], + imageConfig: { baseUrl: "https://api.bfl.ai/v1" } + }, "models": [ { "id": "flux-pro-1.1", diff --git a/open-sse/providers/registry/cloudflare-ai.js b/open-sse/providers/registry/cloudflare-ai.js index ab24865c..845e6fb7 100644 --- a/open-sse/providers/registry/cloudflare-ai.js +++ b/open-sse/providers/registry/cloudflare-ai.js @@ -22,7 +22,8 @@ export default { }, media: { serviceKinds: ["llm", "image"], - hasProviderSpecificData: true + hasProviderSpecificData: true, + imageConfig: { baseUrl: "https://api.cloudflare.com/client/v4/accounts" } }, "models": [ { diff --git a/open-sse/providers/registry/comfyui.js b/open-sse/providers/registry/comfyui.js index 7932c990..183e2b96 100644 --- a/open-sse/providers/registry/comfyui.js +++ b/open-sse/providers/registry/comfyui.js @@ -11,6 +11,10 @@ export default { }, category: "apikey", "transport": null, + media: { + serviceKinds: ["image"], + imageConfig: { baseUrl: "http://localhost:8188" } + }, "models": [ { "id": "flux-dev", diff --git a/open-sse/providers/registry/fal-ai.js b/open-sse/providers/registry/fal-ai.js index 19c15dcf..2bddd9b7 100644 --- a/open-sse/providers/registry/fal-ai.js +++ b/open-sse/providers/registry/fal-ai.js @@ -17,6 +17,10 @@ export default { authType: "apikey", aliases: ["fal"], "transport": null, + media: { + serviceKinds: ["image"], + imageConfig: { baseUrl: "https://queue.fal.run" } + }, "models": [ { "id": "fal-ai/flux/schnell", diff --git a/open-sse/providers/registry/gemini.js b/open-sse/providers/registry/gemini.js index cc897460..d94afa99 100644 --- a/open-sse/providers/registry/gemini.js +++ b/open-sse/providers/registry/gemini.js @@ -26,7 +26,8 @@ export default { ttsConfig: { baseUrl: "https://generativelanguage.googleapis.com/v1beta/models", authType: "apikey", authHeader: "key", format: "gemini-tts", models: [{ id: "gemini-2.5-flash-preview-tts", name: "Gemini 2.5 Flash TTS" }, { id: "gemini-2.5-pro-preview-tts", name: "Gemini 2.5 Pro TTS" }] }, sttConfig: { baseUrl: "https://generativelanguage.googleapis.com/v1beta/models", authType: "apikey", authHeader: "key", format: "gemini-stt", models: [{ id: "gemini-2.5-pro", name: "Gemini 2.5 Pro (Best)" }, { id: "gemini-2.5-flash", name: "Gemini 2.5 Flash" }, { id: "gemini-2.5-flash-lite", name: "Gemini 2.5 Flash Lite (Cheapest)" }, { id: "gemini-2.0-flash", name: "Gemini 2.0 Flash" }] }, embeddingConfig: { baseUrl: "https://generativelanguage.googleapis.com/v1beta/models", authType: "apikey", authHeader: "key", models: [{ id: "text-embedding-004", name: "Text Embedding 004", dimensions: 768 }, { id: "embedding-001", name: "Embedding 001", dimensions: 768 }] }, - searchViaChat: { defaultModel: "gemini-2.5-flash", pricingUrl: "https://ai.google.dev/pricing", freeTier: "Free tier: 15 RPM, 1M tokens/day on gemini-2.5-flash via AI Studio." } + searchViaChat: { defaultModel: "gemini-2.5-flash", endpoint: "https://generativelanguage.googleapis.com/v1beta/models/{model}:generateContent", pricingUrl: "https://ai.google.dev/pricing", freeTier: "Free tier: 15 RPM, 1M tokens/day on gemini-2.5-flash via AI Studio." }, + imageConfig: { baseUrl: "https://generativelanguage.googleapis.com/v1beta/models" } }, "models": [ { diff --git a/open-sse/providers/registry/huggingface.js b/open-sse/providers/registry/huggingface.js index b05788d9..9b812cdb 100644 --- a/open-sse/providers/registry/huggingface.js +++ b/open-sse/providers/registry/huggingface.js @@ -18,6 +18,9 @@ export default { hiddenKinds: ["tts"], aliases: ["hf"], "transport": null, + media: { + imageConfig: { baseUrl: "https://api-inference.huggingface.co/models" } + }, "models": [ { "id": "black-forest-labs/FLUX.1-schnell", diff --git a/open-sse/providers/registry/kimi.js b/open-sse/providers/registry/kimi.js index 31062a40..8c43d34c 100644 --- a/open-sse/providers/registry/kimi.js +++ b/open-sse/providers/registry/kimi.js @@ -23,7 +23,7 @@ export default { }, media: { serviceKinds: ["llm", "webSearch"], - searchViaChat: { defaultModel: "kimi-k2.5", pricingUrl: "https://platform.moonshot.ai/docs/pricing/chat" } + searchViaChat: { defaultModel: "kimi-k2.5", endpoint: "https://api.moonshot.cn/v1/chat/completions", pricingUrl: "https://platform.moonshot.ai/docs/pricing/chat" } }, models: [ { id: "kimi-k2.6", name: "Kimi K2.6" }, diff --git a/open-sse/providers/registry/minimax.js b/open-sse/providers/registry/minimax.js index 2c672012..b4ca80ba 100644 --- a/open-sse/providers/registry/minimax.js +++ b/open-sse/providers/registry/minimax.js @@ -27,7 +27,7 @@ export default { media: { serviceKinds: ["llm", "image", "imageToText", "webSearch", "tts"], ttsConfig: { baseUrl: "https://api.minimax.io/v1/t2a_v2", authType: "apikey", authHeader: "bearer", format: "minimax-tts", models: [{ id: "speech-2.8-hd", name: "Speech 2.8 HD" }, { id: "speech-2.8-turbo", name: "Speech 2.8 Turbo" }, { id: "speech-2.6-hd", name: "Speech 2.6 HD" }, { id: "speech-2.6-turbo", name: "Speech 2.6 Turbo" }, { id: "speech-02-hd", name: "Speech 02 HD" }, { id: "speech-02-turbo", name: "Speech 02 Turbo" }, { id: "speech-01-hd", name: "Speech 01 HD" }, { id: "speech-01-turbo", name: "Speech 01 Turbo" }] }, - searchViaChat: { defaultModel: "MiniMax-M2.7", pricingUrl: "https://www.minimaxi.com/document/price" }, + searchViaChat: { defaultModel: "MiniMax-M2.7", endpoint: "https://api.minimaxi.com/v1/text/chatcompletion_v2", pricingUrl: "https://www.minimaxi.com/document/price" }, imageConfig: { baseUrl: "https://api.minimaxi.com/v1/images/generations" } }, models: [ diff --git a/open-sse/providers/registry/nanobanana.js b/open-sse/providers/registry/nanobanana.js index bd97b6f5..cd00ef85 100644 --- a/open-sse/providers/registry/nanobanana.js +++ b/open-sse/providers/registry/nanobanana.js @@ -20,6 +20,10 @@ export default { "baseUrl": "https://api.nanobananaapi.ai/v1/chat/completions", "validateUrl": "https://api.nanobananaapi.ai/v1/models" }, + media: { + serviceKinds: ["llm", "image"], + imageConfig: { baseUrl: "https://api.nanobananaapi.ai/api/v1/nanobanana/generate", pollUrl: "https://api.nanobananaapi.ai/api/v1/nanobanana/record-info" } + }, "models": [ { "id": "nanobanana-flash", diff --git a/open-sse/providers/registry/openrouter.js b/open-sse/providers/registry/openrouter.js index 75c60e60..c22d29d5 100644 --- a/open-sse/providers/registry/openrouter.js +++ b/open-sse/providers/registry/openrouter.js @@ -26,6 +26,7 @@ export default { embeddingConfig: { baseUrl: "https://openrouter.ai/api/v1/embeddings", authType: "apikey", authHeader: "bearer", headers: { "HTTP-Referer": "https://endpoint-proxy.local", "X-Title": "Endpoint Proxy" }, models: [{ id: "openai/text-embedding-3-small", name: "Text Embedding 3 Small (OpenRouter)", dimensions: 1536 }, { id: "openai/text-embedding-3-large", name: "Text Embedding 3 Large (OpenRouter)", dimensions: 3072 }, { id: "openai/text-embedding-ada-002", name: "Text Embedding Ada 002 (OpenRouter)", dimensions: 1536 }] }, modelsFetcher: { url: "https://openrouter.ai/api/v1/models", type: "openrouter-free" }, imageConfig: { baseUrl: "https://openrouter.ai/api/v1/images/generations", headers: { "HTTP-Referer": "https://endpoint-proxy.local", "X-Title": "Endpoint Proxy" } }, + ttsConfig: { baseUrl: "https://openrouter.ai/api/v1/chat/completions", defaultModel: "openai/gpt-4o-mini-tts", headers: { "HTTP-Referer": "https://endpoint-proxy.local", "X-Title": "Endpoint Proxy" } }, passthroughModels: true }, "models": [ diff --git a/open-sse/providers/registry/perplexity.js b/open-sse/providers/registry/perplexity.js index fa98a00b..98138095 100644 --- a/open-sse/providers/registry/perplexity.js +++ b/open-sse/providers/registry/perplexity.js @@ -22,7 +22,7 @@ export default { }, media: { serviceKinds: ["llm", "webSearch"], - searchViaChat: { defaultModel: "sonar", pricingUrl: "https://docs.perplexity.ai/guides/pricing" } + searchViaChat: { defaultModel: "sonar", endpoint: "https://api.perplexity.ai/chat/completions", pricingUrl: "https://docs.perplexity.ai/guides/pricing" } }, "models": [ { diff --git a/open-sse/providers/registry/recraft.js b/open-sse/providers/registry/recraft.js index d5b3e5b1..da867801 100644 --- a/open-sse/providers/registry/recraft.js +++ b/open-sse/providers/registry/recraft.js @@ -15,6 +15,10 @@ export default { category: "apikey", authType: "apikey", "transport": null, + media: { + serviceKinds: ["image"], + imageConfig: { baseUrl: "https://external.api.recraft.ai/v1/images/generations" } + }, "models": [ { "id": "recraftv3", diff --git a/open-sse/providers/registry/runwayml.js b/open-sse/providers/registry/runwayml.js index 65045c93..28f1bb9c 100644 --- a/open-sse/providers/registry/runwayml.js +++ b/open-sse/providers/registry/runwayml.js @@ -17,6 +17,10 @@ export default { authType: "apikey", aliases: ["runway"], "transport": null, + media: { + serviceKinds: ["image"], + imageConfig: { baseUrl: "https://api.dev.runwayml.com/v1" } + }, "models": [ { "id": "gen4_image", diff --git a/open-sse/providers/registry/sdwebui.js b/open-sse/providers/registry/sdwebui.js index 90045a3d..cd3a23cc 100644 --- a/open-sse/providers/registry/sdwebui.js +++ b/open-sse/providers/registry/sdwebui.js @@ -11,6 +11,10 @@ export default { }, category: "apikey", "transport": null, + media: { + serviceKinds: ["image"], + imageConfig: { baseUrl: "http://localhost:7860/sdapi/v1/txt2img" } + }, "models": [ { "id": "stable-diffusion-v1-5", diff --git a/open-sse/providers/registry/stability-ai.js b/open-sse/providers/registry/stability-ai.js index 5bea5069..c1783ae9 100644 --- a/open-sse/providers/registry/stability-ai.js +++ b/open-sse/providers/registry/stability-ai.js @@ -17,6 +17,10 @@ export default { authType: "apikey", aliases: ["stability"], "transport": null, + media: { + serviceKinds: ["image"], + imageConfig: { baseUrl: "https://api.stability.ai/v2beta/stable-image/generate" } + }, "models": [ { "id": "stable-image-ultra", diff --git a/open-sse/providers/registry/voyage-ai.js b/open-sse/providers/registry/voyage-ai.js index 68c934ef..8d976ea8 100644 --- a/open-sse/providers/registry/voyage-ai.js +++ b/open-sse/providers/registry/voyage-ai.js @@ -16,6 +16,10 @@ export default { uiAlias: "voyage", authType: "apikey", "transport": null, + media: { + serviceKinds: ["embedding"], + embeddingConfig: { baseUrl: "https://api.voyageai.com/v1/embeddings" } + }, "models": [ { "id": "voyage-3-large", diff --git a/open-sse/providers/registry/xai.js b/open-sse/providers/registry/xai.js index 6f4c2739..d696e5cc 100644 --- a/open-sse/providers/registry/xai.js +++ b/open-sse/providers/registry/xai.js @@ -25,7 +25,7 @@ export default { }, media: { serviceKinds: ["llm", "imageToText", "webSearch", "image"], - searchViaChat: { defaultModel: "grok-4.20-reasoning", pricingUrl: "https://x.ai/api#pricing" }, + searchViaChat: { defaultModel: "grok-4.20-reasoning", endpoint: "https://api.x.ai/v1/responses", pricingUrl: "https://x.ai/api#pricing" }, imageConfig: { baseUrl: "https://api.x.ai/v1/images/generations", bodyFields: ["model", "prompt", "n", "response_format"] }, authModes: ["oauth", "apikey"], hasOAuth: true