@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/cron.d.cts CHANGED
@@ -1,3 +1,3 @@
1
- export { N as Cron } from './cron-DK1WVZnI.cjs';
1
+ export { N as Cron } from './cron-ElTj1cSH.cjs';
2
2
  import './run-DFM1H2jW.cjs';
3
3
  import 'zod';
package/dist/cron.d.ts CHANGED
@@ -1,3 +1,3 @@
1
- export { N as Cron } from './cron-C7catiH8.js';
1
+ export { N as Cron } from './cron-DY0uC1ng.js';
2
2
  import './run-DFM1H2jW.js';
3
3
  import 'zod';
package/dist/cron.js CHANGED
@@ -749,13 +749,13 @@ function setAgentFacade(facade) {
749
749
  globalThis[FACADE_KEY] = facade;
750
750
  }
751
751
  function getAgentFacade() {
752
- const registered3 = globalThis[FACADE_KEY];
753
- if (registered3 === void 0) {
752
+ const registered2 = globalThis[FACADE_KEY];
753
+ if (registered2 === void 0) {
754
754
  throw new Error(
755
755
  "internal: Agent facade not registered. The `agent.ts` module must be loaded before internal subsystems (LocalAgent.runUntil/fork, eval, scorers, cron) invoke it."
756
756
  );
757
757
  }
758
- return registered3;
758
+ return registered2;
759
759
  }
760
760
  var FACADE_KEY;
761
761
  var init_agent_factory_registry = __esm({
@@ -11404,7 +11404,13 @@ var ANTHROPIC = {
11404
11404
  baseUrl: "https://api.anthropic.com",
11405
11405
  modelsUrl: "https://api.anthropic.com/v1/models",
11406
11406
  hostname: "api.anthropic.com",
11407
- fallbackModels: ["claude-opus-4-7", "claude-sonnet-4-6", "claude-haiku-4-5-20251001"]
11407
+ fallbackModels: ["claude-opus-4-7", "claude-sonnet-4-6", "claude-haiku-4-5-20251001"],
11408
+ // M45 — the Anthropic beta-features header (interleaved thinking + fine-grained tool streaming). An
11409
+ // Anthropic API constant, adapted verbatim from OpenCode's anthropic plugin (MIT © 2025 opencode). The
11410
+ // SANCTIONED behavior delta of M45 (ADR D4) — consumed by the anthropic transport's extraHeaders wiring.
11411
+ extraHeaders: {
11412
+ "anthropic-beta": "interleaved-thinking-2025-05-14,fine-grained-tool-streaming-2025-05-14"
11413
+ }
11408
11414
  };
11409
11415
 
11410
11416
  // src/internal/providers/builtin/bedrock.ts
@@ -11439,6 +11445,44 @@ function resolveBedrockBaseUrl(modelId) {
11439
11445
  return `https://bedrock-runtime.${region}.amazonaws.com`;
11440
11446
  }
11441
11447
 
11448
+ // src/internal/providers/builtin/openai-compatible.ts
11449
+ function openAiCompatibleProfile(p) {
11450
+ return {
11451
+ apiMode: "chat_completions",
11452
+ authType: "api_key",
11453
+ fallbackModels: [],
11454
+ ...p
11455
+ };
11456
+ }
11457
+
11458
+ // src/internal/providers/builtin/cerebras.ts
11459
+ var CEREBRAS = openAiCompatibleProfile({
11460
+ name: "cerebras",
11461
+ baseUrl: "https://api.cerebras.ai/v1",
11462
+ envVars: ["CEREBRAS_API_KEY"],
11463
+ fallbackModels: ["gpt-oss-120b", "zai-glm-4.7"],
11464
+ extraHeaders: { "X-Cerebras-3rd-Party-Integration": "theokit" },
11465
+ hostname: "api.cerebras.ai"
11466
+ });
11467
+
11468
+ // src/internal/providers/builtin/cohere.ts
11469
+ var COHERE = openAiCompatibleProfile({
11470
+ name: "cohere",
11471
+ baseUrl: "https://api.cohere.ai/compatibility/v1",
11472
+ envVars: ["COHERE_API_KEY", "CO_API_KEY"],
11473
+ fallbackModels: ["command-a-03-2025"],
11474
+ hostname: "api.cohere.ai"
11475
+ });
11476
+
11477
+ // src/internal/providers/builtin/deepinfra.ts
11478
+ var DEEPINFRA = openAiCompatibleProfile({
11479
+ name: "deepinfra",
11480
+ baseUrl: "https://api.deepinfra.com/v1/openai",
11481
+ envVars: ["DEEPINFRA_API_KEY"],
11482
+ fallbackModels: ["Qwen/Qwen3-32B"],
11483
+ hostname: "api.deepinfra.com"
11484
+ });
11485
+
11442
11486
  // src/internal/providers/builtin/gemini.ts
11443
11487
  var GEMINI = {
11444
11488
  name: "gemini",
@@ -11450,6 +11494,24 @@ var GEMINI = {
11450
11494
  fallbackModels: ["google/gemini-2.0-flash-001"]
11451
11495
  };
11452
11496
 
11497
+ // src/internal/providers/builtin/google.ts
11498
+ var GOOGLE = openAiCompatibleProfile({
11499
+ name: "google",
11500
+ baseUrl: "https://generativelanguage.googleapis.com/v1beta/openai",
11501
+ envVars: ["GOOGLE_API_KEY", "GEMINI_API_KEY", "GOOGLE_GENERATIVE_AI_API_KEY"],
11502
+ fallbackModels: ["gemini-2.5-pro", "gemini-2.5-flash"],
11503
+ hostname: "generativelanguage.googleapis.com"
11504
+ });
11505
+
11506
+ // src/internal/providers/builtin/groq.ts
11507
+ var GROQ = openAiCompatibleProfile({
11508
+ name: "groq",
11509
+ baseUrl: "https://api.groq.com/openai/v1",
11510
+ envVars: ["GROQ_API_KEY"],
11511
+ fallbackModels: ["llama-3.3-70b-versatile", "llama-3.1-8b-instant"],
11512
+ hostname: "api.groq.com"
11513
+ });
11514
+
11453
11515
  // src/internal/providers/builtin/llamacpp.ts
11454
11516
  var LLAMACPP = {
11455
11517
  name: "llamacpp",
@@ -11476,6 +11538,15 @@ var LMSTUDIO = {
11476
11538
  fallbackModels: ["loaded-model"]
11477
11539
  };
11478
11540
 
11541
+ // src/internal/providers/builtin/mistral.ts
11542
+ var MISTRAL = openAiCompatibleProfile({
11543
+ name: "mistral",
11544
+ baseUrl: "https://api.mistral.ai/v1",
11545
+ envVars: ["MISTRAL_API_KEY"],
11546
+ fallbackModels: ["mistral-large-latest", "codestral-latest"],
11547
+ hostname: "api.mistral.ai"
11548
+ });
11549
+
11479
11550
  // src/internal/providers/builtin/ollama.ts
11480
11551
  var OLLAMA = {
11481
11552
  name: "ollama",
@@ -11863,9 +11934,33 @@ var OPENROUTER = {
11863
11934
  baseUrl: "https://openrouter.ai/api",
11864
11935
  modelsUrl: "https://openrouter.ai/api/v1/models",
11865
11936
  hostname: "openrouter.ai",
11866
- fallbackModels: ["openai/gpt-4o-mini", "anthropic/claude-3-haiku"]
11937
+ // M45 — models refreshed (claude-3-haiku retired upstream).
11938
+ fallbackModels: ["openai/gpt-4o-mini", "anthropic/claude-haiku-4-5"],
11939
+ // M45 — OpenRouter app-attribution headers (mechanism from OpenCode's openrouter plugin, MIT; VALUES are
11940
+ // theokit's own — copying another app's referer would misattribute traffic).
11941
+ extraHeaders: { "HTTP-Referer": "https://usetheo.dev", "X-Title": "theokit" }
11867
11942
  };
11868
11943
 
11944
+ // src/internal/providers/builtin/perplexity.ts
11945
+ var PERPLEXITY = openAiCompatibleProfile({
11946
+ name: "perplexity",
11947
+ baseUrl: "https://api.perplexity.ai",
11948
+ chatCompletionsPath: "/chat/completions",
11949
+ envVars: ["PERPLEXITY_API_KEY"],
11950
+ fallbackModels: ["sonar-pro", "sonar"],
11951
+ hostname: "api.perplexity.ai"
11952
+ });
11953
+
11954
+ // src/internal/providers/builtin/together.ts
11955
+ var TOGETHER = openAiCompatibleProfile({
11956
+ name: "together",
11957
+ aliases: ["togetherai"],
11958
+ baseUrl: "https://api.together.xyz/v1",
11959
+ envVars: ["TOGETHER_API_KEY"],
11960
+ fallbackModels: ["Qwen/Qwen2.5-7B-Instruct-Turbo"],
11961
+ hostname: "api.together.xyz"
11962
+ });
11963
+
11869
11964
  // src/internal/providers/builtin/vertex.ts
11870
11965
  var VERTEX = {
11871
11966
  name: "vertex",
@@ -11897,11 +11992,26 @@ function stripVertexPrefix(modelId) {
11897
11992
  return modelId.replace(/^vertex\/(anthropic|google)\//, "");
11898
11993
  }
11899
11994
 
11995
+ // src/internal/providers/builtin/xai.ts
11996
+ var XAI = openAiCompatibleProfile({
11997
+ name: "xai",
11998
+ aliases: ["grok"],
11999
+ baseUrl: "https://api.x.ai/v1",
12000
+ envVars: ["XAI_API_KEY"],
12001
+ fallbackModels: ["grok-4.5", "grok-4.3"],
12002
+ hostname: "api.x.ai"
12003
+ });
12004
+
11900
12005
  // src/internal/providers/builtin/index.ts
11901
- var registered2 = false;
12006
+ var _registeredState = (() => {
12007
+ const g = globalThis;
12008
+ const sym = /* @__PURE__ */ Symbol.for("theokit-sdk.providers.builtins-registered");
12009
+ if (g[sym] === void 0) g[sym] = { done: false };
12010
+ return g[sym];
12011
+ })();
11902
12012
  function registerBuiltins() {
11903
- if (registered2) return;
11904
- registered2 = true;
12013
+ if (_registeredState.done) return;
12014
+ _registeredState.done = true;
11905
12015
  registerProvider(ANTHROPIC);
11906
12016
  registerProvider(OPENAI);
11907
12017
  registerProvider(OPENAI_CHATGPT);
@@ -11912,6 +12022,15 @@ function registerBuiltins() {
11912
12022
  registerProvider(LLAMACPP);
11913
12023
  registerProvider(BEDROCK);
11914
12024
  registerProvider(VERTEX);
12025
+ registerProvider(GOOGLE);
12026
+ registerProvider(MISTRAL);
12027
+ registerProvider(GROQ);
12028
+ registerProvider(COHERE);
12029
+ registerProvider(DEEPINFRA);
12030
+ registerProvider(TOGETHER);
12031
+ registerProvider(XAI);
12032
+ registerProvider(PERPLEXITY);
12033
+ registerProvider(CEREBRAS);
11915
12034
  registerCatalogProviders();
11916
12035
  }
11917
12036
 
@@ -12179,14 +12298,16 @@ var AnthropicClient = class {
12179
12298
  // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: HTTP+SSE handshake + accumulator is intentionally one block
12180
12299
  async *stream(request, signal) {
12181
12300
  const body = buildAnthropicBody(request);
12301
+ const headers = {
12302
+ "content-type": "application/json",
12303
+ "x-api-key": this.options.apiKey,
12304
+ "anthropic-version": this.options.version ?? "2023-06-01"
12305
+ };
12306
+ if (this.options.extraHeaders !== void 0) Object.assign(headers, this.options.extraHeaders);
12182
12307
  const response = await this.fetchImpl(`${this.baseUrl}/v1/messages`, {
12183
12308
  method: "POST",
12184
12309
  signal,
12185
- headers: {
12186
- "content-type": "application/json",
12187
- "x-api-key": this.options.apiKey,
12188
- "anthropic-version": this.options.version ?? "2023-06-01"
12189
- },
12310
+ headers,
12190
12311
  body: JSON.stringify(body)
12191
12312
  });
12192
12313
  if (!response.ok) {
@@ -13059,15 +13180,24 @@ var StreamSuppressionBuffer = class {
13059
13180
  };
13060
13181
 
13061
13182
  // src/internal/llm/openai.ts
13183
+ function deriveChatPath(baseUrl) {
13184
+ try {
13185
+ return /\/v\d+[a-z]*(\/|$)/.test(new URL(baseUrl).pathname) ? "/chat/completions" : "/v1/chat/completions";
13186
+ } catch {
13187
+ return "/v1/chat/completions";
13188
+ }
13189
+ }
13062
13190
  var OpenAIClient = class {
13063
13191
  constructor(options) {
13064
13192
  this.options = options;
13065
- this.baseUrl = options.baseUrl ?? "https://api.openai.com";
13193
+ this.baseUrl = (options.baseUrl ?? "https://api.openai.com").replace(/\/+$/, "");
13194
+ this.chatPath = options.chatCompletionsPath ?? deriveChatPath(this.baseUrl);
13066
13195
  this.fetchImpl = options.fetch ?? fetch;
13067
13196
  }
13068
13197
  options;
13069
13198
  name = "openai";
13070
13199
  baseUrl;
13200
+ chatPath;
13071
13201
  fetchImpl;
13072
13202
  /**
13073
13203
  * Whether this client recovers leaked Hermes tool-call dialect from assistant
@@ -13090,7 +13220,7 @@ var OpenAIClient = class {
13090
13220
  const providerId = this.options.providerName ?? this.name;
13091
13221
  let response;
13092
13222
  try {
13093
- response = await this.fetchImpl(`${this.baseUrl}/v1/chat/completions`, {
13223
+ response = await this.fetchImpl(`${this.baseUrl}${this.chatPath}`, {
13094
13224
  method: "POST",
13095
13225
  signal,
13096
13226
  headers,
@@ -14187,6 +14317,9 @@ function selectTransport(profile, apiKey) {
14187
14317
  if (profile.extractToolCallsFromContent === true) {
14188
14318
  opts.extractToolCallsFromContent = true;
14189
14319
  }
14320
+ if (profile.chatCompletionsPath !== void 0) {
14321
+ opts.chatCompletionsPath = profile.chatCompletionsPath;
14322
+ }
14190
14323
  if (profile.name === "openai" && process.env.OPENAI_ORGANIZATION !== void 0) {
14191
14324
  opts.organization = process.env.OPENAI_ORGANIZATION;
14192
14325
  }
@@ -14206,6 +14339,11 @@ function selectTransport(profile, apiKey) {
14206
14339
  }
14207
14340
  const opts = { apiKey };
14208
14341
  opts.baseUrl = process.env.ANTHROPIC_API_BASE_URL ?? profile.baseUrl;
14342
+ const t = applyTransform();
14343
+ assertOAuthResolved(t);
14344
+ if (t.fetch !== void 0) opts.fetch = t.fetch;
14345
+ const merged = profile.extraHeaders !== void 0 || t.headers !== void 0 ? { ...profile.extraHeaders, ...t.headers } : void 0;
14346
+ if (merged !== void 0) opts.extraHeaders = merged;
14209
14347
  return new AnthropicClient(opts);
14210
14348
  }
14211
14349
  if (profile.apiMode === "bedrock_anthropic") {
@@ -14523,12 +14661,12 @@ function resolveMcpCwd(configCwd) {
14523
14661
 
14524
14662
  // src/internal/providers/register-plugin-providers.ts
14525
14663
  function registerPluginProviderProfiles(entries) {
14526
- let registered3 = 0;
14664
+ let registered2 = 0;
14527
14665
  for (const entry of entries) {
14528
14666
  registerProvider(entry.profile);
14529
- registered3 += 1;
14667
+ registered2 += 1;
14530
14668
  }
14531
- return registered3;
14669
+ return registered2;
14532
14670
  }
14533
14671
 
14534
14672
  // src/internal/local-agent/real-local-run.ts
@@ -14853,12 +14991,12 @@ var pluginProvidersAnnounced = false;
14853
14991
  function resolveRunProvider(options) {
14854
14992
  registerBuiltins();
14855
14993
  const profiles = options.pluginManager?.aggregated.providerProfiles ?? [];
14856
- const registered3 = registerPluginProviderProfiles(profiles);
14857
- if (registered3 > 0 && !pluginProvidersAnnounced) {
14994
+ const registered2 = registerPluginProviderProfiles(profiles);
14995
+ if (registered2 > 0 && !pluginProvidersAnnounced) {
14858
14996
  pluginProvidersAnnounced = true;
14859
14997
  const names = profiles.map((e) => e.profile.name).join(", ");
14860
14998
  process.stderr.write(
14861
- `[theokit-sdk] registered ${registered3} plugin provider profile(s): ${names}
14999
+ `[theokit-sdk] registered ${registered2} plugin provider profile(s): ${names}
14862
15000
  `
14863
15001
  );
14864
15002
  }