@tanstack/ai-anthropic 0.15.9 → 0.15.11

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 (54) hide show
  1. package/dist/esm/adapters/summarize.d.ts +41 -0
  2. package/dist/esm/adapters/summarize.js +18 -0
  3. package/dist/esm/adapters/summarize.js.map +1 -0
  4. package/dist/esm/adapters/text.d.ts +92 -0
  5. package/dist/esm/adapters/text.js +851 -0
  6. package/dist/esm/adapters/text.js.map +1 -0
  7. package/dist/esm/index.d.ts +9 -0
  8. package/dist/esm/index.js +15 -0
  9. package/dist/esm/index.js.map +1 -0
  10. package/dist/esm/message-types.d.ts +84 -0
  11. package/dist/esm/model-meta.d.ts +410 -0
  12. package/dist/esm/model-meta.js +81 -0
  13. package/dist/esm/model-meta.js.map +1 -0
  14. package/dist/esm/text/text-provider-options.d.ts +258 -0
  15. package/dist/esm/text/text-provider-options.js +30 -0
  16. package/dist/esm/text/text-provider-options.js.map +1 -0
  17. package/dist/esm/tools/bash-tool.d.ts +8 -0
  18. package/dist/esm/tools/bash-tool.js +17 -0
  19. package/dist/esm/tools/bash-tool.js.map +1 -0
  20. package/dist/esm/tools/code-execution-tool.d.ts +34 -0
  21. package/dist/esm/tools/code-execution-tool.js +39 -0
  22. package/dist/esm/tools/code-execution-tool.js.map +1 -0
  23. package/dist/esm/tools/computer-use-tool.d.ts +8 -0
  24. package/dist/esm/tools/computer-use-tool.js +17 -0
  25. package/dist/esm/tools/computer-use-tool.js.map +1 -0
  26. package/dist/esm/tools/custom-tool.d.ts +26 -0
  27. package/dist/esm/tools/custom-tool.js +34 -0
  28. package/dist/esm/tools/custom-tool.js.map +1 -0
  29. package/dist/esm/tools/index.d.ts +17 -0
  30. package/dist/esm/tools/index.js +22 -0
  31. package/dist/esm/tools/index.js.map +1 -0
  32. package/dist/esm/tools/memory-tool.d.ts +8 -0
  33. package/dist/esm/tools/memory-tool.js +20 -0
  34. package/dist/esm/tools/memory-tool.js.map +1 -0
  35. package/dist/esm/tools/text-editor-tool.d.ts +8 -0
  36. package/dist/esm/tools/text-editor-tool.js +19 -0
  37. package/dist/esm/tools/text-editor-tool.js.map +1 -0
  38. package/dist/esm/tools/tool-converter.d.ts +27 -0
  39. package/dist/esm/tools/tool-converter.js +35 -0
  40. package/dist/esm/tools/tool-converter.js.map +1 -0
  41. package/dist/esm/tools/web-fetch-tool.d.ts +8 -0
  42. package/dist/esm/tools/web-fetch-tool.js +21 -0
  43. package/dist/esm/tools/web-fetch-tool.js.map +1 -0
  44. package/dist/esm/tools/web-search-tool.d.ts +8 -0
  45. package/dist/esm/tools/web-search-tool.js +63 -0
  46. package/dist/esm/tools/web-search-tool.js.map +1 -0
  47. package/dist/esm/usage.d.ts +25 -0
  48. package/dist/esm/usage.js +35 -0
  49. package/dist/esm/usage.js.map +1 -0
  50. package/dist/esm/utils/client.d.ts +17 -0
  51. package/dist/esm/utils/client.js +20 -0
  52. package/dist/esm/utils/client.js.map +1 -0
  53. package/dist/esm/utils/index.d.ts +1 -0
  54. package/package.json +4 -4
@@ -0,0 +1,19 @@
1
+ import { brandProviderTool } from "@tanstack/ai";
2
+ function convertTextEditorToolToAdapterFormat(tool) {
3
+ const metadata = tool.metadata;
4
+ return {
5
+ ...metadata
6
+ };
7
+ }
8
+ function textEditorTool(config) {
9
+ return brandProviderTool({
10
+ name: "str_replace_editor",
11
+ description: "",
12
+ metadata: config
13
+ });
14
+ }
15
+ export {
16
+ convertTextEditorToolToAdapterFormat,
17
+ textEditorTool
18
+ };
19
+ //# sourceMappingURL=text-editor-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-editor-tool.js","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"],"names":[],"mappings":";AAkBO,SAAS,qCACd,MACsB;AACtB,QAAM,WAAW,KAAK;AACtB,SAAO;AAAA,IACL,GAAG;AAAA,EAAA;AAEP;AAEO,SAAS,eACd,QACyB;AACzB,SAAO,kBAA2C;AAAA,IAChD,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EAAA,CACX;AACH;"}
@@ -0,0 +1,27 @@
1
+ import { AnthropicTool } from '.';
2
+ import { Tool } from '@tanstack/ai';
3
+ /**
4
+ * Converts standard Tool format to Anthropic-specific tool format
5
+ *
6
+ * @param tools - Array of standard Tool objects
7
+ * @returns Array of Anthropic-specific tool definitions
8
+ *
9
+ * @example
10
+ * ```typescript
11
+ * const tools: Tool[] = [{
12
+ * type: "function",
13
+ * function: {
14
+ * name: "get_weather",
15
+ * description: "Get weather for a location",
16
+ * parameters: {
17
+ * type: "object",
18
+ * properties: { location: { type: "string" } },
19
+ * required: ["location"]
20
+ * }
21
+ * }
22
+ * }];
23
+ *
24
+ * const anthropicTools = convertToolsToProviderFormat(tools);
25
+ * ```
26
+ */
27
+ export declare function convertToolsToProviderFormat<TTool extends Tool>(tools: Array<TTool>): Array<AnthropicTool>;
@@ -0,0 +1,35 @@
1
+ import { convertBashToolToAdapterFormat } from "./bash-tool.js";
2
+ import { convertCodeExecutionToolToAdapterFormat } from "./code-execution-tool.js";
3
+ import { convertComputerUseToolToAdapterFormat } from "./computer-use-tool.js";
4
+ import { convertCustomToolToAdapterFormat } from "./custom-tool.js";
5
+ import { convertMemoryToolToAdapterFormat } from "./memory-tool.js";
6
+ import { convertTextEditorToolToAdapterFormat } from "./text-editor-tool.js";
7
+ import { convertWebFetchToolToAdapterFormat } from "./web-fetch-tool.js";
8
+ import { convertWebSearchToolToAdapterFormat } from "./web-search-tool.js";
9
+ function convertToolsToProviderFormat(tools) {
10
+ return tools.map((tool) => {
11
+ const name = tool.name;
12
+ switch (name) {
13
+ case "bash":
14
+ return convertBashToolToAdapterFormat(tool);
15
+ case "code_execution":
16
+ return convertCodeExecutionToolToAdapterFormat(tool);
17
+ case "computer":
18
+ return convertComputerUseToolToAdapterFormat(tool);
19
+ case "memory":
20
+ return convertMemoryToolToAdapterFormat(tool);
21
+ case "str_replace_editor":
22
+ return convertTextEditorToolToAdapterFormat(tool);
23
+ case "web_fetch":
24
+ return convertWebFetchToolToAdapterFormat(tool);
25
+ case "web_search":
26
+ return convertWebSearchToolToAdapterFormat(tool);
27
+ default:
28
+ return convertCustomToolToAdapterFormat(tool);
29
+ }
30
+ });
31
+ }
32
+ export {
33
+ convertToolsToProviderFormat
34
+ };
35
+ //# sourceMappingURL=tool-converter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-converter.js","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 '.'\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"],"names":[],"mappings":";;;;;;;;AAmCO,SAAS,6BACd,OACsB;AACtB,SAAO,MAAM,IAAI,CAAC,SAAS;AACzB,UAAM,OAAO,KAAK;AAElB,YAAQ,MAAA;AAAA,MACN,KAAK;AACH,eAAO,+BAA+B,IAAI;AAAA,MAC5C,KAAK;AACH,eAAO,wCAAwC,IAAI;AAAA,MACrD,KAAK;AACH,eAAO,sCAAsC,IAAI;AAAA,MACnD,KAAK;AACH,eAAO,iCAAiC,IAAI;AAAA,MAC9C,KAAK;AACH,eAAO,qCAAqC,IAAI;AAAA,MAClD,KAAK;AACH,eAAO,mCAAmC,IAAI;AAAA,MAChD,KAAK;AACH,eAAO,oCAAoC,IAAI;AAAA,MACjD;AACE,eAAO,iCAAiC,IAAI;AAAA,IAAA;AAAA,EAElD,CAAC;AACH;"}
@@ -0,0 +1,8 @@
1
+ import { BetaWebFetchTool20250910 } from '@anthropic-ai/sdk/resources/beta';
2
+ import { ProviderTool, Tool } from '@tanstack/ai';
3
+ export type WebFetchToolConfig = BetaWebFetchTool20250910;
4
+ /** @deprecated Renamed to `WebFetchToolConfig`. Will be removed in a future release. */
5
+ export type WebFetchTool = WebFetchToolConfig;
6
+ export type AnthropicWebFetchTool = ProviderTool<'anthropic', 'web_fetch'>;
7
+ export declare function convertWebFetchToolToAdapterFormat(tool: Tool): WebFetchToolConfig;
8
+ export declare function webFetchTool(config?: Omit<WebFetchToolConfig, 'type' | 'name'>): AnthropicWebFetchTool;
@@ -0,0 +1,21 @@
1
+ import { brandProviderTool } from "@tanstack/ai";
2
+ function convertWebFetchToolToAdapterFormat(tool) {
3
+ const metadata = tool.metadata;
4
+ return {
5
+ name: "web_fetch",
6
+ type: "web_fetch_20250910",
7
+ ...metadata
8
+ };
9
+ }
10
+ function webFetchTool(config) {
11
+ return brandProviderTool({
12
+ name: "web_fetch",
13
+ description: "",
14
+ metadata: config
15
+ });
16
+ }
17
+ export {
18
+ convertWebFetchToolToAdapterFormat,
19
+ webFetchTool
20
+ };
21
+ //# sourceMappingURL=web-fetch-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-fetch-tool.js","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"],"names":[],"mappings":";AAWO,SAAS,mCACd,MACoB;AACpB,QAAM,WAAW,KAAK;AACtB,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM;AAAA,IACN,GAAG;AAAA,EAAA;AAEP;AAEO,SAAS,aACd,QACuB;AACvB,SAAO,kBAAyC;AAAA,IAC9C,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EAAA,CACX;AACH;"}
@@ -0,0 +1,8 @@
1
+ import { WebSearchTool20250305 } from '@anthropic-ai/sdk/resources/messages';
2
+ import { ProviderTool, Tool } from '@tanstack/ai';
3
+ export type WebSearchToolConfig = WebSearchTool20250305;
4
+ /** @deprecated Renamed to `WebSearchToolConfig`. Will be removed in a future release. */
5
+ export type WebSearchTool = WebSearchToolConfig;
6
+ export type AnthropicWebSearchTool = ProviderTool<'anthropic', 'web_search'>;
7
+ export declare function convertWebSearchToolToAdapterFormat(tool: Tool): WebSearchToolConfig;
8
+ export declare function webSearchTool(config: WebSearchToolConfig): AnthropicWebSearchTool;
@@ -0,0 +1,63 @@
1
+ import { brandProviderTool } from "@tanstack/ai";
2
+ const validateDomains = (tool) => {
3
+ if (tool.allowed_domains && tool.blocked_domains) {
4
+ throw new Error(
5
+ "allowed_domains and blocked_domains cannot be used together."
6
+ );
7
+ }
8
+ };
9
+ const validateUserLocation = (tool) => {
10
+ const userLocation = tool.user_location;
11
+ if (userLocation) {
12
+ if (userLocation.city && (userLocation.city.length < 1 || userLocation.city.length > 255)) {
13
+ throw new Error(
14
+ "user_location.city must be between 1 and 255 characters."
15
+ );
16
+ }
17
+ if (userLocation.country && userLocation.country.length !== 2) {
18
+ throw new Error("user_location.country must be exactly 2 characters.");
19
+ }
20
+ if (userLocation.region && (userLocation.region.length < 1 || userLocation.region.length > 255)) {
21
+ throw new Error(
22
+ "user_location.region must be between 1 and 255 characters."
23
+ );
24
+ }
25
+ if (userLocation.timezone && (userLocation.timezone.length < 1 || userLocation.timezone.length > 255)) {
26
+ throw new Error(
27
+ "user_location.timezone must be between 1 and 255 characters."
28
+ );
29
+ }
30
+ }
31
+ };
32
+ function convertWebSearchToolToAdapterFormat(tool) {
33
+ const metadata = tool.metadata;
34
+ return {
35
+ name: "web_search",
36
+ type: "web_search_20250305",
37
+ ...metadata.allowedDomains !== void 0 && {
38
+ allowed_domains: metadata.allowedDomains
39
+ },
40
+ ...metadata.blockedDomains !== void 0 && {
41
+ blocked_domains: metadata.blockedDomains
42
+ },
43
+ ...metadata.maxUses !== void 0 && { max_uses: metadata.maxUses },
44
+ ...metadata.userLocation !== void 0 && {
45
+ user_location: metadata.userLocation
46
+ },
47
+ cache_control: metadata.cacheControl || null
48
+ };
49
+ }
50
+ function webSearchTool(config) {
51
+ validateDomains(config);
52
+ validateUserLocation(config);
53
+ return brandProviderTool({
54
+ name: "web_search",
55
+ description: "",
56
+ metadata: config
57
+ });
58
+ }
59
+ export {
60
+ convertWebSearchToolToAdapterFormat,
61
+ webSearchTool
62
+ };
63
+ //# sourceMappingURL=web-search-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-search-tool.js","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"],"names":[],"mappings":";AAYA,MAAM,kBAAkB,CAAC,SAA8B;AACrD,MAAI,KAAK,mBAAmB,KAAK,iBAAiB;AAChD,UAAM,IAAI;AAAA,MACR;AAAA,IAAA;AAAA,EAEJ;AACF;AAEA,MAAM,uBAAuB,CAAC,SAA8B;AAC1D,QAAM,eAAe,KAAK;AAC1B,MAAI,cAAc;AAChB,QACE,aAAa,SACZ,aAAa,KAAK,SAAS,KAAK,aAAa,KAAK,SAAS,MAC5D;AACA,YAAM,IAAI;AAAA,QACR;AAAA,MAAA;AAAA,IAEJ;AACA,QAAI,aAAa,WAAW,aAAa,QAAQ,WAAW,GAAG;AAC7D,YAAM,IAAI,MAAM,qDAAqD;AAAA,IACvE;AACA,QACE,aAAa,WACZ,aAAa,OAAO,SAAS,KAAK,aAAa,OAAO,SAAS,MAChE;AACA,YAAM,IAAI;AAAA,QACR;AAAA,MAAA;AAAA,IAEJ;AACA,QACE,aAAa,aACZ,aAAa,SAAS,SAAS,KAAK,aAAa,SAAS,SAAS,MACpE;AACA,YAAM,IAAI;AAAA,QACR;AAAA,MAAA;AAAA,IAEJ;AAAA,EACF;AACF;AAEO,SAAS,oCACd,MACqB;AACrB,QAAM,WAAW,KAAK;AAgBtB,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM;AAAA,IACN,GAAI,SAAS,mBAAmB,UAAa;AAAA,MAC3C,iBAAiB,SAAS;AAAA,IAAA;AAAA,IAE5B,GAAI,SAAS,mBAAmB,UAAa;AAAA,MAC3C,iBAAiB,SAAS;AAAA,IAAA;AAAA,IAE5B,GAAI,SAAS,YAAY,UAAa,EAAE,UAAU,SAAS,QAAA;AAAA,IAC3D,GAAI,SAAS,iBAAiB,UAAa;AAAA,MACzC,eAAe,SAAS;AAAA,IAAA;AAAA,IAE1B,eAAe,SAAS,gBAAgB;AAAA,EAAA;AAE5C;AAEO,SAAS,cACd,QACwB;AACxB,kBAAgB,MAAM;AACtB,uBAAqB,MAAM;AAC3B,SAAO,kBAA0C;AAAA,IAC/C,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EAAA,CACX;AACH;"}
@@ -0,0 +1,25 @@
1
+ import { TokenUsage } from '@tanstack/ai';
2
+ import { default as Anthropic_SDK } from '@anthropic-ai/sdk';
3
+ /**
4
+ * Anthropic-specific provider usage details.
5
+ * These fields are unique to Anthropic and placed in providerUsageDetails.
6
+ */
7
+ export type AnthropicProviderUsageDetails = {
8
+ /**
9
+ * Server-side tool usage metrics.
10
+ * Available when using Anthropic's built-in tools like web search.
11
+ */
12
+ serverToolUse?: {
13
+ /** Number of web search requests made during the response */
14
+ webSearchRequests?: number;
15
+ /** Number of web fetch requests made during the response */
16
+ webFetchRequests?: number;
17
+ };
18
+ };
19
+ /**
20
+ * Build normalized TokenUsage from Anthropic's usage object.
21
+ * Handles cache tokens and server tool use metrics. Returns `undefined` when
22
+ * the provider reported no usage object, so callers omit the field rather than
23
+ * fabricating zeroed totals.
24
+ */
25
+ export declare function buildAnthropicUsage(usage: Anthropic_SDK.Beta.BetaUsage | Anthropic_SDK.Beta.BetaMessageDeltaUsage | undefined | null): TokenUsage<AnthropicProviderUsageDetails> | undefined;
@@ -0,0 +1,35 @@
1
+ import { buildBaseUsage } from "@tanstack/ai";
2
+ function buildAnthropicUsage(usage) {
3
+ if (!usage) return void 0;
4
+ const inputTokens = usage.input_tokens ?? 0;
5
+ const outputTokens = usage.output_tokens || 0;
6
+ const result = buildBaseUsage({
7
+ promptTokens: inputTokens,
8
+ completionTokens: outputTokens,
9
+ totalTokens: inputTokens + outputTokens
10
+ });
11
+ const cacheCreation = usage.cache_creation_input_tokens;
12
+ const cacheRead = usage.cache_read_input_tokens;
13
+ const promptTokensDetails = {
14
+ ...cacheCreation ? { cacheWriteTokens: cacheCreation } : {},
15
+ ...cacheRead ? { cachedTokens: cacheRead } : {}
16
+ };
17
+ if (Object.keys(promptTokensDetails).length > 0) {
18
+ result.promptTokensDetails = promptTokensDetails;
19
+ }
20
+ const serverToolUse = usage.server_tool_use;
21
+ const serverToolUseDetails = {
22
+ ...serverToolUse?.web_search_requests ? { webSearchRequests: serverToolUse.web_search_requests } : {},
23
+ ...serverToolUse?.web_fetch_requests ? { webFetchRequests: serverToolUse.web_fetch_requests } : {}
24
+ };
25
+ if (Object.keys(serverToolUseDetails).length > 0) {
26
+ result.providerUsageDetails = {
27
+ serverToolUse: serverToolUseDetails
28
+ };
29
+ }
30
+ return result;
31
+ }
32
+ export {
33
+ buildAnthropicUsage
34
+ };
35
+ //# sourceMappingURL=usage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage.js","sources":["../../src/usage.ts"],"sourcesContent":["import { buildBaseUsage } from '@tanstack/ai'\nimport type { TokenUsage } from '@tanstack/ai'\nimport type Anthropic_SDK from '@anthropic-ai/sdk'\n\n/**\n * Anthropic-specific provider usage details.\n * These fields are unique to Anthropic and placed in providerUsageDetails.\n */\nexport type AnthropicProviderUsageDetails = {\n /**\n * Server-side tool usage metrics.\n * Available when using Anthropic's built-in tools like web search.\n */\n serverToolUse?: {\n /** Number of web search requests made during the response */\n webSearchRequests?: number\n /** Number of web fetch requests made during the response */\n webFetchRequests?: number\n }\n}\n\n/**\n * Build normalized TokenUsage from Anthropic's usage object.\n * Handles cache tokens and server tool use metrics. Returns `undefined` when\n * the provider reported no usage object, so callers omit the field rather than\n * fabricating zeroed totals.\n */\nexport function buildAnthropicUsage(\n usage:\n | Anthropic_SDK.Beta.BetaUsage\n | Anthropic_SDK.Beta.BetaMessageDeltaUsage\n | undefined\n | null,\n): TokenUsage<AnthropicProviderUsageDetails> | undefined {\n if (!usage) return undefined\n\n const inputTokens = usage.input_tokens ?? 0\n // `|| 0` (rather than `?? 0`) matches the sibling builders and stays defensive\n // against a runtime-absent count without tripping no-unnecessary-condition\n // (the SDK types output_tokens as a required number).\n const outputTokens = usage.output_tokens || 0\n\n const result = buildBaseUsage<AnthropicProviderUsageDetails>({\n promptTokens: inputTokens,\n completionTokens: outputTokens,\n totalTokens: inputTokens + outputTokens,\n })\n\n // Add prompt token details for cache tokens. Only attach the details object\n // when at least one field is present so we don't emit an empty `{}` (every\n // other adapter guards with the same Object.keys check).\n const cacheCreation = usage.cache_creation_input_tokens\n const cacheRead = usage.cache_read_input_tokens\n\n const promptTokensDetails = {\n ...(cacheCreation ? { cacheWriteTokens: cacheCreation } : {}),\n ...(cacheRead ? { cachedTokens: cacheRead } : {}),\n }\n if (Object.keys(promptTokensDetails).length > 0) {\n result.promptTokensDetails = promptTokensDetails\n }\n\n // Add provider-specific usage details for server tool use, again only when\n // the provider actually reported any server tool requests.\n const serverToolUse = usage.server_tool_use\n const serverToolUseDetails = {\n ...(serverToolUse?.web_search_requests\n ? { webSearchRequests: serverToolUse.web_search_requests }\n : {}),\n ...(serverToolUse?.web_fetch_requests\n ? { webFetchRequests: serverToolUse.web_fetch_requests }\n : {}),\n }\n if (Object.keys(serverToolUseDetails).length > 0) {\n result.providerUsageDetails = {\n serverToolUse: serverToolUseDetails,\n } satisfies AnthropicProviderUsageDetails\n }\n\n return result\n}\n"],"names":[],"mappings":";AA2BO,SAAS,oBACd,OAKuD;AACvD,MAAI,CAAC,MAAO,QAAO;AAEnB,QAAM,cAAc,MAAM,gBAAgB;AAI1C,QAAM,eAAe,MAAM,iBAAiB;AAE5C,QAAM,SAAS,eAA8C;AAAA,IAC3D,cAAc;AAAA,IACd,kBAAkB;AAAA,IAClB,aAAa,cAAc;AAAA,EAAA,CAC5B;AAKD,QAAM,gBAAgB,MAAM;AAC5B,QAAM,YAAY,MAAM;AAExB,QAAM,sBAAsB;AAAA,IAC1B,GAAI,gBAAgB,EAAE,kBAAkB,cAAA,IAAkB,CAAA;AAAA,IAC1D,GAAI,YAAY,EAAE,cAAc,cAAc,CAAA;AAAA,EAAC;AAEjD,MAAI,OAAO,KAAK,mBAAmB,EAAE,SAAS,GAAG;AAC/C,WAAO,sBAAsB;AAAA,EAC/B;AAIA,QAAM,gBAAgB,MAAM;AAC5B,QAAM,uBAAuB;AAAA,IAC3B,GAAI,eAAe,sBACf,EAAE,mBAAmB,cAAc,oBAAA,IACnC,CAAA;AAAA,IACJ,GAAI,eAAe,qBACf,EAAE,kBAAkB,cAAc,mBAAA,IAClC,CAAA;AAAA,EAAC;AAEP,MAAI,OAAO,KAAK,oBAAoB,EAAE,SAAS,GAAG;AAChD,WAAO,uBAAuB;AAAA,MAC5B,eAAe;AAAA,IAAA;AAAA,EAEnB;AAEA,SAAO;AACT;"}
@@ -0,0 +1,17 @@
1
+ import { default as Anthropic_SDK, ClientOptions } from '@anthropic-ai/sdk';
2
+ export interface AnthropicClientConfig extends ClientOptions {
3
+ apiKey: string;
4
+ }
5
+ /**
6
+ * Creates an Anthropic SDK client instance
7
+ */
8
+ export declare function createAnthropicClient(config: AnthropicClientConfig): Anthropic_SDK;
9
+ /**
10
+ * Gets Anthropic API key from environment variables
11
+ * @throws Error if ANTHROPIC_API_KEY is not found
12
+ */
13
+ export declare function getAnthropicApiKeyFromEnv(): string;
14
+ /**
15
+ * Generates a unique ID with a prefix
16
+ */
17
+ export declare function generateId(prefix: string): string;
@@ -0,0 +1,20 @@
1
+ import Anthropic_SDK from "@anthropic-ai/sdk";
2
+ import { generateId as generateId$1, getApiKeyFromEnv } from "@tanstack/ai-utils";
3
+ function createAnthropicClient(config) {
4
+ return new Anthropic_SDK({
5
+ ...config,
6
+ apiKey: config.apiKey
7
+ });
8
+ }
9
+ function getAnthropicApiKeyFromEnv() {
10
+ return getApiKeyFromEnv("ANTHROPIC_API_KEY");
11
+ }
12
+ function generateId(prefix) {
13
+ return generateId$1(prefix);
14
+ }
15
+ export {
16
+ createAnthropicClient,
17
+ generateId,
18
+ getAnthropicApiKeyFromEnv
19
+ };
20
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sources":["../../../src/utils/client.ts"],"sourcesContent":["import Anthropic_SDK from '@anthropic-ai/sdk'\nimport { generateId as _generateId, getApiKeyFromEnv } from '@tanstack/ai-utils'\nimport type { ClientOptions } from '@anthropic-ai/sdk'\n\nexport interface AnthropicClientConfig extends ClientOptions {\n apiKey: string\n}\n\n/**\n * Creates an Anthropic SDK client instance\n */\nexport function createAnthropicClient(\n config: AnthropicClientConfig,\n): Anthropic_SDK {\n return new Anthropic_SDK({\n ...config,\n apiKey: config.apiKey,\n })\n}\n\n/**\n * Gets Anthropic API key from environment variables\n * @throws Error if ANTHROPIC_API_KEY is not found\n */\nexport function getAnthropicApiKeyFromEnv(): string {\n return getApiKeyFromEnv('ANTHROPIC_API_KEY')\n}\n\n/**\n * Generates a unique ID with a prefix\n */\nexport function generateId(prefix: string): string {\n return _generateId(prefix)\n}\n"],"names":["_generateId"],"mappings":";;AAWO,SAAS,sBACd,QACe;AACf,SAAO,IAAI,cAAc;AAAA,IACvB,GAAG;AAAA,IACH,QAAQ,OAAO;AAAA,EAAA,CAChB;AACH;AAMO,SAAS,4BAAoC;AAClD,SAAO,iBAAiB,mBAAmB;AAC7C;AAKO,SAAS,WAAW,QAAwB;AACjD,SAAOA,aAAY,MAAM;AAC3B;"}
@@ -0,0 +1 @@
1
+ export { createAnthropicClient, generateId, getAnthropicApiKeyFromEnv, type AnthropicClientConfig, } from './client.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tanstack/ai-anthropic",
3
- "version": "0.15.9",
3
+ "version": "0.15.11",
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",
@@ -49,16 +49,16 @@
49
49
  ],
50
50
  "dependencies": {
51
51
  "@anthropic-ai/sdk": "^0.97.1",
52
- "@tanstack/ai-utils": "0.3.0"
52
+ "@tanstack/ai-utils": "0.3.1"
53
53
  },
54
54
  "peerDependencies": {
55
55
  "zod": "^4.0.0",
56
- "@tanstack/ai": "^0.36.0"
56
+ "@tanstack/ai": "^0.38.0"
57
57
  },
58
58
  "devDependencies": {
59
59
  "@vitest/coverage-v8": "4.0.14",
60
60
  "zod": "^4.2.0",
61
- "@tanstack/ai": "0.36.0"
61
+ "@tanstack/ai": "0.38.0"
62
62
  },
63
63
  "scripts": {
64
64
  "build": "vite build",