@tanstack/ai-anthropic 0.16.6 → 0.16.7

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 (32) hide show
  1. package/dist/esm/adapters/text.js +4 -3
  2. package/dist/esm/adapters/text.js.map +1 -1
  3. package/dist/esm/tools/anthropic-provider-tool.d.ts +24 -0
  4. package/dist/esm/tools/anthropic-provider-tool.js +50 -0
  5. package/dist/esm/tools/anthropic-provider-tool.js.map +1 -0
  6. package/dist/esm/tools/bash-tool.js +4 -4
  7. package/dist/esm/tools/bash-tool.js.map +1 -1
  8. package/dist/esm/tools/code-execution-tool.js +5 -5
  9. package/dist/esm/tools/code-execution-tool.js.map +1 -1
  10. package/dist/esm/tools/computer-use-tool.js +4 -4
  11. package/dist/esm/tools/computer-use-tool.js.map +1 -1
  12. package/dist/esm/tools/memory-tool.js +4 -4
  13. package/dist/esm/tools/memory-tool.js.map +1 -1
  14. package/dist/esm/tools/text-editor-tool.js +4 -4
  15. package/dist/esm/tools/text-editor-tool.js.map +1 -1
  16. package/dist/esm/tools/tool-converter.js +7 -4
  17. package/dist/esm/tools/tool-converter.js.map +1 -1
  18. package/dist/esm/tools/web-fetch-tool.js +4 -4
  19. package/dist/esm/tools/web-fetch-tool.js.map +1 -1
  20. package/dist/esm/tools/web-search-tool.js +9 -9
  21. package/dist/esm/tools/web-search-tool.js.map +1 -1
  22. package/package.json +3 -3
  23. package/src/adapters/text.ts +8 -5
  24. package/src/tools/anthropic-provider-tool.ts +68 -0
  25. package/src/tools/bash-tool.ts +13 -7
  26. package/src/tools/code-execution-tool.ts +22 -8
  27. package/src/tools/computer-use-tool.ts +15 -7
  28. package/src/tools/memory-tool.ts +16 -7
  29. package/src/tools/text-editor-tool.ts +15 -7
  30. package/src/tools/tool-converter.ts +7 -6
  31. package/src/tools/web-fetch-tool.ts +16 -7
  32. package/src/tools/web-search-tool.ts +27 -31
@@ -1 +1 @@
1
- {"version":3,"file":"memory-tool.js","names":[],"sources":["../../../src/tools/memory-tool.ts"],"sourcesContent":["import { brandProviderTool } from '@tanstack/ai'\nimport type { BetaMemoryTool20250818 } from '@anthropic-ai/sdk/resources/beta'\nimport type { ProviderTool, Tool } from '@tanstack/ai'\n\nexport type MemoryToolConfig = BetaMemoryTool20250818\n\n/** @deprecated Renamed to `MemoryToolConfig`. Will be removed in a future release. */\nexport type MemoryTool = MemoryToolConfig\n\nexport type AnthropicMemoryTool = ProviderTool<'anthropic', 'memory'>\n\nexport function convertMemoryToolToAdapterFormat(tool: Tool): MemoryToolConfig {\n const metadata = tool.metadata as Omit<MemoryToolConfig, 'type'>\n return {\n type: 'memory_20250818',\n ...metadata,\n }\n}\n\nexport function memoryTool(config?: MemoryToolConfig): AnthropicMemoryTool {\n return brandProviderTool<AnthropicMemoryTool>({\n name: 'memory',\n description: '',\n metadata: config,\n })\n}\n"],"mappings":";;AAWA,SAAgB,iCAAiC,MAA8B;CAE7E,OAAO;EACL,MAAM;EACN,GAHe,KAAK;CAItB;AACF;AAEA,SAAgB,WAAW,QAAgD;CACzE,OAAO,kBAAuC;EAC5C,MAAM;EACN,aAAa;EACb,UAAU;CACZ,CAAC;AACH"}
1
+ {"version":3,"file":"memory-tool.js","names":[],"sources":["../../../src/tools/memory-tool.ts"],"sourcesContent":["import {\n brandAnthropicProviderTool,\n getAnthropicProviderToolMetadata,\n} from './anthropic-provider-tool'\nimport type { BetaMemoryTool20250818 } from '@anthropic-ai/sdk/resources/beta'\nimport type { ProviderTool, Tool } from '@tanstack/ai'\n\nexport type MemoryToolConfig = BetaMemoryTool20250818\n\n/** @deprecated Renamed to `MemoryToolConfig`. Will be removed in a future release. */\nexport type MemoryTool = MemoryToolConfig\n\nexport type AnthropicMemoryTool = ProviderTool<'anthropic', 'memory'>\n\nexport function convertMemoryToolToAdapterFormat(tool: Tool): MemoryToolConfig {\n const metadata = getAnthropicProviderToolMetadata(tool) as Omit<\n MemoryToolConfig,\n 'type'\n >\n return {\n type: 'memory_20250818',\n ...metadata,\n }\n}\n\nexport function memoryTool(config?: MemoryToolConfig): AnthropicMemoryTool {\n return brandAnthropicProviderTool<AnthropicMemoryTool>(\n {\n name: 'memory',\n description: '',\n metadata: config,\n },\n 'memory',\n )\n}\n"],"mappings":";;AAcA,SAAgB,iCAAiC,MAA8B;CAK7E,OAAO;EACL,MAAM;EACN,GANe,iCAAiC,IAM7C;CACL;AACF;AAEA,SAAgB,WAAW,QAAgD;CACzE,OAAO,2BACL;EACE,MAAM;EACN,aAAa;EACb,UAAU;CACZ,GACA,QACF;AACF"}
@@ -1,14 +1,14 @@
1
- import { brandProviderTool } from "@tanstack/ai";
1
+ import { brandAnthropicProviderTool, getAnthropicProviderToolMetadata } from "./anthropic-provider-tool.js";
2
2
  //#region src/tools/text-editor-tool.ts
3
3
  function convertTextEditorToolToAdapterFormat(tool) {
4
- return { ...tool.metadata };
4
+ return { ...getAnthropicProviderToolMetadata(tool) };
5
5
  }
6
6
  function textEditorTool(config) {
7
- return brandProviderTool({
7
+ return brandAnthropicProviderTool({
8
8
  name: "str_replace_editor",
9
9
  description: "",
10
10
  metadata: config
11
- });
11
+ }, "text_editor");
12
12
  }
13
13
  //#endregion
14
14
  export { convertTextEditorToolToAdapterFormat, textEditorTool };
@@ -1 +1 @@
1
- {"version":3,"file":"text-editor-tool.js","names":[],"sources":["../../../src/tools/text-editor-tool.ts"],"sourcesContent":["import { brandProviderTool } from '@tanstack/ai'\nimport type {\n ToolTextEditor20250124,\n ToolTextEditor20250429,\n ToolTextEditor20250728,\n} from '@anthropic-ai/sdk/resources/messages'\nimport type { ProviderTool, Tool } from '@tanstack/ai'\n\nexport type TextEditorToolConfig =\n | ToolTextEditor20250124\n | ToolTextEditor20250429\n | ToolTextEditor20250728\n\n/** @deprecated Renamed to `TextEditorToolConfig`. Will be removed in a future release. */\nexport type TextEditorTool = TextEditorToolConfig\n\nexport type AnthropicTextEditorTool = ProviderTool<'anthropic', 'text_editor'>\n\nexport function convertTextEditorToolToAdapterFormat(\n tool: Tool,\n): TextEditorToolConfig {\n const metadata = tool.metadata as TextEditorToolConfig\n return {\n ...metadata,\n }\n}\n\nexport function textEditorTool<T extends TextEditorToolConfig>(\n config: T,\n): AnthropicTextEditorTool {\n return brandProviderTool<AnthropicTextEditorTool>({\n name: 'str_replace_editor',\n description: '',\n metadata: config,\n })\n}\n"],"mappings":";;AAkBA,SAAgB,qCACd,MACsB;CAEtB,OAAO,EACL,GAFe,KAAK,SAGtB;AACF;AAEA,SAAgB,eACd,QACyB;CACzB,OAAO,kBAA2C;EAChD,MAAM;EACN,aAAa;EACb,UAAU;CACZ,CAAC;AACH"}
1
+ {"version":3,"file":"text-editor-tool.js","names":[],"sources":["../../../src/tools/text-editor-tool.ts"],"sourcesContent":["import {\n brandAnthropicProviderTool,\n getAnthropicProviderToolMetadata,\n} from './anthropic-provider-tool'\nimport type {\n ToolTextEditor20250124,\n ToolTextEditor20250429,\n ToolTextEditor20250728,\n} from '@anthropic-ai/sdk/resources/messages'\nimport type { ProviderTool, Tool } from '@tanstack/ai'\n\nexport type TextEditorToolConfig =\n | ToolTextEditor20250124\n | ToolTextEditor20250429\n | ToolTextEditor20250728\n\n/** @deprecated Renamed to `TextEditorToolConfig`. Will be removed in a future release. */\nexport type TextEditorTool = TextEditorToolConfig\n\nexport type AnthropicTextEditorTool = ProviderTool<'anthropic', 'text_editor'>\n\nexport function convertTextEditorToolToAdapterFormat(\n tool: Tool,\n): TextEditorToolConfig {\n const metadata = getAnthropicProviderToolMetadata(\n tool,\n ) as TextEditorToolConfig\n return {\n ...metadata,\n }\n}\n\nexport function textEditorTool<T extends TextEditorToolConfig>(\n config: T,\n): AnthropicTextEditorTool {\n return brandAnthropicProviderTool<AnthropicTextEditorTool>(\n {\n name: 'str_replace_editor',\n description: '',\n metadata: config,\n },\n 'text_editor',\n )\n}\n"],"mappings":";;AAqBA,SAAgB,qCACd,MACsB;CAItB,OAAO,EACL,GAJe,iCACf,IAGG,EACL;AACF;AAEA,SAAgB,eACd,QACyB;CACzB,OAAO,2BACL;EACE,MAAM;EACN,aAAa;EACb,UAAU;CACZ,GACA,aACF;AACF"}
@@ -1,3 +1,4 @@
1
+ import { getAnthropicProviderToolKind } from "./anthropic-provider-tool.js";
1
2
  import { convertBashToolToAdapterFormat } from "./bash-tool.js";
2
3
  import { convertCodeExecutionToolToAdapterFormat } from "./code-execution-tool.js";
3
4
  import { convertComputerUseToolToAdapterFormat } from "./computer-use-tool.js";
@@ -6,6 +7,7 @@ import { convertMemoryToolToAdapterFormat } from "./memory-tool.js";
6
7
  import { convertTextEditorToolToAdapterFormat } from "./text-editor-tool.js";
7
8
  import { convertWebFetchToolToAdapterFormat } from "./web-fetch-tool.js";
8
9
  import { convertWebSearchToolToAdapterFormat } from "./web-search-tool.js";
10
+ import { assertUniqueToolNames } from "@tanstack/ai/adapter-internals";
9
11
  //#region src/tools/tool-converter.ts
10
12
  /**
11
13
  * Converts standard Tool format to Anthropic-specific tool format
@@ -32,16 +34,17 @@ import { convertWebSearchToolToAdapterFormat } from "./web-search-tool.js";
32
34
  * ```
33
35
  */
34
36
  function convertToolsToProviderFormat(tools) {
37
+ assertUniqueToolNames(tools);
35
38
  return tools.map((tool) => {
36
- switch (tool.name) {
39
+ switch (getAnthropicProviderToolKind(tool)) {
37
40
  case "bash": return convertBashToolToAdapterFormat(tool);
38
41
  case "code_execution": return convertCodeExecutionToolToAdapterFormat(tool);
39
- case "computer": return convertComputerUseToolToAdapterFormat(tool);
42
+ case "computer_use": return convertComputerUseToolToAdapterFormat(tool);
40
43
  case "memory": return convertMemoryToolToAdapterFormat(tool);
41
- case "str_replace_editor": return convertTextEditorToolToAdapterFormat(tool);
44
+ case "text_editor": return convertTextEditorToolToAdapterFormat(tool);
42
45
  case "web_fetch": return convertWebFetchToolToAdapterFormat(tool);
43
46
  case "web_search": return convertWebSearchToolToAdapterFormat(tool);
44
- default: return convertCustomToolToAdapterFormat(tool);
47
+ case void 0: return convertCustomToolToAdapterFormat(tool);
45
48
  }
46
49
  });
47
50
  }
@@ -1 +1 @@
1
- {"version":3,"file":"tool-converter.js","names":[],"sources":["../../../src/tools/tool-converter.ts"],"sourcesContent":["import { convertBashToolToAdapterFormat } from './bash-tool'\nimport { convertCodeExecutionToolToAdapterFormat } from './code-execution-tool'\nimport { convertComputerUseToolToAdapterFormat } from './computer-use-tool'\nimport { convertCustomToolToAdapterFormat } from './custom-tool'\nimport { convertMemoryToolToAdapterFormat } from './memory-tool'\nimport { convertTextEditorToolToAdapterFormat } from './text-editor-tool'\nimport { convertWebFetchToolToAdapterFormat } from './web-fetch-tool'\nimport { convertWebSearchToolToAdapterFormat } from './web-search-tool'\nimport type { AnthropicTool } from './index'\nimport type { Tool } from '@tanstack/ai'\n\n/**\n * Converts standard Tool format to Anthropic-specific tool format\n *\n * @param tools - Array of standard Tool objects\n * @returns Array of Anthropic-specific tool definitions\n *\n * @example\n * ```typescript\n * const tools: Tool[] = [{\n * type: \"function\",\n * function: {\n * name: \"get_weather\",\n * description: \"Get weather for a location\",\n * parameters: {\n * type: \"object\",\n * properties: { location: { type: \"string\" } },\n * required: [\"location\"]\n * }\n * }\n * }];\n *\n * const anthropicTools = convertToolsToProviderFormat(tools);\n * ```\n */\nexport function convertToolsToProviderFormat<TTool extends Tool>(\n tools: Array<TTool>,\n): Array<AnthropicTool> {\n return tools.map((tool) => {\n const name = tool.name\n\n switch (name) {\n case 'bash':\n return convertBashToolToAdapterFormat(tool)\n case 'code_execution':\n return convertCodeExecutionToolToAdapterFormat(tool)\n case 'computer':\n return convertComputerUseToolToAdapterFormat(tool)\n case 'memory':\n return convertMemoryToolToAdapterFormat(tool)\n case 'str_replace_editor':\n return convertTextEditorToolToAdapterFormat(tool)\n case 'web_fetch':\n return convertWebFetchToolToAdapterFormat(tool)\n case 'web_search':\n return convertWebSearchToolToAdapterFormat(tool)\n default:\n return convertCustomToolToAdapterFormat(tool)\n }\n })\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmCA,SAAgB,6BACd,OACsB;CACtB,OAAO,MAAM,KAAK,SAAS;EAGzB,QAFa,KAAK,MAElB;GACE,KAAK,QACH,OAAO,+BAA+B,IAAI;GAC5C,KAAK,kBACH,OAAO,wCAAwC,IAAI;GACrD,KAAK,YACH,OAAO,sCAAsC,IAAI;GACnD,KAAK,UACH,OAAO,iCAAiC,IAAI;GAC9C,KAAK,sBACH,OAAO,qCAAqC,IAAI;GAClD,KAAK,aACH,OAAO,mCAAmC,IAAI;GAChD,KAAK,cACH,OAAO,oCAAoC,IAAI;GACjD,SACE,OAAO,iCAAiC,IAAI;EAChD;CACF,CAAC;AACH"}
1
+ {"version":3,"file":"tool-converter.js","names":[],"sources":["../../../src/tools/tool-converter.ts"],"sourcesContent":["import { assertUniqueToolNames } from '@tanstack/ai/adapter-internals'\nimport { getAnthropicProviderToolKind } from './anthropic-provider-tool'\nimport { convertBashToolToAdapterFormat } from './bash-tool'\nimport { convertCodeExecutionToolToAdapterFormat } from './code-execution-tool'\nimport { convertComputerUseToolToAdapterFormat } from './computer-use-tool'\nimport { convertCustomToolToAdapterFormat } from './custom-tool'\nimport { convertMemoryToolToAdapterFormat } from './memory-tool'\nimport { convertTextEditorToolToAdapterFormat } from './text-editor-tool'\nimport { convertWebFetchToolToAdapterFormat } from './web-fetch-tool'\nimport { convertWebSearchToolToAdapterFormat } from './web-search-tool'\nimport type { AnthropicTool } from './index'\nimport type { Tool } from '@tanstack/ai'\n\n/**\n * Converts standard Tool format to Anthropic-specific tool format\n *\n * @param tools - Array of standard Tool objects\n * @returns Array of Anthropic-specific tool definitions\n *\n * @example\n * ```typescript\n * const tools: Tool[] = [{\n * type: \"function\",\n * function: {\n * name: \"get_weather\",\n * description: \"Get weather for a location\",\n * parameters: {\n * type: \"object\",\n * properties: { location: { type: \"string\" } },\n * required: [\"location\"]\n * }\n * }\n * }];\n *\n * const anthropicTools = convertToolsToProviderFormat(tools);\n * ```\n */\nexport function convertToolsToProviderFormat<TTool extends Tool>(\n tools: Array<TTool>,\n): Array<AnthropicTool> {\n assertUniqueToolNames(tools)\n return tools.map((tool) => {\n switch (getAnthropicProviderToolKind(tool)) {\n case 'bash':\n return convertBashToolToAdapterFormat(tool)\n case 'code_execution':\n return convertCodeExecutionToolToAdapterFormat(tool)\n case 'computer_use':\n return convertComputerUseToolToAdapterFormat(tool)\n case 'memory':\n return convertMemoryToolToAdapterFormat(tool)\n case 'text_editor':\n return convertTextEditorToolToAdapterFormat(tool)\n case 'web_fetch':\n return convertWebFetchToolToAdapterFormat(tool)\n case 'web_search':\n return convertWebSearchToolToAdapterFormat(tool)\n case undefined:\n return convertCustomToolToAdapterFormat(tool)\n }\n })\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqCA,SAAgB,6BACd,OACsB;CACtB,sBAAsB,KAAK;CAC3B,OAAO,MAAM,KAAK,SAAS;EACzB,QAAQ,6BAA6B,IAAI,GAAzC;GACE,KAAK,QACH,OAAO,+BAA+B,IAAI;GAC5C,KAAK,kBACH,OAAO,wCAAwC,IAAI;GACrD,KAAK,gBACH,OAAO,sCAAsC,IAAI;GACnD,KAAK,UACH,OAAO,iCAAiC,IAAI;GAC9C,KAAK,eACH,OAAO,qCAAqC,IAAI;GAClD,KAAK,aACH,OAAO,mCAAmC,IAAI;GAChD,KAAK,cACH,OAAO,oCAAoC,IAAI;GACjD,KAAK,KAAA,GACH,OAAO,iCAAiC,IAAI;EAChD;CACF,CAAC;AACH"}
@@ -1,18 +1,18 @@
1
- import { brandProviderTool } from "@tanstack/ai";
1
+ import { brandAnthropicProviderTool, getAnthropicProviderToolMetadata } from "./anthropic-provider-tool.js";
2
2
  //#region src/tools/web-fetch-tool.ts
3
3
  function convertWebFetchToolToAdapterFormat(tool) {
4
4
  return {
5
5
  name: "web_fetch",
6
6
  type: "web_fetch_20250910",
7
- ...tool.metadata
7
+ ...getAnthropicProviderToolMetadata(tool)
8
8
  };
9
9
  }
10
10
  function webFetchTool(config) {
11
- return brandProviderTool({
11
+ return brandAnthropicProviderTool({
12
12
  name: "web_fetch",
13
13
  description: "",
14
14
  metadata: config
15
- });
15
+ }, "web_fetch");
16
16
  }
17
17
  //#endregion
18
18
  export { convertWebFetchToolToAdapterFormat, webFetchTool };
@@ -1 +1 @@
1
- {"version":3,"file":"web-fetch-tool.js","names":[],"sources":["../../../src/tools/web-fetch-tool.ts"],"sourcesContent":["import { brandProviderTool } from '@tanstack/ai'\nimport type { BetaWebFetchTool20250910 } from '@anthropic-ai/sdk/resources/beta'\nimport type { ProviderTool, Tool } from '@tanstack/ai'\n\nexport type WebFetchToolConfig = BetaWebFetchTool20250910\n\n/** @deprecated Renamed to `WebFetchToolConfig`. Will be removed in a future release. */\nexport type WebFetchTool = WebFetchToolConfig\n\nexport type AnthropicWebFetchTool = ProviderTool<'anthropic', 'web_fetch'>\n\nexport function convertWebFetchToolToAdapterFormat(\n tool: Tool,\n): WebFetchToolConfig {\n const metadata = tool.metadata as Omit<WebFetchToolConfig, 'type' | 'name'>\n return {\n name: 'web_fetch',\n type: 'web_fetch_20250910',\n ...metadata,\n }\n}\n\nexport function webFetchTool(\n config?: Omit<WebFetchToolConfig, 'type' | 'name'>,\n): AnthropicWebFetchTool {\n return brandProviderTool<AnthropicWebFetchTool>({\n name: 'web_fetch',\n description: '',\n metadata: config,\n })\n}\n"],"mappings":";;AAWA,SAAgB,mCACd,MACoB;CAEpB,OAAO;EACL,MAAM;EACN,MAAM;EACN,GAJe,KAAK;CAKtB;AACF;AAEA,SAAgB,aACd,QACuB;CACvB,OAAO,kBAAyC;EAC9C,MAAM;EACN,aAAa;EACb,UAAU;CACZ,CAAC;AACH"}
1
+ {"version":3,"file":"web-fetch-tool.js","names":[],"sources":["../../../src/tools/web-fetch-tool.ts"],"sourcesContent":["import {\n brandAnthropicProviderTool,\n getAnthropicProviderToolMetadata,\n} from './anthropic-provider-tool'\nimport type { BetaWebFetchTool20250910 } from '@anthropic-ai/sdk/resources/beta'\nimport type { ProviderTool, Tool } from '@tanstack/ai'\n\nexport type WebFetchToolConfig = BetaWebFetchTool20250910\n\n/** @deprecated Renamed to `WebFetchToolConfig`. Will be removed in a future release. */\nexport type WebFetchTool = WebFetchToolConfig\n\nexport type AnthropicWebFetchTool = ProviderTool<'anthropic', 'web_fetch'>\n\nexport function convertWebFetchToolToAdapterFormat(\n tool: Tool,\n): WebFetchToolConfig {\n const metadata = getAnthropicProviderToolMetadata(tool) as Omit<\n WebFetchToolConfig,\n 'type' | 'name'\n >\n return {\n name: 'web_fetch',\n type: 'web_fetch_20250910',\n ...metadata,\n }\n}\n\nexport function webFetchTool(\n config?: Omit<WebFetchToolConfig, 'type' | 'name'>,\n): AnthropicWebFetchTool {\n return brandAnthropicProviderTool<AnthropicWebFetchTool>(\n {\n name: 'web_fetch',\n description: '',\n metadata: config,\n },\n 'web_fetch',\n )\n}\n"],"mappings":";;AAcA,SAAgB,mCACd,MACoB;CAKpB,OAAO;EACL,MAAM;EACN,MAAM;EACN,GAPe,iCAAiC,IAO7C;CACL;AACF;AAEA,SAAgB,aACd,QACuB;CACvB,OAAO,2BACL;EACE,MAAM;EACN,aAAa;EACb,UAAU;CACZ,GACA,WACF;AACF"}
@@ -1,4 +1,4 @@
1
- import { brandProviderTool } from "@tanstack/ai";
1
+ import { brandAnthropicProviderTool, getAnthropicProviderToolMetadata } from "./anthropic-provider-tool.js";
2
2
  //#region src/tools/web-search-tool.ts
3
3
  var validateDomains = (tool) => {
4
4
  if (tool.allowed_domains && tool.blocked_domains) throw new Error("allowed_domains and blocked_domains cannot be used together.");
@@ -13,25 +13,25 @@ var validateUserLocation = (tool) => {
13
13
  }
14
14
  };
15
15
  function convertWebSearchToolToAdapterFormat(tool) {
16
- const metadata = tool.metadata;
16
+ const metadata = getAnthropicProviderToolMetadata(tool);
17
17
  return {
18
18
  name: "web_search",
19
19
  type: "web_search_20250305",
20
- ...metadata.allowedDomains !== void 0 && { allowed_domains: metadata.allowedDomains },
21
- ...metadata.blockedDomains !== void 0 && { blocked_domains: metadata.blockedDomains },
22
- ...metadata.maxUses !== void 0 && { max_uses: metadata.maxUses },
23
- ...metadata.userLocation !== void 0 && { user_location: metadata.userLocation },
24
- cache_control: metadata.cacheControl || null
20
+ ...metadata?.allowed_domains !== void 0 && { allowed_domains: metadata.allowed_domains },
21
+ ...metadata?.blocked_domains !== void 0 && { blocked_domains: metadata.blocked_domains },
22
+ ...metadata?.max_uses !== void 0 && { max_uses: metadata.max_uses },
23
+ ...metadata?.user_location !== void 0 && { user_location: metadata.user_location },
24
+ ...metadata?.cache_control !== void 0 && { cache_control: metadata.cache_control }
25
25
  };
26
26
  }
27
27
  function webSearchTool(config) {
28
28
  validateDomains(config);
29
29
  validateUserLocation(config);
30
- return brandProviderTool({
30
+ return brandAnthropicProviderTool({
31
31
  name: "web_search",
32
32
  description: "",
33
33
  metadata: config
34
- });
34
+ }, "web_search");
35
35
  }
36
36
  //#endregion
37
37
  export { convertWebSearchToolToAdapterFormat, webSearchTool };
@@ -1 +1 @@
1
- {"version":3,"file":"web-search-tool.js","names":[],"sources":["../../../src/tools/web-search-tool.ts"],"sourcesContent":["import { brandProviderTool } from '@tanstack/ai'\nimport type { WebSearchTool20250305 } from '@anthropic-ai/sdk/resources/messages'\nimport type { CacheControl } from '../text/text-provider-options'\nimport type { ProviderTool, Tool } from '@tanstack/ai'\n\nexport type WebSearchToolConfig = WebSearchTool20250305\n\n/** @deprecated Renamed to `WebSearchToolConfig`. Will be removed in a future release. */\nexport type WebSearchTool = WebSearchToolConfig\n\nexport type AnthropicWebSearchTool = ProviderTool<'anthropic', 'web_search'>\n\nconst validateDomains = (tool: WebSearchToolConfig) => {\n if (tool.allowed_domains && tool.blocked_domains) {\n throw new Error(\n 'allowed_domains and blocked_domains cannot be used together.',\n )\n }\n}\n\nconst validateUserLocation = (tool: WebSearchToolConfig) => {\n const userLocation = tool.user_location\n if (userLocation) {\n if (\n userLocation.city &&\n (userLocation.city.length < 1 || userLocation.city.length > 255)\n ) {\n throw new Error(\n 'user_location.city must be between 1 and 255 characters.',\n )\n }\n if (userLocation.country && userLocation.country.length !== 2) {\n throw new Error('user_location.country must be exactly 2 characters.')\n }\n if (\n userLocation.region &&\n (userLocation.region.length < 1 || userLocation.region.length > 255)\n ) {\n throw new Error(\n 'user_location.region must be between 1 and 255 characters.',\n )\n }\n if (\n userLocation.timezone &&\n (userLocation.timezone.length < 1 || userLocation.timezone.length > 255)\n ) {\n throw new Error(\n 'user_location.timezone must be between 1 and 255 characters.',\n )\n }\n }\n}\n\nexport function convertWebSearchToolToAdapterFormat(\n tool: Tool,\n): WebSearchToolConfig {\n const metadata = tool.metadata as {\n allowedDomains?: Array<string> | null\n blockedDomains?: Array<string> | null\n maxUses?: number | null\n userLocation?: {\n type: 'approximate'\n city?: string | null\n country?: string | null\n region?: string | null\n timezone?: string | null\n } | null\n cacheControl?: CacheControl | null\n }\n // Vendor `WebSearchTool20250305` declares these fields as `T | null`\n // (no `| undefined`) under exactOptionalPropertyTypes, so spread them\n // conditionally rather than passing explicit `undefined`.\n return {\n name: 'web_search',\n type: 'web_search_20250305',\n ...(metadata.allowedDomains !== undefined && {\n allowed_domains: metadata.allowedDomains,\n }),\n ...(metadata.blockedDomains !== undefined && {\n blocked_domains: metadata.blockedDomains,\n }),\n ...(metadata.maxUses !== undefined && { max_uses: metadata.maxUses }),\n ...(metadata.userLocation !== undefined && {\n user_location: metadata.userLocation,\n }),\n cache_control: metadata.cacheControl || null,\n }\n}\n\nexport function webSearchTool(\n config: WebSearchToolConfig,\n): AnthropicWebSearchTool {\n validateDomains(config)\n validateUserLocation(config)\n return brandProviderTool<AnthropicWebSearchTool>({\n name: 'web_search',\n description: '',\n metadata: config,\n })\n}\n"],"mappings":";;AAYA,IAAM,mBAAmB,SAA8B;CACrD,IAAI,KAAK,mBAAmB,KAAK,iBAC/B,MAAM,IAAI,MACR,8DACF;AAEJ;AAEA,IAAM,wBAAwB,SAA8B;CAC1D,MAAM,eAAe,KAAK;CAC1B,IAAI,cAAc;EAChB,IACE,aAAa,SACZ,aAAa,KAAK,SAAS,KAAK,aAAa,KAAK,SAAS,MAE5D,MAAM,IAAI,MACR,0DACF;EAEF,IAAI,aAAa,WAAW,aAAa,QAAQ,WAAW,GAC1D,MAAM,IAAI,MAAM,qDAAqD;EAEvE,IACE,aAAa,WACZ,aAAa,OAAO,SAAS,KAAK,aAAa,OAAO,SAAS,MAEhE,MAAM,IAAI,MACR,4DACF;EAEF,IACE,aAAa,aACZ,aAAa,SAAS,SAAS,KAAK,aAAa,SAAS,SAAS,MAEpE,MAAM,IAAI,MACR,8DACF;CAEJ;AACF;AAEA,SAAgB,oCACd,MACqB;CACrB,MAAM,WAAW,KAAK;CAgBtB,OAAO;EACL,MAAM;EACN,MAAM;EACN,GAAI,SAAS,mBAAmB,KAAA,KAAa,EAC3C,iBAAiB,SAAS,eAC5B;EACA,GAAI,SAAS,mBAAmB,KAAA,KAAa,EAC3C,iBAAiB,SAAS,eAC5B;EACA,GAAI,SAAS,YAAY,KAAA,KAAa,EAAE,UAAU,SAAS,QAAQ;EACnE,GAAI,SAAS,iBAAiB,KAAA,KAAa,EACzC,eAAe,SAAS,aAC1B;EACA,eAAe,SAAS,gBAAgB;CAC1C;AACF;AAEA,SAAgB,cACd,QACwB;CACxB,gBAAgB,MAAM;CACtB,qBAAqB,MAAM;CAC3B,OAAO,kBAA0C;EAC/C,MAAM;EACN,aAAa;EACb,UAAU;CACZ,CAAC;AACH"}
1
+ {"version":3,"file":"web-search-tool.js","names":[],"sources":["../../../src/tools/web-search-tool.ts"],"sourcesContent":["import {\n brandAnthropicProviderTool,\n getAnthropicProviderToolMetadata,\n} from './anthropic-provider-tool'\nimport type { WebSearchTool20250305 } from '@anthropic-ai/sdk/resources/messages'\nimport type { ProviderTool, Tool } from '@tanstack/ai'\n\nexport type WebSearchToolConfig = WebSearchTool20250305\n\n/** @deprecated Renamed to `WebSearchToolConfig`. Will be removed in a future release. */\nexport type WebSearchTool = WebSearchToolConfig\n\nexport type AnthropicWebSearchTool = ProviderTool<'anthropic', 'web_search'>\n\nconst validateDomains = (tool: WebSearchToolConfig) => {\n if (tool.allowed_domains && tool.blocked_domains) {\n throw new Error(\n 'allowed_domains and blocked_domains cannot be used together.',\n )\n }\n}\n\nconst validateUserLocation = (tool: WebSearchToolConfig) => {\n const userLocation = tool.user_location\n if (userLocation) {\n if (\n userLocation.city &&\n (userLocation.city.length < 1 || userLocation.city.length > 255)\n ) {\n throw new Error(\n 'user_location.city must be between 1 and 255 characters.',\n )\n }\n if (userLocation.country && userLocation.country.length !== 2) {\n throw new Error('user_location.country must be exactly 2 characters.')\n }\n if (\n userLocation.region &&\n (userLocation.region.length < 1 || userLocation.region.length > 255)\n ) {\n throw new Error(\n 'user_location.region must be between 1 and 255 characters.',\n )\n }\n if (\n userLocation.timezone &&\n (userLocation.timezone.length < 1 || userLocation.timezone.length > 255)\n ) {\n throw new Error(\n 'user_location.timezone must be between 1 and 255 characters.',\n )\n }\n }\n}\n\nexport function convertWebSearchToolToAdapterFormat(\n tool: Tool,\n): WebSearchToolConfig {\n // The factory stores the SDK config (`allowed_domains`, `max_uses`, …)\n // on `metadata`. Vendor `WebSearchTool20250305` declares those fields as\n // `T | null` (no `| undefined`) under exactOptionalPropertyTypes, so\n // spread them only when present rather than passing explicit `undefined`.\n const metadata = getAnthropicProviderToolMetadata(tool)\n return {\n name: 'web_search',\n type: 'web_search_20250305',\n ...(metadata?.allowed_domains !== undefined && {\n allowed_domains: metadata.allowed_domains,\n }),\n ...(metadata?.blocked_domains !== undefined && {\n blocked_domains: metadata.blocked_domains,\n }),\n ...(metadata?.max_uses !== undefined && { max_uses: metadata.max_uses }),\n ...(metadata?.user_location !== undefined && {\n user_location: metadata.user_location,\n }),\n ...(metadata?.cache_control !== undefined && {\n cache_control: metadata.cache_control,\n }),\n }\n}\n\nexport function webSearchTool(\n config: WebSearchToolConfig,\n): AnthropicWebSearchTool {\n validateDomains(config)\n validateUserLocation(config)\n return brandAnthropicProviderTool<AnthropicWebSearchTool>(\n {\n name: 'web_search',\n description: '',\n metadata: config,\n },\n 'web_search',\n )\n}\n"],"mappings":";;AAcA,IAAM,mBAAmB,SAA8B;CACrD,IAAI,KAAK,mBAAmB,KAAK,iBAC/B,MAAM,IAAI,MACR,8DACF;AAEJ;AAEA,IAAM,wBAAwB,SAA8B;CAC1D,MAAM,eAAe,KAAK;CAC1B,IAAI,cAAc;EAChB,IACE,aAAa,SACZ,aAAa,KAAK,SAAS,KAAK,aAAa,KAAK,SAAS,MAE5D,MAAM,IAAI,MACR,0DACF;EAEF,IAAI,aAAa,WAAW,aAAa,QAAQ,WAAW,GAC1D,MAAM,IAAI,MAAM,qDAAqD;EAEvE,IACE,aAAa,WACZ,aAAa,OAAO,SAAS,KAAK,aAAa,OAAO,SAAS,MAEhE,MAAM,IAAI,MACR,4DACF;EAEF,IACE,aAAa,aACZ,aAAa,SAAS,SAAS,KAAK,aAAa,SAAS,SAAS,MAEpE,MAAM,IAAI,MACR,8DACF;CAEJ;AACF;AAEA,SAAgB,oCACd,MACqB;CAKrB,MAAM,WAAW,iCAAiC,IAAI;CACtD,OAAO;EACL,MAAM;EACN,MAAM;EACN,GAAI,UAAU,oBAAoB,KAAA,KAAa,EAC7C,iBAAiB,SAAS,gBAC5B;EACA,GAAI,UAAU,oBAAoB,KAAA,KAAa,EAC7C,iBAAiB,SAAS,gBAC5B;EACA,GAAI,UAAU,aAAa,KAAA,KAAa,EAAE,UAAU,SAAS,SAAS;EACtE,GAAI,UAAU,kBAAkB,KAAA,KAAa,EAC3C,eAAe,SAAS,cAC1B;EACA,GAAI,UAAU,kBAAkB,KAAA,KAAa,EAC3C,eAAe,SAAS,cAC1B;CACF;AACF;AAEA,SAAgB,cACd,QACwB;CACxB,gBAAgB,MAAM;CACtB,qBAAqB,MAAM;CAC3B,OAAO,2BACL;EACE,MAAM;EACN,aAAa;EACb,UAAU;CACZ,GACA,YACF;AACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tanstack/ai-anthropic",
3
- "version": "0.16.6",
3
+ "version": "0.16.7",
4
4
  "description": "Anthropic Claude adapter for TanStack AI chat, tool calling, thinking, and structured outputs.",
5
5
  "author": "Tanner Linsley",
6
6
  "license": "MIT",
@@ -53,12 +53,12 @@
53
53
  },
54
54
  "peerDependencies": {
55
55
  "zod": "^4.0.0",
56
- "@tanstack/ai": "^0.45.0"
56
+ "@tanstack/ai": "^0.46.0"
57
57
  },
58
58
  "devDependencies": {
59
59
  "@vitest/coverage-v8": "4.1.10",
60
60
  "zod": "^4.2.0",
61
- "@tanstack/ai": "0.45.0"
61
+ "@tanstack/ai": "0.46.0"
62
62
  },
63
63
  "scripts": {
64
64
  "build": "vite build",
@@ -2,6 +2,7 @@ import { EventType, normalizeSystemPrompts } from '@tanstack/ai'
2
2
  import { toRunErrorRawEvent } from '@tanstack/ai/adapter-internals'
3
3
  import { BaseTextAdapter } from '@tanstack/ai/adapters'
4
4
  import { convertToolsToProviderFormat } from '../tools/tool-converter'
5
+ import { getAnthropicProviderToolKind } from '../tools/anthropic-provider-tool'
5
6
  import {
6
7
  readCodeExecutionConfig,
7
8
  readCodeExecutionSkills,
@@ -171,7 +172,9 @@ export function computeAnthropicBetas(
171
172
 
172
173
  // Code-execution beta is version-aware: select from the FIRST code_execution
173
174
  // tool's config type.
174
- const codeExecTool = tools?.find((t) => t.name === 'code_execution')
175
+ const codeExecTool = tools?.find(
176
+ (tool) => getAnthropicProviderToolKind(tool) === 'code_execution',
177
+ )
175
178
  if (codeExecTool) {
176
179
  const cfgType = readCodeExecutionConfig(codeExecTool)?.type
177
180
  // Each code_execution tool version pairs with a specific beta. Known
@@ -188,9 +191,9 @@ export function computeAnthropicBetas(
188
191
  // container-lift, which lifts skills from any code_execution tool that
189
192
  // carries them (not just the first).
190
193
  const hasSkills = tools?.some(
191
- (t) =>
192
- t.name === 'code_execution' &&
193
- (readCodeExecutionSkills(t)?.length ?? 0) > 0,
194
+ (tool) =>
195
+ getAnthropicProviderToolKind(tool) === 'code_execution' &&
196
+ (readCodeExecutionSkills(tool)?.length ?? 0) > 0,
194
197
  )
195
198
  if (hasSkills) betas.add('skills-2025-10-02')
196
199
 
@@ -575,7 +578,7 @@ export class AnthropicTextAdapter<
575
578
  // canonical path for skills; `modelOptions.container.skills` is deprecated.
576
579
  const toolSkills = options.tools
577
580
  ?.map((tool) =>
578
- tool.name === 'code_execution'
581
+ getAnthropicProviderToolKind(tool) === 'code_execution'
579
582
  ? readCodeExecutionSkills(tool)
580
583
  : undefined,
581
584
  )
@@ -0,0 +1,68 @@
1
+ import { brandProviderTool } from '@tanstack/ai'
2
+ import type { ProviderTool, Tool } from '@tanstack/ai'
3
+
4
+ const ANTHROPIC_PROVIDER_TOOL_KINDS = {
5
+ bash: 'anthropic.bash',
6
+ code_execution: 'anthropic.code_execution',
7
+ computer_use: 'anthropic.computer_use',
8
+ memory: 'anthropic.memory',
9
+ text_editor: 'anthropic.text_editor',
10
+ web_fetch: 'anthropic.web_fetch',
11
+ web_search: 'anthropic.web_search',
12
+ } as const
13
+
14
+ type AnthropicProviderToolKind = keyof typeof ANTHROPIC_PROVIDER_TOOL_KINDS
15
+
16
+ /**
17
+ * Adds a stable runtime discriminator to an Anthropic-native tool.
18
+ *
19
+ * The core ProviderTool brand is intentionally type-only. Anthropic also needs
20
+ * a runtime discriminator because custom functions may use the same public
21
+ * names as native tools. Adapter metadata is the repository-wide extension
22
+ * point for this plain-data marker; converters remove it from the wire shape.
23
+ */
24
+ export function brandAnthropicProviderTool<
25
+ T extends ProviderTool<'anthropic', AnthropicProviderToolKind>,
26
+ >(tool: Omit<T, '~provider' | '~toolKind'>, toolKind: T['~toolKind']): T {
27
+ return brandProviderTool<T>({
28
+ ...tool,
29
+ metadata: {
30
+ ...tool.metadata,
31
+ __kind: ANTHROPIC_PROVIDER_TOOL_KINDS[toolKind],
32
+ },
33
+ })
34
+ }
35
+
36
+ export function getAnthropicProviderToolKind(
37
+ tool: Tool,
38
+ ): AnthropicProviderToolKind | undefined {
39
+ const toolKind = tool.metadata?.['__kind']
40
+ switch (toolKind) {
41
+ case 'anthropic.bash':
42
+ return 'bash'
43
+ case 'anthropic.code_execution':
44
+ return 'code_execution'
45
+ case 'anthropic.computer_use':
46
+ return 'computer_use'
47
+ case 'anthropic.memory':
48
+ return 'memory'
49
+ case 'anthropic.text_editor':
50
+ return 'text_editor'
51
+ case 'anthropic.web_fetch':
52
+ return 'web_fetch'
53
+ case 'anthropic.web_search':
54
+ return 'web_search'
55
+ default:
56
+ return undefined
57
+ }
58
+ }
59
+
60
+ /** Returns adapter metadata without the internal runtime discriminator. */
61
+ export function getAnthropicProviderToolMetadata(tool: Tool): Tool['metadata'] {
62
+ if (!tool.metadata) {
63
+ return undefined
64
+ }
65
+ const { __kind: _kind, ...metadata } = tool.metadata
66
+ void _kind
67
+ return metadata
68
+ }
@@ -1,4 +1,7 @@
1
- import { brandProviderTool } from '@tanstack/ai'
1
+ import {
2
+ brandAnthropicProviderTool,
3
+ getAnthropicProviderToolMetadata,
4
+ } from './anthropic-provider-tool'
2
5
  import type {
3
6
  BetaToolBash20241022,
4
7
  BetaToolBash20250124,
@@ -13,14 +16,17 @@ export type BashTool = BashToolConfig
13
16
  export type AnthropicBashTool = ProviderTool<'anthropic', 'bash'>
14
17
 
15
18
  export function convertBashToolToAdapterFormat(tool: Tool): BashToolConfig {
16
- const metadata = tool.metadata as BashToolConfig
19
+ const metadata = getAnthropicProviderToolMetadata(tool) as BashToolConfig
17
20
  return metadata
18
21
  }
19
22
 
20
23
  export function bashTool(config: BashToolConfig): AnthropicBashTool {
21
- return brandProviderTool<AnthropicBashTool>({
22
- name: 'bash',
23
- description: '',
24
- metadata: config,
25
- })
24
+ return brandAnthropicProviderTool<AnthropicBashTool>(
25
+ {
26
+ name: 'bash',
27
+ description: '',
28
+ metadata: config,
29
+ },
30
+ 'bash',
31
+ )
26
32
  }
@@ -1,4 +1,7 @@
1
- import { brandProviderTool } from '@tanstack/ai'
1
+ import {
2
+ brandAnthropicProviderTool,
3
+ getAnthropicProviderToolMetadata,
4
+ } from './anthropic-provider-tool'
2
5
  import type {
3
6
  BetaCodeExecutionTool20250522,
4
7
  BetaCodeExecutionTool20250825,
@@ -56,7 +59,11 @@ export function convertCodeExecutionToolToAdapterFormat(
56
59
  export function readCodeExecutionConfig(
57
60
  tool: Tool,
58
61
  ): CodeExecutionToolConfig | undefined {
59
- return (tool.metadata as CodeExecutionToolMetadata | undefined)?.config
62
+ return (
63
+ getAnthropicProviderToolMetadata(tool) as
64
+ | CodeExecutionToolMetadata
65
+ | undefined
66
+ )?.config
60
67
  }
61
68
 
62
69
  /**
@@ -66,7 +73,11 @@ export function readCodeExecutionConfig(
66
73
  export function readCodeExecutionSkills(
67
74
  tool: Tool,
68
75
  ): Array<AnthropicContainerSkill> | undefined {
69
- return (tool.metadata as CodeExecutionToolMetadata | undefined)?.skills
76
+ return (
77
+ getAnthropicProviderToolMetadata(tool) as
78
+ | CodeExecutionToolMetadata
79
+ | undefined
80
+ )?.skills
70
81
  }
71
82
 
72
83
  export function codeExecutionTool(
@@ -88,9 +99,12 @@ export function codeExecutionTool(
88
99
  config,
89
100
  ...(skills && { skills }),
90
101
  }
91
- return brandProviderTool<AnthropicCodeExecutionTool>({
92
- name: 'code_execution',
93
- description: '',
94
- metadata,
95
- })
102
+ return brandAnthropicProviderTool<AnthropicCodeExecutionTool>(
103
+ {
104
+ name: 'code_execution',
105
+ description: '',
106
+ metadata,
107
+ },
108
+ 'code_execution',
109
+ )
96
110
  }
@@ -1,4 +1,7 @@
1
- import { brandProviderTool } from '@tanstack/ai'
1
+ import {
2
+ brandAnthropicProviderTool,
3
+ getAnthropicProviderToolMetadata,
4
+ } from './anthropic-provider-tool'
2
5
  import type {
3
6
  BetaToolComputerUse20241022,
4
7
  BetaToolComputerUse20250124,
@@ -17,16 +20,21 @@ export type AnthropicComputerUseTool = ProviderTool<'anthropic', 'computer_use'>
17
20
  export function convertComputerUseToolToAdapterFormat(
18
21
  tool: Tool,
19
22
  ): ComputerUseToolConfig {
20
- const metadata = tool.metadata as ComputerUseToolConfig
23
+ const metadata = getAnthropicProviderToolMetadata(
24
+ tool,
25
+ ) as ComputerUseToolConfig
21
26
  return metadata
22
27
  }
23
28
 
24
29
  export function computerUseTool(
25
30
  config: ComputerUseToolConfig,
26
31
  ): AnthropicComputerUseTool {
27
- return brandProviderTool<AnthropicComputerUseTool>({
28
- name: 'computer',
29
- description: '',
30
- metadata: config,
31
- })
32
+ return brandAnthropicProviderTool<AnthropicComputerUseTool>(
33
+ {
34
+ name: 'computer',
35
+ description: '',
36
+ metadata: config,
37
+ },
38
+ 'computer_use',
39
+ )
32
40
  }
@@ -1,4 +1,7 @@
1
- import { brandProviderTool } from '@tanstack/ai'
1
+ import {
2
+ brandAnthropicProviderTool,
3
+ getAnthropicProviderToolMetadata,
4
+ } from './anthropic-provider-tool'
2
5
  import type { BetaMemoryTool20250818 } from '@anthropic-ai/sdk/resources/beta'
3
6
  import type { ProviderTool, Tool } from '@tanstack/ai'
4
7
 
@@ -10,7 +13,10 @@ export type MemoryTool = MemoryToolConfig
10
13
  export type AnthropicMemoryTool = ProviderTool<'anthropic', 'memory'>
11
14
 
12
15
  export function convertMemoryToolToAdapterFormat(tool: Tool): MemoryToolConfig {
13
- const metadata = tool.metadata as Omit<MemoryToolConfig, 'type'>
16
+ const metadata = getAnthropicProviderToolMetadata(tool) as Omit<
17
+ MemoryToolConfig,
18
+ 'type'
19
+ >
14
20
  return {
15
21
  type: 'memory_20250818',
16
22
  ...metadata,
@@ -18,9 +24,12 @@ export function convertMemoryToolToAdapterFormat(tool: Tool): MemoryToolConfig {
18
24
  }
19
25
 
20
26
  export function memoryTool(config?: MemoryToolConfig): AnthropicMemoryTool {
21
- return brandProviderTool<AnthropicMemoryTool>({
22
- name: 'memory',
23
- description: '',
24
- metadata: config,
25
- })
27
+ return brandAnthropicProviderTool<AnthropicMemoryTool>(
28
+ {
29
+ name: 'memory',
30
+ description: '',
31
+ metadata: config,
32
+ },
33
+ 'memory',
34
+ )
26
35
  }
@@ -1,4 +1,7 @@
1
- import { brandProviderTool } from '@tanstack/ai'
1
+ import {
2
+ brandAnthropicProviderTool,
3
+ getAnthropicProviderToolMetadata,
4
+ } from './anthropic-provider-tool'
2
5
  import type {
3
6
  ToolTextEditor20250124,
4
7
  ToolTextEditor20250429,
@@ -19,7 +22,9 @@ export type AnthropicTextEditorTool = ProviderTool<'anthropic', 'text_editor'>
19
22
  export function convertTextEditorToolToAdapterFormat(
20
23
  tool: Tool,
21
24
  ): TextEditorToolConfig {
22
- const metadata = tool.metadata as TextEditorToolConfig
25
+ const metadata = getAnthropicProviderToolMetadata(
26
+ tool,
27
+ ) as TextEditorToolConfig
23
28
  return {
24
29
  ...metadata,
25
30
  }
@@ -28,9 +33,12 @@ export function convertTextEditorToolToAdapterFormat(
28
33
  export function textEditorTool<T extends TextEditorToolConfig>(
29
34
  config: T,
30
35
  ): AnthropicTextEditorTool {
31
- return brandProviderTool<AnthropicTextEditorTool>({
32
- name: 'str_replace_editor',
33
- description: '',
34
- metadata: config,
35
- })
36
+ return brandAnthropicProviderTool<AnthropicTextEditorTool>(
37
+ {
38
+ name: 'str_replace_editor',
39
+ description: '',
40
+ metadata: config,
41
+ },
42
+ 'text_editor',
43
+ )
36
44
  }
@@ -1,3 +1,5 @@
1
+ import { assertUniqueToolNames } from '@tanstack/ai/adapter-internals'
2
+ import { getAnthropicProviderToolKind } from './anthropic-provider-tool'
1
3
  import { convertBashToolToAdapterFormat } from './bash-tool'
2
4
  import { convertCodeExecutionToolToAdapterFormat } from './code-execution-tool'
3
5
  import { convertComputerUseToolToAdapterFormat } from './computer-use-tool'
@@ -36,25 +38,24 @@ import type { Tool } from '@tanstack/ai'
36
38
  export function convertToolsToProviderFormat<TTool extends Tool>(
37
39
  tools: Array<TTool>,
38
40
  ): Array<AnthropicTool> {
41
+ assertUniqueToolNames(tools)
39
42
  return tools.map((tool) => {
40
- const name = tool.name
41
-
42
- switch (name) {
43
+ switch (getAnthropicProviderToolKind(tool)) {
43
44
  case 'bash':
44
45
  return convertBashToolToAdapterFormat(tool)
45
46
  case 'code_execution':
46
47
  return convertCodeExecutionToolToAdapterFormat(tool)
47
- case 'computer':
48
+ case 'computer_use':
48
49
  return convertComputerUseToolToAdapterFormat(tool)
49
50
  case 'memory':
50
51
  return convertMemoryToolToAdapterFormat(tool)
51
- case 'str_replace_editor':
52
+ case 'text_editor':
52
53
  return convertTextEditorToolToAdapterFormat(tool)
53
54
  case 'web_fetch':
54
55
  return convertWebFetchToolToAdapterFormat(tool)
55
56
  case 'web_search':
56
57
  return convertWebSearchToolToAdapterFormat(tool)
57
- default:
58
+ case undefined:
58
59
  return convertCustomToolToAdapterFormat(tool)
59
60
  }
60
61
  })
@@ -1,4 +1,7 @@
1
- import { brandProviderTool } from '@tanstack/ai'
1
+ import {
2
+ brandAnthropicProviderTool,
3
+ getAnthropicProviderToolMetadata,
4
+ } from './anthropic-provider-tool'
2
5
  import type { BetaWebFetchTool20250910 } from '@anthropic-ai/sdk/resources/beta'
3
6
  import type { ProviderTool, Tool } from '@tanstack/ai'
4
7
 
@@ -12,7 +15,10 @@ export type AnthropicWebFetchTool = ProviderTool<'anthropic', 'web_fetch'>
12
15
  export function convertWebFetchToolToAdapterFormat(
13
16
  tool: Tool,
14
17
  ): WebFetchToolConfig {
15
- const metadata = tool.metadata as Omit<WebFetchToolConfig, 'type' | 'name'>
18
+ const metadata = getAnthropicProviderToolMetadata(tool) as Omit<
19
+ WebFetchToolConfig,
20
+ 'type' | 'name'
21
+ >
16
22
  return {
17
23
  name: 'web_fetch',
18
24
  type: 'web_fetch_20250910',
@@ -23,9 +29,12 @@ export function convertWebFetchToolToAdapterFormat(
23
29
  export function webFetchTool(
24
30
  config?: Omit<WebFetchToolConfig, 'type' | 'name'>,
25
31
  ): AnthropicWebFetchTool {
26
- return brandProviderTool<AnthropicWebFetchTool>({
27
- name: 'web_fetch',
28
- description: '',
29
- metadata: config,
30
- })
32
+ return brandAnthropicProviderTool<AnthropicWebFetchTool>(
33
+ {
34
+ name: 'web_fetch',
35
+ description: '',
36
+ metadata: config,
37
+ },
38
+ 'web_fetch',
39
+ )
31
40
  }