Просмотр исходного кода

feat(core): add overseas/local/custom/aggregator/github providers (7 providers, 161 models; total 36)

fanghanjun 6 месяцев назад
Родитель
Сommit
81fd4601e8

+ 17 - 0
packages/core/src/__tests__/providers-schema.test.ts

@@ -86,4 +86,21 @@ describe("providers structural integrity", () => {
   it("B3:higress baseUrl 为空(gateway 占位)", () => {
     expect(getProvider("higress")?.baseUrl).toBe("");
   });
+
+  it("B4:海外/本地/自定义/聚合/GH 全部收录(7 个)", () => {
+    const ids = getAllProviders().map((p) => p.id);
+    for (const id of ["ollama", "openrouter", "custom", "mistral", "xai", "newapi", "githubCopilot"]) {
+      expect(ids).toContain(id);
+    }
+  });
+
+  it("B4:custom / newapi / higress baseUrl 为空", () => {
+    expect(getProvider("custom")?.baseUrl).toBe("");
+    expect(getProvider("newapi")?.baseUrl).toBe("");
+    expect(getProvider("higress")?.baseUrl).toBe("");
+  });
+
+  it("B4:总 provider 数 = 36", () => {
+    expect(getAllProviders().length).toBe(36);
+  });
 });

+ 16 - 0
packages/core/src/llm/providers/custom.ts

@@ -0,0 +1,16 @@
+import type { InkosProvider } from "./types.js";
+
+/**
+ * custom 是"用户自填 baseUrl 的中转站"的锚点 provider。
+ * models 为空——lookup 对 custom service 走 Layer 2 全局扫。
+ * checkModel 为 undefined——verifyService 对 custom 只做 probe 不做 chat hello。
+ * listModelsForService 对 custom 用用户填的 baseUrl 走 live /models probe,
+ * 失败再 fallback 到全局 bank 反查补元数据。
+ */
+export const CUSTOM: InkosProvider = {
+  id: "custom",
+  label: "自定义端点",
+  api: "openai-completions",
+  baseUrl: "",
+  models: [],
+};

+ 35 - 0
packages/core/src/llm/providers/githubCopilot.ts

@@ -0,0 +1,35 @@
+import type { InkosProvider } from "./types.js";
+
+export const GITHUB_COPILOT: InkosProvider = {
+  id: "githubCopilot",
+  label: "GitHub Copilot",
+  api: "openai-responses",
+  baseUrl: "https://api.githubcopilot.com",
+  checkModel: "gpt-4o",
+  temperatureRange: [0, 2],
+  defaultTemperature: 1,
+  writingTemperature: 1,
+  models: [
+    { id: "gpt-5.4", displayName: "GPT-5.4", maxOutput: 4096, contextWindowTokens: 400000, abilities: { reasoning: true, vision: true, functionCall: true, structuredOutput: true }, enabled: true, releasedAt: "2026-03-05" },
+    { id: "gpt-5.4-mini", displayName: "GPT-5.4 mini", maxOutput: 4096, contextWindowTokens: 400000, abilities: { reasoning: true, vision: true, functionCall: true, structuredOutput: true }, enabled: true, releasedAt: "2026-03-18" },
+    { id: "gpt-5.3-codex", displayName: "GPT-5.3 Codex", maxOutput: 4096, contextWindowTokens: 400000, abilities: { reasoning: true, vision: true, functionCall: true, structuredOutput: true }, releasedAt: "2026-02-05" },
+    { id: "gpt-5.2", displayName: "GPT-5.2", maxOutput: 4096, contextWindowTokens: 192000, abilities: { reasoning: true, vision: true, functionCall: true, structuredOutput: true }, releasedAt: "2025-12-11" },
+    { id: "gpt-5.2-codex", displayName: "GPT-5.2 Codex", maxOutput: 4096, contextWindowTokens: 400000, abilities: { reasoning: true, vision: true, functionCall: true, structuredOutput: true }, releasedAt: "2025-12-18" },
+    { id: "gpt-5.1", displayName: "GPT-5.1", maxOutput: 4096, contextWindowTokens: 192000, abilities: { reasoning: true, vision: true, functionCall: true }, releasedAt: "2025-11-13" },
+    { id: "gpt-5-mini", displayName: "GPT-5 mini", maxOutput: 4096, contextWindowTokens: 192000, abilities: { reasoning: true, vision: true, functionCall: true, structuredOutput: true }, releasedAt: "2025-08-07" },
+    { id: "gpt-4.1", displayName: "GPT-4.1", maxOutput: 4096, contextWindowTokens: 128000, abilities: { vision: true, functionCall: true }, releasedAt: "2025-04-14" },
+    { id: "claude-opus-4.6", displayName: "Claude Opus 4.6", maxOutput: 4096, contextWindowTokens: 139000, abilities: { reasoning: true, vision: true, functionCall: true, structuredOutput: true }, enabled: true, releasedAt: "2026-02-05" },
+    { id: "claude-opus-4.6-fast", displayName: "Claude Opus 4.6 (Fast Mode)", maxOutput: 4096, contextWindowTokens: 139000, abilities: { reasoning: true, vision: true, functionCall: true, structuredOutput: true }, releasedAt: "2026-02-05" },
+    { id: "claude-sonnet-4.6", displayName: "Claude Sonnet 4.6", maxOutput: 4096, contextWindowTokens: 139000, abilities: { reasoning: true, vision: true, functionCall: true, structuredOutput: true }, enabled: true, releasedAt: "2026-02-17" },
+    { id: "claude-opus-4.5", displayName: "Claude Opus 4.5", maxOutput: 4096, contextWindowTokens: 139000, abilities: { reasoning: true, vision: true, functionCall: true, structuredOutput: true }, releasedAt: "2025-11-24" },
+    { id: "claude-sonnet-4.5", displayName: "Claude Sonnet 4.5", maxOutput: 4096, contextWindowTokens: 139000, abilities: { reasoning: true, vision: true, functionCall: true, structuredOutput: true }, releasedAt: "2025-09-29" },
+    { id: "claude-haiku-4.5", displayName: "Claude Haiku 4.5", maxOutput: 4096, contextWindowTokens: 139000, abilities: { reasoning: true, vision: true, functionCall: true, structuredOutput: true }, enabled: true, releasedAt: "2025-10-16" },
+    { id: "claude-sonnet-4", displayName: "Claude Sonnet 4", maxOutput: 4096, contextWindowTokens: 139000, abilities: { reasoning: true, vision: true, functionCall: true }, releasedAt: "2025-05-23" },
+    { id: "gemini-3.1-pro-preview", displayName: "Gemini 3.1 Pro Preview", maxOutput: 4096, contextWindowTokens: 173000, abilities: { reasoning: true, vision: true, functionCall: true, structuredOutput: true }, enabled: true, releasedAt: "2026-02-19" },
+    { id: "gemini-3-flash-preview", displayName: "Gemini 3 Flash Preview", maxOutput: 4096, contextWindowTokens: 173000, abilities: { reasoning: true, vision: true, functionCall: true }, releasedAt: "2025-12-17" },
+    { id: "gemini-2.5-pro", displayName: "Gemini 2.5 Pro", maxOutput: 4096, contextWindowTokens: 173000, abilities: { reasoning: true, vision: true, functionCall: true }, releasedAt: "2025-06-17" },
+    { id: "grok-code-fast-1", displayName: "Grok Code Fast 1", maxOutput: 4096, contextWindowTokens: 173000, abilities: { reasoning: true, functionCall: true, structuredOutput: true }, enabled: true, releasedAt: "2025-08-27" },
+    { id: "oswe-vscode-prime", displayName: "Raptor mini", maxOutput: 4096, contextWindowTokens: 264000, abilities: { reasoning: true, vision: true, functionCall: true, structuredOutput: true }, enabled: true },
+    { id: "oswe-vscode-secondary", displayName: "Raptor mini (Secondary)", maxOutput: 4096, contextWindowTokens: 264000, abilities: { reasoning: true, vision: true, functionCall: true, structuredOutput: true } },
+  ],
+};

+ 9 - 0
packages/core/src/llm/providers/index.ts

@@ -31,6 +31,14 @@ import { HIGRESS } from "./higress.js";
 import { INFINIAI } from "./infiniai.js";
 import { ZEROONE } from "./zeroone.js";
 import { AI360 } from "./ai360.js";
+// B4
+import { OLLAMA } from "./ollama.js";
+import { OPENROUTER } from "./openrouter.js";
+import { CUSTOM } from "./custom.js";
+import { MISTRAL } from "./mistral.js";
+import { XAI } from "./xai.js";
+import { NEWAPI } from "./newapi.js";
+import { GITHUB_COPILOT } from "./githubCopilot.js";
 
 export type { InkosProvider, InkosModel, ApiProtocol } from "./types.js";
 
@@ -43,6 +51,7 @@ const ALL_PROVIDERS: readonly InkosProvider[] = [
   MOONSHOT, ZHIPU, SILICONCLOUD, PPIO, BAILIAN, VOLCENGINE, HUNYUAN, BAICHUAN, STEPFUN, WENXIN,
   SPARK, SENSENOVA, TENCENTCLOUD, XIAOMI_MIMO, LONGCAT, INTERNLM,
   MODELSCOPE, GITEEAI, QINIU, HIGRESS, INFINIAI, ZEROONE, AI360,
+  OLLAMA, OPENROUTER, CUSTOM, MISTRAL, XAI, NEWAPI, GITHUB_COPILOT,
 ];
 
 const PROVIDERS_BY_ID: Map<string, InkosProvider> = new Map(

+ 31 - 0
packages/core/src/llm/providers/mistral.ts

@@ -0,0 +1,31 @@
+import type { InkosProvider } from "./types.js";
+
+export const MISTRAL: InkosProvider = {
+  id: "mistral",
+  label: "Mistral AI",
+  api: "openai-completions",
+  baseUrl: "https://api.mistral.ai/v1",
+  checkModel: "mistral-small-latest",
+  temperatureRange: [0, 1],
+  defaultTemperature: 0.7,
+  writingTemperature: 1,
+  models: [
+    { id: "devstral-2512", displayName: "Devstral 2", maxOutput: 4096, contextWindowTokens: 262144, abilities: { functionCall: true }, releasedAt: "2025-12-09" },
+    { id: "labs-devstral-small-2512", displayName: "Devstral Small 2", maxOutput: 4096, contextWindowTokens: 262144, abilities: { functionCall: true }, releasedAt: "2025-12-09" },
+    { id: "mistral-medium-2508", displayName: "Mistral Medium 3.1", maxOutput: 4096, contextWindowTokens: 131072, abilities: { functionCall: true }, enabled: true },
+    { id: "magistral-medium-2509", displayName: "Magistral Medium 1.2", maxOutput: 4096, contextWindowTokens: 131072, abilities: { reasoning: true, vision: true } },
+    { id: "magistral-small-2509", displayName: "Magistral Small 1.2", maxOutput: 4096, contextWindowTokens: 131072, abilities: { reasoning: true, vision: true } },
+    { id: "open-mistral-nemo", displayName: "Mistral Nemo", maxOutput: 4096, contextWindowTokens: 131072, abilities: { vision: true, functionCall: true } },
+    { id: "mistral-small-2603", displayName: "Mistral Small 4", maxOutput: 4096, contextWindowTokens: 256000, abilities: { reasoning: true, vision: true, functionCall: true }, releasedAt: "2026-03-16" },
+    { id: "mistral-small-2506", displayName: "Mistral Small 3.2", maxOutput: 4096, contextWindowTokens: 131072, abilities: { functionCall: true } },
+    { id: "mistral-large-2512", displayName: "Mistral Large 3", maxOutput: 4096, contextWindowTokens: 256000, abilities: { vision: true, functionCall: true }, enabled: true, releasedAt: "2025-12-02" },
+    { id: "mistral-large-2411", displayName: "Mistral Large 2.1", maxOutput: 4096, contextWindowTokens: 131072, abilities: { vision: true, functionCall: true } },
+    { id: "codestral-latest", displayName: "Codestral 2508", maxOutput: 4096, contextWindowTokens: 256000, abilities: { functionCall: true }, releasedAt: "2025-07-30" },
+    { id: "pixtral-large-latest", displayName: "Pixtral Large", maxOutput: 4096, contextWindowTokens: 131072, abilities: { vision: true, functionCall: true } },
+    { id: "pixtral-12b-2409", displayName: "Pixtral 12B", maxOutput: 4096, contextWindowTokens: 131072, abilities: { vision: true, functionCall: true } },
+    { id: "ministral-3b-latest", displayName: "Ministral 3B", maxOutput: 4096, contextWindowTokens: 131072, abilities: { functionCall: true } },
+    { id: "ministral-8b-latest", displayName: "Ministral 8B", maxOutput: 4096, contextWindowTokens: 131072, abilities: { functionCall: true } },
+    { id: "open-codestral-mamba", displayName: "Codestral Mamba", maxOutput: 4096, contextWindowTokens: 256000 },
+    { id: "labs-leanstral-2603", displayName: "Leanstral", maxOutput: 4096, contextWindowTokens: 256000, abilities: { vision: true, functionCall: true }, releasedAt: "2026-03-16" },
+  ],
+};

+ 14 - 0
packages/core/src/llm/providers/newapi.ts

@@ -0,0 +1,14 @@
+import type { InkosProvider } from "./types.js";
+
+/**
+ * newapi 是 OneAPI / new-api 中转网关的锚点 provider。
+ * 跟 custom 类似:baseUrl 由用户在 Studio 填(指向自己部署的 new-api 网关),
+ * models 默认为空,实际可走 live /models probe(跟 custom 共用逻辑)。
+ */
+export const NEWAPI: InkosProvider = {
+  id: "newapi",
+  label: "New API (中转网关)",
+  api: "openai-completions",
+  baseUrl: "",
+  models: [],
+};

+ 63 - 0
packages/core/src/llm/providers/ollama.ts

@@ -0,0 +1,63 @@
+import type { InkosProvider } from "./types.js";
+
+export const OLLAMA: InkosProvider = {
+  id: "ollama",
+  label: "Ollama (本地)",
+  api: "openai-completions",
+  baseUrl: "http://localhost:11434/v1",
+  checkModel: "llama3.2:3b",
+  models: [
+    { id: "deepseek-v3.1:671b", displayName: "DeepSeek V3.1", maxOutput: 4096, contextWindowTokens: 163840, abilities: { reasoning: true, functionCall: true } },
+    { id: "gpt-oss:20b", displayName: "GPT-OSS 20B", maxOutput: 4096, contextWindowTokens: 131072, abilities: { reasoning: true, functionCall: true }, releasedAt: "2025-08-05" },
+    { id: "gpt-oss:120b", displayName: "GPT-OSS 120B", maxOutput: 4096, contextWindowTokens: 131072, abilities: { reasoning: true, functionCall: true }, releasedAt: "2025-08-05" },
+    { id: "qwen3-coder:480b", displayName: "Qwen3 Coder 480B", maxOutput: 4096, contextWindowTokens: 262144, abilities: { functionCall: true } },
+    { id: "deepseek-r1", displayName: "DeepSeek R1", maxOutput: 4096, contextWindowTokens: 65536, abilities: { reasoning: true } },
+    { id: "deepseek-v3", displayName: "DeepSeek V3 671B", maxOutput: 4096, contextWindowTokens: 65536 },
+    { id: "llama3.1", displayName: "Llama 3.1 8B", maxOutput: 4096, contextWindowTokens: 128000, abilities: { functionCall: true } },
+    { id: "llama3.1:70b", displayName: "Llama 3.1 70B", maxOutput: 4096, contextWindowTokens: 128000 },
+    { id: "llama3.1:405b", displayName: "Llama 3.1 405B", maxOutput: 4096, contextWindowTokens: 128000 },
+    { id: "codellama", displayName: "Code Llama 7B", maxOutput: 4096, contextWindowTokens: 16384 },
+    { id: "codellama:13b", displayName: "Code Llama 13B", maxOutput: 4096, contextWindowTokens: 16384 },
+    { id: "codellama:34b", displayName: "Code Llama 34B", maxOutput: 4096, contextWindowTokens: 16384 },
+    { id: "codellama:70b", displayName: "Code Llama 70B", maxOutput: 4096, contextWindowTokens: 16384 },
+    { id: "qwq", displayName: "QwQ 32B", maxOutput: 4096, contextWindowTokens: 128000, abilities: { reasoning: true, functionCall: true }, releasedAt: "2024-11-28" },
+    { id: "qwen3", displayName: "Qwen3 7B", maxOutput: 4096, contextWindowTokens: 65536, abilities: { functionCall: true } },
+    { id: "qwen2.5:0.5b", displayName: "Qwen2.5 0.5B", maxOutput: 4096, contextWindowTokens: 128000 },
+    { id: "qwen2.5:1.5b", displayName: "Qwen2.5 1.5B", maxOutput: 4096, contextWindowTokens: 128000 },
+    { id: "qwen2.5", displayName: "Qwen2.5 7B", maxOutput: 4096, contextWindowTokens: 128000, abilities: { functionCall: true } },
+    { id: "qwen2.5:72b", displayName: "Qwen2.5 72B", maxOutput: 4096, contextWindowTokens: 128000 },
+    { id: "codeqwen", displayName: "CodeQwen1.5 7B", maxOutput: 4096, contextWindowTokens: 65536, abilities: { functionCall: true } },
+    { id: "qwen2:0.5b", displayName: "Qwen2 0.5B", maxOutput: 4096, contextWindowTokens: 128000, abilities: { functionCall: true } },
+    { id: "qwen2:1.5b", displayName: "Qwen2 1.5B", maxOutput: 4096, contextWindowTokens: 128000, abilities: { functionCall: true } },
+    { id: "qwen2", displayName: "Qwen2 7B", maxOutput: 4096, contextWindowTokens: 128000, abilities: { functionCall: true } },
+    { id: "qwen2:72b", displayName: "Qwen2 72B", maxOutput: 4096, contextWindowTokens: 128000, abilities: { functionCall: true } },
+    { id: "gemma2:2b", displayName: "Gemma 2 2B", maxOutput: 4096, contextWindowTokens: 8192 },
+    { id: "gemma2", displayName: "Gemma 2 9B", maxOutput: 4096, contextWindowTokens: 8192 },
+    { id: "gemma2:27b", displayName: "Gemma 2 27B", maxOutput: 4096, contextWindowTokens: 8192 },
+    { id: "codegemma:2b", displayName: "CodeGemma 2B", maxOutput: 4096, contextWindowTokens: 8192 },
+    { id: "codegemma", displayName: "CodeGemma 7B", maxOutput: 4096, contextWindowTokens: 8192 },
+    { id: "phi3", displayName: "Phi-3 3.8B", maxOutput: 4096, contextWindowTokens: 128000 },
+    { id: "phi3:14b", displayName: "Phi-3 14B", maxOutput: 4096, contextWindowTokens: 128000 },
+    { id: "wizardlm2", displayName: "WizardLM 2 7B", maxOutput: 4096, contextWindowTokens: 32768 },
+    { id: "wizardlm2:8x22b", displayName: "WizardLM 2 8x22B", maxOutput: 4096, contextWindowTokens: 65536 },
+    { id: "mathstral", displayName: "MathΣtral 7B", maxOutput: 4096, contextWindowTokens: 32768 },
+    { id: "mistral", displayName: "Mistral 7B", maxOutput: 4096, contextWindowTokens: 32768, abilities: { functionCall: true } },
+    { id: "mixtral", displayName: "Mixtral 8x7B", maxOutput: 4096, contextWindowTokens: 32768, abilities: { functionCall: true } },
+    { id: "mixtral:8x22b", displayName: "Mixtral 8x22B", maxOutput: 4096, contextWindowTokens: 65536, abilities: { functionCall: true } },
+    { id: "mistral-large", displayName: "Mixtral Large 123B", maxOutput: 4096, contextWindowTokens: 128000 },
+    { id: "mistral-nemo", displayName: "Mixtral Nemo 12B", maxOutput: 4096, contextWindowTokens: 128000, abilities: { functionCall: true } },
+    { id: "codestral", displayName: "Codestral 22B", maxOutput: 4096, contextWindowTokens: 32768 },
+    { id: "aya", displayName: "Aya 23 8B", maxOutput: 4096, contextWindowTokens: 8192 },
+    { id: "aya:35b", displayName: "Aya 23 35B", maxOutput: 4096, contextWindowTokens: 8192 },
+    { id: "command-r", displayName: "Command R 35B", maxOutput: 4096, contextWindowTokens: 131072, abilities: { functionCall: true } },
+    { id: "command-r-plus", displayName: "Command R+ 104B", maxOutput: 4096, contextWindowTokens: 131072, abilities: { functionCall: true } },
+    { id: "deepseek-v2", displayName: "DeepSeek V2 16B", maxOutput: 4096, contextWindowTokens: 32768 },
+    { id: "deepseek-v2:236b", displayName: "DeepSeek V2 236B", maxOutput: 4096, contextWindowTokens: 128000 },
+    { id: "deepseek-coder-v2", displayName: "DeepSeek Coder V2 16B", maxOutput: 4096, contextWindowTokens: 128000 },
+    { id: "deepseek-coder-v2:236b", displayName: "DeepSeek Coder V2 236B", maxOutput: 4096, contextWindowTokens: 128000 },
+    { id: "llava", displayName: "LLaVA 7B", maxOutput: 4096, contextWindowTokens: 4096, abilities: { vision: true } },
+    { id: "llava:13b", displayName: "LLaVA 13B", maxOutput: 4096, contextWindowTokens: 4096, abilities: { vision: true } },
+    { id: "llava:34b", displayName: "LLaVA 34B", maxOutput: 4096, contextWindowTokens: 4096, abilities: { vision: true } },
+    { id: "minicpm-v", displayName: "MiniCPM-V 8B", maxOutput: 4096, contextWindowTokens: 128000, abilities: { vision: true } },
+  ],
+};

+ 75 - 0
packages/core/src/llm/providers/openrouter.ts

@@ -0,0 +1,75 @@
+import type { InkosProvider } from "./types.js";
+
+export const OPENROUTER: InkosProvider = {
+  id: "openrouter",
+  label: "OpenRouter",
+  api: "openai-responses",
+  baseUrl: "https://openrouter.ai/api/v1",
+  piProvider: "openrouter",
+  checkModel: "google/gemma-2-9b-it:free",
+  temperatureRange: [0, 2],
+  defaultTemperature: 0.7,
+  writingTemperature: 1,
+  models: [
+    { id: "openrouter/auto", displayName: "Auto (best for prompt)", maxOutput: 4096, contextWindowTokens: 2000000, enabled: true },
+    { id: "deepseek/deepseek-chat-v3.1", displayName: "DeepSeek V3.1", maxOutput: 4096, contextWindowTokens: 163840, abilities: { reasoning: true, functionCall: true }, releasedAt: "2025-08-21" },
+    { id: "google/gemini-3.1-flash-image-preview", displayName: "Nano Banana 2", maxOutput: 65536, contextWindowTokens: 131072, abilities: { reasoning: true, vision: true }, releasedAt: "2026-02-26" },
+    { id: "google/gemini-3-pro-image-preview", displayName: "Nano Banana Pro", maxOutput: 32768, contextWindowTokens: 163840, abilities: { reasoning: true, vision: true }, releasedAt: "2025-11-20" },
+    { id: "google/gemini-2.5-flash-image", displayName: "Nano Banana", maxOutput: 8192, contextWindowTokens: 40960, abilities: { vision: true }, releasedAt: "2025-10-07" },
+    { id: "qwen/qwen3-30b-a3b:free", displayName: "Qwen3 30B A3B (Free)", maxOutput: 4096, contextWindowTokens: 40960, abilities: { reasoning: true } },
+    { id: "qwen/qwen3-30b-a3b", displayName: "Qwen3 30B A3B", maxOutput: 40960, contextWindowTokens: 40960, abilities: { reasoning: true } },
+    { id: "qwen/qwen3-8b:free", displayName: "Qwen3 8B (Free)", maxOutput: 40960, contextWindowTokens: 40960, abilities: { reasoning: true } },
+    { id: "qwen/qwen3-14b:free", displayName: "Qwen3 14B (Free)", maxOutput: 4096, contextWindowTokens: 40960, abilities: { reasoning: true } },
+    { id: "qwen/qwen3-14b", displayName: "Qwen3 14B", maxOutput: 40960, contextWindowTokens: 40960, abilities: { reasoning: true } },
+    { id: "qwen/qwen3-32b:free", displayName: "Qwen3 32B (Free)", maxOutput: 4096, contextWindowTokens: 40960, abilities: { reasoning: true } },
+    { id: "qwen/qwen3-32b", displayName: "Qwen3 32B", maxOutput: 4096, contextWindowTokens: 40960, abilities: { reasoning: true } },
+    { id: "qwen/qwen3-235b-a22b:free", displayName: "Qwen3 235B A22B (Free)", maxOutput: 4096, contextWindowTokens: 131072, abilities: { reasoning: true } },
+    { id: "qwen/qwen3-235b-a22b", displayName: "Qwen3 235B A22B", maxOutput: 40960, contextWindowTokens: 40960, abilities: { reasoning: true } },
+    { id: "tngtech/deepseek-r1t-chimera:free", displayName: "DeepSeek R1T Chimera (Free)", maxOutput: 4096, contextWindowTokens: 163840, abilities: { reasoning: true } },
+    { id: "thudm/glm-z1-rumination-32b", displayName: "GLM Z1 Rumination 32B", maxOutput: 4096, contextWindowTokens: 32000, abilities: { reasoning: true } },
+    { id: "thudm/glm-z1-32b", displayName: "GLM Z1 32B", maxOutput: 4096, contextWindowTokens: 32768, abilities: { reasoning: true } },
+    { id: "thudm/glm-4-32b:free", displayName: "GLM 4 32B (Free)", maxOutput: 4096, contextWindowTokens: 32000, abilities: { reasoning: true } },
+    { id: "thudm/glm-4-32b", displayName: "GLM 4 32B", maxOutput: 4096, contextWindowTokens: 32000, abilities: { reasoning: true } },
+    { id: "google/gemini-2.5-pro", displayName: "Gemini 2.5 Pro", maxOutput: 65536, contextWindowTokens: 1048576, abilities: { reasoning: true, vision: true, functionCall: true } },
+    { id: "google/gemini-2.5-pro-preview", displayName: "Gemini 2.5 Pro Preview", maxOutput: 65536, contextWindowTokens: 1048576, abilities: { reasoning: true, vision: true, functionCall: true } },
+    { id: "google/gemini-2.5-flash", displayName: "Gemini 2.5 Flash", maxOutput: 65535, contextWindowTokens: 1048576, abilities: { reasoning: true, vision: true, functionCall: true } },
+    { id: "google/gemini-2.5-flash-preview", displayName: "Gemini 2.5 Flash Preview", maxOutput: 65535, contextWindowTokens: 1048576, abilities: { reasoning: true, vision: true, functionCall: true } },
+    { id: "google/gemini-2.5-flash-preview:thinking", displayName: "Gemini 2.5 Flash Preview (thinking)", maxOutput: 65535, contextWindowTokens: 1048576, abilities: { reasoning: true, vision: true, functionCall: true } },
+    { id: "openai/o3", displayName: "o3", maxOutput: 100000, contextWindowTokens: 200000, abilities: { reasoning: true, vision: true, functionCall: true }, releasedAt: "2025-04-17" },
+    { id: "openai/o4-mini-high", displayName: "o4-mini (high)", maxOutput: 100000, contextWindowTokens: 200000, abilities: { reasoning: true, vision: true, functionCall: true }, releasedAt: "2025-04-17" },
+    { id: "openai/o4-mini", displayName: "o4-mini", maxOutput: 100000, contextWindowTokens: 200000, abilities: { reasoning: true, vision: true, functionCall: true }, releasedAt: "2025-04-17" },
+    { id: "openai/gpt-4.1", displayName: "GPT-4.1", maxOutput: 32768, contextWindowTokens: 1047576, abilities: { vision: true, functionCall: true }, releasedAt: "2025-04-14" },
+    { id: "openai/gpt-4.1-mini", displayName: "GPT-4.1 mini", maxOutput: 32768, contextWindowTokens: 1047576, abilities: { vision: true, functionCall: true }, releasedAt: "2025-04-14" },
+    { id: "openai/gpt-4.1-nano", displayName: "GPT-4.1 nano", maxOutput: 32768, contextWindowTokens: 1047576, abilities: { vision: true, functionCall: true }, releasedAt: "2025-04-14" },
+    { id: "openai/o3-mini-high", displayName: "o3-mini (high)", maxOutput: 100000, contextWindowTokens: 200000, abilities: { reasoning: true, functionCall: true }, releasedAt: "2025-01-31" },
+    { id: "openai/o3-mini", displayName: "o3-mini", maxOutput: 100000, contextWindowTokens: 200000, abilities: { reasoning: true, functionCall: true }, releasedAt: "2025-01-31" },
+    { id: "openai/o1-mini", displayName: "o1-mini", maxOutput: 65536, contextWindowTokens: 128000, abilities: { reasoning: true }, releasedAt: "2024-09-12" },
+    { id: "openai/o1-preview", displayName: "o1-preview", maxOutput: 32768, contextWindowTokens: 128000, abilities: { reasoning: true }, releasedAt: "2024-09-12" },
+    { id: "openai/gpt-4o-mini", displayName: "GPT-4o mini", maxOutput: 16385, contextWindowTokens: 128000, abilities: { vision: true, functionCall: true } },
+    { id: "openai/gpt-4o", displayName: "GPT-4o", maxOutput: 4096, contextWindowTokens: 128000, abilities: { vision: true, functionCall: true } },
+    { id: "deepseek/deepseek-r1-0528", displayName: "DeepSeek R1 0528", maxOutput: 4096, contextWindowTokens: 163840, abilities: { reasoning: true, functionCall: true }, releasedAt: "2025-05-28" },
+    { id: "deepseek/deepseek-r1-0528:free", displayName: "DeepSeek R1 0528 (Free)", maxOutput: 4096, contextWindowTokens: 163840, abilities: { reasoning: true }, releasedAt: "2025-05-28" },
+    { id: "deepseek/deepseek-r1", displayName: "DeepSeek R1", maxOutput: 4096, contextWindowTokens: 163840, abilities: { reasoning: true }, releasedAt: "2025-01-20" },
+    { id: "deepseek/deepseek-r1:free", displayName: "DeepSeek R1 (Free)", maxOutput: 4096, contextWindowTokens: 163840, abilities: { reasoning: true }, releasedAt: "2025-01-20" },
+    { id: "deepseek/deepseek-chat-v3-0324", displayName: "DeepSeek V3 0324", maxOutput: 4096, contextWindowTokens: 163840 },
+    { id: "deepseek/deepseek-chat-v3-0324:free", displayName: "DeepSeek V3 0324 (Free)", maxOutput: 4096, contextWindowTokens: 163840 },
+    { id: "anthropic/claude-opus-4.5", displayName: "Claude Opus 4.5", maxOutput: 64000, contextWindowTokens: 200000, abilities: { reasoning: true, vision: true, functionCall: true, search: true }, releasedAt: "2025-11-24" },
+    { id: "anthropic/claude-sonnet-4.5", displayName: "Claude Sonnet 4.5", maxOutput: 64000, contextWindowTokens: 200000, abilities: { reasoning: true, vision: true, functionCall: true, search: true }, releasedAt: "2025-09-30" },
+    { id: "anthropic/claude-3-haiku", displayName: "Claude 3 Haiku", maxOutput: 4096, contextWindowTokens: 200000, abilities: { vision: true, functionCall: true }, releasedAt: "2024-03-07" },
+    { id: "anthropic/claude-3.5-haiku", displayName: "Claude 3.5 Haiku", maxOutput: 8192, contextWindowTokens: 200000, abilities: { functionCall: true }, releasedAt: "2024-11-05" },
+    { id: "anthropic/claude-3.5-sonnet", displayName: "Claude 3.5 Sonnet", maxOutput: 8192, contextWindowTokens: 200000, abilities: { vision: true, functionCall: true }, releasedAt: "2024-06-20" },
+    { id: "anthropic/claude-3.7-sonnet", displayName: "Claude 3.7 Sonnet", maxOutput: 8192, contextWindowTokens: 200000, abilities: { reasoning: true, vision: true, functionCall: true }, releasedAt: "2025-02-24" },
+    { id: "anthropic/claude-sonnet-4", displayName: "Claude Sonnet 4", maxOutput: 64000, contextWindowTokens: 200000, abilities: { reasoning: true, vision: true, functionCall: true }, releasedAt: "2025-05-23" },
+    { id: "anthropic/claude-opus-4", displayName: "Claude Opus 4", maxOutput: 32000, contextWindowTokens: 200000, abilities: { reasoning: true, vision: true, functionCall: true }, releasedAt: "2025-05-23" },
+    { id: "anthropic/claude-3-opus", displayName: "Claude 3 Opus", maxOutput: 4096, contextWindowTokens: 200000, abilities: { vision: true, functionCall: true }, releasedAt: "2024-02-29" },
+    { id: "google/gemini-flash-1.5", displayName: "Gemini 1.5 Flash", maxOutput: 8192, contextWindowTokens: 1008192, abilities: { vision: true, functionCall: true } },
+    { id: "google/gemini-2.0-flash-001", displayName: "Gemini 2.0 Flash", maxOutput: 8192, contextWindowTokens: 1056768, abilities: { vision: true, functionCall: true }, releasedAt: "2025-02-05" },
+    { id: "google/gemini-pro-1.5", displayName: "Gemini 1.5 Pro", maxOutput: 8192, contextWindowTokens: 2008192, abilities: { vision: true, functionCall: true } },
+    { id: "meta-llama/llama-3.2-11b-vision-instruct", displayName: "Llama 3.2 11B Vision", maxOutput: 4096, contextWindowTokens: 131072, abilities: { vision: true } },
+    { id: "meta-llama/llama-3.3-70b-instruct", displayName: "Llama 3.3 70B Instruct", maxOutput: 4096, contextWindowTokens: 131072, abilities: { functionCall: true } },
+    { id: "meta-llama/llama-3.3-70b-instruct:free", displayName: "Llama 3.3 70B Instruct (Free)", maxOutput: 4096, contextWindowTokens: 65536, abilities: { functionCall: true } },
+    { id: "qwen/qwen-2-7b-instruct:free", displayName: "Qwen2 7B (Free)", maxOutput: 4096, contextWindowTokens: 32768 },
+    { id: "meta-llama/llama-3.1-8b-instruct:free", displayName: "Llama 3.1 8B (Free)", maxOutput: 4096, contextWindowTokens: 131072 },
+    { id: "google/gemma-2-9b-it:free", displayName: "Gemma 2 9B (Free)", maxOutput: 4096, contextWindowTokens: 8192 },
+  ],
+};

+ 25 - 0
packages/core/src/llm/providers/xai.ts

@@ -0,0 +1,25 @@
+import type { InkosProvider } from "./types.js";
+
+export const XAI: InkosProvider = {
+  id: "xai",
+  label: "xAI (Grok)",
+  api: "openai-completions",
+  baseUrl: "https://api.x.ai/v1",
+  checkModel: "grok-2-1212",
+  temperatureRange: [0, 2],
+  defaultTemperature: 1,
+  writingTemperature: 1,
+  models: [
+    { id: "grok-4.20-beta-0309-reasoning", displayName: "Grok 4.20 Beta", maxOutput: 4096, contextWindowTokens: 2000000, abilities: { reasoning: true, vision: true, functionCall: true, search: true, structuredOutput: true }, enabled: true, releasedAt: "2026-03-09" },
+    { id: "grok-4.20-beta-0309-non-reasoning", displayName: "Grok 4.20 Beta (Non-Reasoning)", maxOutput: 4096, contextWindowTokens: 2000000, abilities: { vision: true, functionCall: true, search: true, structuredOutput: true }, enabled: true, releasedAt: "2026-03-09" },
+    { id: "grok-4.20-multi-agent-beta-0309", displayName: "Grok 4.20 Multi-Agent Beta", maxOutput: 4096, contextWindowTokens: 2000000, abilities: { reasoning: true, vision: true, search: true, structuredOutput: true }, enabled: true, releasedAt: "2026-03-09" },
+    { id: "grok-4-1-fast-non-reasoning", displayName: "Grok 4.1 Fast (Non-Reasoning)", maxOutput: 4096, contextWindowTokens: 2000000, abilities: { vision: true, functionCall: true, search: true, structuredOutput: true }, enabled: true, releasedAt: "2025-11-20" },
+    { id: "grok-4-1-fast-reasoning", displayName: "Grok 4.1 Fast", maxOutput: 4096, contextWindowTokens: 2000000, abilities: { reasoning: true, vision: true, functionCall: true, search: true, structuredOutput: true }, enabled: true, releasedAt: "2025-11-20" },
+    { id: "grok-4-fast-non-reasoning", displayName: "Grok 4 Fast (Non-Reasoning)", maxOutput: 4096, contextWindowTokens: 2000000, abilities: { vision: true, functionCall: true, search: true, structuredOutput: true }, releasedAt: "2025-09-09" },
+    { id: "grok-4-fast-reasoning", displayName: "Grok 4 Fast", maxOutput: 4096, contextWindowTokens: 2000000, abilities: { reasoning: true, vision: true, functionCall: true, search: true, structuredOutput: true }, releasedAt: "2025-09-09" },
+    { id: "grok-code-fast-1", displayName: "Grok Code Fast 1", maxOutput: 4096, contextWindowTokens: 256000, abilities: { reasoning: true, functionCall: true, structuredOutput: true }, releasedAt: "2025-08-27" },
+    { id: "grok-4", displayName: "Grok 4 0709", maxOutput: 4096, contextWindowTokens: 256000, abilities: { reasoning: true, vision: true, functionCall: true, search: true, structuredOutput: true }, releasedAt: "2025-07-09" },
+    { id: "grok-3", displayName: "Grok 3", maxOutput: 4096, contextWindowTokens: 131072, abilities: { functionCall: true, search: true, structuredOutput: true }, releasedAt: "2025-04-03" },
+    { id: "grok-3-mini", displayName: "Grok 3 Mini", maxOutput: 4096, contextWindowTokens: 131072, abilities: { reasoning: true, functionCall: true, search: true, structuredOutput: true }, releasedAt: "2025-04-03" },
+  ],
+};