refactor(open-sse): translator DRY + schema enums, bug fixes, dead code cleanup
- Bug B1-B7: media UI m.kind||m.type, serviceKinds, gemini mediaPriority, schema kind, models/info lookup by kind - Dead code D1-D6: safeParseJSON, drop PROVIDER_ENDPOINTS, orphan fetcher, GITHUB_CONFIG derive, getProviderConfig internal, legacy kiro file - Translator concerns: toOpenAIUsage, toOpenAIFinish (gemini/kiro/ollama + fix kiro tool finish), thinking effort maps - Reorg helpers/ → concerns/ (logic) + formats/ (per-format) + schema/ (pure enums: roles/blocks/finishReasons/defaults) - Wire ~280 hardcoded role/block/finish/default literals to schema enums across 20+ files - collapseTextParts + extractTextContent dedup - Normalize translator fn names to openaiToXRequest / xToOpenAIResponse - Golden tests lock behavior; 0 regression (byte-for-byte providers/alias, 26=26 known fails) Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -5,7 +5,7 @@ import { OAUTH_ENDPOINTS, ANTIGRAVITY_HEADERS, INTERNAL_REQUEST_HEADER, AG_DEFAU
|
|||||||
import { HTTP_STATUS } from "../config/runtimeConfig.js";
|
import { HTTP_STATUS } from "../config/runtimeConfig.js";
|
||||||
import { deriveSessionId } from "../utils/sessionManager.js";
|
import { deriveSessionId } from "../utils/sessionManager.js";
|
||||||
import { proxyAwareFetch } from "../utils/proxyFetch.js";
|
import { proxyAwareFetch } from "../utils/proxyFetch.js";
|
||||||
import { cleanJSONSchemaForAntigravity } from "../translator/helpers/geminiHelper.js";
|
import { cleanJSONSchemaForAntigravity } from "../translator/formats/gemini.js";
|
||||||
|
|
||||||
// Sanitize function name: Gemini requires [a-zA-Z_][a-zA-Z0-9_.:\-]{0,63}
|
// Sanitize function name: Gemini requires [a-zA-Z_][a-zA-Z0-9_.:\-]{0,63}
|
||||||
function sanitizeFunctionName(name) {
|
function sanitizeFunctionName(name) {
|
||||||
|
|||||||
@@ -6,8 +6,8 @@ import {
|
|||||||
refreshProviderCredentials,
|
refreshProviderCredentials,
|
||||||
shouldRefreshCredentials,
|
shouldRefreshCredentials,
|
||||||
} from "../services/oauthCredentialManager.js";
|
} from "../services/oauthCredentialManager.js";
|
||||||
import { normalizeResponsesInput } from "../translator/helpers/responsesApiHelper.js";
|
import { normalizeResponsesInput } from "../translator/formats/responsesApi.js";
|
||||||
import { fetchImageAsBase64 } from "../translator/helpers/imageHelper.js";
|
import { fetchImageAsBase64 } from "../translator/concerns/image.js";
|
||||||
import { getModelUpstreamId } from "../config/providerModels.js";
|
import { getModelUpstreamId } from "../config/providerModels.js";
|
||||||
import { getConsistentMachineId } from "../shared/machineId.js";
|
import { getConsistentMachineId } from "../shared/machineId.js";
|
||||||
import { DEFAULT_RETRY_CONFIG, resolveRetryEntry } from "../config/runtimeConfig.js";
|
import { DEFAULT_RETRY_CONFIG, resolveRetryEntry } from "../config/runtimeConfig.js";
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { randomUUID } from "crypto";
|
import { randomUUID } from "crypto";
|
||||||
import { BaseExecutor } from "./base.js";
|
import { BaseExecutor } from "./base.js";
|
||||||
import { PROVIDERS } from "../config/providers.js";
|
import { PROVIDERS } from "../config/providers.js";
|
||||||
import { convertCommandCodeToOpenAI } from "../translator/response/commandcode-to-openai.js";
|
import { commandCodeToOpenAIResponse } from "../translator/response/commandcode-to-openai.js";
|
||||||
import { SSE_DONE } from "../utils/sseConstants.js";
|
import { SSE_DONE } from "../utils/sseConstants.js";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -71,13 +71,13 @@ function wrapNdjsonAsOpenAISse(originalResponse, model) {
|
|||||||
const trimmed = line.trim();
|
const trimmed = line.trim();
|
||||||
if (!trimmed) continue;
|
if (!trimmed) continue;
|
||||||
// Translate AI SDK v5 NDJSON line to one or more OpenAI chunks
|
// Translate AI SDK v5 NDJSON line to one or more OpenAI chunks
|
||||||
emitChunks(convertCommandCodeToOpenAI(trimmed, state), controller);
|
emitChunks(commandCodeToOpenAIResponse(trimmed, state), controller);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
flush(controller) {
|
flush(controller) {
|
||||||
const trimmed = buffer.trim();
|
const trimmed = buffer.trim();
|
||||||
if (trimmed) {
|
if (trimmed) {
|
||||||
emitChunks(convertCommandCodeToOpenAI(trimmed, state), controller);
|
emitChunks(commandCodeToOpenAIResponse(trimmed, state), controller);
|
||||||
}
|
}
|
||||||
controller.enqueue(encoder.encode(SSE_DONE));
|
controller.enqueue(encoder.encode(SSE_DONE));
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -142,7 +142,7 @@ export class CursorExecutor extends BaseExecutor {
|
|||||||
|
|
||||||
transformRequest(model, body, stream, credentials) {
|
transformRequest(model, body, stream, credentials) {
|
||||||
// Messages are already translated by chatCore (claude→openai→cursor)
|
// Messages are already translated by chatCore (claude→openai→cursor)
|
||||||
// Do NOT call buildCursorRequest again — double-translation drops tool_results
|
// Do NOT call openaiToCursorRequest again — double-translation drops tool_results
|
||||||
const messages = body.messages || [];
|
const messages = body.messages || [];
|
||||||
const tools = body.tools || [];
|
const tools = body.tools || [];
|
||||||
const reasoningEffort = body.reasoning_effort || null;
|
const reasoningEffort = body.reasoning_effort || null;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { detectFormat, getTargetFormat } from "../services/provider.js";
|
import { detectFormat, getTargetFormat } from "../services/provider.js";
|
||||||
import { translateRequest } from "../translator/index.js";
|
import { translateRequest } from "../translator/index.js";
|
||||||
import { FORMATS } from "../translator/formats.js";
|
import { FORMATS } from "../translator/formats.js";
|
||||||
import { normalizeClaudePassthrough } from "../translator/helpers/claudeHelper.js";
|
import { normalizeClaudePassthrough } from "../translator/formats/claude.js";
|
||||||
import { COLORS } from "../utils/stream.js";
|
import { COLORS } from "../utils/stream.js";
|
||||||
import { createStreamController } from "../utils/streamHandler.js";
|
import { createStreamController } from "../utils/streamHandler.js";
|
||||||
import { refreshWithRetry } from "../services/tokenRefresh.js";
|
import { refreshWithRetry } from "../services/tokenRefresh.js";
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import { handleChatCore } from "./chatCore.js";
|
import { handleChatCore } from "./chatCore.js";
|
||||||
import { convertResponsesApiFormat } from "../translator/helpers/responsesApiHelper.js";
|
import { convertResponsesApiFormat } from "../translator/formats/responsesApi.js";
|
||||||
import { createResponsesApiTransformStream } from "../transformer/responsesTransformer.js";
|
import { createResponsesApiTransformStream } from "../transformer/responsesTransformer.js";
|
||||||
import { convertResponsesStreamToJson } from "../transformer/streamToJsonConverter.js";
|
import { convertResponsesStreamToJson } from "../transformer/streamToJsonConverter.js";
|
||||||
import { SSE_HEADERS_CORS } from "../utils/sseConstants.js";
|
import { SSE_HEADERS_CORS } from "../utils/sseConstants.js";
|
||||||
|
|||||||
@@ -30,7 +30,6 @@ export {
|
|||||||
// Services
|
// Services
|
||||||
export {
|
export {
|
||||||
detectFormat,
|
detectFormat,
|
||||||
getProviderConfig,
|
|
||||||
getTargetFormat
|
getTargetFormat
|
||||||
} from "./services/provider.js";
|
} from "./services/provider.js";
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
import { deriveModelName } from "./namePatterns.js";
|
import { deriveModelName } from "./namePatterns.js";
|
||||||
|
|
||||||
// Model defaults centralized (was scattered as `m.type || "llm"`, `quotaFamily || "normal"`, etc.)
|
// Model defaults centralized (was scattered as `m.kind || "llm"`, `quotaFamily || "normal"`, etc.)
|
||||||
export const MODEL_DEFAULTS = {
|
export const MODEL_DEFAULTS = {
|
||||||
type: "llm",
|
kind: "llm",
|
||||||
quotaFamily: "normal",
|
quotaFamily: "normal",
|
||||||
strip: [],
|
strip: [],
|
||||||
targetFormat: null
|
targetFormat: null
|
||||||
@@ -16,9 +16,9 @@ export function normalizeModel(raw) {
|
|||||||
return { ...model, name: deriveModelName(model.id) };
|
return { ...model, name: deriveModelName(model.id) };
|
||||||
}
|
}
|
||||||
|
|
||||||
// Resolve a single field with its default (keeps accessor call-sites one-liners)
|
// Resolve model kind with default (accepts legacy `type` field)
|
||||||
export function modelType(model) {
|
export function modelKind(model) {
|
||||||
return model?.type || MODEL_DEFAULTS.type;
|
return model?.kind || model?.type || MODEL_DEFAULTS.kind;
|
||||||
}
|
}
|
||||||
export function modelQuotaFamily(model) {
|
export function modelQuotaFamily(model) {
|
||||||
return model?.quotaFamily || MODEL_DEFAULTS.quotaFamily;
|
return model?.quotaFamily || MODEL_DEFAULTS.quotaFamily;
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
export default {
|
export default {
|
||||||
id: "alicode-intl",
|
id: "alicode-intl",
|
||||||
|
priority: 10,
|
||||||
alias: "alicode-intl",
|
alias: "alicode-intl",
|
||||||
display: {
|
display: {
|
||||||
name: "Alibaba Intl",
|
name: "Alibaba Intl",
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
export default {
|
export default {
|
||||||
id: "alicode",
|
id: "alicode",
|
||||||
|
priority: 20,
|
||||||
alias: "alicode",
|
alias: "alicode",
|
||||||
display: {
|
display: {
|
||||||
name: "Alibaba",
|
name: "Alibaba",
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import { CLAUDE_API_HEADERS } from "../shared.js";
|
|||||||
|
|
||||||
export default {
|
export default {
|
||||||
id: "anthropic",
|
id: "anthropic",
|
||||||
|
priority: 30,
|
||||||
alias: "anthropic",
|
alias: "anthropic",
|
||||||
display: {
|
display: {
|
||||||
name: "Anthropic",
|
name: "Anthropic",
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import { ANTIGRAVITY_OAUTH_CLIENT } from "../shared.js";
|
|||||||
|
|
||||||
export default {
|
export default {
|
||||||
id: "antigravity",
|
id: "antigravity",
|
||||||
|
priority: 20,
|
||||||
alias: "ag",
|
alias: "ag",
|
||||||
uiAlias: "ag",
|
uiAlias: "ag",
|
||||||
display: {
|
display: {
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
export default {
|
export default {
|
||||||
id: "assemblyai",
|
id: "assemblyai",
|
||||||
|
priority: 30,
|
||||||
alias: "assemblyai",
|
alias: "assemblyai",
|
||||||
aliases: [
|
aliases: [
|
||||||
"aai",
|
"aai",
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
export default {
|
export default {
|
||||||
id: "azure",
|
id: "azure",
|
||||||
|
priority: 40,
|
||||||
alias: "azure",
|
alias: "azure",
|
||||||
display: {
|
display: {
|
||||||
name: "Azure OpenAI",
|
name: "Azure OpenAI",
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
export default {
|
export default {
|
||||||
id: "black-forest-labs",
|
id: "black-forest-labs",
|
||||||
|
priority: 50,
|
||||||
alias: "black-forest-labs",
|
alias: "black-forest-labs",
|
||||||
aliases: [
|
aliases: [
|
||||||
"bfl",
|
"bfl",
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
export default {
|
export default {
|
||||||
id: "blackbox",
|
id: "blackbox",
|
||||||
|
priority: 50,
|
||||||
alias: "blackbox",
|
alias: "blackbox",
|
||||||
aliases: [
|
aliases: [
|
||||||
"bb",
|
"bb",
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
export default {
|
export default {
|
||||||
id: "byteplus",
|
id: "byteplus",
|
||||||
|
priority: 150,
|
||||||
alias: "byteplus",
|
alias: "byteplus",
|
||||||
aliases: [
|
aliases: [
|
||||||
"bpm",
|
"bpm",
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
export default {
|
export default {
|
||||||
id: "cerebras",
|
id: "cerebras",
|
||||||
|
priority: 60,
|
||||||
alias: "cerebras",
|
alias: "cerebras",
|
||||||
display: {
|
display: {
|
||||||
name: "Cerebras",
|
name: "Cerebras",
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
export default {
|
export default {
|
||||||
id: "chutes",
|
id: "chutes",
|
||||||
|
priority: 70,
|
||||||
alias: "chutes",
|
alias: "chutes",
|
||||||
aliases: [
|
aliases: [
|
||||||
"ch",
|
"ch",
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import { CLAUDE_CLI_SPOOF_HEADERS } from "../shared.js";
|
|||||||
|
|
||||||
export default {
|
export default {
|
||||||
id: "claude",
|
id: "claude",
|
||||||
|
priority: 10,
|
||||||
alias: "cc",
|
alias: "cc",
|
||||||
uiAlias: "cc",
|
uiAlias: "cc",
|
||||||
display: {
|
display: {
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
export default {
|
export default {
|
||||||
id: "cline",
|
id: "cline",
|
||||||
|
priority: 70,
|
||||||
alias: "cl",
|
alias: "cl",
|
||||||
uiAlias: "cl",
|
uiAlias: "cl",
|
||||||
display: {
|
display: {
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
export default {
|
export default {
|
||||||
id: "cloudflare-ai",
|
id: "cloudflare-ai",
|
||||||
|
priority: 20,
|
||||||
|
hasFree: true,
|
||||||
alias: "cloudflare-ai",
|
alias: "cloudflare-ai",
|
||||||
aliases: [
|
aliases: [
|
||||||
"cf",
|
"cf",
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
export default {
|
export default {
|
||||||
id: "codebuddy",
|
id: "codebuddy",
|
||||||
|
priority: 80,
|
||||||
display: {
|
display: {
|
||||||
name: "CodeBuddy",
|
name: "CodeBuddy",
|
||||||
icon: "smart_toy",
|
icon: "smart_toy",
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import { withCodexReviewModels } from "../models/helpers.js";
|
|||||||
|
|
||||||
export default {
|
export default {
|
||||||
id: "codex",
|
id: "codex",
|
||||||
|
priority: 30,
|
||||||
alias: "cx",
|
alias: "cx",
|
||||||
uiAlias: "cx",
|
uiAlias: "cx",
|
||||||
display: {
|
display: {
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
export default {
|
export default {
|
||||||
id: "cohere",
|
id: "cohere",
|
||||||
|
priority: 90,
|
||||||
alias: "cohere",
|
alias: "cohere",
|
||||||
display: {
|
display: {
|
||||||
name: "Cohere",
|
name: "Cohere",
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
export default {
|
export default {
|
||||||
id: "comfyui",
|
id: "comfyui",
|
||||||
|
priority: 120,
|
||||||
alias: "comfyui",
|
alias: "comfyui",
|
||||||
display: {
|
display: {
|
||||||
name: "ComfyUI",
|
name: "ComfyUI",
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
export default {
|
export default {
|
||||||
id: "commandcode",
|
id: "commandcode",
|
||||||
|
priority: 100,
|
||||||
alias: "commandcode",
|
alias: "commandcode",
|
||||||
aliases: [
|
aliases: [
|
||||||
"cmc",
|
"cmc",
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
export default {
|
export default {
|
||||||
id: "cursor",
|
id: "cursor",
|
||||||
|
priority: 40,
|
||||||
alias: "cu",
|
alias: "cu",
|
||||||
uiAlias: "cu",
|
uiAlias: "cu",
|
||||||
display: {
|
display: {
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
export default {
|
export default {
|
||||||
id: "deepgram",
|
id: "deepgram",
|
||||||
|
priority: 20,
|
||||||
alias: "deepgram",
|
alias: "deepgram",
|
||||||
aliases: [
|
aliases: [
|
||||||
"dg",
|
"dg",
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
export default {
|
export default {
|
||||||
id: "deepseek",
|
id: "deepseek",
|
||||||
|
priority: 110,
|
||||||
alias: "deepseek",
|
alias: "deepseek",
|
||||||
aliases: [
|
aliases: [
|
||||||
"ds",
|
"ds",
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
export default {
|
export default {
|
||||||
id: "fal-ai",
|
id: "fal-ai",
|
||||||
|
priority: 90,
|
||||||
|
hasFree: true,
|
||||||
alias: "fal-ai",
|
alias: "fal-ai",
|
||||||
aliases: [
|
aliases: [
|
||||||
"fal",
|
"fal",
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
export default {
|
export default {
|
||||||
id: "fireworks",
|
id: "fireworks",
|
||||||
|
priority: 50,
|
||||||
alias: "fireworks",
|
alias: "fireworks",
|
||||||
display: {
|
display: {
|
||||||
name: "Fireworks AI",
|
name: "Fireworks AI",
|
||||||
@@ -23,5 +24,6 @@ export default {
|
|||||||
{ id: "accounts/fireworks/models/qwen3-235b-a22b", name: "Qwen3 235B" },
|
{ id: "accounts/fireworks/models/qwen3-235b-a22b", name: "Qwen3 235B" },
|
||||||
{ id: "nomic-ai/nomic-embed-text-v1.5", name: "Nomic Embed Text v1.5", kind: "embedding" },
|
{ id: "nomic-ai/nomic-embed-text-v1.5", name: "Nomic Embed Text v1.5", kind: "embedding" },
|
||||||
],
|
],
|
||||||
|
serviceKinds: ["llm", "embedding"],
|
||||||
embeddingConfig: { baseUrl: "https://api.fireworks.ai/inference/v1/embeddings" },
|
embeddingConfig: { baseUrl: "https://api.fireworks.ai/inference/v1/embeddings" },
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -2,6 +2,8 @@ import { GOOGLE_OAUTH_CLIENT } from "../shared.js";
|
|||||||
|
|
||||||
export default {
|
export default {
|
||||||
id: "gemini-cli",
|
id: "gemini-cli",
|
||||||
|
priority: 130,
|
||||||
|
hasFree: true,
|
||||||
alias: "gc",
|
alias: "gc",
|
||||||
uiAlias: "gc",
|
uiAlias: "gc",
|
||||||
display: {
|
display: {
|
||||||
|
|||||||
@@ -2,6 +2,8 @@ import { GOOGLE_OAUTH_CLIENT } from "../shared.js";
|
|||||||
|
|
||||||
export default {
|
export default {
|
||||||
id: "gemini",
|
id: "gemini",
|
||||||
|
priority: 10,
|
||||||
|
hasFree: true,
|
||||||
alias: "gemini",
|
alias: "gemini",
|
||||||
display: {
|
display: {
|
||||||
name: "Gemini",
|
name: "Gemini",
|
||||||
@@ -12,9 +14,9 @@ export default {
|
|||||||
notice: {
|
notice: {
|
||||||
apiKeyUrl: "https://aistudio.google.com/app/apikey",
|
apiKeyUrl: "https://aistudio.google.com/app/apikey",
|
||||||
},
|
},
|
||||||
mediaPriority: 1,
|
|
||||||
},
|
},
|
||||||
category: "freeTier",
|
category: "freeTier",
|
||||||
|
mediaPriority: 1,
|
||||||
transport: {
|
transport: {
|
||||||
baseUrl: "https://generativelanguage.googleapis.com/v1beta/models",
|
baseUrl: "https://generativelanguage.googleapis.com/v1beta/models",
|
||||||
format: "gemini",
|
format: "gemini",
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
export default {
|
export default {
|
||||||
id: "github",
|
id: "github",
|
||||||
|
priority: 50,
|
||||||
alias: "gh",
|
alias: "gh",
|
||||||
uiAlias: "gh",
|
uiAlias: "gh",
|
||||||
display: {
|
display: {
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
export default {
|
export default {
|
||||||
id: "gitlab",
|
id: "gitlab",
|
||||||
|
priority: 120,
|
||||||
display: {
|
display: {
|
||||||
name: "GitLab Duo",
|
name: "GitLab Duo",
|
||||||
icon: "code",
|
icon: "code",
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
export default {
|
export default {
|
||||||
id: "glm-cn",
|
id: "glm-cn",
|
||||||
|
priority: 130,
|
||||||
alias: "glm-cn",
|
alias: "glm-cn",
|
||||||
display: {
|
display: {
|
||||||
name: "GLM (China)",
|
name: "GLM (China)",
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import { CLAUDE_API_HEADERS } from "../shared.js";
|
|||||||
|
|
||||||
export default {
|
export default {
|
||||||
id: "glm",
|
id: "glm",
|
||||||
|
priority: 140,
|
||||||
alias: "glm",
|
alias: "glm",
|
||||||
display: {
|
display: {
|
||||||
name: "GLM Coding",
|
name: "GLM Coding",
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
export default {
|
export default {
|
||||||
id: "grok-web",
|
id: "grok-web",
|
||||||
|
priority: 150,
|
||||||
alias: "grok-web",
|
alias: "grok-web",
|
||||||
aliases: [
|
aliases: [
|
||||||
"gw",
|
"gw",
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
export default {
|
export default {
|
||||||
id: "groq",
|
id: "groq",
|
||||||
|
priority: 60,
|
||||||
|
hasFree: true,
|
||||||
alias: "groq",
|
alias: "groq",
|
||||||
display: {
|
display: {
|
||||||
name: "Groq",
|
name: "Groq",
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
export default {
|
export default {
|
||||||
id: "huggingface",
|
id: "huggingface",
|
||||||
|
priority: 70,
|
||||||
|
hasFree: true,
|
||||||
alias: "huggingface",
|
alias: "huggingface",
|
||||||
aliases: [
|
aliases: [
|
||||||
"hf",
|
"hf",
|
||||||
@@ -27,5 +29,6 @@ export default {
|
|||||||
{ id: "openai/whisper-large-v3", name: "Whisper Large v3 (HF)", params: ["language"], kind: "stt" },
|
{ id: "openai/whisper-large-v3", name: "Whisper Large v3 (HF)", params: ["language"], kind: "stt" },
|
||||||
{ id: "openai/whisper-small", name: "Whisper Small (HF)", params: ["language"], kind: "stt" },
|
{ id: "openai/whisper-small", name: "Whisper Small (HF)", params: ["language"], kind: "stt" },
|
||||||
],
|
],
|
||||||
|
serviceKinds: ["image", "stt"],
|
||||||
imageConfig: { baseUrl: "https://api-inference.huggingface.co/models" },
|
imageConfig: { baseUrl: "https://api-inference.huggingface.co/models" },
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
export default {
|
export default {
|
||||||
id: "hyperbolic",
|
id: "hyperbolic",
|
||||||
|
priority: 160,
|
||||||
alias: "hyperbolic",
|
alias: "hyperbolic",
|
||||||
aliases: [
|
aliases: [
|
||||||
"hyp",
|
"hyp",
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
export default {
|
export default {
|
||||||
id: "iflow",
|
id: "iflow",
|
||||||
|
priority: 170,
|
||||||
alias: "if",
|
alias: "if",
|
||||||
display: {
|
display: {
|
||||||
name: "iFlow AI",
|
name: "iFlow AI",
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
export default {
|
export default {
|
||||||
id: "kilocode",
|
id: "kilocode",
|
||||||
|
priority: 60,
|
||||||
alias: "kc",
|
alias: "kc",
|
||||||
uiAlias: "kc",
|
uiAlias: "kc",
|
||||||
display: {
|
display: {
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import { CLAUDE_API_HEADERS, KIMI_CODING_BASE_URL } from "../shared.js";
|
|||||||
|
|
||||||
export default {
|
export default {
|
||||||
id: "kimi-coding",
|
id: "kimi-coding",
|
||||||
|
priority: 180,
|
||||||
alias: "kmc",
|
alias: "kmc",
|
||||||
display: {
|
display: {
|
||||||
name: "Kimi Coding",
|
name: "Kimi Coding",
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import { CLAUDE_API_HEADERS, KIMI_CODING_BASE_URL } from "../shared.js";
|
|||||||
|
|
||||||
export default {
|
export default {
|
||||||
id: "kimi",
|
id: "kimi",
|
||||||
|
priority: 170,
|
||||||
alias: "kimi",
|
alias: "kimi",
|
||||||
display: {
|
display: {
|
||||||
name: "Kimi",
|
name: "Kimi",
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
export default {
|
export default {
|
||||||
id: "kiro",
|
id: "kiro",
|
||||||
|
priority: 80,
|
||||||
alias: "kr",
|
alias: "kr",
|
||||||
uiAlias: "kr",
|
uiAlias: "kr",
|
||||||
display: {
|
display: {
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
export default {
|
export default {
|
||||||
id: "mimo-free",
|
id: "mimo-free",
|
||||||
|
priority: 120,
|
||||||
|
hasFree: true,
|
||||||
alias: "mmf",
|
alias: "mmf",
|
||||||
uiAlias: "mmf",
|
uiAlias: "mmf",
|
||||||
display: {
|
display: {
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import { CLAUDE_API_HEADERS } from "../shared.js";
|
|||||||
|
|
||||||
export default {
|
export default {
|
||||||
id: "minimax-cn",
|
id: "minimax-cn",
|
||||||
|
priority: 190,
|
||||||
alias: "minimax-cn",
|
alias: "minimax-cn",
|
||||||
display: {
|
display: {
|
||||||
name: "Minimax (China)",
|
name: "Minimax (China)",
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import { CLAUDE_API_HEADERS } from "../shared.js";
|
|||||||
|
|
||||||
export default {
|
export default {
|
||||||
id: "minimax",
|
id: "minimax",
|
||||||
|
priority: 90,
|
||||||
alias: "minimax",
|
alias: "minimax",
|
||||||
display: {
|
display: {
|
||||||
name: "Minimax Coding",
|
name: "Minimax Coding",
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user