@theokit/sdk 4.13.1 → 4.14.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/{cron-C7catiH8.d.ts → cron-DY0uC1ng.d.ts} +7 -0
  3. package/dist/{cron-DK1WVZnI.d.cts → cron-ElTj1cSH.d.cts} +7 -0
  4. package/dist/cron.cjs +159 -21
  5. package/dist/cron.cjs.map +1 -1
  6. package/dist/cron.d.cts +1 -1
  7. package/dist/cron.d.ts +1 -1
  8. package/dist/cron.js +159 -21
  9. package/dist/cron.js.map +1 -1
  10. package/dist/eval.cjs +159 -21
  11. package/dist/eval.cjs.map +1 -1
  12. package/dist/eval.js +159 -21
  13. package/dist/eval.js.map +1 -1
  14. package/dist/index.cjs +162 -21
  15. package/dist/index.cjs.map +1 -1
  16. package/dist/index.d.cts +2 -2
  17. package/dist/index.d.ts +2 -2
  18. package/dist/index.js +162 -21
  19. package/dist/index.js.map +1 -1
  20. package/dist/internal/llm/openai.d.ts +29 -0
  21. package/dist/internal/providers/builtin/cerebras.d.ts +5 -0
  22. package/dist/internal/providers/builtin/cohere.d.ts +8 -0
  23. package/dist/internal/providers/builtin/deepinfra.d.ts +2 -0
  24. package/dist/internal/providers/builtin/google.d.ts +6 -0
  25. package/dist/internal/providers/builtin/groq.d.ts +2 -0
  26. package/dist/internal/providers/builtin/mistral.d.ts +2 -0
  27. package/dist/internal/providers/builtin/openai-compatible.d.ts +1 -0
  28. package/dist/internal/providers/builtin/perplexity.d.ts +5 -0
  29. package/dist/internal/providers/builtin/together.d.ts +2 -0
  30. package/dist/internal/providers/builtin/xai.d.ts +2 -0
  31. package/dist/models.cjs +124 -5
  32. package/dist/models.cjs.map +1 -1
  33. package/dist/models.js +124 -5
  34. package/dist/models.js.map +1 -1
  35. package/dist/types/provider-profile.d.ts +7 -0
  36. package/package.json +1 -1
package/dist/index.cjs CHANGED
@@ -758,13 +758,13 @@ function setAgentFacade(facade) {
758
758
  globalThis[FACADE_KEY] = facade;
759
759
  }
760
760
  function getAgentFacade() {
761
- const registered3 = globalThis[FACADE_KEY];
762
- if (registered3 === void 0) {
761
+ const registered2 = globalThis[FACADE_KEY];
762
+ if (registered2 === void 0) {
763
763
  throw new Error(
764
764
  "internal: Agent facade not registered. The `agent.ts` module must be loaded before internal subsystems (LocalAgent.runUntil/fork, eval, scorers, cron) invoke it."
765
765
  );
766
766
  }
767
- return registered3;
767
+ return registered2;
768
768
  }
769
769
  var FACADE_KEY;
770
770
  var init_agent_factory_registry = __esm({
@@ -13247,6 +13247,9 @@ function getCatalogCapabilities(providerId) {
13247
13247
  _capabilitiesCache = {};
13248
13248
  for (const entry of Object.values(catalog)) {
13249
13249
  _capabilitiesCache[entry.id] = entry.capabilities;
13250
+ for (const alias of entry.aliases ?? []) {
13251
+ if (_capabilitiesCache[alias] === void 0) _capabilitiesCache[alias] = entry.capabilities;
13252
+ }
13250
13253
  }
13251
13254
  }
13252
13255
  return _capabilitiesCache[providerId];
@@ -14003,7 +14006,13 @@ var ANTHROPIC = {
14003
14006
  baseUrl: "https://api.anthropic.com",
14004
14007
  modelsUrl: "https://api.anthropic.com/v1/models",
14005
14008
  hostname: "api.anthropic.com",
14006
- fallbackModels: ["claude-opus-4-7", "claude-sonnet-4-6", "claude-haiku-4-5-20251001"]
14009
+ fallbackModels: ["claude-opus-4-7", "claude-sonnet-4-6", "claude-haiku-4-5-20251001"],
14010
+ // M45 — the Anthropic beta-features header (interleaved thinking + fine-grained tool streaming). An
14011
+ // Anthropic API constant, adapted verbatim from OpenCode's anthropic plugin (MIT © 2025 opencode). The
14012
+ // SANCTIONED behavior delta of M45 (ADR D4) — consumed by the anthropic transport's extraHeaders wiring.
14013
+ extraHeaders: {
14014
+ "anthropic-beta": "interleaved-thinking-2025-05-14,fine-grained-tool-streaming-2025-05-14"
14015
+ }
14007
14016
  };
14008
14017
 
14009
14018
  // src/internal/providers/builtin/bedrock.ts
@@ -14038,6 +14047,44 @@ function resolveBedrockBaseUrl(modelId) {
14038
14047
  return `https://bedrock-runtime.${region}.amazonaws.com`;
14039
14048
  }
14040
14049
 
14050
+ // src/internal/providers/builtin/openai-compatible.ts
14051
+ function openAiCompatibleProfile(p) {
14052
+ return {
14053
+ apiMode: "chat_completions",
14054
+ authType: "api_key",
14055
+ fallbackModels: [],
14056
+ ...p
14057
+ };
14058
+ }
14059
+
14060
+ // src/internal/providers/builtin/cerebras.ts
14061
+ var CEREBRAS = openAiCompatibleProfile({
14062
+ name: "cerebras",
14063
+ baseUrl: "https://api.cerebras.ai/v1",
14064
+ envVars: ["CEREBRAS_API_KEY"],
14065
+ fallbackModels: ["gpt-oss-120b", "zai-glm-4.7"],
14066
+ extraHeaders: { "X-Cerebras-3rd-Party-Integration": "theokit" },
14067
+ hostname: "api.cerebras.ai"
14068
+ });
14069
+
14070
+ // src/internal/providers/builtin/cohere.ts
14071
+ var COHERE = openAiCompatibleProfile({
14072
+ name: "cohere",
14073
+ baseUrl: "https://api.cohere.ai/compatibility/v1",
14074
+ envVars: ["COHERE_API_KEY", "CO_API_KEY"],
14075
+ fallbackModels: ["command-a-03-2025"],
14076
+ hostname: "api.cohere.ai"
14077
+ });
14078
+
14079
+ // src/internal/providers/builtin/deepinfra.ts
14080
+ var DEEPINFRA = openAiCompatibleProfile({
14081
+ name: "deepinfra",
14082
+ baseUrl: "https://api.deepinfra.com/v1/openai",
14083
+ envVars: ["DEEPINFRA_API_KEY"],
14084
+ fallbackModels: ["Qwen/Qwen3-32B"],
14085
+ hostname: "api.deepinfra.com"
14086
+ });
14087
+
14041
14088
  // src/internal/providers/builtin/gemini.ts
14042
14089
  var GEMINI = {
14043
14090
  name: "gemini",
@@ -14049,6 +14096,24 @@ var GEMINI = {
14049
14096
  fallbackModels: ["google/gemini-2.0-flash-001"]
14050
14097
  };
14051
14098
 
14099
+ // src/internal/providers/builtin/google.ts
14100
+ var GOOGLE = openAiCompatibleProfile({
14101
+ name: "google",
14102
+ baseUrl: "https://generativelanguage.googleapis.com/v1beta/openai",
14103
+ envVars: ["GOOGLE_API_KEY", "GEMINI_API_KEY", "GOOGLE_GENERATIVE_AI_API_KEY"],
14104
+ fallbackModels: ["gemini-2.5-pro", "gemini-2.5-flash"],
14105
+ hostname: "generativelanguage.googleapis.com"
14106
+ });
14107
+
14108
+ // src/internal/providers/builtin/groq.ts
14109
+ var GROQ = openAiCompatibleProfile({
14110
+ name: "groq",
14111
+ baseUrl: "https://api.groq.com/openai/v1",
14112
+ envVars: ["GROQ_API_KEY"],
14113
+ fallbackModels: ["llama-3.3-70b-versatile", "llama-3.1-8b-instant"],
14114
+ hostname: "api.groq.com"
14115
+ });
14116
+
14052
14117
  // src/internal/providers/builtin/llamacpp.ts
14053
14118
  var LLAMACPP = {
14054
14119
  name: "llamacpp",
@@ -14075,6 +14140,15 @@ var LMSTUDIO = {
14075
14140
  fallbackModels: ["loaded-model"]
14076
14141
  };
14077
14142
 
14143
+ // src/internal/providers/builtin/mistral.ts
14144
+ var MISTRAL = openAiCompatibleProfile({
14145
+ name: "mistral",
14146
+ baseUrl: "https://api.mistral.ai/v1",
14147
+ envVars: ["MISTRAL_API_KEY"],
14148
+ fallbackModels: ["mistral-large-latest", "codestral-latest"],
14149
+ hostname: "api.mistral.ai"
14150
+ });
14151
+
14078
14152
  // src/internal/providers/builtin/ollama.ts
14079
14153
  var OLLAMA = {
14080
14154
  name: "ollama",
@@ -14462,9 +14536,33 @@ var OPENROUTER = {
14462
14536
  baseUrl: "https://openrouter.ai/api",
14463
14537
  modelsUrl: "https://openrouter.ai/api/v1/models",
14464
14538
  hostname: "openrouter.ai",
14465
- fallbackModels: ["openai/gpt-4o-mini", "anthropic/claude-3-haiku"]
14539
+ // M45 — models refreshed (claude-3-haiku retired upstream).
14540
+ fallbackModels: ["openai/gpt-4o-mini", "anthropic/claude-haiku-4-5"],
14541
+ // M45 — OpenRouter app-attribution headers (mechanism from OpenCode's openrouter plugin, MIT; VALUES are
14542
+ // theokit's own — copying another app's referer would misattribute traffic).
14543
+ extraHeaders: { "HTTP-Referer": "https://usetheo.dev", "X-Title": "theokit" }
14466
14544
  };
14467
14545
 
14546
+ // src/internal/providers/builtin/perplexity.ts
14547
+ var PERPLEXITY = openAiCompatibleProfile({
14548
+ name: "perplexity",
14549
+ baseUrl: "https://api.perplexity.ai",
14550
+ chatCompletionsPath: "/chat/completions",
14551
+ envVars: ["PERPLEXITY_API_KEY"],
14552
+ fallbackModels: ["sonar-pro", "sonar"],
14553
+ hostname: "api.perplexity.ai"
14554
+ });
14555
+
14556
+ // src/internal/providers/builtin/together.ts
14557
+ var TOGETHER = openAiCompatibleProfile({
14558
+ name: "together",
14559
+ aliases: ["togetherai"],
14560
+ baseUrl: "https://api.together.xyz/v1",
14561
+ envVars: ["TOGETHER_API_KEY"],
14562
+ fallbackModels: ["Qwen/Qwen2.5-7B-Instruct-Turbo"],
14563
+ hostname: "api.together.xyz"
14564
+ });
14565
+
14468
14566
  // src/internal/providers/builtin/vertex.ts
14469
14567
  var VERTEX = {
14470
14568
  name: "vertex",
@@ -14496,11 +14594,26 @@ function stripVertexPrefix(modelId) {
14496
14594
  return modelId.replace(/^vertex\/(anthropic|google)\//, "");
14497
14595
  }
14498
14596
 
14597
+ // src/internal/providers/builtin/xai.ts
14598
+ var XAI = openAiCompatibleProfile({
14599
+ name: "xai",
14600
+ aliases: ["grok"],
14601
+ baseUrl: "https://api.x.ai/v1",
14602
+ envVars: ["XAI_API_KEY"],
14603
+ fallbackModels: ["grok-4.5", "grok-4.3"],
14604
+ hostname: "api.x.ai"
14605
+ });
14606
+
14499
14607
  // src/internal/providers/builtin/index.ts
14500
- var registered2 = false;
14608
+ var _registeredState = (() => {
14609
+ const g = globalThis;
14610
+ const sym = /* @__PURE__ */ Symbol.for("theokit-sdk.providers.builtins-registered");
14611
+ if (g[sym] === void 0) g[sym] = { done: false };
14612
+ return g[sym];
14613
+ })();
14501
14614
  function registerBuiltins() {
14502
- if (registered2) return;
14503
- registered2 = true;
14615
+ if (_registeredState.done) return;
14616
+ _registeredState.done = true;
14504
14617
  registerProvider(ANTHROPIC);
14505
14618
  registerProvider(OPENAI);
14506
14619
  registerProvider(OPENAI_CHATGPT);
@@ -14511,6 +14624,15 @@ function registerBuiltins() {
14511
14624
  registerProvider(LLAMACPP);
14512
14625
  registerProvider(BEDROCK);
14513
14626
  registerProvider(VERTEX);
14627
+ registerProvider(GOOGLE);
14628
+ registerProvider(MISTRAL);
14629
+ registerProvider(GROQ);
14630
+ registerProvider(COHERE);
14631
+ registerProvider(DEEPINFRA);
14632
+ registerProvider(TOGETHER);
14633
+ registerProvider(XAI);
14634
+ registerProvider(PERPLEXITY);
14635
+ registerProvider(CEREBRAS);
14514
14636
  registerCatalogProviders();
14515
14637
  }
14516
14638
 
@@ -14779,14 +14901,16 @@ var AnthropicClient = class {
14779
14901
  // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: HTTP+SSE handshake + accumulator is intentionally one block
14780
14902
  async *stream(request, signal) {
14781
14903
  const body = buildAnthropicBody(request);
14904
+ const headers = {
14905
+ "content-type": "application/json",
14906
+ "x-api-key": this.options.apiKey,
14907
+ "anthropic-version": this.options.version ?? "2023-06-01"
14908
+ };
14909
+ if (this.options.extraHeaders !== void 0) Object.assign(headers, this.options.extraHeaders);
14782
14910
  const response = await this.fetchImpl(`${this.baseUrl}/v1/messages`, {
14783
14911
  method: "POST",
14784
14912
  signal,
14785
- headers: {
14786
- "content-type": "application/json",
14787
- "x-api-key": this.options.apiKey,
14788
- "anthropic-version": this.options.version ?? "2023-06-01"
14789
- },
14913
+ headers,
14790
14914
  body: JSON.stringify(body)
14791
14915
  });
14792
14916
  if (!response.ok) {
@@ -15659,15 +15783,24 @@ var StreamSuppressionBuffer = class {
15659
15783
  };
15660
15784
 
15661
15785
  // src/internal/llm/openai.ts
15786
+ function deriveChatPath(baseUrl) {
15787
+ try {
15788
+ return /\/v\d+[a-z]*(\/|$)/.test(new URL(baseUrl).pathname) ? "/chat/completions" : "/v1/chat/completions";
15789
+ } catch {
15790
+ return "/v1/chat/completions";
15791
+ }
15792
+ }
15662
15793
  var OpenAIClient = class {
15663
15794
  constructor(options) {
15664
15795
  this.options = options;
15665
- this.baseUrl = options.baseUrl ?? "https://api.openai.com";
15796
+ this.baseUrl = (options.baseUrl ?? "https://api.openai.com").replace(/\/+$/, "");
15797
+ this.chatPath = options.chatCompletionsPath ?? deriveChatPath(this.baseUrl);
15666
15798
  this.fetchImpl = options.fetch ?? fetch;
15667
15799
  }
15668
15800
  options;
15669
15801
  name = "openai";
15670
15802
  baseUrl;
15803
+ chatPath;
15671
15804
  fetchImpl;
15672
15805
  /**
15673
15806
  * Whether this client recovers leaked Hermes tool-call dialect from assistant
@@ -15690,7 +15823,7 @@ var OpenAIClient = class {
15690
15823
  const providerId = this.options.providerName ?? this.name;
15691
15824
  let response;
15692
15825
  try {
15693
- response = await this.fetchImpl(`${this.baseUrl}/v1/chat/completions`, {
15826
+ response = await this.fetchImpl(`${this.baseUrl}${this.chatPath}`, {
15694
15827
  method: "POST",
15695
15828
  signal,
15696
15829
  headers,
@@ -16787,6 +16920,9 @@ function selectTransport(profile, apiKey) {
16787
16920
  if (profile.extractToolCallsFromContent === true) {
16788
16921
  opts.extractToolCallsFromContent = true;
16789
16922
  }
16923
+ if (profile.chatCompletionsPath !== void 0) {
16924
+ opts.chatCompletionsPath = profile.chatCompletionsPath;
16925
+ }
16790
16926
  if (profile.name === "openai" && process.env.OPENAI_ORGANIZATION !== void 0) {
16791
16927
  opts.organization = process.env.OPENAI_ORGANIZATION;
16792
16928
  }
@@ -16806,6 +16942,11 @@ function selectTransport(profile, apiKey) {
16806
16942
  }
16807
16943
  const opts = { apiKey };
16808
16944
  opts.baseUrl = process.env.ANTHROPIC_API_BASE_URL ?? profile.baseUrl;
16945
+ const t = applyTransform();
16946
+ assertOAuthResolved(t);
16947
+ if (t.fetch !== void 0) opts.fetch = t.fetch;
16948
+ const merged = profile.extraHeaders !== void 0 || t.headers !== void 0 ? { ...profile.extraHeaders, ...t.headers } : void 0;
16949
+ if (merged !== void 0) opts.extraHeaders = merged;
16809
16950
  return new AnthropicClient(opts);
16810
16951
  }
16811
16952
  if (profile.apiMode === "bedrock_anthropic") {
@@ -17124,12 +17265,12 @@ function resolveMcpCwd(configCwd) {
17124
17265
 
17125
17266
  // src/internal/providers/register-plugin-providers.ts
17126
17267
  function registerPluginProviderProfiles(entries) {
17127
- let registered3 = 0;
17268
+ let registered2 = 0;
17128
17269
  for (const entry of entries) {
17129
17270
  registerProvider(entry.profile);
17130
- registered3 += 1;
17271
+ registered2 += 1;
17131
17272
  }
17132
- return registered3;
17273
+ return registered2;
17133
17274
  }
17134
17275
 
17135
17276
  // src/internal/local-agent/real-local-run.ts
@@ -17454,12 +17595,12 @@ var pluginProvidersAnnounced = false;
17454
17595
  function resolveRunProvider(options) {
17455
17596
  registerBuiltins();
17456
17597
  const profiles = options.pluginManager?.aggregated.providerProfiles ?? [];
17457
- const registered3 = registerPluginProviderProfiles(profiles);
17458
- if (registered3 > 0 && !pluginProvidersAnnounced) {
17598
+ const registered2 = registerPluginProviderProfiles(profiles);
17599
+ if (registered2 > 0 && !pluginProvidersAnnounced) {
17459
17600
  pluginProvidersAnnounced = true;
17460
17601
  const names = profiles.map((e) => e.profile.name).join(", ");
17461
17602
  process.stderr.write(
17462
- `[theokit-sdk] registered ${registered3} plugin provider profile(s): ${names}
17603
+ `[theokit-sdk] registered ${registered2} plugin provider profile(s): ${names}
17463
17604
  `
17464
17605
  );
17465
17606
  }