@ax-llm/ax 11.0.34 → 11.0.36

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/index.js CHANGED
@@ -734,8 +734,8 @@ var AxBaseAI = class {
734
734
  this.modelInfo = modelInfo;
735
735
  this.models = models;
736
736
  this.id = crypto.randomUUID();
737
- const model = this.models?.find((v) => v.key === defaults.model)?.model ?? defaults.model;
738
- const embedModel = defaults.embedModel;
737
+ const model = this.getModel(defaults.model) ?? defaults.model;
738
+ const embedModel = this.getEmbedModel(defaults.embedModel);
739
739
  this.defaults = { model, embedModel };
740
740
  if (!defaults.model || typeof defaults.model !== "string" || defaults.model === "") {
741
741
  throw new Error("No model defined");
@@ -801,18 +801,10 @@ var AxBaseAI = class {
801
801
  this.headers = headers;
802
802
  }
803
803
  setOptions(options) {
804
- if (options.debug) {
805
- this.debug = options.debug;
806
- }
807
- if (options.rateLimiter) {
808
- this.rt = options.rateLimiter;
809
- }
810
- if (options.fetch) {
811
- this.fetch = options.fetch;
812
- }
813
- if (options.tracer) {
814
- this.tracer = options.tracer;
815
- }
804
+ this.debug = options.debug ?? false;
805
+ this.rt = options.rateLimiter;
806
+ this.fetch = options.fetch;
807
+ this.tracer = options.tracer;
816
808
  }
817
809
  getOptions() {
818
810
  return {
@@ -823,17 +815,27 @@ var AxBaseAI = class {
823
815
  };
824
816
  }
825
817
  getModelList() {
826
- return this.models?.filter((model) => !model.isInternal)?.map((model) => ({
827
- key: model.key,
828
- description: model.description,
829
- model: model.model
830
- }));
831
- }
832
- getDefaultModels() {
833
- return {
834
- model: this.defaults.model,
835
- embedModel: this.defaults.embedModel
836
- };
818
+ const models = [];
819
+ for (const model of this.models ?? []) {
820
+ if (model.isInternal) {
821
+ continue;
822
+ }
823
+ if ("model" in model && model.model) {
824
+ models.push({
825
+ key: model.key,
826
+ description: model.description,
827
+ model: model.model
828
+ });
829
+ }
830
+ if ("embedModel" in model && model.embedModel) {
831
+ models.push({
832
+ key: model.key,
833
+ description: model.description,
834
+ embedModel: model.embedModel
835
+ });
836
+ }
837
+ }
838
+ return models;
837
839
  }
838
840
  getName() {
839
841
  return this.name;
@@ -888,7 +890,7 @@ var AxBaseAI = class {
888
890
  }
889
891
  }
890
892
  async _chat1(req, options) {
891
- const model = req.model ? this.models?.find((v) => v.key === req.model)?.model ?? req.model : this.defaults.model;
893
+ const model = this.getModel(req.model) ?? req.model ?? this.defaults.model;
892
894
  const modelConfig = {
893
895
  ...this.aiImpl.getModelConfig(),
894
896
  ...req.modelConfig
@@ -952,6 +954,7 @@ var AxBaseAI = class {
952
954
  if (!this.aiImpl.createChatReq) {
953
955
  throw new Error("generateChatReq not implemented");
954
956
  }
957
+ const debug = options?.debug ?? this.debug;
955
958
  let functions;
956
959
  if (chatReq.functions && chatReq.functions.length > 0) {
957
960
  functions = chatReq.functions.map((fn2) => this.cleanupFunctionSchema(fn2));
@@ -973,7 +976,7 @@ var AxBaseAI = class {
973
976
  url: this.apiURL,
974
977
  headers: await this.buildHeaders(apiConfig.headers),
975
978
  stream: modelConfig.stream,
976
- debug: this.debug,
979
+ debug,
977
980
  fetch: this.fetch,
978
981
  span
979
982
  },
@@ -981,7 +984,7 @@ var AxBaseAI = class {
981
984
  );
982
985
  return res2;
983
986
  };
984
- if (options?.debug ?? this.debug) {
987
+ if (debug) {
985
988
  logChatRequest(req.chatPrompt, options?.debugHideSystemPrompt);
986
989
  }
987
990
  const rt = options?.rateLimiter ?? this.rt;
@@ -990,23 +993,28 @@ var AxBaseAI = class {
990
993
  if (!this.aiImpl.createChatStreamResp) {
991
994
  throw new Error("generateChatResp not implemented");
992
995
  }
993
- const respFn = this.aiImpl.createChatStreamResp;
996
+ const respFn = this.aiImpl.createChatStreamResp.bind(this);
994
997
  const wrappedRespFn = (state) => (resp) => {
995
998
  const res2 = respFn(resp, state);
996
999
  res2.sessionId = options?.sessionId;
997
- if (res2.modelUsage) {
998
- this.modelUsage = res2.modelUsage;
1000
+ if (!res2.modelUsage) {
1001
+ res2.modelUsage = {
1002
+ ai: this.name,
1003
+ model,
1004
+ tokens: this.aiImpl.getTokenUsage()
1005
+ };
999
1006
  }
1007
+ this.modelUsage = res2.modelUsage;
1000
1008
  if (span?.isRecording()) {
1001
1009
  setResponseAttr(res2, span);
1002
1010
  }
1003
- if (options?.debug ?? this.debug) {
1011
+ if (debug) {
1004
1012
  logResponse(res2);
1005
1013
  }
1006
1014
  return res2;
1007
1015
  };
1008
1016
  const doneCb = async (_values) => {
1009
- if (options?.debug ?? this.debug) {
1017
+ if (debug) {
1010
1018
  process.stdout.write("\n");
1011
1019
  }
1012
1020
  };
@@ -1029,7 +1037,7 @@ var AxBaseAI = class {
1029
1037
  if (span?.isRecording()) {
1030
1038
  setResponseAttr(res, span);
1031
1039
  }
1032
- if (options?.debug ?? this.debug) {
1040
+ if (debug) {
1033
1041
  logResponse(res);
1034
1042
  }
1035
1043
  span?.end();
@@ -1050,7 +1058,7 @@ var AxBaseAI = class {
1050
1058
  }
1051
1059
  }
1052
1060
  async _embed1(req, options) {
1053
- const embedModel = req.embedModel ?? this.defaults.embedModel;
1061
+ const embedModel = this.getEmbedModel(req.embedModel) ?? req.embedModel ?? this.defaults.embedModel;
1054
1062
  if (!embedModel) {
1055
1063
  throw new Error("No embed model defined");
1056
1064
  }
@@ -1082,6 +1090,7 @@ var AxBaseAI = class {
1082
1090
  if (!this.aiImpl.createEmbedResp) {
1083
1091
  throw new Error("generateEmbedResp not implemented");
1084
1092
  }
1093
+ const debug = options?.debug ?? this.debug;
1085
1094
  const req = {
1086
1095
  ...embedReq,
1087
1096
  embedModel
@@ -1093,7 +1102,7 @@ var AxBaseAI = class {
1093
1102
  name: apiConfig.name,
1094
1103
  url: this.apiURL,
1095
1104
  headers: await this.buildHeaders(apiConfig.headers),
1096
- debug: this.debug,
1105
+ debug,
1097
1106
  fetch: this.fetch,
1098
1107
  span
1099
1108
  },
@@ -1101,15 +1110,23 @@ var AxBaseAI = class {
1101
1110
  );
1102
1111
  return res2;
1103
1112
  };
1104
- const resValue = this.rt ? await this.rt(fn, { embedModelUsage: this.embedModelUsage }) : await fn();
1113
+ const resValue = this.rt ? await this.rt(fn, { modelUsage: this.embedModelUsage }) : await fn();
1105
1114
  const res = this.aiImpl.createEmbedResp(resValue);
1106
1115
  res.sessionId = options?.sessionId;
1116
+ if (!res.modelUsage) {
1117
+ res.modelUsage = {
1118
+ ai: this.name,
1119
+ model: embedModel,
1120
+ tokens: this.aiImpl.getTokenUsage()
1121
+ };
1122
+ }
1123
+ this.embedModelUsage = res.modelUsage;
1107
1124
  if (span?.isRecording()) {
1108
1125
  if (res.modelUsage) {
1109
1126
  this.embedModelUsage = res.modelUsage;
1110
1127
  span.setAttributes({
1111
- [axSpanAttributes.LLM_USAGE_COMPLETION_TOKENS]: res.modelUsage.completionTokens ?? 0,
1112
- [axSpanAttributes.LLM_USAGE_PROMPT_TOKENS]: res.modelUsage.promptTokens
1128
+ [axSpanAttributes.LLM_USAGE_COMPLETION_TOKENS]: res.modelUsage.tokens?.completionTokens ?? 0,
1129
+ [axSpanAttributes.LLM_USAGE_PROMPT_TOKENS]: res.modelUsage.tokens?.promptTokens
1113
1130
  });
1114
1131
  }
1115
1132
  }
@@ -1119,12 +1136,27 @@ var AxBaseAI = class {
1119
1136
  async buildHeaders(headers = {}) {
1120
1137
  return { ...headers, ...await this.headers() };
1121
1138
  }
1139
+ getModelByKey(modelName) {
1140
+ if (!modelName) {
1141
+ return void 0;
1142
+ }
1143
+ const item = this.models?.find((v) => v.key === modelName);
1144
+ return item;
1145
+ }
1146
+ getModel(modelName) {
1147
+ const item = this.getModelByKey(modelName);
1148
+ return item && "model" in item ? item.model : void 0;
1149
+ }
1150
+ getEmbedModel(modelName) {
1151
+ const item = this.getModelByKey(modelName);
1152
+ return item && "embedModel" in item ? item.embedModel : void 0;
1153
+ }
1122
1154
  };
1123
1155
  function setResponseAttr(res, span) {
1124
1156
  if (res.modelUsage) {
1125
1157
  span.setAttributes({
1126
- [axSpanAttributes.LLM_USAGE_COMPLETION_TOKENS]: res.modelUsage.completionTokens ?? 0,
1127
- [axSpanAttributes.LLM_USAGE_PROMPT_TOKENS]: res.modelUsage.promptTokens
1158
+ [axSpanAttributes.LLM_USAGE_COMPLETION_TOKENS]: res.modelUsage.tokens?.completionTokens ?? 0,
1159
+ [axSpanAttributes.LLM_USAGE_PROMPT_TOKENS]: res.modelUsage.tokens?.promptTokens
1128
1160
  });
1129
1161
  }
1130
1162
  }
@@ -1179,14 +1211,14 @@ var AxAIAnthropicModel = /* @__PURE__ */ ((AxAIAnthropicModel2) => {
1179
1211
  AxAIAnthropicModel2["ClaudeInstant12"] = "claude-instant-1.2";
1180
1212
  return AxAIAnthropicModel2;
1181
1213
  })(AxAIAnthropicModel || {});
1182
- var AxAIAnthropicVertexModel = /* @__PURE__ */ ((AxAIAnthropicVertexModel3) => {
1183
- AxAIAnthropicVertexModel3["Claude37Sonnet"] = "claude-3-7-sonnet";
1184
- AxAIAnthropicVertexModel3["Claude35Haiku"] = "claude-3-5-haiku";
1185
- AxAIAnthropicVertexModel3["Claude35Sonnet"] = "claude-3-5-sonnet";
1186
- AxAIAnthropicVertexModel3["Claude35SonnetV2"] = "claude-3-5-sonnet-v2";
1187
- AxAIAnthropicVertexModel3["Claude3Haiku"] = "claude-3-haiku";
1188
- AxAIAnthropicVertexModel3["Claude3Opus"] = "claude-3-opus";
1189
- return AxAIAnthropicVertexModel3;
1214
+ var AxAIAnthropicVertexModel = /* @__PURE__ */ ((AxAIAnthropicVertexModel2) => {
1215
+ AxAIAnthropicVertexModel2["Claude37Sonnet"] = "claude-3-7-sonnet";
1216
+ AxAIAnthropicVertexModel2["Claude35Haiku"] = "claude-3-5-haiku";
1217
+ AxAIAnthropicVertexModel2["Claude35Sonnet"] = "claude-3-5-sonnet";
1218
+ AxAIAnthropicVertexModel2["Claude35SonnetV2"] = "claude-3-5-sonnet-v2";
1219
+ AxAIAnthropicVertexModel2["Claude3Haiku"] = "claude-3-haiku";
1220
+ AxAIAnthropicVertexModel2["Claude3Opus"] = "claude-3-opus";
1221
+ return AxAIAnthropicVertexModel2;
1190
1222
  })(AxAIAnthropicVertexModel || {});
1191
1223
 
1192
1224
  // ai/anthropic/info.ts
@@ -1240,7 +1272,11 @@ var axModelInfoAnthropic = [
1240
1272
 
1241
1273
  // ai/anthropic/api.ts
1242
1274
  var axAIAnthropicDefaultConfig = () => structuredClone({
1243
- model: "claude-3-5-sonnet-latest" /* Claude35Sonnet */,
1275
+ model: "claude-3-7-sonnet-latest" /* Claude37Sonnet */,
1276
+ ...axBaseAIDefaultConfig()
1277
+ });
1278
+ var axAIAnthropicVertexDefaultConfig = () => structuredClone({
1279
+ model: "claude-3-7-sonnet" /* Claude37Sonnet */,
1244
1280
  ...axBaseAIDefaultConfig()
1245
1281
  });
1246
1282
  var AxAIAnthropicImpl = class {
@@ -1248,6 +1284,10 @@ var AxAIAnthropicImpl = class {
1248
1284
  this.config = config;
1249
1285
  this.isVertex = isVertex;
1250
1286
  }
1287
+ tokensUsed;
1288
+ getTokenUsage() {
1289
+ return this.tokensUsed;
1290
+ }
1251
1291
  getModelConfig() {
1252
1292
  const { config } = this;
1253
1293
  return {
@@ -1357,16 +1397,12 @@ var AxAIAnthropicImpl = class {
1357
1397
  finishReason
1358
1398
  };
1359
1399
  });
1360
- const modelUsage = {
1400
+ this.tokensUsed = {
1361
1401
  promptTokens: resp.usage.input_tokens,
1362
1402
  completionTokens: resp.usage.output_tokens,
1363
1403
  totalTokens: resp.usage.input_tokens + resp.usage.output_tokens
1364
1404
  };
1365
- return {
1366
- results,
1367
- modelUsage,
1368
- remoteId: resp.id
1369
- };
1405
+ return { results, remoteId: resp.id };
1370
1406
  };
1371
1407
  createChatStreamResp = (resp, state) => {
1372
1408
  if (!("type" in resp)) {
@@ -1383,15 +1419,12 @@ var AxAIAnthropicImpl = class {
1383
1419
  if (resp.type === "message_start") {
1384
1420
  const { message } = resp;
1385
1421
  const results = [{ content: "", id: message.id }];
1386
- const modelUsage = {
1422
+ this.tokensUsed = {
1387
1423
  promptTokens: message.usage?.input_tokens ?? 0,
1388
1424
  completionTokens: message.usage?.output_tokens ?? 0,
1389
1425
  totalTokens: (message.usage?.input_tokens ?? 0) + (message.usage?.output_tokens ?? 0)
1390
1426
  };
1391
- return {
1392
- results,
1393
- modelUsage
1394
- };
1427
+ return { results };
1395
1428
  }
1396
1429
  if (resp.type === "content_block_start") {
1397
1430
  const { content_block: contentBlock } = resp;
@@ -1448,19 +1481,15 @@ var AxAIAnthropicImpl = class {
1448
1481
  }
1449
1482
  if (resp.type === "message_delta") {
1450
1483
  const { delta, usage } = resp;
1451
- return {
1452
- results: [
1453
- {
1454
- content: "",
1455
- finishReason: mapFinishReason(delta.stop_reason)
1456
- }
1457
- ],
1458
- modelUsage: {
1459
- promptTokens: 0,
1460
- completionTokens: usage.output_tokens,
1461
- totalTokens: usage.output_tokens
1462
- }
1484
+ this.tokensUsed = {
1485
+ promptTokens: 0,
1486
+ completionTokens: usage.output_tokens,
1487
+ totalTokens: usage.output_tokens
1463
1488
  };
1489
+ const results = [
1490
+ { content: "", finishReason: mapFinishReason(delta.stop_reason) }
1491
+ ];
1492
+ return { results };
1464
1493
  }
1465
1494
  return {
1466
1495
  results: [{ content: "" }]
@@ -1645,10 +1674,13 @@ function mapFinishReason(stopReason) {
1645
1674
  // ai/openai/types.ts
1646
1675
  var AxAIOpenAIModel = /* @__PURE__ */ ((AxAIOpenAIModel2) => {
1647
1676
  AxAIOpenAIModel2["O1"] = "o1";
1677
+ AxAIOpenAIModel2["O3"] = "o3";
1648
1678
  AxAIOpenAIModel2["O1Mini"] = "o1-mini";
1649
1679
  AxAIOpenAIModel2["O3Mini"] = "o3-mini";
1680
+ AxAIOpenAIModel2["O4Mini"] = "o4-mini";
1650
1681
  AxAIOpenAIModel2["GPT4"] = "gpt-4";
1651
- AxAIOpenAIModel2["GPT45"] = "gpt-4.5-preview";
1682
+ AxAIOpenAIModel2["GPT41"] = "gpt-4.1";
1683
+ AxAIOpenAIModel2["GPT41Mini"] = "gpt-4.1-mini";
1652
1684
  AxAIOpenAIModel2["GPT4O"] = "gpt-4o";
1653
1685
  AxAIOpenAIModel2["GPT4OMini"] = "gpt-4o-mini";
1654
1686
  AxAIOpenAIModel2["GPT4ChatGPT4O"] = "chatgpt-4o-latest";
@@ -1669,12 +1701,6 @@ var AxAIOpenAIEmbedModel = /* @__PURE__ */ ((AxAIOpenAIEmbedModel2) => {
1669
1701
 
1670
1702
  // ai/openai/info.ts
1671
1703
  var axModelInfoOpenAI = [
1672
- {
1673
- name: "gpt-4.5-preview" /* GPT45 */,
1674
- currency: "usd",
1675
- promptTokenCostPer1M: 75,
1676
- completionTokenCostPer1M: 150
1677
- },
1678
1704
  {
1679
1705
  name: "o1" /* O1 */,
1680
1706
  currency: "usd",
@@ -1693,12 +1719,30 @@ var axModelInfoOpenAI = [
1693
1719
  promptTokenCostPer1M: 1.1,
1694
1720
  completionTokenCostPer1M: 4.4
1695
1721
  },
1722
+ {
1723
+ name: "o4-mini" /* O4Mini */,
1724
+ currency: "usd",
1725
+ promptTokenCostPer1M: 1.1,
1726
+ completionTokenCostPer1M: 4.4
1727
+ },
1696
1728
  {
1697
1729
  name: "gpt-4" /* GPT4 */,
1698
1730
  currency: "usd",
1699
1731
  promptTokenCostPer1M: 30,
1700
1732
  completionTokenCostPer1M: 60
1701
1733
  },
1734
+ {
1735
+ name: "gpt-4.1" /* GPT41 */,
1736
+ currency: "usd",
1737
+ promptTokenCostPer1M: 2,
1738
+ completionTokenCostPer1M: 8
1739
+ },
1740
+ {
1741
+ name: "gpt-4.1-mini" /* GPT41Mini */,
1742
+ currency: "usd",
1743
+ promptTokenCostPer1M: 0.4,
1744
+ completionTokenCostPer1M: 1.6
1745
+ },
1702
1746
  {
1703
1747
  name: "gpt-4o" /* GPT4O */,
1704
1748
  currency: "usd",
@@ -1751,28 +1795,32 @@ var axModelInfoOpenAI = [
1751
1795
 
1752
1796
  // ai/openai/api.ts
1753
1797
  var axAIOpenAIDefaultConfig = () => structuredClone({
1754
- model: "gpt-4o" /* GPT4O */,
1798
+ model: "gpt-4.1" /* GPT41 */,
1755
1799
  embedModel: "text-embedding-3-small" /* TextEmbedding3Small */,
1756
1800
  ...axBaseAIDefaultConfig()
1757
1801
  });
1758
1802
  var axAIOpenAIBestConfig = () => structuredClone({
1759
1803
  ...axAIOpenAIDefaultConfig(),
1760
- model: "gpt-4o" /* GPT4O */
1804
+ model: "gpt-4.1" /* GPT41 */
1761
1805
  });
1762
1806
  var axAIOpenAICreativeConfig = () => structuredClone({
1763
- model: "gpt-4o" /* GPT4O */,
1807
+ model: "gpt-4.1" /* GPT41 */,
1764
1808
  embedModel: "text-embedding-3-small" /* TextEmbedding3Small */,
1765
1809
  ...axBaseAIDefaultCreativeConfig()
1766
1810
  });
1767
1811
  var axAIOpenAIFastConfig = () => ({
1768
1812
  ...axAIOpenAIDefaultConfig(),
1769
- model: "gpt-4o-mini" /* GPT4OMini */
1813
+ model: "gpt-4.1-mini" /* GPT41Mini */
1770
1814
  });
1771
1815
  var AxAIOpenAIImpl = class {
1772
1816
  constructor(config, streamingUsage) {
1773
1817
  this.config = config;
1774
1818
  this.streamingUsage = streamingUsage;
1775
1819
  }
1820
+ tokensUsed;
1821
+ getTokenUsage() {
1822
+ return this.tokensUsed;
1823
+ }
1776
1824
  getModelConfig() {
1777
1825
  const { config } = this;
1778
1826
  return {
@@ -1852,7 +1900,7 @@ var AxAIOpenAIImpl = class {
1852
1900
  if (error) {
1853
1901
  throw error;
1854
1902
  }
1855
- const modelUsage = usage ? {
1903
+ this.tokensUsed = usage ? {
1856
1904
  promptTokens: usage.prompt_tokens,
1857
1905
  completionTokens: usage.completion_tokens,
1858
1906
  totalTokens: usage.total_tokens
@@ -1874,14 +1922,13 @@ var AxAIOpenAIImpl = class {
1874
1922
  };
1875
1923
  });
1876
1924
  return {
1877
- modelUsage,
1878
1925
  results,
1879
1926
  remoteId: id
1880
1927
  };
1881
1928
  }
1882
1929
  createChatStreamResp(resp, state) {
1883
1930
  const { id, usage, choices } = resp;
1884
- const modelUsage = usage ? {
1931
+ this.tokensUsed = usage ? {
1885
1932
  promptTokens: usage.prompt_tokens,
1886
1933
  completionTokens: usage.completion_tokens,
1887
1934
  totalTokens: usage.total_tokens
@@ -1919,22 +1966,16 @@ var AxAIOpenAIImpl = class {
1919
1966
  };
1920
1967
  }
1921
1968
  );
1922
- return {
1923
- results,
1924
- modelUsage
1925
- };
1969
+ return { results };
1926
1970
  }
1927
1971
  createEmbedResp(resp) {
1928
1972
  const { data, usage } = resp;
1929
- const modelUsage = usage ? {
1973
+ this.tokensUsed = usage ? {
1930
1974
  promptTokens: usage.prompt_tokens,
1931
1975
  completionTokens: usage.completion_tokens,
1932
1976
  totalTokens: usage.total_tokens
1933
1977
  } : void 0;
1934
- return {
1935
- embeddings: data.map((v) => v.embedding),
1936
- modelUsage
1937
- };
1978
+ return { embeddings: data.map((v) => v.embedding) };
1938
1979
  }
1939
1980
  };
1940
1981
  var mapFinishReason2 = (finishReason) => {
@@ -2199,6 +2240,10 @@ var AxAICohereImpl = class {
2199
2240
  constructor(config) {
2200
2241
  this.config = config;
2201
2242
  }
2243
+ tokensUsed;
2244
+ getTokenUsage() {
2245
+ return this.tokensUsed;
2246
+ }
2202
2247
  getModelConfig() {
2203
2248
  const { config } = this;
2204
2249
  return {
@@ -2290,7 +2335,7 @@ var AxAICohereImpl = class {
2290
2335
  return [apiConfig, reqValue];
2291
2336
  };
2292
2337
  createChatResp = (resp) => {
2293
- const modelUsage = resp.meta.billed_units ? {
2338
+ this.tokensUsed = resp.meta.billed_units ? {
2294
2339
  promptTokens: resp.meta.billed_units.input_tokens,
2295
2340
  completionTokens: resp.meta.billed_units.output_tokens,
2296
2341
  totalTokens: resp.meta.billed_units.input_tokens + resp.meta.billed_units.output_tokens
@@ -2333,17 +2378,18 @@ var AxAICohereImpl = class {
2333
2378
  finishReason
2334
2379
  }
2335
2380
  ];
2336
- return {
2337
- results,
2338
- modelUsage,
2339
- remoteId: resp.response_id
2340
- };
2381
+ return { results, remoteId: resp.response_id };
2341
2382
  };
2342
2383
  createChatStreamResp = (resp, state) => {
2343
2384
  const ss = state;
2344
2385
  if (resp.event_type === "stream-start") {
2345
2386
  ss.generation_id = resp.generation_id;
2346
2387
  }
2388
+ this.tokensUsed = {
2389
+ promptTokens: 0,
2390
+ completionTokens: resp.meta.billed_units?.output_tokens ?? 0,
2391
+ totalTokens: resp.meta.billed_units?.output_tokens ?? 0
2392
+ };
2347
2393
  const { results } = this.createChatResp(resp);
2348
2394
  const result = results[0];
2349
2395
  if (!result) {
@@ -2503,8 +2549,8 @@ var AxAIDeepSeek = class extends AxAIOpenAIBase {
2503
2549
 
2504
2550
  // ai/google-gemini/types.ts
2505
2551
  var AxAIGoogleGeminiModel = /* @__PURE__ */ ((AxAIGoogleGeminiModel2) => {
2506
- AxAIGoogleGeminiModel2["Gemini25Pro"] = "gemini-2.5-pro-exp-03-25";
2507
- AxAIGoogleGeminiModel2["Gemini20Pro"] = "gemini-2.0-pro-exp-02-05";
2552
+ AxAIGoogleGeminiModel2["Gemini25Pro"] = "gemini-2.5-pro-preview-03-25";
2553
+ AxAIGoogleGeminiModel2["Gemini25Flash"] = "gemini-2.5-flash-preview-04-17";
2508
2554
  AxAIGoogleGeminiModel2["Gemini20Flash"] = "gemini-2.0-flash";
2509
2555
  AxAIGoogleGeminiModel2["Gemini20FlashLite"] = "gemini-2.0-flash-lite-preview-02-05";
2510
2556
  AxAIGoogleGeminiModel2["Gemini20FlashThinking"] = "gemini-2.0-flash-thinking-exp-01-21";
@@ -2552,11 +2598,18 @@ var AxAIGoogleGeminiEmbedTypes = /* @__PURE__ */ ((AxAIGoogleGeminiEmbedTypes2)
2552
2598
  // ai/google-gemini/info.ts
2553
2599
  var axModelInfoGoogleGemini = [
2554
2600
  {
2555
- name: "gemini-2.0-pro-exp-02-05" /* Gemini20Pro */,
2601
+ name: "gemini-2.5-pro-preview-03-25" /* Gemini25Pro */,
2556
2602
  currency: "usd",
2557
2603
  characterIsToken: false,
2558
- promptTokenCostPer1M: 0,
2559
- completionTokenCostPer1M: 0
2604
+ promptTokenCostPer1M: 2.5,
2605
+ completionTokenCostPer1M: 15
2606
+ },
2607
+ {
2608
+ name: "gemini-2.5-flash-preview-04-17" /* Gemini25Flash */,
2609
+ currency: "usd",
2610
+ characterIsToken: false,
2611
+ promptTokenCostPer1M: 15,
2612
+ completionTokenCostPer1M: 3.5
2560
2613
  },
2561
2614
  {
2562
2615
  name: "gemini-2.0-flash" /* Gemini20Flash */,
@@ -2630,13 +2683,13 @@ var safetySettings = [
2630
2683
  ];
2631
2684
  var axAIGoogleGeminiDefaultConfig = () => structuredClone({
2632
2685
  model: "gemini-2.0-flash" /* Gemini20Flash */,
2633
- embedModel: "text-embedding-004" /* TextEmbedding004 */,
2686
+ embedModel: "text-embedding-005" /* TextEmbedding005 */,
2634
2687
  safetySettings,
2635
2688
  ...axBaseAIDefaultConfig()
2636
2689
  });
2637
2690
  var axAIGoogleGeminiDefaultCreativeConfig = () => structuredClone({
2638
2691
  model: "gemini-2.0-flash" /* Gemini20Flash */,
2639
- embedModel: "text-embedding-004" /* TextEmbedding004 */,
2692
+ embedModel: "text-embedding-005" /* TextEmbedding005 */,
2640
2693
  safetySettings,
2641
2694
  ...axBaseAIDefaultCreativeConfig()
2642
2695
  });
@@ -2651,6 +2704,10 @@ var AxAIGoogleGeminiImpl = class {
2651
2704
  throw new Error("Auto truncate is not supported for GoogleGemini");
2652
2705
  }
2653
2706
  }
2707
+ tokensUsed;
2708
+ getTokenUsage() {
2709
+ return this.tokensUsed;
2710
+ }
2654
2711
  getModelConfig() {
2655
2712
  const { config } = this;
2656
2713
  return {
@@ -2810,7 +2867,10 @@ var AxAIGoogleGeminiImpl = class {
2810
2867
  frequencyPenalty: req.modelConfig?.frequencyPenalty ?? this.config.frequencyPenalty,
2811
2868
  candidateCount: 1,
2812
2869
  stopSequences: req.modelConfig?.stopSequences ?? this.config.stopSequences,
2813
- responseMimeType: "text/plain"
2870
+ responseMimeType: "text/plain",
2871
+ ...this.config.thinkingConfig && {
2872
+ thinkingConfig: this.config.thinkingConfig
2873
+ }
2814
2874
  };
2815
2875
  const safetySettings2 = this.config.safetySettings;
2816
2876
  const reqValue = {
@@ -2910,18 +2970,14 @@ var AxAIGoogleGeminiImpl = class {
2910
2970
  return result;
2911
2971
  }
2912
2972
  );
2913
- let modelUsage;
2914
2973
  if (resp.usageMetadata) {
2915
- modelUsage = {
2974
+ this.tokensUsed = {
2916
2975
  totalTokens: resp.usageMetadata.totalTokenCount,
2917
2976
  promptTokens: resp.usageMetadata.promptTokenCount,
2918
2977
  completionTokens: resp.usageMetadata.candidatesTokenCount
2919
2978
  };
2920
2979
  }
2921
- return {
2922
- results,
2923
- modelUsage
2924
- };
2980
+ return { results };
2925
2981
  };
2926
2982
  createChatStreamResp = (resp) => {
2927
2983
  return this.createChatResp(resp);
@@ -3139,7 +3195,7 @@ var AxAIGroq = class extends AxAIOpenAIBase {
3139
3195
  debug: options?.debug
3140
3196
  });
3141
3197
  const rtFunc = async (func, info) => {
3142
- const totalTokens = info.modelUsage?.totalTokens || 0;
3198
+ const totalTokens = info.modelUsage?.tokens?.totalTokens || 0;
3143
3199
  await rt.acquire(totalTokens);
3144
3200
  return await func();
3145
3201
  };
@@ -3169,6 +3225,10 @@ var AxAIHuggingFaceImpl = class {
3169
3225
  constructor(config) {
3170
3226
  this.config = config;
3171
3227
  }
3228
+ tokensUsed;
3229
+ getTokenUsage() {
3230
+ return this.tokensUsed;
3231
+ }
3172
3232
  getModelConfig() {
3173
3233
  const { config } = this;
3174
3234
  return {
@@ -3462,6 +3522,10 @@ var AxAIRekaImpl = class {
3462
3522
  constructor(config) {
3463
3523
  this.config = config;
3464
3524
  }
3525
+ tokensUsed;
3526
+ getTokenUsage() {
3527
+ return this.tokensUsed;
3528
+ }
3465
3529
  getModelConfig() {
3466
3530
  const { config } = this;
3467
3531
  return {
@@ -3502,7 +3566,7 @@ var AxAIRekaImpl = class {
3502
3566
  };
3503
3567
  createChatResp = (resp) => {
3504
3568
  const { id, usage, responses } = resp;
3505
- const modelUsage = usage ? {
3569
+ this.tokensUsed = usage ? {
3506
3570
  promptTokens: usage.input_tokens,
3507
3571
  completionTokens: usage.output_tokens,
3508
3572
  totalTokens: usage.input_tokens + usage.output_tokens
@@ -3521,15 +3585,11 @@ var AxAIRekaImpl = class {
3521
3585
  finishReason
3522
3586
  };
3523
3587
  });
3524
- return {
3525
- modelUsage,
3526
- results,
3527
- remoteId: id
3528
- };
3588
+ return { results, remoteId: id };
3529
3589
  };
3530
3590
  createChatStreamResp = (resp) => {
3531
3591
  const { id, usage, responses } = resp;
3532
- const modelUsage = usage ? {
3592
+ this.tokensUsed = usage ? {
3533
3593
  promptTokens: usage.input_tokens,
3534
3594
  completionTokens: usage.output_tokens,
3535
3595
  totalTokens: usage.input_tokens + usage.output_tokens
@@ -3548,10 +3608,7 @@ var AxAIRekaImpl = class {
3548
3608
  finishReason
3549
3609
  };
3550
3610
  });
3551
- return {
3552
- results,
3553
- modelUsage
3554
- };
3611
+ return { results };
3555
3612
  };
3556
3613
  };
3557
3614
  var mapFinishReason3 = (finishReason) => {
@@ -3737,9 +3794,6 @@ var AxAI = class {
3737
3794
  getModelList() {
3738
3795
  return this.ai.getModelList();
3739
3796
  }
3740
- getDefaultModels() {
3741
- return this.ai.getDefaultModels();
3742
- }
3743
3797
  getMetrics() {
3744
3798
  return this.ai.getMetrics();
3745
3799
  }
@@ -4676,9 +4730,15 @@ function mergeProgramUsage(usages) {
4676
4730
  }
4677
4731
  const currentUsage = usageMap[key];
4678
4732
  if (currentUsage) {
4679
- currentUsage.promptTokens += usage.promptTokens;
4680
- currentUsage.completionTokens += usage.completionTokens;
4681
- currentUsage.totalTokens += usage.totalTokens;
4733
+ const tokens = currentUsage.tokens ?? {
4734
+ promptTokens: 0,
4735
+ completionTokens: 0,
4736
+ totalTokens: 0
4737
+ };
4738
+ tokens.promptTokens += usage?.tokens?.promptTokens ?? 0;
4739
+ tokens.completionTokens += usage?.tokens?.completionTokens ?? 0;
4740
+ tokens.totalTokens += usage?.tokens?.totalTokens ?? 0;
4741
+ currentUsage.tokens = tokens;
4682
4742
  }
4683
4743
  }
4684
4744
  return Object.values(usageMap);
@@ -6198,13 +6258,9 @@ var AxGen = class extends AxProgramWithSignature {
6198
6258
  mem,
6199
6259
  options
6200
6260
  }) {
6201
- const { sessionId, traceId, model, functions: _functions } = options ?? {};
6261
+ const { sessionId, traceId, functions: _functions } = options ?? {};
6202
6262
  const fastFail = options?.fastFail ?? this.options?.fastFail;
6203
- const modelName = model ?? ai.getDefaultModels().model;
6204
- const usageInfo = {
6205
- ai: ai.getName(),
6206
- model: modelName
6207
- };
6263
+ const model = options.model;
6208
6264
  const functions = _functions?.map((f) => "toFunction" in f ? f.toFunction() : f)?.flat();
6209
6265
  const res = await this.forwardSendRequest({
6210
6266
  ai,
@@ -6216,7 +6272,6 @@ var AxGen = class extends AxProgramWithSignature {
6216
6272
  ai,
6217
6273
  model,
6218
6274
  res,
6219
- usageInfo,
6220
6275
  mem,
6221
6276
  traceId,
6222
6277
  sessionId,
@@ -6228,7 +6283,6 @@ var AxGen = class extends AxProgramWithSignature {
6228
6283
  ai,
6229
6284
  model,
6230
6285
  res,
6231
- usageInfo,
6232
6286
  mem,
6233
6287
  traceId,
6234
6288
  sessionId,
@@ -6240,14 +6294,13 @@ var AxGen = class extends AxProgramWithSignature {
6240
6294
  ai,
6241
6295
  model,
6242
6296
  res,
6243
- usageInfo,
6244
6297
  mem,
6245
6298
  sessionId,
6246
6299
  traceId,
6247
6300
  functions,
6248
6301
  fastFail
6249
6302
  }) {
6250
- const streamingValidation = fastFail ?? ai.getFeatures().functionCot !== true;
6303
+ const streamingValidation = fastFail ?? ai.getFeatures(model).functionCot !== true;
6251
6304
  const functionCalls = [];
6252
6305
  const values = {};
6253
6306
  const xstate = {
@@ -6262,7 +6315,7 @@ var AxGen = class extends AxProgramWithSignature {
6262
6315
  continue;
6263
6316
  }
6264
6317
  if (v.modelUsage) {
6265
- this.usage.push({ ...usageInfo, ...v.modelUsage });
6318
+ this.usage.push(v.modelUsage);
6266
6319
  }
6267
6320
  if (result.functionCalls) {
6268
6321
  mergeFunctionCalls(functionCalls, result.functionCalls);
@@ -6363,7 +6416,6 @@ var AxGen = class extends AxProgramWithSignature {
6363
6416
  async processResponse({
6364
6417
  ai,
6365
6418
  res,
6366
- usageInfo,
6367
6419
  mem,
6368
6420
  sessionId,
6369
6421
  traceId,
@@ -6376,7 +6428,7 @@ var AxGen = class extends AxProgramWithSignature {
6376
6428
  }
6377
6429
  for (const result of results) {
6378
6430
  if (res.modelUsage) {
6379
- this.usage.push({ ...usageInfo, ...res.modelUsage });
6431
+ this.usage.push(res.modelUsage);
6380
6432
  }
6381
6433
  mem.addResult(result, sessionId);
6382
6434
  if (result.functionCalls?.length) {
@@ -6424,10 +6476,8 @@ var AxGen = class extends AxProgramWithSignature {
6424
6476
  const maxRetries = options.maxRetries ?? this.options?.maxRetries ?? 10;
6425
6477
  const maxSteps = options.maxSteps ?? this.options?.maxSteps ?? 10;
6426
6478
  const debug = options.debug ?? ai.getOptions().debug;
6427
- const memOptions = {
6428
- debug: options.debug,
6429
- debugHideSystemPrompt: options.debugHideSystemPrompt
6430
- };
6479
+ const debugHideSystemPrompt = options.debugHideSystemPrompt;
6480
+ const memOptions = { debug, debugHideSystemPrompt };
6431
6481
  const mem = options.mem ?? this.options?.mem ?? new AxMemory(1e4, memOptions);
6432
6482
  let err;
6433
6483
  if (options?.functions && options.functions.length > 0) {
@@ -6505,7 +6555,7 @@ var AxGen = class extends AxProgramWithSignature {
6505
6555
  return false;
6506
6556
  }
6507
6557
  async *_forward1(ai, values, options) {
6508
- const tracer = this.options?.tracer ?? options?.tracer;
6558
+ const tracer = options?.tracer ?? this.options?.tracer;
6509
6559
  let functions = this.functions;
6510
6560
  if (options?.functions) {
6511
6561
  functions = parseFunctions(options.functions, this.functions);
@@ -6541,9 +6591,7 @@ var AxGen = class extends AxProgramWithSignature {
6541
6591
  }
6542
6592
  }
6543
6593
  async forward(ai, values, options) {
6544
- const generator = this._forward1(ai, values, {
6545
- ...options
6546
- });
6594
+ const generator = this._forward1(ai, values, options ?? {});
6547
6595
  let buffer = {};
6548
6596
  let currentVersion = 0;
6549
6597
  for await (const item of generator) {
@@ -6972,9 +7020,6 @@ var AxBalancer = class _AxBalancer {
6972
7020
  getModelList() {
6973
7021
  return this.currentService.getModelList();
6974
7022
  }
6975
- getDefaultModels() {
6976
- return this.currentService.getDefaultModels();
6977
- }
6978
7023
  getNextService() {
6979
7024
  const cs = this.services[++this.currentServiceIndex];
6980
7025
  if (cs === void 0) {
@@ -9126,12 +9171,6 @@ var AxMockAIService = class {
9126
9171
  getModelList() {
9127
9172
  return this.config.models;
9128
9173
  }
9129
- getDefaultModels() {
9130
- return {
9131
- model: this.config.modelInfo?.name ?? "mock-model",
9132
- embedModel: this.config.embedModelInfo?.name
9133
- };
9134
- }
9135
9174
  getMetrics() {
9136
9175
  return this.metrics;
9137
9176
  }
@@ -9154,9 +9193,13 @@ var AxMockAIService = class {
9154
9193
  }
9155
9194
  ],
9156
9195
  modelUsage: {
9157
- promptTokens: 10,
9158
- completionTokens: 5,
9159
- totalTokens: 15
9196
+ ai: this.getName(),
9197
+ model: "mock-model",
9198
+ tokens: {
9199
+ promptTokens: 10,
9200
+ completionTokens: 5,
9201
+ totalTokens: 15
9202
+ }
9160
9203
  }
9161
9204
  };
9162
9205
  }
@@ -9174,9 +9217,13 @@ var AxMockAIService = class {
9174
9217
  return this.config.embedResponse ?? {
9175
9218
  embeddings: [[0.1, 0.2, 0.3]],
9176
9219
  modelUsage: {
9177
- promptTokens: 5,
9178
- completionTokens: 0,
9179
- totalTokens: 5
9220
+ ai: this.getName(),
9221
+ model: "mock-model",
9222
+ tokens: {
9223
+ promptTokens: 5,
9224
+ completionTokens: 0,
9225
+ totalTokens: 5
9226
+ }
9180
9227
  }
9181
9228
  };
9182
9229
  }
@@ -9207,7 +9254,7 @@ var AxMockAIService = class {
9207
9254
  }
9208
9255
  };
9209
9256
 
9210
- // dsp/router.ts
9257
+ // dsp/classifier.ts
9211
9258
  var colorLog6 = new ColorLog();
9212
9259
  var AxSimpleClassifierClass = class {
9213
9260
  name;
@@ -11016,6 +11063,7 @@ var AxMCPStdioTransport = class {
11016
11063
 
11017
11064
  // ai/multiservice.ts
11018
11065
  var AxMultiServiceRouter = class {
11066
+ options;
11019
11067
  services = /* @__PURE__ */ new Map();
11020
11068
  /**
11021
11069
  * Constructs a new multi-service router.
@@ -11036,9 +11084,7 @@ var AxMultiServiceRouter = class {
11036
11084
  this.services.set(item.key, {
11037
11085
  service,
11038
11086
  description,
11039
- isInternal,
11040
- model: item.service.getDefaultModels().model,
11041
- useDefaultModel: true
11087
+ isInternal
11042
11088
  });
11043
11089
  } else {
11044
11090
  const modelList = item.getModelList();
@@ -11047,18 +11093,31 @@ var AxMultiServiceRouter = class {
11047
11093
  `Service ${index} \`${item.getName()}\` has no model list.`
11048
11094
  );
11049
11095
  }
11050
- for (const { key, description, model } of modelList ?? []) {
11051
- if (this.services.has(key)) {
11052
- const otherService = this.services.get(key)?.service;
11096
+ for (const v of modelList) {
11097
+ if (this.services.has(v.key)) {
11098
+ const otherService = this.services.get(v.key)?.service;
11053
11099
  throw new Error(
11054
- `Service ${index} \`${item.getName()}\` has duplicate model key: ${key} as service ${otherService?.getName()}`
11100
+ `Service ${index} \`${item.getName()}\` has duplicate model key: ${v.key} as service ${otherService?.getName()}`
11055
11101
  );
11102
+ } else {
11103
+ if ("model" in v && typeof v.model) {
11104
+ this.services.set(v.key, {
11105
+ description: v.description,
11106
+ service: item,
11107
+ model: v.model
11108
+ });
11109
+ } else if ("embedModel" in v && v.embedModel) {
11110
+ this.services.set(v.key, {
11111
+ description: v.description,
11112
+ service: item,
11113
+ embedModel: v.embedModel
11114
+ });
11115
+ } else {
11116
+ throw new Error(
11117
+ `Key ${v.key} in model list for service ${index} \`${item.getName()}\` is missing a model or embedModel property.`
11118
+ );
11119
+ }
11056
11120
  }
11057
- this.services.set(key, {
11058
- description,
11059
- service: item,
11060
- model
11061
- });
11062
11121
  }
11063
11122
  }
11064
11123
  }
@@ -11075,25 +11134,32 @@ var AxMultiServiceRouter = class {
11075
11134
  if (!item) {
11076
11135
  throw new Error(`No service found for model key: ${modelKey}`);
11077
11136
  }
11078
- const service = item.service;
11079
- const model = item.useDefaultModel ? req.model : modelKey;
11080
- return await service.chat({ model, ...req }, options);
11137
+ if (!item.model) {
11138
+ const { model, ...reqWithoutModel } = req;
11139
+ return await item.service.chat(reqWithoutModel, options);
11140
+ }
11141
+ return await item.service.chat({ model: modelKey, ...req }, options);
11081
11142
  }
11082
11143
  /**
11083
11144
  * Delegates the embed call to the service matching the provided embed model key.
11084
11145
  */
11085
11146
  async embed(req, options) {
11086
- const modelKey = req.embedModel;
11087
- if (!modelKey) {
11147
+ const embedModelKey = req.embedModel;
11148
+ if (!embedModelKey) {
11088
11149
  throw new Error("Embed model key must be specified for multi-service");
11089
11150
  }
11090
- const item = this.services.get(modelKey);
11151
+ const item = this.services.get(embedModelKey);
11091
11152
  if (!item) {
11092
- throw new Error(`No service found for embed model key: ${modelKey}`);
11153
+ throw new Error(`No service found for embed model key: ${embedModelKey}`);
11093
11154
  }
11094
- const service = item.service;
11095
- const embedModel = item.useDefaultModel ? req.embedModel : modelKey;
11096
- return await service.embed({ embedModel, ...req }, options);
11155
+ if (!item.model) {
11156
+ const { embedModel, ...reqWithoutEmbedModel } = req;
11157
+ return await item.service.embed(reqWithoutEmbedModel, options);
11158
+ }
11159
+ return await item.service.embed(
11160
+ { embedModel: embedModelKey, ...req },
11161
+ options
11162
+ );
11097
11163
  }
11098
11164
  /**
11099
11165
  * Returns a composite ID built from the IDs of the underlying services.
@@ -11111,16 +11177,15 @@ var AxMultiServiceRouter = class {
11111
11177
  * Aggregates all available models across the underlying services.
11112
11178
  */
11113
11179
  getModelList() {
11114
- return Array.from(this.services).filter(([, value]) => !value.isInternal).map(([key, { description, model }]) => ({
11115
- key,
11116
- description,
11117
- model
11118
- }));
11119
- }
11120
- getDefaultModels() {
11121
- throw new Error(
11122
- "getDefaultModels is not supported for multi-service router."
11123
- );
11180
+ return Array.from(this.services).filter(([, value]) => !value.isInternal).map(([key, v]) => {
11181
+ if (v.model) {
11182
+ return { key, description: v.description, model: v.model };
11183
+ } else if (v.embedModel) {
11184
+ return { key, description: v.description, embedModel: v.embedModel };
11185
+ } else {
11186
+ throw new Error(`Service ${key} has no model or embedModel`);
11187
+ }
11188
+ });
11124
11189
  }
11125
11190
  /**
11126
11191
  * If a model key is provided, delegate to the corresponding service's features.
@@ -11154,17 +11219,14 @@ var AxMultiServiceRouter = class {
11154
11219
  for (const service of this.services.values()) {
11155
11220
  service.service.setOptions(options);
11156
11221
  }
11222
+ this.options = options;
11157
11223
  }
11158
11224
  /**
11159
11225
  * Returns the options from the last used service,
11160
11226
  * or falls back to the first service if none has been used.
11161
11227
  */
11162
11228
  getOptions() {
11163
- const service = this.services.values().next().value;
11164
- if (!service) {
11165
- throw new Error("No service available to get options.");
11166
- }
11167
- return service.service.getOptions();
11229
+ return this.options ?? {};
11168
11230
  }
11169
11231
  };
11170
11232
 
@@ -11286,6 +11348,7 @@ export {
11286
11348
  AxStringUtil,
11287
11349
  AxTestPrompt,
11288
11350
  axAIAnthropicDefaultConfig,
11351
+ axAIAnthropicVertexDefaultConfig,
11289
11352
  axAIAzureOpenAIBestConfig,
11290
11353
  axAIAzureOpenAICreativeConfig,
11291
11354
  axAIAzureOpenAIDefaultConfig,