aieo 0.1.38 → 0.1.40

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.
package/dist/index.cjs CHANGED
@@ -30,9 +30,12 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
30
30
  // src/index.ts
31
31
  var index_exports = {};
32
32
  __export(index_exports, {
33
+ API_KEY_ENV: () => API_KEY_ENV,
33
34
  ConversationStorage: () => ConversationStorage,
35
+ DEFAULT_MODELS: () => DEFAULT_MODELS,
34
36
  GATEWAY_PATHS: () => GATEWAY_PATHS,
35
37
  MAX_CONVERSATIONS: () => MAX_CONVERSATIONS,
38
+ MODELS: () => MODELS,
36
39
  OUTRO: () => OUTRO,
37
40
  PROVIDERS: () => PROVIDERS,
38
41
  SYSTEM: () => SYSTEM,
@@ -42,6 +45,7 @@ __export(index_exports, {
42
45
  callGenerateObject: () => callGenerateObject,
43
46
  callGenerateText: () => callGenerateText,
44
47
  callModel: () => callModel,
48
+ canonicalModelName: () => canonicalModelName,
45
49
  captureNativeFetchResults: () => captureNativeFetchResults,
46
50
  captureNativeResults: () => captureNativeResults,
47
51
  computeSessionCost: () => computeSessionCost,
@@ -69,12 +73,16 @@ __export(index_exports, {
69
73
  htmlToText: () => htmlToText,
70
74
  isPrivateAddress: () => isPrivateAddress,
71
75
  linkifyCitations: () => linkifyCitations,
76
+ listModels: () => listModels,
72
77
  loadModelPricing: () => loadModelPricing,
78
+ maxOutputTokensFor: () => maxOutputTokensFor,
73
79
  normalizeApiKey: () => normalizeApiKey,
74
80
  normalizeCallerBaseURL: () => normalizeCallerBaseURL,
75
81
  normalizeUsage: () => normalizeUsage,
82
+ parseModelName: () => parseModelName,
76
83
  resolveFetchBackend: () => resolveFetchBackend,
77
84
  resolveLLMConfig: () => resolveLLMConfig,
85
+ resolveModel: () => resolveModel,
78
86
  resolveSearchBackend: () => resolveSearchBackend,
79
87
  searchWeb: () => searchWeb,
80
88
  stripCitations: () => stripCitations,
@@ -23167,20 +23175,20 @@ var PROVIDERS = [
23167
23175
  var MODELS = {
23168
23176
  anthropic: {
23169
23177
  sonnet: "claude-sonnet-5",
23170
- opus: "claude-opus-4-6",
23178
+ opus: "claude-opus-5",
23171
23179
  haiku: "claude-haiku-4-5"
23172
23180
  },
23173
23181
  google: {
23174
23182
  gemini: "gemini-3-pro-preview"
23175
23183
  },
23176
23184
  openai: {
23177
- gpt: "gpt-5"
23185
+ gpt: "gpt-5.6-luna"
23178
23186
  },
23179
23187
  openrouter: {
23180
- kimi: "moonshotai/kimi-k2.6"
23188
+ kimi: "moonshotai/kimi-k3"
23181
23189
  },
23182
23190
  xai: {
23183
- grok: "grok-4"
23191
+ grok: "grok-4.6"
23184
23192
  }
23185
23193
  };
23186
23194
  var DEFAULT_MODELS = {
@@ -23234,6 +23242,7 @@ function getProviderForModel(modelName) {
23234
23242
  return "xai";
23235
23243
  // Full model IDs
23236
23244
  case "claude-sonnet-5":
23245
+ case "claude-opus-5":
23237
23246
  case "claude-opus-4-6":
23238
23247
  case "claude-haiku-4-5":
23239
23248
  return "anthropic";
@@ -23241,6 +23250,10 @@ function getProviderForModel(modelName) {
23241
23250
  case "gemini-2.0-flash":
23242
23251
  return "google";
23243
23252
  case "gpt-5":
23253
+ case "gpt-5.5":
23254
+ case "gpt-5.6-luna":
23255
+ case "gpt-5.6-sol":
23256
+ case "gpt-5.6-terra":
23244
23257
  case "gpt-4.1-mini":
23245
23258
  return "openai";
23246
23259
  default:
@@ -23250,6 +23263,11 @@ function getProviderForModel(modelName) {
23250
23263
  if (process.env.LLM_PROVIDER && PROVIDERS.includes(process.env.LLM_PROVIDER)) {
23251
23264
  return process.env.LLM_PROVIDER;
23252
23265
  }
23266
+ if (typeof modelName === "string") {
23267
+ const m = modelName.toLowerCase();
23268
+ if (m.startsWith("gpt-")) return "openai";
23269
+ if (m.startsWith("gemini-")) return "google";
23270
+ }
23253
23271
  return "anthropic";
23254
23272
  }
23255
23273
  }
@@ -23258,23 +23276,19 @@ function normalizeApiKey(key) {
23258
23276
  const trimmed = key.trim();
23259
23277
  return trimmed.length > 0 ? trimmed : void 0;
23260
23278
  }
23279
+ var API_KEY_ENV = {
23280
+ anthropic: "ANTHROPIC_API_KEY",
23281
+ google: "GOOGLE_API_KEY",
23282
+ openai: "OPENAI_API_KEY",
23283
+ openrouter: "OPENROUTER_API_KEY",
23284
+ xai: "XAI_API_KEY"
23285
+ };
23261
23286
  function lookupApiKeyForProvider(provider) {
23262
- switch (provider) {
23263
- case "anthropic":
23264
- return normalizeApiKey(process.env.ANTHROPIC_API_KEY);
23265
- case "google":
23266
- return normalizeApiKey(process.env.GOOGLE_API_KEY);
23267
- case "openai":
23268
- return normalizeApiKey(process.env.OPENAI_API_KEY);
23269
- case "openrouter":
23270
- return normalizeApiKey(process.env.OPENROUTER_API_KEY);
23271
- case "xai":
23272
- return normalizeApiKey(process.env.XAI_API_KEY);
23273
- case "claude_code":
23274
- return normalizeApiKey(process.env.CLAUDE_CODE_API_KEY);
23275
- default:
23276
- return void 0;
23287
+ if (provider === "claude_code") {
23288
+ return normalizeApiKey(process.env.CLAUDE_CODE_API_KEY);
23277
23289
  }
23290
+ if (!PROVIDERS.includes(provider)) return void 0;
23291
+ return normalizeApiKey(process.env[API_KEY_ENV[provider]]);
23278
23292
  }
23279
23293
  function hasApiKeyForProvider(provider) {
23280
23294
  return !!lookupApiKeyForProvider(provider);
@@ -23547,23 +23561,26 @@ function getModel(provider, opts) {
23547
23561
  }
23548
23562
  }
23549
23563
  var MODEL_CONTEXT_LIMITS = {
23550
- // Anthropic
23564
+ // Anthropic — 1M is the default and the max on the 5-series; Haiku 4.5 is 200k.
23551
23565
  "claude-sonnet-5": 1e6,
23566
+ "claude-opus-5": 1e6,
23552
23567
  "claude-opus-4-6": 1e6,
23553
23568
  "claude-haiku-4-5": 2e5,
23554
- // Google
23555
- "gemini-3-pro-preview": 1e6,
23556
- "gemini-2.0-flash": 1e6,
23557
- // OpenAI
23569
+ // Google — Gemini's "1M" is 2^20.
23570
+ "gemini-3-pro-preview": 1048576,
23571
+ "gemini-2.0-flash": 1048576,
23572
+ // OpenAI — 5.4+ is 1,050,000; the 4.1 family is 1,047,576; 5 through 5.3 are 400k.
23558
23573
  "gpt-5": 4e5,
23559
23574
  "gpt-5.5": 105e4,
23560
23575
  "gpt-5.6-terra": 105e4,
23561
23576
  "gpt-5.6-luna": 105e4,
23562
23577
  "gpt-5.6-sol": 105e4,
23563
- "gpt-4.1-mini": 1e6,
23578
+ "gpt-4.1-mini": 1047576,
23564
23579
  // OpenRouter — values from the OpenRouter model catalog
23565
23580
  // (https://openrouter.ai/api/v1/models, context_length).
23566
23581
  "stealth/ox-alpha": 1048576,
23582
+ "anthropic/claude-opus-5": 1e6,
23583
+ "anthropic/claude-sonnet-5": 1e6,
23567
23584
  "openai/gpt-5": 4e5,
23568
23585
  "openai/gpt-5.5": 105e4,
23569
23586
  "openai/gpt-5.6-terra": 105e4,
@@ -23579,11 +23596,17 @@ var MODEL_CONTEXT_LIMITS = {
23579
23596
  // right matters beyond display: contextLimit drives truncateOldToolResults,
23580
23597
  // and premature truncation rewrites old messages — which invalidates Grok's
23581
23598
  // automatic prefix cache on every subsequent step.
23599
+ "grok-4.6": 5e5,
23600
+ "grok-4.5": 5e5,
23601
+ "grok-4.3": 1e6,
23582
23602
  "grok-4": 256e3,
23583
23603
  "grok-4-fast": 2e6,
23584
23604
  "grok-4-fast-reasoning": 2e6,
23585
23605
  "grok-4-fast-non-reasoning": 2e6,
23586
23606
  "grok-code-fast-1": 256e3,
23607
+ "x-ai/grok-4.6": 5e5,
23608
+ "x-ai/grok-4.5": 5e5,
23609
+ "x-ai/grok-4.3": 1e6,
23587
23610
  "x-ai/grok-4": 256e3,
23588
23611
  "x-ai/grok-4-fast": 2e6,
23589
23612
  "x-ai/grok-code-fast-1": 256e3
@@ -23745,6 +23768,95 @@ function resolveLLMConfig(opts) {
23745
23768
  return { provider, apiKey, model, modelName: effectiveModelName };
23746
23769
  }
23747
23770
 
23771
+ // src/resolve.ts
23772
+ function listModels() {
23773
+ const out = [];
23774
+ for (const provider of PROVIDERS) {
23775
+ for (const [alias, modelId] of Object.entries(MODELS[provider])) {
23776
+ if (!modelId) continue;
23777
+ out.push({
23778
+ provider,
23779
+ alias,
23780
+ modelId,
23781
+ default: DEFAULT_MODELS[provider] === modelId
23782
+ });
23783
+ }
23784
+ }
23785
+ return out;
23786
+ }
23787
+ function parseModelName(name19) {
23788
+ if (!name19) return {};
23789
+ const slash = name19.indexOf("/");
23790
+ if (slash > 0) {
23791
+ const head = name19.slice(0, slash);
23792
+ if (PROVIDERS.includes(head)) {
23793
+ return { provider: head, modelId: name19.slice(slash + 1) || void 0 };
23794
+ }
23795
+ }
23796
+ return { modelId: name19 };
23797
+ }
23798
+ var ALIASES = new Set(Object.values(MODELS).flatMap((m) => Object.keys(m)));
23799
+ function envProvider() {
23800
+ const v = process.env.LLM_PROVIDER;
23801
+ return v && PROVIDERS.includes(v) ? v : void 0;
23802
+ }
23803
+ function canonicalModelName(model, provider) {
23804
+ const parsed = parseModelName(model);
23805
+ const chosen = provider ?? parsed.provider ?? getProviderForModel(model);
23806
+ if (!PROVIDERS.includes(chosen)) {
23807
+ throw new Error(`Unknown LLM provider: "${chosen}". Supported: ${PROVIDERS.join(", ")}`);
23808
+ }
23809
+ const p = chosen;
23810
+ if (model && !provider && !parsed.provider && model.includes("/") && !envProvider()) {
23811
+ const head = model.split("/")[0];
23812
+ throw new Error(
23813
+ `Model "${model}" has no provider prefix: "${head}" is not a provider (${PROVIDERS.join(", ")}). For an OpenRouter-hosted model write "openrouter/${model}"; otherwise pass the provider explicitly.`
23814
+ );
23815
+ }
23816
+ let modelId = parsed.modelId;
23817
+ if (modelId && ALIASES.has(modelId)) {
23818
+ const hit = MODELS[p][modelId];
23819
+ if (!hit) {
23820
+ throw new Error(
23821
+ `Model "${modelId}" is not available for provider "${p}". Available models: ${Object.keys(MODELS[p]).join(", ")}`
23822
+ );
23823
+ }
23824
+ modelId = hit;
23825
+ }
23826
+ if (!modelId) modelId = DEFAULT_MODELS[p];
23827
+ return { provider: p, modelId, name: `${p}/${modelId}` };
23828
+ }
23829
+ function maxOutputTokensFor(provider) {
23830
+ const env = Number(process.env.MAX_OUTPUT_TOKENS);
23831
+ if (env > 0) return env;
23832
+ return provider === "anthropic" ? 128e3 : 64e3;
23833
+ }
23834
+ async function resolveModel(opts = {}) {
23835
+ const ref = canonicalModelName(opts.model, opts.provider);
23836
+ const envName = API_KEY_ENV[ref.provider];
23837
+ const apiKey = normalizeApiKey(opts.apiKey) ?? normalizeApiKey(await opts.getSecret?.(envName)) ?? normalizeApiKey(process.env[envName]);
23838
+ if (!apiKey) {
23839
+ throw new Error(
23840
+ `No API key for provider "${ref.provider}": set ${envName} (or pass apiKey / getSecret)`
23841
+ );
23842
+ }
23843
+ const model = getModel(ref.provider, {
23844
+ modelName: ref.name,
23845
+ apiKey,
23846
+ baseUrl: opts.baseUrl,
23847
+ headers: opts.headers,
23848
+ abortSignal: opts.abortSignal,
23849
+ timeoutMs: opts.timeoutMs
23850
+ });
23851
+ return {
23852
+ ...ref,
23853
+ model,
23854
+ apiKey,
23855
+ contextLimit: getContextLimit(ref.modelId, ref.provider),
23856
+ maxOutputTokens: maxOutputTokensFor(ref.provider)
23857
+ };
23858
+ }
23859
+
23748
23860
  // src/stream.ts
23749
23861
  var import_ai = require("ai");
23750
23862
 
@@ -24561,9 +24673,12 @@ function consoleLogger(name19) {
24561
24673
  }
24562
24674
  // Annotate the CommonJS export names for ESM import in node:
24563
24675
  0 && (module.exports = {
24676
+ API_KEY_ENV,
24564
24677
  ConversationStorage,
24678
+ DEFAULT_MODELS,
24565
24679
  GATEWAY_PATHS,
24566
24680
  MAX_CONVERSATIONS,
24681
+ MODELS,
24567
24682
  OUTRO,
24568
24683
  PROVIDERS,
24569
24684
  SYSTEM,
@@ -24573,6 +24688,7 @@ function consoleLogger(name19) {
24573
24688
  callGenerateObject,
24574
24689
  callGenerateText,
24575
24690
  callModel,
24691
+ canonicalModelName,
24576
24692
  captureNativeFetchResults,
24577
24693
  captureNativeResults,
24578
24694
  computeSessionCost,
@@ -24600,12 +24716,16 @@ function consoleLogger(name19) {
24600
24716
  htmlToText,
24601
24717
  isPrivateAddress,
24602
24718
  linkifyCitations,
24719
+ listModels,
24603
24720
  loadModelPricing,
24721
+ maxOutputTokensFor,
24604
24722
  normalizeApiKey,
24605
24723
  normalizeCallerBaseURL,
24606
24724
  normalizeUsage,
24725
+ parseModelName,
24607
24726
  resolveFetchBackend,
24608
24727
  resolveLLMConfig,
24728
+ resolveModel,
24609
24729
  resolveSearchBackend,
24610
24730
  searchWeb,
24611
24731
  stripCitations,