@absolutejs/ai 0.5.0 → 0.6.0

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/CHANGELOG.md CHANGED
@@ -6,6 +6,12 @@ This file is generated by `absolute-changelog` from the entries in
6
6
  `changelog/`. Edit an entry, not this file — and add new ones under
7
7
  `changelog/unreleased/`.
8
8
 
9
+ ## 0.6.0 — 2026-10-20
10
+
11
+ ### Added
12
+
13
+ - **Load tools on demand (deferLoading, through Anthropic tool search) and clear old tool results past a threshold (toolResultClearing); both cross the provider proxy** (`AIToolResultClearing`, `AIToolDefinition`, `AIProviderToolDefinition`, `AIProviderStreamParams`, `StreamAIOptions`)
14
+
9
15
  ## 0.5.0 — 2026-10-19
10
16
 
11
17
  ### Breaking
package/changelog.json CHANGED
@@ -2,6 +2,23 @@
2
2
  "contract": 1,
3
3
  "name": "@absolutejs/ai",
4
4
  "releases": [
5
+ {
6
+ "changes": [
7
+ {
8
+ "kind": "added",
9
+ "summary": "Load tools on demand (deferLoading, through Anthropic tool search) and clear old tool results past a threshold (toolResultClearing); both cross the provider proxy",
10
+ "symbols": [
11
+ "AIToolResultClearing",
12
+ "AIToolDefinition",
13
+ "AIProviderToolDefinition",
14
+ "AIProviderStreamParams",
15
+ "StreamAIOptions"
16
+ ]
17
+ }
18
+ ],
19
+ "date": "2026-10-20",
20
+ "version": "0.6.0"
21
+ },
5
22
  {
6
23
  "changes": [
7
24
  {
package/dist/ai/index.js CHANGED
@@ -478,6 +478,7 @@ var sendMessage = async (socket, message) => {
478
478
  return true;
479
479
  };
480
480
  var buildToolDefinitions = (tools) => Object.entries(tools).map(([name, def]) => ({
481
+ ...def.deferLoading ? { deferLoading: true } : {},
481
482
  description: def.description,
482
483
  input_schema: def.input,
483
484
  name
@@ -670,6 +671,7 @@ var processToolTurn = async (socket, options, state, messageId, conversationId,
670
671
  model: options.model,
671
672
  promptCaching: options.promptCaching,
672
673
  providerOptions: options.providerOptions,
674
+ toolResultClearing: options.toolResultClearing,
673
675
  reasoning: options.reasoning,
674
676
  signal,
675
677
  systemPrompt: options.systemPrompt,
@@ -760,6 +762,7 @@ var processStream = async (socket, options, messages, messageId, conversationId,
760
762
  model: options.model,
761
763
  promptCaching: options.promptCaching,
762
764
  providerOptions: options.providerOptions,
765
+ toolResultClearing: options.toolResultClearing,
763
766
  reasoning: options.reasoning,
764
767
  signal,
765
768
  systemPrompt: options.systemPrompt,
@@ -929,6 +932,7 @@ var withHeartbeat = async function* (source, signal, intervalMs) {
929
932
  }
930
933
  };
931
934
  var buildToolDefinitions2 = (tools) => Object.entries(tools).map(([name, def]) => ({
935
+ ...def.deferLoading ? { deferLoading: true } : {},
932
936
  description: def.description,
933
937
  input_schema: def.input,
934
938
  name
@@ -1193,6 +1197,7 @@ var streamTurns = async function* (options, renderers, messages, signal, startTi
1193
1197
  reasoning: options.reasoning,
1194
1198
  signal,
1195
1199
  systemPrompt: options.systemPrompt,
1200
+ toolResultClearing: options.toolResultClearing,
1196
1201
  tools: toolDefs
1197
1202
  }, options.contextPolicy, (prepared) => {
1198
1203
  turnState.currentMessages = prepared.messages;
@@ -1805,6 +1810,7 @@ var mergeUsage = (left, right) => {
1805
1810
  };
1806
1811
  };
1807
1812
  var toProviderTools = (tools) => Object.entries(tools).map(([name, definition]) => ({
1813
+ ...definition.deferLoading ? { deferLoading: true } : {},
1808
1814
  description: definition.description,
1809
1815
  input_schema: definition.input,
1810
1816
  name
@@ -2296,6 +2302,7 @@ var wireParams = (params) => ({
2296
2302
  ...params.systemPrompt === undefined ? {} : { systemPrompt: params.systemPrompt },
2297
2303
  ...params.temperature === undefined ? {} : { temperature: params.temperature },
2298
2304
  ...params.toolChoice === undefined ? {} : { toolChoice: params.toolChoice },
2305
+ ...params.toolResultClearing === undefined ? {} : { toolResultClearing: params.toolResultClearing },
2299
2306
  ...params.tools === undefined ? {} : { tools: params.tools },
2300
2307
  ...params.topP === undefined ? {} : { topP: params.topP }
2301
2308
  });
@@ -6716,10 +6723,32 @@ var mapMessage = (msg) => ({
6716
6723
  role: msg.role === "system" ? "user" : msg.role
6717
6724
  });
6718
6725
  var mapToolDefinition2 = (tool) => ({
6726
+ ...tool.deferLoading ? { defer_loading: true } : {},
6719
6727
  description: tool.description,
6720
6728
  input_schema: tool.input_schema,
6721
6729
  name: tool.name
6722
6730
  });
6731
+ var TOOL_SEARCH_TOOL = {
6732
+ name: "tool_search_tool_bm25",
6733
+ type: "tool_search_tool_bm25_20251119"
6734
+ };
6735
+ var CONTEXT_MANAGEMENT_BETA = "context-management-2025-06-27";
6736
+ var contextManagementFor = (clearing) => ({
6737
+ edits: [
6738
+ {
6739
+ ...clearing.clearAtLeastInputTokens === undefined ? {} : {
6740
+ clear_at_least: {
6741
+ type: "input_tokens",
6742
+ value: clearing.clearAtLeastInputTokens
6743
+ }
6744
+ },
6745
+ ...clearing.excludeTools?.length ? { exclude_tools: [...clearing.excludeTools] } : {},
6746
+ ...clearing.keepToolUses === undefined ? {} : { keep: { type: "tool_uses", value: clearing.keepToolUses } },
6747
+ trigger: { type: "input_tokens", value: clearing.triggerInputTokens },
6748
+ type: "clear_tool_uses_20250919"
6749
+ }
6750
+ ]
6751
+ });
6723
6752
  var requestOptionsFor = (params) => {
6724
6753
  const raw = params.providerOptions?.anthropic;
6725
6754
  if (raw === undefined)
@@ -6828,16 +6857,20 @@ var buildRequestBody3 = (params, configuredMax, configCaching) => {
6828
6857
  ] : params.systemPrompt;
6829
6858
  }
6830
6859
  const clientTools = params.tools?.map(mapToolDefinition2) ?? [];
6831
- if (clientTools.length > 0) {
6832
- if (caching) {
6833
- clientTools[clientTools.length - 1] = {
6834
- ...clientTools[clientTools.length - 1],
6835
- cache_control: { type: "ephemeral" }
6836
- };
6837
- }
6860
+ const deferring = clientTools.some((tool) => tool.defer_loading === true);
6861
+ const lastLoaded = clientTools.findLastIndex((tool) => tool.defer_loading !== true);
6862
+ if (caching && lastLoaded >= 0) {
6863
+ clientTools[lastLoaded] = {
6864
+ ...clientTools[lastLoaded],
6865
+ cache_control: { type: "ephemeral" }
6866
+ };
6838
6867
  }
6839
6868
  const serverTools = (options.serverTools ?? []).map(mapServerTool);
6840
- const tools = [...clientTools, ...serverTools];
6869
+ const tools = [
6870
+ ...clientTools,
6871
+ ...deferring ? [TOOL_SEARCH_TOOL] : [],
6872
+ ...serverTools
6873
+ ];
6841
6874
  if (tools.length > 0) {
6842
6875
  body.tools = tools;
6843
6876
  if (params.toolChoice === "auto" || params.toolChoice === "none") {
@@ -6851,6 +6884,9 @@ var buildRequestBody3 = (params, configuredMax, configCaching) => {
6851
6884
  if (params.stopSequences && params.stopSequences.length > 0) {
6852
6885
  body.stop_sequences = params.stopSequences;
6853
6886
  }
6887
+ if (params.toolResultClearing) {
6888
+ body.context_management = contextManagementFor(params.toolResultClearing);
6889
+ }
6854
6890
  const mode = params.reasoning && params.reasoning.effort !== "none" ? anthropicReasoningMode(params.model) : "none";
6855
6891
  if (params.reasoning?.effort === "none")
6856
6892
  body.thinking = { type: "disabled" };
@@ -7297,6 +7333,11 @@ var fetchAndStream = async function* (baseUrl, config, params, configuredMax, pr
7297
7333
  const suppliedHeaders = typeof config.headers === "function" ? await config.headers(params) : config.headers ?? {};
7298
7334
  const requestHeaders = new Headers(suppliedHeaders);
7299
7335
  requestHeaders.set("Content-Type", "application/json");
7336
+ if (body.context_management !== undefined) {
7337
+ const betas = (requestHeaders.get("anthropic-beta") ?? "").split(",").map((beta) => beta.trim()).filter(Boolean);
7338
+ if (!betas.includes(CONTEXT_MANAGEMENT_BETA))
7339
+ requestHeaders.set("anthropic-beta", [...betas, CONTEXT_MANAGEMENT_BETA].join(","));
7340
+ }
7300
7341
  if (config.authStyle === "bearer") {
7301
7342
  requestHeaders.set("Authorization", `Bearer ${token}`);
7302
7343
  } else {
@@ -7365,7 +7406,12 @@ var anthropic = (config) => {
7365
7406
  const hosted = tools.filter((tool) => isRecord5(tool) && typeof tool.type === "string" && /^(web_search_|web_fetch_|code_execution_|bash_code_execution_|text_editor_code_execution_|tool_search_tool_)/u.test(tool.type));
7366
7407
  const scope = hosted.length > 0 || body.mcp_servers !== undefined ? "caller-input" : "request";
7367
7408
  if (hosted.length > 0) {
7368
- const clientTools = tools.filter((tool) => !hosted.includes(tool));
7409
+ const clientTools = tools.filter((tool) => !hosted.includes(tool)).map((tool) => {
7410
+ if (!isRecord5(tool) || tool.defer_loading === undefined)
7411
+ return tool;
7412
+ const { defer_loading: _deferred, ...loaded } = tool;
7413
+ return loaded;
7414
+ });
7369
7415
  if (clientTools.length)
7370
7416
  counted.tools = clientTools;
7371
7417
  else
@@ -9197,5 +9243,5 @@ export {
9197
9243
  xai
9198
9244
  };
9199
9245
 
9200
- //# debugId=94F48F9A5CBF872A64756E2164756E21
9246
+ //# debugId=9A889A121344253764756E2164756E21
9201
9247
  //# sourceMappingURL=index.js.map