@robota-sdk/agent-provider 3.0.0-beta.64

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 (220) hide show
  1. package/LICENSE +21 -0
  2. package/dist/browser/index.d.ts +1104 -0
  3. package/dist/browser/index.d.ts.map +1 -0
  4. package/dist/browser/index.js +7 -0
  5. package/dist/browser/index.js.map +1 -0
  6. package/dist/loggers/index.cjs +1 -0
  7. package/dist/loggers/index.d.ts +151 -0
  8. package/dist/loggers/index.d.ts.map +1 -0
  9. package/dist/loggers/index.js +2 -0
  10. package/dist/loggers/index.js.map +1 -0
  11. package/dist/node/anthropic/index.cjs +1 -0
  12. package/dist/node/anthropic/index.d.ts +158 -0
  13. package/dist/node/anthropic/index.d.ts.map +1 -0
  14. package/dist/node/anthropic/index.js +1 -0
  15. package/dist/node/anthropic--1vgLC-e.js +5 -0
  16. package/dist/node/anthropic--1vgLC-e.js.map +1 -0
  17. package/dist/node/anthropic-BFQ6DSCP.cjs +4 -0
  18. package/dist/node/bytedance/index.cjs +1 -0
  19. package/dist/node/bytedance/index.d.ts +74 -0
  20. package/dist/node/bytedance/index.d.ts.map +1 -0
  21. package/dist/node/bytedance/index.js +1 -0
  22. package/dist/node/bytedance-C_0sF_pJ.js +2 -0
  23. package/dist/node/bytedance-C_0sF_pJ.js.map +1 -0
  24. package/dist/node/bytedance-DVPxqEiC.cjs +1 -0
  25. package/dist/node/chunk-Bmb41Sf3.cjs +1 -0
  26. package/dist/node/deepseek/index.cjs +1 -0
  27. package/dist/node/deepseek/index.d.ts +2 -0
  28. package/dist/node/deepseek/index.js +1 -0
  29. package/dist/node/deepseek-_8Ixx7rA.js +2 -0
  30. package/dist/node/deepseek-_8Ixx7rA.js.map +1 -0
  31. package/dist/node/deepseek-oA2Y6bD0.cjs +1 -0
  32. package/dist/node/gemini/index.cjs +1 -0
  33. package/dist/node/gemini/index.d.ts +173 -0
  34. package/dist/node/gemini/index.d.ts.map +1 -0
  35. package/dist/node/gemini/index.js +1 -0
  36. package/dist/node/gemini-Bh2U87MY.js +4 -0
  37. package/dist/node/gemini-Bh2U87MY.js.map +1 -0
  38. package/dist/node/gemini-DSaNCxZj.cjs +3 -0
  39. package/dist/node/gemma/index.cjs +1 -0
  40. package/dist/node/gemma/index.d.ts +2 -0
  41. package/dist/node/gemma/index.js +1 -0
  42. package/dist/node/gemma-Dp_AfCUR.js +2 -0
  43. package/dist/node/gemma-Dp_AfCUR.js.map +1 -0
  44. package/dist/node/gemma-G-Pf_PnX.cjs +1 -0
  45. package/dist/node/google/index.cjs +1 -0
  46. package/dist/node/google/index.d.ts +14 -0
  47. package/dist/node/google/index.d.ts.map +1 -0
  48. package/dist/node/google/index.js +2 -0
  49. package/dist/node/google/index.js.map +1 -0
  50. package/dist/node/index-B6PnlDMd.d.ts +82 -0
  51. package/dist/node/index-B6PnlDMd.d.ts.map +1 -0
  52. package/dist/node/index-B7UvPJcI.d.ts +315 -0
  53. package/dist/node/index-B7UvPJcI.d.ts.map +1 -0
  54. package/dist/node/index-BLPOTNb5.d.ts +98 -0
  55. package/dist/node/index-BLPOTNb5.d.ts.map +1 -0
  56. package/dist/node/index-BqixM_XD.d.ts +231 -0
  57. package/dist/node/index-BqixM_XD.d.ts.map +1 -0
  58. package/dist/node/index-C3beaqKO.d.ts +231 -0
  59. package/dist/node/index-C3beaqKO.d.ts.map +1 -0
  60. package/dist/node/index-Cp2XRh9G.d.ts +82 -0
  61. package/dist/node/index-Cp2XRh9G.d.ts.map +1 -0
  62. package/dist/node/index-DSv5xruI.d.ts +98 -0
  63. package/dist/node/index-DSv5xruI.d.ts.map +1 -0
  64. package/dist/node/index-w0bV1uaP.d.ts +315 -0
  65. package/dist/node/index-w0bV1uaP.d.ts.map +1 -0
  66. package/dist/node/index.cjs +1 -0
  67. package/dist/node/index.d.ts +8 -0
  68. package/dist/node/index.js +1 -0
  69. package/dist/node/openai/index.cjs +1 -0
  70. package/dist/node/openai/index.d.ts +2 -0
  71. package/dist/node/openai/index.js +1 -0
  72. package/dist/node/openai-CRQjg4xF.js +2 -0
  73. package/dist/node/openai-CRQjg4xF.js.map +1 -0
  74. package/dist/node/openai-compatible-BYfyY5lb.cjs +1 -0
  75. package/dist/node/openai-compatible-Dm4Sof9e.js +2 -0
  76. package/dist/node/openai-compatible-Dm4Sof9e.js.map +1 -0
  77. package/dist/node/openai-xWC6pY7r.cjs +1 -0
  78. package/dist/node/qwen/index.cjs +1 -0
  79. package/dist/node/qwen/index.d.ts +2 -0
  80. package/dist/node/qwen/index.js +1 -0
  81. package/dist/node/qwen-ChUZobTL.js +2 -0
  82. package/dist/node/qwen-ChUZobTL.js.map +1 -0
  83. package/dist/node/qwen-CjT71vSM.cjs +1 -0
  84. package/package.json +157 -0
  85. package/src/anthropic/__tests__/abort-streaming.test.ts +199 -0
  86. package/src/anthropic/__tests__/model-catalog-refresh.test.ts +92 -0
  87. package/src/anthropic/__tests__/provider-definition.test.ts +55 -0
  88. package/src/anthropic/__tests__/provider.test.ts +1357 -0
  89. package/src/anthropic/__tests__/response-parser.test.ts +326 -0
  90. package/src/anthropic/index.ts +22 -0
  91. package/src/anthropic/message-converter.ts +181 -0
  92. package/src/anthropic/model-catalog-refresh.ts +128 -0
  93. package/src/anthropic/parsers/response-parser.ts +184 -0
  94. package/src/anthropic/provider-definition.ts +93 -0
  95. package/src/anthropic/provider.ts +290 -0
  96. package/src/anthropic/streaming-handler.ts +204 -0
  97. package/src/anthropic/types/api-types.ts +158 -0
  98. package/src/anthropic/types.ts +79 -0
  99. package/src/bytedance/http-client.test.ts +288 -0
  100. package/src/bytedance/http-client.ts +163 -0
  101. package/src/bytedance/index.ts +2 -0
  102. package/src/bytedance/provider.spec.ts +320 -0
  103. package/src/bytedance/provider.ts +171 -0
  104. package/src/bytedance/status-mapper.test.ts +299 -0
  105. package/src/bytedance/status-mapper.ts +141 -0
  106. package/src/bytedance/types.ts +68 -0
  107. package/src/deepseek/defaults.ts +4 -0
  108. package/src/deepseek/index.ts +22 -0
  109. package/src/deepseek/model-catalog-refresh.test.ts +57 -0
  110. package/src/deepseek/model-catalog-refresh.ts +105 -0
  111. package/src/deepseek/model-catalog.ts +55 -0
  112. package/src/deepseek/provider-definition.test.ts +109 -0
  113. package/src/deepseek/provider-definition.ts +132 -0
  114. package/src/deepseek/provider.test.ts +324 -0
  115. package/src/deepseek/provider.ts +298 -0
  116. package/src/deepseek/types.ts +37 -0
  117. package/src/gemini/execution-helpers.ts +233 -0
  118. package/src/gemini/genai-transport.test.ts +208 -0
  119. package/src/gemini/image-operations.test.ts +448 -0
  120. package/src/gemini/image-operations.ts +261 -0
  121. package/src/gemini/index.ts +11 -0
  122. package/src/gemini/message-converter.test.ts +616 -0
  123. package/src/gemini/message-converter.ts +140 -0
  124. package/src/gemini/model-catalog-refresh.test.ts +107 -0
  125. package/src/gemini/model-catalog-refresh.ts +92 -0
  126. package/src/gemini/provider-definition.test.ts +70 -0
  127. package/src/gemini/provider-definition.ts +78 -0
  128. package/src/gemini/provider-extended.test.ts +898 -0
  129. package/src/gemini/provider.spec.ts +216 -0
  130. package/src/gemini/provider.ts +279 -0
  131. package/src/gemini/request-converter.ts +226 -0
  132. package/src/gemini/tool-schema-converter.ts +78 -0
  133. package/src/gemini/types/api-types.ts +235 -0
  134. package/src/gemini/types.ts +121 -0
  135. package/src/gemma/index.ts +5 -0
  136. package/src/gemma/message-factory.ts +38 -0
  137. package/src/gemma/provider-definition.test.ts +43 -0
  138. package/src/gemma/provider-definition.ts +84 -0
  139. package/src/gemma/provider-projection.ts +49 -0
  140. package/src/gemma/provider.test.ts +628 -0
  141. package/src/gemma/provider.ts +308 -0
  142. package/src/gemma/pseudo-command-envelope.ts +58 -0
  143. package/src/gemma/pseudo-tool-call-projector.ts +243 -0
  144. package/src/gemma/pseudo-tool-call-tag-parser.ts +153 -0
  145. package/src/gemma/pseudo-tool-call-types.ts +31 -0
  146. package/src/gemma/reasoning-projector.test.ts +52 -0
  147. package/src/gemma/reasoning-projector.ts +144 -0
  148. package/src/gemma/streaming-projection.ts +79 -0
  149. package/src/gemma/tool-call-argument-parser.ts +126 -0
  150. package/src/gemma/tool-call-projector.test.ts +227 -0
  151. package/src/gemma/tool-call-projector.ts +264 -0
  152. package/src/gemma/types.ts +27 -0
  153. package/src/google/index.ts +11 -0
  154. package/src/google/provider-compat.test.ts +19 -0
  155. package/src/google/provider-definition.ts +6 -0
  156. package/src/google/provider.ts +10 -0
  157. package/src/google/types.ts +5 -0
  158. package/src/index.ts +9 -0
  159. package/src/openai/adapter.test.ts +494 -0
  160. package/src/openai/adapter.ts +145 -0
  161. package/src/openai/chat-completions-chat.ts +189 -0
  162. package/src/openai/executor-integration.test.ts +206 -0
  163. package/src/openai/index.ts +21 -0
  164. package/src/openai/interfaces/payload-logger.ts +48 -0
  165. package/src/openai/loggers/console-payload-logger.test.ts +173 -0
  166. package/src/openai/loggers/console-payload-logger.ts +94 -0
  167. package/src/openai/loggers/console.ts +9 -0
  168. package/src/openai/loggers/file-payload-logger.test.ts +238 -0
  169. package/src/openai/loggers/file-payload-logger.ts +112 -0
  170. package/src/openai/loggers/file.ts +9 -0
  171. package/src/openai/loggers/index.ts +12 -0
  172. package/src/openai/loggers/sanitize-openai-log-data.test.ts +89 -0
  173. package/src/openai/loggers/sanitize-openai-log-data.ts +14 -0
  174. package/src/openai/message-converter.ts +22 -0
  175. package/src/openai/model-catalog-refresh.test.ts +92 -0
  176. package/src/openai/model-catalog-refresh.ts +115 -0
  177. package/src/openai/openai-request-format.ts +92 -0
  178. package/src/openai/parsers/response-parser.test.ts +407 -0
  179. package/src/openai/parsers/response-parser.ts +47 -0
  180. package/src/openai/provider-definition.test.ts +75 -0
  181. package/src/openai/provider-definition.ts +132 -0
  182. package/src/openai/provider.test.ts +1402 -0
  183. package/src/openai/provider.ts +237 -0
  184. package/src/openai/responses-chat.ts +258 -0
  185. package/src/openai/responses-converter.ts +112 -0
  186. package/src/openai/responses-parser.ts +285 -0
  187. package/src/openai/responses-stream-utils.ts +45 -0
  188. package/src/openai/responses-types.ts +195 -0
  189. package/src/openai/streaming/stream-assembler.ts +3 -0
  190. package/src/openai/streaming/stream-handler.test.ts +367 -0
  191. package/src/openai/streaming/stream-handler.ts +119 -0
  192. package/src/openai/types/api-types.ts +112 -0
  193. package/src/openai/types.ts +194 -0
  194. package/src/qwen/defaults.ts +26 -0
  195. package/src/qwen/index.ts +5 -0
  196. package/src/qwen/model-catalog-refresh.test.ts +91 -0
  197. package/src/qwen/model-catalog-refresh.ts +97 -0
  198. package/src/qwen/provider-capabilities.ts +34 -0
  199. package/src/qwen/provider-definition.test.ts +139 -0
  200. package/src/qwen/provider-definition.ts +173 -0
  201. package/src/qwen/provider-streaming-assembly.ts +40 -0
  202. package/src/qwen/provider.test.ts +640 -0
  203. package/src/qwen/provider.ts +293 -0
  204. package/src/qwen/responses-chat.ts +194 -0
  205. package/src/qwen/responses-converter.ts +104 -0
  206. package/src/qwen/responses-parser.ts +299 -0
  207. package/src/qwen/responses-stream-utils.ts +38 -0
  208. package/src/qwen/types.ts +228 -0
  209. package/src/shared/openai-compatible/endpoint-probe.test.ts +52 -0
  210. package/src/shared/openai-compatible/endpoint-probe.ts +43 -0
  211. package/src/shared/openai-compatible/index.ts +6 -0
  212. package/src/shared/openai-compatible/message-converter.test.ts +111 -0
  213. package/src/shared/openai-compatible/message-converter.ts +84 -0
  214. package/src/shared/openai-compatible/native-payload-observer.test.ts +43 -0
  215. package/src/shared/openai-compatible/native-payload-observer.ts +26 -0
  216. package/src/shared/openai-compatible/response-parser.test.ts +172 -0
  217. package/src/shared/openai-compatible/response-parser.ts +180 -0
  218. package/src/shared/openai-compatible/stream-assembler.test.ts +266 -0
  219. package/src/shared/openai-compatible/stream-assembler.ts +248 -0
  220. package/src/shared/openai-compatible/types.ts +59 -0
@@ -0,0 +1 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let c=require(`fs`);c=s(c,1);let l=require(`path`);l=s(l,1);let u=require(`@robota-sdk/agent-core`);function d(e){return JSON.parse(JSON.stringify(e))}var f=class{enabled;logDir;includeTimestamp;logger;constructor(e){this.enabled=e.enabled??!0,this.logDir=e.logDir,this.includeTimestamp=e.includeTimestamp??!0,this.logger=e.logger||u.SilentLogger,this.enabled&&this.ensureLogDirectoryExists()}isEnabled(){return this.enabled}async logPayload(e,t=`chat`){if(this.enabled)try{let n=new Date().toISOString().replace(/[:.]/g,`-`),r=this.includeTimestamp?`openai-${t}-${n}.json`:`openai-${t}-${Date.now()}.json`,i=l.join(this.logDir,r),a={timestamp:new Date().toISOString(),type:t,provider:`openai`,payload:d(e)};await c.promises.writeFile(i,JSON.stringify(a,null,2),`utf8`)}catch(e){this.logger.error(`[FilePayloadLogger] Failed to save payload log:`,{error:e instanceof Error?e.message:String(e)})}}ensureLogDirectoryExists(){try{c.existsSync(this.logDir)||c.mkdirSync(this.logDir,{recursive:!0})}catch(e){this.logger.error(`[FilePayloadLogger] Failed to create log directory:`,{error:e instanceof Error?e.message:String(e)})}}},p=class{enabled;includeTimestamp;logger;constructor(e={}){this.enabled=e.enabled??!0,this.includeTimestamp=e.includeTimestamp??!0,this.logger=e.logger||u.SilentLogger}isEnabled(){return this.enabled}async logPayload(e,t=`chat`){if(this.enabled)try{let n=d(e),r=`[OpenAI ${t.toUpperCase()}] API Payload`,i=this.includeTimestamp?` (${n.timestamp})`:``;this.logger.group?.(`${r}${i}`),this.logger.info(`šŸ“‹ Request Details:`,{model:e.model,messagesCount:e.messagesCount,hasTools:e.hasTools,temperature:e.temperature,maxTokens:e.maxTokens}),this.logger.debug(`šŸ” Full Payload:`,{type:t,provider:`openai`,...n}),this.logger.groupEnd?.()}catch(e){this.logger.error(`[ConsolePayloadLogger] Failed to log payload:`,e instanceof Error?e.message:`Unknown error`)}}};exports.ConsolePayloadLogger=p,exports.FilePayloadLogger=f;
@@ -0,0 +1,151 @@
1
+ import { ILogger } from "@robota-sdk/agent-core";
2
+
3
+ //#region src/openai/types/api-types.d.ts
4
+ /**
5
+ * Payload logging data structure
6
+ */
7
+ interface IOpenAILogData {
8
+ model: string;
9
+ messagesCount: number;
10
+ hasTools: boolean;
11
+ temperature?: number | undefined;
12
+ maxTokens?: number | undefined;
13
+ timestamp: string;
14
+ requestId?: string | undefined;
15
+ }
16
+ //#endregion
17
+ //#region src/openai/interfaces/payload-logger.d.ts
18
+ /**
19
+ * IPayloadLogger interface for logging OpenAI API payloads
20
+ *
21
+ * This interface provides a contract for different logging implementations:
22
+ * - FilePayloadLogger: Node.js file-based logging
23
+ * - ConsolePayloadLogger: Browser console-based logging
24
+ * - Custom implementations: User-defined loggers
25
+ */
26
+ interface IPayloadLogger {
27
+ /**
28
+ * Check if logging is enabled
29
+ * @returns true if logging is active, false otherwise
30
+ */
31
+ isEnabled(): boolean;
32
+ /**
33
+ * Log API payload data
34
+ * @param payload - The API request/response payload data
35
+ * @param type - Type of operation ('chat' or 'stream')
36
+ */
37
+ logPayload(payload: IOpenAILogData, type: 'chat' | 'stream'): Promise<void>;
38
+ }
39
+ /**
40
+ * Configuration options for payload loggers
41
+ */
42
+ interface IPayloadLoggerOptions {
43
+ /**
44
+ * Whether logging is enabled
45
+ * @defaultValue true
46
+ */
47
+ enabled?: boolean;
48
+ /**
49
+ * Include timestamp in log entries
50
+ * @defaultValue true
51
+ */
52
+ includeTimestamp?: boolean;
53
+ /**
54
+ * Logger instance for console output
55
+ * @defaultValue SilentLogger
56
+ */
57
+ logger?: ILogger;
58
+ }
59
+ //#endregion
60
+ //#region src/openai/loggers/file-payload-logger.d.ts
61
+ /**
62
+ * File-based payload logger for Node.js environments
63
+ *
64
+ * This logger saves API request/response payloads to JSON files on disk.
65
+ * It's designed specifically for Node.js environments with filesystem access.
66
+ *
67
+ * @example
68
+ * ```typescript
69
+ * import { FilePayloadLogger } from '@robota-sdk/agent-provider/openai/loggers';
70
+ *
71
+ * const logger = new FilePayloadLogger({
72
+ * logDir: './logs/api-payloads',
73
+ * enabled: true,
74
+ * includeTimestamp: true
75
+ * });
76
+ *
77
+ * const provider = new OpenAIProvider({
78
+ * client: openaiClient,
79
+ * payloadLogger: logger
80
+ * });
81
+ * ```
82
+ */
83
+ declare class FilePayloadLogger implements IPayloadLogger {
84
+ private readonly enabled;
85
+ private readonly logDir;
86
+ private readonly includeTimestamp;
87
+ private readonly logger;
88
+ constructor(options: {
89
+ logDir: string;
90
+ enabled?: boolean;
91
+ includeTimestamp?: boolean;
92
+ logger?: ILogger;
93
+ });
94
+ /**
95
+ * Check if logging is enabled
96
+ */
97
+ isEnabled(): boolean;
98
+ /**
99
+ * Log API payload to file
100
+ * @param payload - The API request payload
101
+ * @param type - Type of request ('chat' or 'stream')
102
+ */
103
+ logPayload(payload: IOpenAILogData, type?: 'chat' | 'stream'): Promise<void>;
104
+ /**
105
+ * Ensure log directory exists
106
+ */
107
+ private ensureLogDirectoryExists;
108
+ }
109
+ //#endregion
110
+ //#region src/openai/loggers/console-payload-logger.d.ts
111
+ /**
112
+ * Console-based payload logger for browser environments
113
+ *
114
+ * This logger outputs API request/response payloads to the browser console
115
+ * using structured logging. It's designed specifically for browser environments
116
+ * and development/debugging scenarios.
117
+ *
118
+ * @example
119
+ * ```typescript
120
+ * import { ConsolePayloadLogger } from '@robota-sdk/agent-provider/openai/loggers';
121
+ *
122
+ * const logger = new ConsolePayloadLogger({
123
+ * enabled: true,
124
+ * includeTimestamp: true
125
+ * });
126
+ *
127
+ * const provider = new OpenAIProvider({
128
+ * client: openaiClient,
129
+ * payloadLogger: logger
130
+ * });
131
+ * ```
132
+ */
133
+ declare class ConsolePayloadLogger implements IPayloadLogger {
134
+ private readonly enabled;
135
+ private readonly includeTimestamp;
136
+ private readonly logger;
137
+ constructor(options?: IPayloadLoggerOptions);
138
+ /**
139
+ * Check if logging is enabled
140
+ */
141
+ isEnabled(): boolean;
142
+ /**
143
+ * Log API payload to browser console
144
+ * @param payload - The API request payload
145
+ * @param type - Type of request ('chat' or 'stream')
146
+ */
147
+ logPayload(payload: IOpenAILogData, type?: 'chat' | 'stream'): Promise<void>;
148
+ }
149
+ //#endregion
150
+ export { ConsolePayloadLogger, FilePayloadLogger, type IPayloadLogger, type IPayloadLoggerOptions };
151
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/openai/types/api-types.ts","../../src/openai/interfaces/payload-logger.ts","../../src/openai/loggers/file-payload-logger.ts","../../src/openai/loggers/console-payload-logger.ts"],"mappings":";;;;;;UAuGiB,cAAA;EACf,KAAA;EACA,aAAA;EACA,QAAA;EACA,WAAA;EACA,SAAA;EACA,SAAA;EACA,SAAA;AAAA;;;;;AAPF;;;;;;UC5FiB,cAAA;EDgGf;;;;EC3FA,SAAA;ED8FS;;;;ACnGX;EAYE,UAAA,CAAW,OAAA,EAAS,cAAA,EAAgB,IAAA,sBAA0B,OAAO;AAAA;;;;UAMtD,qBAAA;EANJ;;;;EAWX,OAAA;EALe;;;;EAWf,gBAAA;EAAA;;;;EAMA,MAAA,GAAS,OAAO;AAAA;;;;ADyDlB;;;;;;;;;;;;AAOW;;;;ACnGX;;;;;cCmBa,iBAAA,YAA6B,cAAA;EAAA,iBACvB,OAAA;EAAA,iBACA,MAAA;EAAA,iBACA,gBAAA;EAAA,iBACA,MAAA;cAEL,OAAA;IACV,MAAA;IACA,OAAA;IACA,gBAAA;IACA,MAAA,GAAS,OAAA;EAAA;EDNX;;;ECqBA,SAAA,CAAA;EDTgB;AAAA;;;;ECkBV,UAAA,CAAW,OAAA,EAAS,cAAA,EAAgB,IAAA,uBAAmC,OAAA;EAlChD;;;EAAA,QAqErB,wBAAA;AAAA;;;;;AFIV;;;;;;;;;;;;AAOW;;;;ACnGX;;;;cEgBa,oBAAA,YAAgC,cAAA;EAAA,iBAC1B,OAAA;EAAA,iBACA,gBAAA;EAAA,iBACA,MAAA;cAEL,OAAA,GAAS,qBAAA;EFTyC;;AAAO;EEkBrE,SAAA,CAAA;EFZoC;;;;;EEqB9B,UAAA,CAAW,OAAA,EAAS,cAAA,EAAgB,IAAA,uBAAmC,OAAA;AAAA"}
@@ -0,0 +1,2 @@
1
+ import*as e from"fs";import*as t from"path";import{SilentLogger as n}from"@robota-sdk/agent-core";function r(e){return JSON.parse(JSON.stringify(e))}var i=class{enabled;logDir;includeTimestamp;logger;constructor(e){this.enabled=e.enabled??!0,this.logDir=e.logDir,this.includeTimestamp=e.includeTimestamp??!0,this.logger=e.logger||n,this.enabled&&this.ensureLogDirectoryExists()}isEnabled(){return this.enabled}async logPayload(n,i=`chat`){if(this.enabled)try{let a=new Date().toISOString().replace(/[:.]/g,`-`),o=this.includeTimestamp?`openai-${i}-${a}.json`:`openai-${i}-${Date.now()}.json`,s=t.join(this.logDir,o),c={timestamp:new Date().toISOString(),type:i,provider:`openai`,payload:r(n)};await e.promises.writeFile(s,JSON.stringify(c,null,2),`utf8`)}catch(e){this.logger.error(`[FilePayloadLogger] Failed to save payload log:`,{error:e instanceof Error?e.message:String(e)})}}ensureLogDirectoryExists(){try{e.existsSync(this.logDir)||e.mkdirSync(this.logDir,{recursive:!0})}catch(e){this.logger.error(`[FilePayloadLogger] Failed to create log directory:`,{error:e instanceof Error?e.message:String(e)})}}},a=class{enabled;includeTimestamp;logger;constructor(e={}){this.enabled=e.enabled??!0,this.includeTimestamp=e.includeTimestamp??!0,this.logger=e.logger||n}isEnabled(){return this.enabled}async logPayload(e,t=`chat`){if(this.enabled)try{let n=r(e),i=`[OpenAI ${t.toUpperCase()}] API Payload`,a=this.includeTimestamp?` (${n.timestamp})`:``;this.logger.group?.(`${i}${a}`),this.logger.info(`šŸ“‹ Request Details:`,{model:e.model,messagesCount:e.messagesCount,hasTools:e.hasTools,temperature:e.temperature,maxTokens:e.maxTokens}),this.logger.debug(`šŸ” Full Payload:`,{type:t,provider:`openai`,...n}),this.logger.groupEnd?.()}catch(e){this.logger.error(`[ConsolePayloadLogger] Failed to log payload:`,e instanceof Error?e.message:`Unknown error`)}}};export{a as ConsolePayloadLogger,i as FilePayloadLogger};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/openai/loggers/sanitize-openai-log-data.ts","../../src/openai/loggers/file-payload-logger.ts","../../src/openai/loggers/console-payload-logger.ts"],"sourcesContent":["import type { IOpenAILogData } from '../types/api-types';\n\n/**\n * Creates a defensive deep copy of OpenAI log data.\n * SSOT utility shared by payload loggers.\n */\nexport function sanitizeOpenAILogData(payload: IOpenAILogData): IOpenAILogData {\n // Create a deep copy to avoid modifying original\n const sanitized = JSON.parse(JSON.stringify(payload)) as IOpenAILogData;\n\n // Remove or mask sensitive data if needed.\n // For now, we keep everything as OpenAI payloads don't contain API keys.\n return sanitized;\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport type { IPayloadLogger } from '../interfaces/payload-logger';\nimport type { IOpenAILogData } from '../types/api-types';\nimport type { ILogger } from '@robota-sdk/agent-core';\nimport { SilentLogger } from '@robota-sdk/agent-core';\nimport { sanitizeOpenAILogData } from './sanitize-openai-log-data';\n\n/**\n * File-based payload logger for Node.js environments\n *\n * This logger saves API request/response payloads to JSON files on disk.\n * It's designed specifically for Node.js environments with filesystem access.\n *\n * @example\n * ```typescript\n * import { FilePayloadLogger } from '@robota-sdk/agent-provider/openai/loggers';\n *\n * const logger = new FilePayloadLogger({\n * logDir: './logs/api-payloads',\n * enabled: true,\n * includeTimestamp: true\n * });\n *\n * const provider = new OpenAIProvider({\n * client: openaiClient,\n * payloadLogger: logger\n * });\n * ```\n */\nexport class FilePayloadLogger implements IPayloadLogger {\n private readonly enabled: boolean;\n private readonly logDir: string;\n private readonly includeTimestamp: boolean;\n private readonly logger: ILogger;\n\n constructor(options: {\n logDir: string;\n enabled?: boolean;\n includeTimestamp?: boolean;\n logger?: ILogger;\n }) {\n this.enabled = options.enabled ?? true;\n this.logDir = options.logDir;\n this.includeTimestamp = options.includeTimestamp ?? true;\n this.logger = options.logger || SilentLogger;\n\n if (this.enabled) {\n this.ensureLogDirectoryExists();\n }\n }\n\n /**\n * Check if logging is enabled\n */\n isEnabled(): boolean {\n return this.enabled;\n }\n\n /**\n * Log API payload to file\n * @param payload - The API request payload\n * @param type - Type of request ('chat' or 'stream')\n */\n async logPayload(payload: IOpenAILogData, type: 'chat' | 'stream' = 'chat'): Promise<void> {\n if (!this.enabled) {\n return;\n }\n\n try {\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const filename = this.includeTimestamp\n ? `openai-${type}-${timestamp}.json`\n : `openai-${type}-${Date.now()}.json`;\n\n const filepath = path.join(this.logDir, filename);\n\n const logData = {\n timestamp: new Date().toISOString(),\n type,\n provider: 'openai',\n payload: sanitizeOpenAILogData(payload),\n };\n\n await fs.promises.writeFile(filepath, JSON.stringify(logData, null, 2), 'utf8');\n\n // Payload saved successfully (silent operation)\n } catch (error) {\n // Don't throw errors - just log them and continue\n // This ensures that API logging failures don't break the main functionality\n this.logger.error('[FilePayloadLogger] Failed to save payload log:', {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n /**\n * Ensure log directory exists\n */\n private ensureLogDirectoryExists(): void {\n try {\n if (!fs.existsSync(this.logDir)) {\n fs.mkdirSync(this.logDir, { recursive: true });\n }\n } catch (error) {\n this.logger.error('[FilePayloadLogger] Failed to create log directory:', {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n // Sanitization intentionally lives in ./sanitize-openai-log-data.ts (SSOT utility).\n}\n","import type { IPayloadLogger, IPayloadLoggerOptions } from '../interfaces/payload-logger';\nimport type { IOpenAILogData } from '../types/api-types';\nimport { SilentLogger, type ILogger } from '@robota-sdk/agent-core';\nimport { sanitizeOpenAILogData } from './sanitize-openai-log-data';\n\n/**\n * Console-based payload logger for browser environments\n *\n * This logger outputs API request/response payloads to the browser console\n * using structured logging. It's designed specifically for browser environments\n * and development/debugging scenarios.\n *\n * @example\n * ```typescript\n * import { ConsolePayloadLogger } from '@robota-sdk/agent-provider/openai/loggers';\n *\n * const logger = new ConsolePayloadLogger({\n * enabled: true,\n * includeTimestamp: true\n * });\n *\n * const provider = new OpenAIProvider({\n * client: openaiClient,\n * payloadLogger: logger\n * });\n * ```\n */\nexport class ConsolePayloadLogger implements IPayloadLogger {\n private readonly enabled: boolean;\n private readonly includeTimestamp: boolean;\n private readonly logger: ILogger;\n\n constructor(options: IPayloadLoggerOptions = {}) {\n this.enabled = options.enabled ?? true;\n this.includeTimestamp = options.includeTimestamp ?? true;\n this.logger = options.logger || SilentLogger;\n }\n\n /**\n * Check if logging is enabled\n */\n isEnabled(): boolean {\n return this.enabled;\n }\n\n /**\n * Log API payload to browser console\n * @param payload - The API request payload\n * @param type - Type of request ('chat' or 'stream')\n */\n async logPayload(payload: IOpenAILogData, type: 'chat' | 'stream' = 'chat'): Promise<void> {\n if (!this.enabled) {\n return;\n }\n\n try {\n const sanitizedPayload = sanitizeOpenAILogData(payload);\n\n // Use structured console logging for better browser developer tools integration\n const title = `[OpenAI ${type.toUpperCase()}] API Payload`;\n const timeInfo = this.includeTimestamp ? ` (${sanitizedPayload.timestamp})` : '';\n\n // Group related log entries for better organization\n this.logger.group?.(`${title}${timeInfo}`);\n\n // Log different aspects with appropriate console methods\n this.logger.info('šŸ“‹ Request Details:', {\n model: payload.model,\n messagesCount: payload.messagesCount,\n hasTools: payload.hasTools,\n temperature: payload.temperature,\n maxTokens: payload.maxTokens,\n });\n\n this.logger.debug('šŸ” Full Payload:', { type, provider: 'openai', ...sanitizedPayload });\n\n this.logger.groupEnd?.();\n } catch (error) {\n // Don't throw errors - just log them and continue\n // This ensures that API logging failures don't break the main functionality\n this.logger.error(\n '[ConsolePayloadLogger] Failed to log payload:',\n error instanceof Error ? error.message : 'Unknown error',\n );\n }\n }\n\n /**\n * Sanitize payload to remove sensitive information\n * @param payload - Raw payload object\n * @returns Sanitized payload\n */\n // Sanitization intentionally lives in ./sanitize-openai-log-data.ts (SSOT utility).\n}\n"],"mappings":"kGAMA,SAAgB,EAAsB,EAAyC,CAM7E,OAJkB,KAAK,MAAM,KAAK,UAAU,CAAO,CAIpC,CACjB,CCiBA,IAAa,EAAb,KAAyD,CACvD,QACA,OACA,iBACA,OAEA,YAAY,EAKT,CACD,KAAK,QAAU,EAAQ,SAAW,GAClC,KAAK,OAAS,EAAQ,OACtB,KAAK,iBAAmB,EAAQ,kBAAoB,GACpD,KAAK,OAAS,EAAQ,QAAU,EAE5B,KAAK,SACP,KAAK,yBAAyB,CAElC,CAKA,WAAqB,CACnB,OAAO,KAAK,OACd,CAOA,MAAM,WAAW,EAAyB,EAA0B,OAAuB,CACpF,QAAK,QAIV,GAAI,CACF,IAAM,EAAY,IAAI,KAAK,EAAE,YAAY,EAAE,QAAQ,QAAS,GAAG,EACzD,EAAW,KAAK,iBAClB,UAAU,EAAK,GAAG,EAAU,OAC5B,UAAU,EAAK,GAAG,KAAK,IAAI,EAAE,OAE3B,EAAW,EAAK,KAAK,KAAK,OAAQ,CAAQ,EAE1C,EAAU,CACd,UAAW,IAAI,KAAK,EAAE,YAAY,EAClC,OACA,SAAU,SACV,QAAS,EAAsB,CAAO,CACxC,EAEA,MAAM,EAAG,SAAS,UAAU,EAAU,KAAK,UAAU,EAAS,KAAM,CAAC,EAAG,MAAM,CAGhF,OAAS,EAAO,CAGd,KAAK,OAAO,MAAM,kDAAmD,CACnE,MAAO,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,CAC9D,CAAC,CACH,CACF,CAKA,0BAAyC,CACvC,GAAI,CACG,EAAG,WAAW,KAAK,MAAM,GAC5B,EAAG,UAAU,KAAK,OAAQ,CAAE,UAAW,EAAK,CAAC,CAEjD,OAAS,EAAO,CACd,KAAK,OAAO,MAAM,sDAAuD,CACvE,MAAO,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,CAC9D,CAAC,CACH,CACF,CAEF,ECpFa,EAAb,KAA4D,CAC1D,QACA,iBACA,OAEA,YAAY,EAAiC,CAAC,EAAG,CAC/C,KAAK,QAAU,EAAQ,SAAW,GAClC,KAAK,iBAAmB,EAAQ,kBAAoB,GACpD,KAAK,OAAS,EAAQ,QAAU,CAClC,CAKA,WAAqB,CACnB,OAAO,KAAK,OACd,CAOA,MAAM,WAAW,EAAyB,EAA0B,OAAuB,CACpF,QAAK,QAIV,GAAI,CACF,IAAM,EAAmB,EAAsB,CAAO,EAGhD,EAAQ,WAAW,EAAK,YAAY,EAAE,eACtC,EAAW,KAAK,iBAAmB,KAAK,EAAiB,UAAU,GAAK,GAG9E,KAAK,OAAO,QAAQ,GAAG,IAAQ,GAAU,EAGzC,KAAK,OAAO,KAAK,sBAAuB,CACtC,MAAO,EAAQ,MACf,cAAe,EAAQ,cACvB,SAAU,EAAQ,SAClB,YAAa,EAAQ,YACrB,UAAW,EAAQ,SACrB,CAAC,EAED,KAAK,OAAO,MAAM,mBAAoB,CAAE,OAAM,SAAU,SAAU,GAAG,CAAiB,CAAC,EAEvF,KAAK,OAAO,WAAW,CACzB,OAAS,EAAO,CAGd,KAAK,OAAO,MACV,gDACA,aAAiB,MAAQ,EAAM,QAAU,eAC3C,CACF,CACF,CAQF"}
@@ -0,0 +1 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../anthropic-BFQ6DSCP.cjs`);exports.ANTHROPIC_MODEL_LAST_VERIFIED_AT=e.n,exports.ANTHROPIC_MODEL_SOURCE_URL=e.r,exports.AnthropicProvider=e.l,exports.DEFAULT_ANTHROPIC_PROVIDER_API_KEY_ENV=e.i,exports.DEFAULT_ANTHROPIC_PROVIDER_API_KEY_REFERENCE=e.a,exports.DEFAULT_ANTHROPIC_PROVIDER_MODEL=e.o,exports.createAnthropicProvider=e.t,exports.createAnthropicProviderDefinition=e.s,exports.refreshAnthropicModelCatalog=e.c;
@@ -0,0 +1,158 @@
1
+ import Anthropic from "@anthropic-ai/sdk";
2
+ import { AbstractAIProvider, IChatOptions, IExecutor, IProviderCapabilities, IProviderDefinition, IProviderModelCatalog, IProviderNativeWebToolRequest, IProviderProfileConfig, TProviderOptionValueBase, TTextDeltaCallback, TUniversalMessage } from "@robota-sdk/agent-core";
3
+
4
+ //#region src/anthropic/types.d.ts
5
+ /**
6
+ * Valid provider option value types
7
+ */
8
+ type TAnthropicProviderOptionValue = string | number | boolean | undefined | null | Anthropic | IExecutor | TProviderOptionValueBase | TAnthropicProviderOptionValue[] | {
9
+ [key: string]: TAnthropicProviderOptionValue;
10
+ };
11
+ /**
12
+ * Anthropic provider options
13
+ *
14
+ * Note: Anthropic API doesn't support response format configuration.
15
+ * JSON output can be requested through prompt instructions.
16
+ */
17
+ interface IAnthropicProviderOptions {
18
+ /**
19
+ * Additional provider-specific options
20
+ */
21
+ [key: string]: TAnthropicProviderOptionValue;
22
+ /**
23
+ * Anthropic API key (required when client and executor are not provided)
24
+ */
25
+ apiKey?: string;
26
+ /**
27
+ * API request timeout (milliseconds)
28
+ */
29
+ timeout?: number;
30
+ /**
31
+ * API base URL
32
+ */
33
+ baseURL?: string;
34
+ /**
35
+ * Anthropic client instance (optional: will be created from apiKey if not provided)
36
+ * Use this path for advanced Anthropic SDK authentication that is outside
37
+ * Robota's normal API-key setup flow.
38
+ */
39
+ client?: Anthropic;
40
+ /**
41
+ * Optional executor for handling AI requests
42
+ *
43
+ * When provided, the provider will delegate all chat operations to this executor
44
+ * instead of making direct API calls. This enables remote execution capabilities.
45
+ *
46
+ * @example
47
+ * ```typescript
48
+ * import { LocalExecutor, RemoteExecutor } from '@robota-sdk/agent-core';
49
+ *
50
+ * // Local execution (registers this provider)
51
+ * const localExecutor = new LocalExecutor();
52
+ * localExecutor.registerProvider('anthropic', new AnthropicProvider({ apiKey: 'sk-ant-...' }));
53
+ *
54
+ * // Remote execution
55
+ * const remoteExecutor = new RemoteExecutor({
56
+ * serverUrl: 'https://api.robota.io',
57
+ * userApiKey: 'user-token-123'
58
+ * });
59
+ *
60
+ * const provider = new AnthropicProvider({
61
+ * executor: remoteExecutor // No direct API key needed
62
+ * });
63
+ * ```
64
+ */
65
+ executor?: IExecutor;
66
+ }
67
+ //#endregion
68
+ //#region src/anthropic/provider.d.ts
69
+ /**
70
+ * Anthropic provider implementation for Robota
71
+ *
72
+ * IMPORTANT PROVIDER-SPECIFIC RULES:
73
+ * 1. This provider MUST extend BaseAIProvider from @robota-sdk/agent-core
74
+ * 2. Content handling for Anthropic API:
75
+ * - When tool_calls are present: content MUST be null (not empty string)
76
+ * - For regular assistant messages: content should be a string
77
+ * 3. Use override keyword for all methods inherited from BaseAIProvider
78
+ * 4. Provider-specific API behavior should be documented here
79
+ *
80
+ * @public
81
+ */
82
+ declare class AnthropicProvider extends AbstractAIProvider {
83
+ readonly name = "anthropic";
84
+ readonly version = "1.0.0";
85
+ private readonly client?;
86
+ private readonly options;
87
+ /**
88
+ * When true, Anthropic server tools (web_search) are included in every request.
89
+ * The server executes these tools internally — no local tool registration needed.
90
+ */
91
+ enableWebTools: boolean;
92
+ /**
93
+ * Optional callback for text deltas during streaming.
94
+ * Set by the consumer (e.g., Session) to receive real-time text chunks.
95
+ * When set, chat() uses streaming internally while still returning
96
+ * the complete assembled message.
97
+ */
98
+ onTextDelta?: TTextDeltaCallback;
99
+ /** Callback when a server tool (web_search etc.) is invoked by the API */
100
+ onServerToolUse?: (toolName: string, input: Record<string, string>) => void;
101
+ constructor(options: IAnthropicProviderOptions);
102
+ /**
103
+ * Generate response using TUniversalMessage
104
+ */
105
+ chat(messages: TUniversalMessage[], options?: IChatOptions): Promise<TUniversalMessage>;
106
+ /**
107
+ * Generate streaming response using TUniversalMessage
108
+ */
109
+ chatStream(messages: TUniversalMessage[], options?: IChatOptions): AsyncIterable<TUniversalMessage>;
110
+ supportsTools(): boolean;
111
+ getCapabilities(): IProviderCapabilities;
112
+ configureNativeWebTools(request: IProviderNativeWebToolRequest): IProviderCapabilities;
113
+ validateConfig(): boolean;
114
+ dispose(): Promise<void>;
115
+ /**
116
+ * Validate TUniversalMessage array
117
+ */
118
+ protected validateMessages(messages: TUniversalMessage[]): void;
119
+ }
120
+ //#endregion
121
+ //#region src/anthropic/provider-definition.d.ts
122
+ declare const DEFAULT_ANTHROPIC_PROVIDER_MODEL = "claude-sonnet-4-6";
123
+ declare const DEFAULT_ANTHROPIC_PROVIDER_API_KEY_ENV = "ANTHROPIC_API_KEY";
124
+ declare const DEFAULT_ANTHROPIC_PROVIDER_API_KEY_REFERENCE = "$ENV:ANTHROPIC_API_KEY";
125
+ declare const ANTHROPIC_MODEL_SOURCE_URL = "https://platform.claude.com/docs/en/api/models/list";
126
+ declare const ANTHROPIC_MODEL_LAST_VERIFIED_AT = "2026-05-04";
127
+ declare function createAnthropicProviderDefinition(): IProviderDefinition;
128
+ //#endregion
129
+ //#region src/anthropic/model-catalog-refresh.d.ts
130
+ interface IAnthropicModelsResponse {
131
+ data?: Array<{
132
+ id?: string;
133
+ display_name?: string;
134
+ type?: string;
135
+ }>;
136
+ has_more?: boolean;
137
+ }
138
+ interface IAnthropicFetchInit {
139
+ headers?: Record<string, string>;
140
+ }
141
+ interface IAnthropicFetchResponse {
142
+ ok: boolean;
143
+ status: number;
144
+ json: () => Promise<IAnthropicModelsResponse>;
145
+ }
146
+ type TAnthropicFetch = (url: string, init?: IAnthropicFetchInit) => Promise<IAnthropicFetchResponse>;
147
+ declare function refreshAnthropicModelCatalog(profile: IProviderProfileConfig, fetcher?: TAnthropicFetch): Promise<IProviderModelCatalog>;
148
+ //#endregion
149
+ //#region src/anthropic/index.d.ts
150
+ /**
151
+ * Factory function for creating an AnthropicProvider instance.
152
+ * @param _options - Configuration options for the Anthropic provider
153
+ * @returns An AnthropicProvider instance
154
+ */
155
+ declare function createAnthropicProvider(_options: IAnthropicProviderOptions): void;
156
+ //#endregion
157
+ export { ANTHROPIC_MODEL_LAST_VERIFIED_AT, ANTHROPIC_MODEL_SOURCE_URL, AnthropicProvider, DEFAULT_ANTHROPIC_PROVIDER_API_KEY_ENV, DEFAULT_ANTHROPIC_PROVIDER_API_KEY_REFERENCE, DEFAULT_ANTHROPIC_PROVIDER_MODEL, IAnthropicFetchInit, IAnthropicFetchResponse, IAnthropicModelsResponse, IAnthropicProviderOptions, TAnthropicFetch, TAnthropicProviderOptionValue, createAnthropicProvider, createAnthropicProviderDefinition, refreshAnthropicModelCatalog };
158
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/anthropic/types.ts","../../../src/anthropic/provider.ts","../../../src/anthropic/provider-definition.ts","../../../src/anthropic/model-catalog-refresh.ts","../../../src/anthropic/index.ts"],"mappings":";;;;;;AAMA;KAAY,6BAAA,kDAMR,SAAA,GACA,SAAA,GACA,wBAAA,GACA,6BAAA;EAAA,CACG,GAAA,WAAc,6BAAA;AAAA;;;;;;;UAQJ,yBAAA;EAXb;;;EAAA,CAeD,GAAA,WAAc,6BAAA;EAZI;;AAA6B;EAiBhD,MAAA;EATwC;;;EAcxC,OAAA;EAuCW;;;EAlCX,OAAA;EAfe;;;;;EAsBf,MAAA,GAAS,SAAA;EA2BT;;;AAAoB;;;;AClDtB;;;;;;;;;;;;;;;;;;EDkDE,QAAA,GAAW,SAAA;AAAA;;;;AAvEb;;;;;;;;;;;;cCqBa,iBAAA,SAA0B,kBAAA;EAAA,SACnB,IAAA;EAAA,SACA,OAAA;EAAA,iBAED,MAAA;EAAA,iBACA,OAAA;EDhB+B;AAQlD;;;ECcE,cAAA;EDYS;;;;;;ECJT,WAAA,GAAc,kBAAA;EDRd;ECWA,eAAA,IAAmB,QAAA,UAAkB,KAAA,EAAO,MAAA;cAEhC,OAAA,EAAS,yBAAA;EDDZ;;;EC8BM,IAAA,CACb,QAAA,EAAU,iBAAA,IACV,OAAA,GAAU,YAAA,GACT,OAAA,CAAQ,iBAAA;EDNS;;;ECqEJ,UAAA,CACd,QAAA,EAAU,iBAAA,IACV,OAAA,GAAU,YAAA,GACT,aAAA,CAAc,iBAAA;EAgFR,aAAA,CAAA;EAIA,eAAA,CAAA,GAAmB,qBAAA;EAsB5B,uBAAA,CAAwB,OAAA,EAAS,6BAAA,GAAgC,qBAAA;EAQxD,cAAA,CAAA;EAIM,OAAA,CAAA,GAAW,OAAA;EAxNL;;;EAAA,UA+NF,gBAAA,CAAiB,QAAA,EAAU,iBAAA;AAAA;;;cC1QnC,gCAAA;AAAA,cACA,sCAAA;AAAA,cACA,4CAAA;AAAA,cACA,0BAAA;AAAA,cACA,gCAAA;AAAA,iBAcG,iCAAA,CAAA,GAAqC,mBAAmB;;;UCbvD,wBAAA;EACf,IAAA,GAAO,KAAK;IACV,EAAA;IACA,YAAA;IACA,IAAA;EAAA;EAEF,QAAA;AAAA;AAAA,UAGe,mBAAA;EACf,OAAA,GAAU,MAAM;AAAA;AAAA,UAGD,uBAAA;EACf,EAAA;EACA,MAAA;EACA,IAAA,QAAY,OAAO,CAAC,wBAAA;AAAA;AAAA,KAGV,eAAA,IACV,GAAA,UACA,IAAA,GAAO,mBAAA,KACJ,OAAA,CAAQ,uBAAA;AAAA,iBAES,4BAAA,CACpB,OAAA,EAAS,sBAAA,EACT,OAAA,GAAS,eAAA,GACR,OAAA,CAAQ,qBAAA;;;;;;;;iBCrBK,uBAAA,CAAwB,QAAmC,EAAzB,yBAAyB"}
@@ -0,0 +1 @@
1
+ import{a as e,c as t,i as n,l as r,n as i,o as a,r as o,s,t as c}from"../anthropic--1vgLC-e.js";export{i as ANTHROPIC_MODEL_LAST_VERIFIED_AT,o as ANTHROPIC_MODEL_SOURCE_URL,r as AnthropicProvider,n as DEFAULT_ANTHROPIC_PROVIDER_API_KEY_ENV,e as DEFAULT_ANTHROPIC_PROVIDER_API_KEY_REFERENCE,a as DEFAULT_ANTHROPIC_PROVIDER_MODEL,c as createAnthropicProvider,s as createAnthropicProviderDefinition,t as refreshAnthropicModelCatalog};
@@ -0,0 +1,5 @@
1
+ import{randomUUID as e}from"node:crypto";import t from"@anthropic-ai/sdk";import{AbstractAIProvider as n,CLAUDE_MODELS as r,getModelMaxOutput as i}from"@robota-sdk/agent-core";function a(e){return e.map(e=>{if(e.role===`user`)return{role:`user`,content:e.content||``};if(e.role===`assistant`){let t=e;if(t.toolCalls&&t.toolCalls.length>0){let e=[];t.content&&e.push({type:`text`,text:t.content});for(let n of t.toolCalls)e.push({type:`tool_use`,id:n.id,name:n.function.name,input:JSON.parse(n.function.arguments)});return{role:`assistant`,content:e}}return{role:`assistant`,content:t.content||``}}else if(e.role===`tool`)return{role:`user`,content:[{type:`tool_result`,tool_use_id:e.toolCallId??``,content:e.content||``}]};else return{role:`user`,content:e.content||``}})}function o(e){if(!Array.isArray(e.content))return``;let t=e.content.filter(e=>e.type===`web_search_result`&&`title`in e&&`url`in e).map((e,t)=>`${t+1}. ${e.title}\n ${e.url}`).join(`
2
+ `);return t?`[Web Search Results]\n${t}`:``}function s(e){return e.map(e=>({name:e.name,description:e.description,input_schema:e.parameters}))}async function c(t,n,r,i,a,s){let c={...n,stream:!0};s?.({provider:`anthropic`,apiSurface:`anthropic-messages`,payloadKind:`request`,payload:c});let d=await t.messages.create(c,a?{signal:a}:void 0),f=[],p=[],m=``,h=``,g=``,_={input_tokens:0,output_tokens:0},v=``,y=null;try{let e=0;for await(let t of u(d,a))switch(s?.({provider:`anthropic`,apiSurface:`anthropic-messages`,payloadKind:`stream_event`,sequence:e,payload:t}),e++,t.type){case`message_start`:_=t.message.usage,v=t.message.model;break;case`content_block_start`:if(t.content_block.type===`tool_use`)m=t.content_block.id,h=t.content_block.name,g=``;else if(t.content_block.type===`server_tool_use`){let e=t.content_block,n=e.input?.query??``,a=n?`\nšŸ” Searching: "${n}"\n`:`\nšŸ” [${e.name??`server_tool`}]\n`;f.push(a),r(a),i&&i(e.name??`server_tool`,{query:n})}else if(t.content_block.type===`web_search_tool_result`){let e=t.content_block,n=o(e);n&&(f.push(`\n${n}\n\n`),r(`\n${n}\n\n`))}break;case`content_block_delta`:t.delta.type===`text_delta`?(f.push(t.delta.text),r(t.delta.text)):t.delta.type===`input_json_delta`&&(g+=t.delta.partial_json);break;case`content_block_stop`:m&&(p.push({id:m,type:`function`,function:{name:h,arguments:g||`{}`}}),m=``,h=``,g=``);break;case`message_delta`:t.usage&&(_.output_tokens=t.usage.output_tokens),y=t.delta.stop_reason;break}}catch(e){if(e instanceof Error&&e.name===`AbortError`)return l(f,p,_,v);throw e}if(a?.aborted)return l(f,p,_,v);let b=f.join(``)||``,x={id:e(),role:`assistant`,content:b,state:`complete`,timestamp:new Date,...p.length>0&&{toolCalls:p}};return x.metadata={inputTokens:_.input_tokens,outputTokens:_.output_tokens,model:v},y&&(x.metadata.stopReason=y),x}function l(t,n,r,i){let a=t.join(``)||``,o={id:e(),role:`assistant`,content:a,state:`complete`,timestamp:new Date,...n.length>0&&{toolCalls:n}};return o.metadata={inputTokens:r.input_tokens,outputTokens:r.output_tokens,model:i,stopReason:`aborted`},o}async function*u(e,t){for await(let n of e){if(t?.aborted)break;yield n}}var d=class extends n{name=`anthropic`;version=`1.0.0`;client;options;enableWebTools=!1;onTextDelta;onServerToolUse;constructor(e){if(super(),this.options=e,e.executor&&(this.executor=e.executor),!this.executor)if(e.client)this.client=e.client;else if(e.apiKey)this.client=new t({apiKey:e.apiKey,...e.timeout&&{timeout:e.timeout},...e.baseURL&&{baseURL:e.baseURL}});else throw Error(`Either Anthropic client, apiKey, or executor is required`)}async chat(e,t){if(this.validateMessages(e),this.validateNativeWebTools(t?.nativeWebTools),this.executor)try{return await this.executeViaExecutorOrDirect(e,t)}catch(e){throw e}if(!this.client)throw Error(`Anthropic client not available. Either provide a client/apiKey or use an executor.`);let n=e.filter(e=>e.role===`system`),r=a(e.filter(e=>e.role!==`system`)),o=n.map(e=>e.content||``).join(`
3
+
4
+ `)||void 0;if(!t?.model)throw Error(`Model is required in chat options. Please specify a model in defaultModel configuration.`);let l=t?.tools?s(t.tools):[],u=this.enableWebTools?[{type:`web_search_20250305`,name:`web_search`}]:[],d=[...l,...u],f={model:t.model,messages:r,max_tokens:t?.maxTokens||i(t.model),...o&&{system:o},...t?.temperature!==void 0&&{temperature:t.temperature},...d.length>0&&{tools:d}},p=t?.onTextDelta??this.onTextDelta??(()=>{});return c(this.client,f,p,this.onServerToolUse,t?.signal,t?.onProviderNativeRawPayload)}async*chatStream(t,n){if(this.validateMessages(t),this.validateNativeWebTools(n?.nativeWebTools),this.executor)try{yield*this.executeStreamViaExecutorOrDirect(t,n);return}catch(e){throw e}if(!this.client)throw Error(`Anthropic client not available. Either provide a client/apiKey or use an executor.`);let r=a(t);if(!n?.model)throw Error(`Model is required in chat options. Please specify a model in defaultModel configuration.`);let o={model:n.model,messages:r,max_tokens:n?.maxTokens||i(n.model),stream:!0};n?.temperature!==void 0&&(o.temperature=n.temperature);let c=n?.tools?s(n.tools):[],l=this.enableWebTools?[{type:`web_search_20250305`,name:`web_search`}]:[],u=[...c,...l];u.length>0&&(o.tools=u),n?.onProviderNativeRawPayload?.({provider:`anthropic`,apiSurface:`anthropic-messages`,payloadKind:`request`,payload:o});let d=await this.client.messages.create(o),f=0;for await(let t of d)n?.onProviderNativeRawPayload?.({provider:`anthropic`,apiSurface:`anthropic-messages`,payloadKind:`stream_event`,sequence:f,payload:t}),f++,t.type===`content_block_delta`&&t.delta.type===`text_delta`&&(yield{id:e(),role:`assistant`,content:t.delta.text,state:`complete`,timestamp:new Date})}supportsTools(){return!0}getCapabilities(){return{functionCalling:{supported:!0},nativeWebTools:{webSearch:this.enableWebTools?{supported:!0,enabled:!0,source:`anthropic-messages`}:{supported:!0,enabled:!1,source:`anthropic-messages`,reason:`Call configureNativeWebTools({ webSearch: true }) or set enableWebTools.`},webFetch:{supported:!1,enabled:!1,source:`anthropic-messages`,reason:`Anthropic provider exposes server web search only.`}}}}configureNativeWebTools(e){return e.webSearch===!0&&(this.enableWebTools=!0),this.validateNativeWebTools(e),this.getCapabilities()}validateConfig(){return!!this.client&&!!this.options&&!!this.options.apiKey}async dispose(){}validateMessages(e){if(!Array.isArray(e))throw Error(`Messages must be an array`);if(e.length===0)throw Error(`Messages array cannot be empty`);for(let t of e)if(!t.role||![`user`,`assistant`,`system`,`tool`].includes(t.role))throw Error(`Invalid message role: ${t.role}`)}};async function f(e,t=h){return p(e,t)}async function p(e,t){let n=await t(`https://api.anthropic.com/v1/models`,m(e.apiKey)).catch(e=>({ok:!1,status:0,json:()=>Promise.resolve({data:[]}),errorMessage:`Anthropic model refresh failed: ${e instanceof Error?e.message:String(e)}`}));if(`errorMessage`in n)return{status:`unavailable`,sourceUrl:y,message:n.errorMessage};if(!n.ok)return{status:`unavailable`,sourceUrl:y,message:`Anthropic model refresh failed: HTTP ${n.status}`};let r=await n.json(),i=new Date().toISOString(),a=(r.data??[]).filter(e=>typeof e.id==`string`&&e.id.length>0).map(e=>({id:e.id,displayName:e.display_name??e.id,lifecycle:`active`,sourceUrl:y,lastVerifiedAt:i}));return{status:`live`,sourceUrl:y,lastVerifiedAt:b,entries:a,message:`Fetched ${a.length} models from Anthropic API`}}function m(e){if(e)return{headers:{"x-api-key":e,"anthropic-version":`2023-06-01`}}}async function h(e,t){let n=await fetch(e,{...t?.headers!==void 0&&{headers:t.headers}});return{ok:n.ok,status:n.status,json:()=>n.json()}}const g=`claude-sonnet-4-6`,_=`ANTHROPIC_API_KEY`,v=`$ENV:${_}`,y=`https://platform.claude.com/docs/en/api/models/list`,b=`2026-05-04`,x=[{kind:`api-key`,label:`Anthropic API keys`,url:`https://platform.claude.com/settings/keys`,sourceUrl:`https://platform.claude.com/docs/en/api/overview`,lastVerifiedAt:`2026-05-08`}];function S(){return{type:`anthropic`,displayName:`Anthropic`,description:`Claude models through Anthropic API`,defaults:{model:g,apiKey:v},modelCatalog:{status:`fallback`,sourceUrl:y,lastVerifiedAt:b,entries:C()},setupHelpLinks:x,setupSteps:[{key:`apiKey`,title:`Anthropic API key`,defaultValue:v,masked:!0},{key:`model`,title:`Anthropic model`,defaultValue:g}],refreshModelCatalog:({profile:e})=>f(e),modelCatalogCacheTtlSeconds:86400,requiresApiKey:!0,createProvider:e=>new d({apiKey:w(e.apiKey),...e.baseURL!==void 0&&{baseURL:e.baseURL},...e.timeout!==void 0&&{timeout:e.timeout},defaultModel:e.model})}}function C(){let e=new Set,t=[];for(let n of Object.values(r))e.has(n.name)||(e.add(n.name),t.push({id:n.id,displayName:n.name,contextWindow:n.contextWindow,capabilities:[`tools`,`vision`,`json_schema`,`reasoning`,`streaming`],lifecycle:`active`,sourceUrl:y,lastVerifiedAt:b}));return t}function w(e){if(!e)throw Error(`Provider anthropic requires apiKey`);return e}function T(e){}export{v as a,f as c,_ as i,d as l,b as n,g as o,y as r,S as s,T as t};
5
+ //# sourceMappingURL=anthropic--1vgLC-e.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic--1vgLC-e.js","names":["toolMsg"],"sources":["../../src/anthropic/message-converter.ts","../../src/anthropic/streaming-handler.ts","../../src/anthropic/provider.ts","../../src/anthropic/model-catalog-refresh.ts","../../src/anthropic/provider-definition.ts","../../src/anthropic/index.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\nimport Anthropic from '@anthropic-ai/sdk';\nimport type {\n TUniversalMessage,\n IToolSchema,\n IAssistantMessage,\n IToolMessage,\n} from '@robota-sdk/agent-core';\n\n/**\n * Convert TUniversalMessage array to Anthropic message format.\n *\n * CRITICAL: Anthropic API requires specific content handling:\n * - tool_use messages: content MUST be null\n * - regular messages: content should be a string\n */\nexport function convertToAnthropicFormat(messages: TUniversalMessage[]): Anthropic.MessageParam[] {\n return messages.map((msg) => {\n if (msg.role === 'user') {\n return {\n role: 'user',\n content: msg.content || '',\n };\n } else if (msg.role === 'assistant') {\n const assistantMsg = msg as IAssistantMessage;\n\n // Anthropic uses content blocks — include both text and tool_use\n if (assistantMsg.toolCalls && assistantMsg.toolCalls.length > 0) {\n const contentBlocks: Array<Anthropic.TextBlockParam | Anthropic.ToolUseBlockParam> = [];\n\n // Include text content if present alongside tool calls\n if (assistantMsg.content) {\n contentBlocks.push({\n type: 'text' as const,\n text: assistantMsg.content,\n });\n }\n\n for (const tc of assistantMsg.toolCalls) {\n contentBlocks.push({\n type: 'tool_use' as const,\n id: tc.id,\n name: tc.function.name,\n input: JSON.parse(tc.function.arguments),\n });\n }\n\n return {\n role: 'assistant' as const,\n content: contentBlocks,\n };\n }\n\n // Regular assistant message (no tool calls)\n return {\n role: 'assistant',\n content: assistantMsg.content || '',\n };\n } else if (msg.role === 'tool') {\n // Tool result message — convert to Anthropic tool_result content block\n const toolMsg = msg as IToolMessage;\n return {\n role: 'user' as const,\n content: [\n {\n type: 'tool_result' as const,\n tool_use_id: toolMsg.toolCallId ?? '',\n content: msg.content || '',\n },\n ],\n };\n } else {\n // System messages\n return {\n role: 'user', // Anthropic doesn't have system role, use user\n content: msg.content || '',\n };\n }\n });\n}\n\n/**\n * Convert Anthropic response to TUniversalMessage.\n *\n * Anthropic responses can contain multiple content blocks:\n * e.g., [text(\"I'll read the file\"), tool_use(Read, {...}), tool_use(Bash, {...})]\n * We must extract ALL text and ALL tool_use blocks.\n */\nexport function convertFromAnthropicResponse(response: Anthropic.Message): TUniversalMessage {\n if (!response.content || response.content.length === 0) {\n throw new Error('No content in Anthropic response');\n }\n\n let textParts: string[] = [];\n const toolCalls: Array<{\n id: string;\n type: 'function';\n function: { name: string; arguments: string };\n }> = [];\n\n for (const block of response.content) {\n if (block.type === 'text') {\n const textBlock = block as Anthropic.TextBlock;\n if (textBlock.text) {\n textParts.push(textBlock.text);\n }\n } else if (block.type === 'tool_use') {\n const toolBlock = block as Anthropic.ToolUseBlock;\n toolCalls.push({\n id: toolBlock.id,\n type: 'function' as const,\n function: {\n name: toolBlock.name,\n arguments: JSON.stringify(toolBlock.input),\n },\n });\n } else if (block.type === 'server_tool_use') {\n // Server tool invocation (e.g., web_search) — results come in a separate block\n } else if (block.type === 'web_search_tool_result') {\n const resultBlock = block as Anthropic.Messages.WebSearchToolResultBlock;\n const searchResults = formatWebSearchResults(resultBlock);\n if (searchResults) {\n textParts.push(searchResults);\n }\n }\n }\n\n // Use empty string instead of null so agent-core's buildFinalResult\n // doesn't reject the message. Tool-only responses have no text.\n const textContent = textParts.join('\\n') || '';\n\n const result: TUniversalMessage = {\n id: randomUUID(),\n role: 'assistant',\n content: textContent,\n state: 'complete' as const,\n timestamp: new Date(),\n ...(toolCalls.length > 0 && { toolCalls }),\n };\n\n // Add metadata if available\n if (response.usage) {\n result.metadata = {\n inputTokens: response.usage.input_tokens,\n outputTokens: response.usage.output_tokens,\n model: response.model,\n };\n\n if (response.stop_reason) {\n result.metadata['stopReason'] = response.stop_reason;\n }\n }\n\n return result;\n}\n\n/** Format a WebSearchToolResultBlock into readable text. */\nexport function formatWebSearchResults(block: Anthropic.Messages.WebSearchToolResultBlock): string {\n if (!Array.isArray(block.content)) return '';\n\n const results = block.content\n .filter(\n (r): r is Anthropic.Messages.WebSearchResultBlock =>\n r.type === 'web_search_result' && 'title' in r && 'url' in r,\n )\n .map((r, i) => `${i + 1}. ${r.title}\\n ${r.url}`)\n .join('\\n');\n\n return results ? `[Web Search Results]\\n${results}` : '';\n}\n\n/**\n * Convert tool schemas to Anthropic format.\n */\nexport function convertToolsToAnthropicFormat(tools: IToolSchema[]): Anthropic.Tool[] {\n return tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n input_schema: tool.parameters as Anthropic.Tool.InputSchema,\n }));\n}\n","import { randomUUID } from 'node:crypto';\nimport Anthropic from '@anthropic-ai/sdk';\nimport type {\n TProviderNativeRawPayloadCallback,\n TUniversalMessage,\n TTextDeltaCallback,\n} from '@robota-sdk/agent-core';\nimport { formatWebSearchResults } from './message-converter';\n\n/**\n * Stream the Anthropic API response and assemble a complete TUniversalMessage.\n *\n * Calls onTextDelta for each text chunk as it arrives.\n * Returns the fully assembled TUniversalMessage when the stream is done.\n */\nexport async function streamAndAssemble(\n client: Anthropic,\n params: Anthropic.MessageCreateParamsNonStreaming,\n onTextDelta: TTextDeltaCallback,\n onServerToolUse: ((toolName: string, input: Record<string, string>) => void) | undefined,\n signal: AbortSignal | undefined,\n onProviderNativeRawPayload?: TProviderNativeRawPayloadCallback,\n): Promise<TUniversalMessage> {\n const streamParams: Anthropic.MessageCreateParamsStreaming = {\n ...params,\n stream: true,\n };\n\n onProviderNativeRawPayload?.({\n provider: 'anthropic',\n apiSurface: 'anthropic-messages',\n payloadKind: 'request',\n payload: streamParams,\n });\n const stream = await client.messages.create(streamParams, signal ? { signal } : undefined);\n\n // Accumulate the full response from stream events\n const textParts: string[] = [];\n const toolCalls: Array<{\n id: string;\n type: 'function';\n function: { name: string; arguments: string };\n }> = [];\n let currentToolId = '';\n let currentToolName = '';\n let currentToolJson = '';\n let usage = { input_tokens: 0, output_tokens: 0 };\n let model = '';\n let stopReason: string | null = null;\n\n try {\n let sequence = 0;\n for await (const event of streamWithAbort(stream, signal)) {\n onProviderNativeRawPayload?.({\n provider: 'anthropic',\n apiSurface: 'anthropic-messages',\n payloadKind: 'stream_event',\n sequence,\n payload: event,\n });\n sequence++;\n switch (event.type) {\n case 'message_start':\n usage = event.message.usage;\n model = event.message.model;\n break;\n\n case 'content_block_start':\n if (event.content_block.type === 'tool_use') {\n currentToolId = event.content_block.id;\n currentToolName = event.content_block.name;\n currentToolJson = '';\n } else if (event.content_block.type === 'server_tool_use') {\n const serverBlock = event.content_block as {\n name?: string;\n input?: { query?: string };\n };\n const query = serverBlock.input?.query ?? '';\n const toolLabel = query\n ? `\\nšŸ” Searching: \"${query}\"\\n`\n : `\\nšŸ” [${serverBlock.name ?? 'server_tool'}]\\n`;\n textParts.push(toolLabel);\n onTextDelta(toolLabel);\n if (onServerToolUse) {\n onServerToolUse(serverBlock.name ?? 'server_tool', { query });\n }\n } else if (event.content_block.type === 'web_search_tool_result') {\n const resultBlock = event.content_block as Anthropic.Messages.WebSearchToolResultBlock;\n const formatted = formatWebSearchResults(resultBlock);\n if (formatted) {\n textParts.push(`\\n${formatted}\\n\\n`);\n onTextDelta(`\\n${formatted}\\n\\n`);\n }\n }\n break;\n\n case 'content_block_delta':\n if (event.delta.type === 'text_delta') {\n textParts.push(event.delta.text);\n onTextDelta(event.delta.text);\n } else if (event.delta.type === 'input_json_delta') {\n currentToolJson += event.delta.partial_json;\n }\n break;\n\n case 'content_block_stop':\n if (currentToolId) {\n toolCalls.push({\n id: currentToolId,\n type: 'function' as const,\n function: {\n name: currentToolName,\n arguments: currentToolJson || '{}',\n },\n });\n currentToolId = '';\n currentToolName = '';\n currentToolJson = '';\n }\n break;\n\n case 'message_delta':\n if (event.usage) {\n usage.output_tokens = event.usage.output_tokens;\n }\n stopReason = event.delta.stop_reason;\n break;\n }\n }\n } catch (err) {\n if (err instanceof Error && err.name === 'AbortError') {\n return buildPartialResult(textParts, toolCalls, usage, model);\n }\n throw err;\n }\n\n // If aborted via break (not via catch), return partial response\n if (signal?.aborted) {\n return buildPartialResult(textParts, toolCalls, usage, model);\n }\n\n const textContent = textParts.join('') || '';\n\n const result: TUniversalMessage = {\n id: randomUUID(),\n role: 'assistant',\n content: textContent,\n state: 'complete' as const,\n timestamp: new Date(),\n ...(toolCalls.length > 0 && { toolCalls }),\n };\n\n result.metadata = {\n inputTokens: usage.input_tokens,\n outputTokens: usage.output_tokens,\n model,\n };\n if (stopReason) {\n result.metadata['stopReason'] = stopReason;\n }\n\n return result;\n}\n\nfunction buildPartialResult(\n textParts: string[],\n toolCalls: Array<{\n id: string;\n type: 'function';\n function: { name: string; arguments: string };\n }>,\n usage: { input_tokens: number; output_tokens: number },\n model: string,\n): TUniversalMessage {\n const partialText = textParts.join('') || '';\n const partialResult: TUniversalMessage = {\n id: randomUUID(),\n role: 'assistant',\n content: partialText,\n state: 'complete' as const,\n timestamp: new Date(),\n ...(toolCalls.length > 0 && { toolCalls }),\n };\n partialResult.metadata = {\n inputTokens: usage.input_tokens,\n outputTokens: usage.output_tokens,\n model,\n stopReason: 'aborted',\n };\n return partialResult;\n}\n\n/**\n * Wrap a stream to support abort signal interruption.\n */\nasync function* streamWithAbort(\n stream: AsyncIterable<Anthropic.MessageStreamEvent>,\n signal?: AbortSignal,\n): AsyncIterable<Anthropic.MessageStreamEvent> {\n for await (const event of stream) {\n if (signal?.aborted) break;\n yield event;\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport Anthropic from '@anthropic-ai/sdk';\nimport type { IAnthropicProviderOptions } from './types';\nimport { AbstractAIProvider, getModelMaxOutput } from '@robota-sdk/agent-core';\nimport type {\n IProviderCapabilities,\n IProviderNativeWebToolRequest,\n TUniversalMessage,\n IChatOptions,\n TTextDeltaCallback,\n} from '@robota-sdk/agent-core';\nimport { convertToAnthropicFormat, convertToolsToAnthropicFormat } from './message-converter';\nimport { streamAndAssemble } from './streaming-handler';\n\n/**\n * Anthropic provider implementation for Robota\n *\n * IMPORTANT PROVIDER-SPECIFIC RULES:\n * 1. This provider MUST extend BaseAIProvider from @robota-sdk/agent-core\n * 2. Content handling for Anthropic API:\n * - When tool_calls are present: content MUST be null (not empty string)\n * - For regular assistant messages: content should be a string\n * 3. Use override keyword for all methods inherited from BaseAIProvider\n * 4. Provider-specific API behavior should be documented here\n *\n * @public\n */\nexport class AnthropicProvider extends AbstractAIProvider {\n override readonly name = 'anthropic';\n override readonly version = '1.0.0';\n\n private readonly client?: Anthropic;\n private readonly options: IAnthropicProviderOptions;\n\n /**\n * When true, Anthropic server tools (web_search) are included in every request.\n * The server executes these tools internally — no local tool registration needed.\n */\n enableWebTools = false;\n\n /**\n * Optional callback for text deltas during streaming.\n * Set by the consumer (e.g., Session) to receive real-time text chunks.\n * When set, chat() uses streaming internally while still returning\n * the complete assembled message.\n */\n onTextDelta?: TTextDeltaCallback;\n\n /** Callback when a server tool (web_search etc.) is invoked by the API */\n onServerToolUse?: (toolName: string, input: Record<string, string>) => void;\n\n constructor(options: IAnthropicProviderOptions) {\n super();\n this.options = options;\n\n // Set executor if provided\n if (options.executor) {\n this.executor = options.executor;\n }\n\n // Only create client if not using executor\n if (!this.executor) {\n // Create client from apiKey if not provided.\n if (options.client) {\n this.client = options.client;\n } else if (options.apiKey) {\n this.client = new Anthropic({\n apiKey: options.apiKey,\n ...(options.timeout && { timeout: options.timeout }),\n ...(options.baseURL && { baseURL: options.baseURL }),\n });\n } else {\n throw new Error('Either Anthropic client, apiKey, or executor is required');\n }\n }\n }\n\n /**\n * Generate response using TUniversalMessage\n */\n override async chat(\n messages: TUniversalMessage[],\n options?: IChatOptions,\n ): Promise<TUniversalMessage> {\n this.validateMessages(messages);\n this.validateNativeWebTools(options?.nativeWebTools);\n\n // Use executor when configured; otherwise use direct execution\n if (this.executor) {\n try {\n return await this.executeViaExecutorOrDirect(messages, options);\n } catch (error) {\n throw error;\n }\n }\n\n // Direct execution with Anthropic client\n if (!this.client) {\n throw new Error(\n 'Anthropic client not available. Either provide a client/apiKey or use an executor.',\n );\n }\n\n // Separate system messages for the Anthropic system parameter\n const systemMessages = messages.filter((m) => m.role === 'system');\n const nonSystemMessages = messages.filter((m) => m.role !== 'system');\n const anthropicMessages = convertToAnthropicFormat(nonSystemMessages);\n const systemPrompt = systemMessages.map((m) => m.content || '').join('\\n\\n') || undefined;\n\n if (!options?.model) {\n throw new Error(\n 'Model is required in chat options. Please specify a model in defaultModel configuration.',\n );\n }\n\n const functionTools = options?.tools ? convertToolsToAnthropicFormat(options.tools) : [];\n const serverTools: Anthropic.Messages.ToolUnion[] = this.enableWebTools\n ? [{ type: 'web_search_20250305' as const, name: 'web_search' }]\n : [];\n const allTools: Anthropic.Messages.ToolUnion[] = [...functionTools, ...serverTools];\n\n const baseParams: Anthropic.MessageCreateParamsNonStreaming = {\n model: options.model as string,\n messages: anthropicMessages,\n max_tokens: options?.maxTokens || getModelMaxOutput(options.model as string),\n ...(systemPrompt && { system: systemPrompt }),\n ...(options?.temperature !== undefined && { temperature: options.temperature }),\n ...(allTools.length > 0 && { tools: allTools }),\n };\n\n // Always use streaming to avoid Anthropic SDK's 10-minute non-streaming timeout.\n // When no onTextDelta callback is available, use a no-op to silently assemble the response.\n const textDeltaCb = options?.onTextDelta ?? this.onTextDelta ?? (() => {});\n return streamAndAssemble(\n this.client,\n baseParams,\n textDeltaCb,\n this.onServerToolUse,\n options?.signal,\n options?.onProviderNativeRawPayload,\n );\n }\n\n /**\n * Generate streaming response using TUniversalMessage\n */\n override async *chatStream(\n messages: TUniversalMessage[],\n options?: IChatOptions,\n ): AsyncIterable<TUniversalMessage> {\n this.validateMessages(messages);\n this.validateNativeWebTools(options?.nativeWebTools);\n\n // Use executor when configured; otherwise use direct execution\n if (this.executor) {\n try {\n yield* this.executeStreamViaExecutorOrDirect(messages, options);\n return;\n } catch (error) {\n throw error;\n }\n }\n\n // Direct execution with Anthropic client\n if (!this.client) {\n throw new Error(\n 'Anthropic client not available. Either provide a client/apiKey or use an executor.',\n );\n }\n\n const anthropicMessages = convertToAnthropicFormat(messages);\n\n if (!options?.model) {\n throw new Error(\n 'Model is required in chat options. Please specify a model in defaultModel configuration.',\n );\n }\n\n const requestParams: Anthropic.MessageCreateParamsStreaming = {\n model: options.model as string,\n messages: anthropicMessages,\n max_tokens: options?.maxTokens || getModelMaxOutput(options.model as string),\n stream: true,\n };\n\n if (options?.temperature !== undefined) {\n requestParams.temperature = options.temperature;\n }\n\n const functionTools = options?.tools ? convertToolsToAnthropicFormat(options.tools) : [];\n const serverTools: Anthropic.Messages.ToolUnion[] = this.enableWebTools\n ? [{ type: 'web_search_20250305' as const, name: 'web_search' }]\n : [];\n const allTools: Anthropic.Messages.ToolUnion[] = [...functionTools, ...serverTools];\n\n if (allTools.length > 0) {\n requestParams.tools = allTools;\n }\n\n options?.onProviderNativeRawPayload?.({\n provider: 'anthropic',\n apiSurface: 'anthropic-messages',\n payloadKind: 'request',\n payload: requestParams,\n });\n const stream = await this.client.messages.create(requestParams);\n\n let sequence = 0;\n for await (const chunk of stream) {\n options?.onProviderNativeRawPayload?.({\n provider: 'anthropic',\n apiSurface: 'anthropic-messages',\n payloadKind: 'stream_event',\n sequence,\n payload: chunk,\n });\n sequence++;\n if (chunk.type === 'content_block_delta' && chunk.delta.type === 'text_delta') {\n yield {\n id: randomUUID(),\n role: 'assistant',\n content: chunk.delta.text,\n state: 'complete' as const,\n timestamp: new Date(),\n };\n }\n }\n }\n\n override supportsTools(): boolean {\n return true;\n }\n\n override getCapabilities(): IProviderCapabilities {\n return {\n functionCalling: { supported: true },\n nativeWebTools: {\n webSearch: this.enableWebTools\n ? { supported: true, enabled: true, source: 'anthropic-messages' }\n : {\n supported: true,\n enabled: false,\n source: 'anthropic-messages',\n reason: 'Call configureNativeWebTools({ webSearch: true }) or set enableWebTools.',\n },\n webFetch: {\n supported: false,\n enabled: false,\n source: 'anthropic-messages',\n reason: 'Anthropic provider exposes server web search only.',\n },\n },\n };\n }\n\n configureNativeWebTools(request: IProviderNativeWebToolRequest): IProviderCapabilities {\n if (request.webSearch === true) {\n this.enableWebTools = true;\n }\n this.validateNativeWebTools(request);\n return this.getCapabilities();\n }\n\n override validateConfig(): boolean {\n return !!this.client && !!this.options && !!this.options.apiKey;\n }\n\n override async dispose(): Promise<void> {\n // Anthropic client doesn't need explicit cleanup\n }\n\n /**\n * Validate TUniversalMessage array\n */\n protected override validateMessages(messages: TUniversalMessage[]): void {\n if (!Array.isArray(messages)) {\n throw new Error('Messages must be an array');\n }\n\n if (messages.length === 0) {\n throw new Error('Messages array cannot be empty');\n }\n\n for (const message of messages) {\n if (!message.role || !['user', 'assistant', 'system', 'tool'].includes(message.role)) {\n throw new Error(`Invalid message role: ${message.role}`);\n }\n }\n }\n}\n","import type {\n IProviderModelCatalog,\n IProviderModelCatalogEntry,\n IProviderProfileConfig,\n} from '@robota-sdk/agent-core';\nimport {\n ANTHROPIC_MODEL_SOURCE_URL,\n ANTHROPIC_MODEL_LAST_VERIFIED_AT,\n} from './provider-definition';\n\nconst ANTHROPIC_MODELS_API_URL = 'https://api.anthropic.com/v1/models';\nconst ANTHROPIC_API_VERSION = '2023-06-01';\n\nexport interface IAnthropicModelsResponse {\n data?: Array<{\n id?: string;\n display_name?: string;\n type?: string;\n }>;\n has_more?: boolean;\n}\n\nexport interface IAnthropicFetchInit {\n headers?: Record<string, string>;\n}\n\nexport interface IAnthropicFetchResponse {\n ok: boolean;\n status: number;\n json: () => Promise<IAnthropicModelsResponse>;\n}\n\nexport type TAnthropicFetch = (\n url: string,\n init?: IAnthropicFetchInit,\n) => Promise<IAnthropicFetchResponse>;\n\nexport async function refreshAnthropicModelCatalog(\n profile: IProviderProfileConfig,\n fetcher: TAnthropicFetch = defaultAnthropicFetch,\n): Promise<IProviderModelCatalog> {\n return fetchModelCatalog(profile, fetcher);\n}\n\nasync function fetchModelCatalog(\n profile: IProviderProfileConfig,\n fetcher: TAnthropicFetch,\n): Promise<IProviderModelCatalog> {\n const response = await fetcher(ANTHROPIC_MODELS_API_URL, buildFetchInit(profile.apiKey)).catch(\n (err: unknown) => {\n // allow-fallback: catalog refresh is non-terminal; callers expect IProviderModelCatalog\n const message = err instanceof Error ? err.message : String(err);\n return {\n ok: false as const,\n status: 0,\n json: (): Promise<IAnthropicModelsResponse> => Promise.resolve({ data: [] }),\n errorMessage: `Anthropic model refresh failed: ${message}`,\n };\n },\n );\n\n if ('errorMessage' in response) {\n return {\n status: 'unavailable',\n sourceUrl: ANTHROPIC_MODEL_SOURCE_URL,\n message: response.errorMessage,\n };\n }\n\n if (!response.ok) {\n return {\n status: 'unavailable',\n sourceUrl: ANTHROPIC_MODEL_SOURCE_URL,\n message: `Anthropic model refresh failed: HTTP ${response.status}`,\n };\n }\n\n const body = await response.json();\n const now = new Date().toISOString();\n const entries: IProviderModelCatalogEntry[] = (body.data ?? [])\n .filter(\n (item): item is { id: string; display_name?: string; type?: string } =>\n typeof item.id === 'string' && item.id.length > 0,\n )\n .map(\n (item): IProviderModelCatalogEntry => ({\n id: item.id,\n displayName: item.display_name ?? item.id,\n lifecycle: 'active',\n sourceUrl: ANTHROPIC_MODEL_SOURCE_URL,\n lastVerifiedAt: now,\n }),\n );\n\n return {\n status: 'live',\n sourceUrl: ANTHROPIC_MODEL_SOURCE_URL,\n lastVerifiedAt: ANTHROPIC_MODEL_LAST_VERIFIED_AT,\n entries,\n message: `Fetched ${entries.length} models from Anthropic API`,\n };\n}\n\nfunction buildFetchInit(apiKey: string | undefined): IAnthropicFetchInit | undefined {\n if (!apiKey) {\n return undefined;\n }\n return {\n headers: {\n 'x-api-key': apiKey,\n 'anthropic-version': ANTHROPIC_API_VERSION,\n },\n };\n}\n\nasync function defaultAnthropicFetch(\n url: string,\n init?: IAnthropicFetchInit,\n): Promise<IAnthropicFetchResponse> {\n const response = await fetch(url, {\n ...(init?.headers !== undefined && { headers: init.headers }),\n });\n return {\n ok: response.ok,\n status: response.status,\n json: () => response.json() as Promise<IAnthropicModelsResponse>,\n };\n}\n","import {\n CLAUDE_MODELS,\n type IProviderDefinition,\n type IProviderModelCatalogEntry,\n} from '@robota-sdk/agent-core';\nimport { AnthropicProvider } from './provider';\nimport { refreshAnthropicModelCatalog } from './model-catalog-refresh';\n\nexport const DEFAULT_ANTHROPIC_PROVIDER_MODEL = 'claude-sonnet-4-6';\nexport const DEFAULT_ANTHROPIC_PROVIDER_API_KEY_ENV = 'ANTHROPIC_API_KEY';\nexport const DEFAULT_ANTHROPIC_PROVIDER_API_KEY_REFERENCE = `$ENV:${DEFAULT_ANTHROPIC_PROVIDER_API_KEY_ENV}`;\nexport const ANTHROPIC_MODEL_SOURCE_URL = 'https://platform.claude.com/docs/en/api/models/list';\nexport const ANTHROPIC_MODEL_LAST_VERIFIED_AT = '2026-05-04';\nconst ANTHROPIC_API_KEY_URL = 'https://platform.claude.com/settings/keys';\nconst ANTHROPIC_SETUP_SOURCE_URL = 'https://platform.claude.com/docs/en/api/overview';\nconst ANTHROPIC_SETUP_LAST_VERIFIED_AT = '2026-05-08';\nconst ANTHROPIC_SETUP_HELP_LINKS: NonNullable<IProviderDefinition['setupHelpLinks']> = [\n {\n kind: 'api-key',\n label: 'Anthropic API keys',\n url: ANTHROPIC_API_KEY_URL,\n sourceUrl: ANTHROPIC_SETUP_SOURCE_URL,\n lastVerifiedAt: ANTHROPIC_SETUP_LAST_VERIFIED_AT,\n },\n];\n\nexport function createAnthropicProviderDefinition(): IProviderDefinition {\n return {\n type: 'anthropic',\n displayName: 'Anthropic',\n description: 'Claude models through Anthropic API',\n defaults: {\n model: DEFAULT_ANTHROPIC_PROVIDER_MODEL,\n apiKey: DEFAULT_ANTHROPIC_PROVIDER_API_KEY_REFERENCE,\n },\n modelCatalog: {\n status: 'fallback',\n sourceUrl: ANTHROPIC_MODEL_SOURCE_URL,\n lastVerifiedAt: ANTHROPIC_MODEL_LAST_VERIFIED_AT,\n entries: buildAnthropicModelCatalogEntries(),\n },\n setupHelpLinks: ANTHROPIC_SETUP_HELP_LINKS,\n setupSteps: [\n {\n key: 'apiKey',\n title: 'Anthropic API key',\n defaultValue: DEFAULT_ANTHROPIC_PROVIDER_API_KEY_REFERENCE,\n masked: true,\n },\n {\n key: 'model',\n title: 'Anthropic model',\n defaultValue: DEFAULT_ANTHROPIC_PROVIDER_MODEL,\n },\n ],\n refreshModelCatalog: ({ profile }) => refreshAnthropicModelCatalog(profile),\n modelCatalogCacheTtlSeconds: 86400,\n requiresApiKey: true,\n createProvider: (config) =>\n new AnthropicProvider({\n apiKey: requireAnthropicApiKey(config.apiKey),\n ...(config.baseURL !== undefined && { baseURL: config.baseURL }),\n ...(config.timeout !== undefined && { timeout: config.timeout }),\n defaultModel: config.model,\n }),\n };\n}\n\nfunction buildAnthropicModelCatalogEntries(): IProviderModelCatalogEntry[] {\n const seen = new Set<string>();\n const entries: IProviderModelCatalogEntry[] = [];\n for (const model of Object.values(CLAUDE_MODELS)) {\n if (seen.has(model.name)) continue;\n seen.add(model.name);\n entries.push({\n id: model.id,\n displayName: model.name,\n contextWindow: model.contextWindow,\n capabilities: ['tools', 'vision', 'json_schema', 'reasoning', 'streaming'],\n lifecycle: 'active',\n sourceUrl: ANTHROPIC_MODEL_SOURCE_URL,\n lastVerifiedAt: ANTHROPIC_MODEL_LAST_VERIFIED_AT,\n });\n }\n return entries;\n}\n\nfunction requireAnthropicApiKey(apiKey: string | undefined): string {\n if (!apiKey) {\n throw new Error('Provider anthropic requires apiKey');\n }\n return apiKey;\n}\n","/**\n * @robota-sdk/agent-provider (anthropic)\n *\n * Provides Provider implementation for using Anthropic API with provider-agnostic TUniversalMessage.\n */\n\n// Main exports\nexport * from './provider';\nexport * from './types';\nexport * from './provider-definition';\nexport * from './model-catalog-refresh';\n\nimport type { IAnthropicProviderOptions } from './types';\n\n/**\n * Factory function for creating an AnthropicProvider instance.\n * @param _options - Configuration options for the Anthropic provider\n * @returns An AnthropicProvider instance\n */\nexport function createAnthropicProvider(_options: IAnthropicProviderOptions) {\n // Implementation of createAnthropicProvider function\n}\n"],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ const e=require(`./chunk-Bmb41Sf3.cjs`);let t=require(`node:crypto`),n=require(`@anthropic-ai/sdk`);n=e.t(n,1);let r=require(`@robota-sdk/agent-core`);function i(e){return e.map(e=>{if(e.role===`user`)return{role:`user`,content:e.content||``};if(e.role===`assistant`){let t=e;if(t.toolCalls&&t.toolCalls.length>0){let e=[];t.content&&e.push({type:`text`,text:t.content});for(let n of t.toolCalls)e.push({type:`tool_use`,id:n.id,name:n.function.name,input:JSON.parse(n.function.arguments)});return{role:`assistant`,content:e}}return{role:`assistant`,content:t.content||``}}else if(e.role===`tool`)return{role:`user`,content:[{type:`tool_result`,tool_use_id:e.toolCallId??``,content:e.content||``}]};else return{role:`user`,content:e.content||``}})}function a(e){if(!Array.isArray(e.content))return``;let t=e.content.filter(e=>e.type===`web_search_result`&&`title`in e&&`url`in e).map((e,t)=>`${t+1}. ${e.title}\n ${e.url}`).join(`
2
+ `);return t?`[Web Search Results]\n${t}`:``}function o(e){return e.map(e=>({name:e.name,description:e.description,input_schema:e.parameters}))}async function s(e,n,r,i,o,s){let u={...n,stream:!0};s?.({provider:`anthropic`,apiSurface:`anthropic-messages`,payloadKind:`request`,payload:u});let d=await e.messages.create(u,o?{signal:o}:void 0),f=[],p=[],m=``,h=``,g=``,_={input_tokens:0,output_tokens:0},v=``,y=null;try{let e=0;for await(let t of l(d,o))switch(s?.({provider:`anthropic`,apiSurface:`anthropic-messages`,payloadKind:`stream_event`,sequence:e,payload:t}),e++,t.type){case`message_start`:_=t.message.usage,v=t.message.model;break;case`content_block_start`:if(t.content_block.type===`tool_use`)m=t.content_block.id,h=t.content_block.name,g=``;else if(t.content_block.type===`server_tool_use`){let e=t.content_block,n=e.input?.query??``,a=n?`\nšŸ” Searching: "${n}"\n`:`\nšŸ” [${e.name??`server_tool`}]\n`;f.push(a),r(a),i&&i(e.name??`server_tool`,{query:n})}else if(t.content_block.type===`web_search_tool_result`){let e=t.content_block,n=a(e);n&&(f.push(`\n${n}\n\n`),r(`\n${n}\n\n`))}break;case`content_block_delta`:t.delta.type===`text_delta`?(f.push(t.delta.text),r(t.delta.text)):t.delta.type===`input_json_delta`&&(g+=t.delta.partial_json);break;case`content_block_stop`:m&&(p.push({id:m,type:`function`,function:{name:h,arguments:g||`{}`}}),m=``,h=``,g=``);break;case`message_delta`:t.usage&&(_.output_tokens=t.usage.output_tokens),y=t.delta.stop_reason;break}}catch(e){if(e instanceof Error&&e.name===`AbortError`)return c(f,p,_,v);throw e}if(o?.aborted)return c(f,p,_,v);let b=f.join(``)||``,x={id:(0,t.randomUUID)(),role:`assistant`,content:b,state:`complete`,timestamp:new Date,...p.length>0&&{toolCalls:p}};return x.metadata={inputTokens:_.input_tokens,outputTokens:_.output_tokens,model:v},y&&(x.metadata.stopReason=y),x}function c(e,n,r,i){let a=e.join(``)||``,o={id:(0,t.randomUUID)(),role:`assistant`,content:a,state:`complete`,timestamp:new Date,...n.length>0&&{toolCalls:n}};return o.metadata={inputTokens:r.input_tokens,outputTokens:r.output_tokens,model:i,stopReason:`aborted`},o}async function*l(e,t){for await(let n of e){if(t?.aborted)break;yield n}}var u=class extends r.AbstractAIProvider{name=`anthropic`;version=`1.0.0`;client;options;enableWebTools=!1;onTextDelta;onServerToolUse;constructor(e){if(super(),this.options=e,e.executor&&(this.executor=e.executor),!this.executor)if(e.client)this.client=e.client;else if(e.apiKey)this.client=new n.default({apiKey:e.apiKey,...e.timeout&&{timeout:e.timeout},...e.baseURL&&{baseURL:e.baseURL}});else throw Error(`Either Anthropic client, apiKey, or executor is required`)}async chat(e,t){if(this.validateMessages(e),this.validateNativeWebTools(t?.nativeWebTools),this.executor)try{return await this.executeViaExecutorOrDirect(e,t)}catch(e){throw e}if(!this.client)throw Error(`Anthropic client not available. Either provide a client/apiKey or use an executor.`);let n=e.filter(e=>e.role===`system`),a=i(e.filter(e=>e.role!==`system`)),c=n.map(e=>e.content||``).join(`
3
+
4
+ `)||void 0;if(!t?.model)throw Error(`Model is required in chat options. Please specify a model in defaultModel configuration.`);let l=t?.tools?o(t.tools):[],u=this.enableWebTools?[{type:`web_search_20250305`,name:`web_search`}]:[],d=[...l,...u],f={model:t.model,messages:a,max_tokens:t?.maxTokens||(0,r.getModelMaxOutput)(t.model),...c&&{system:c},...t?.temperature!==void 0&&{temperature:t.temperature},...d.length>0&&{tools:d}},p=t?.onTextDelta??this.onTextDelta??(()=>{});return s(this.client,f,p,this.onServerToolUse,t?.signal,t?.onProviderNativeRawPayload)}async*chatStream(e,n){if(this.validateMessages(e),this.validateNativeWebTools(n?.nativeWebTools),this.executor)try{yield*this.executeStreamViaExecutorOrDirect(e,n);return}catch(e){throw e}if(!this.client)throw Error(`Anthropic client not available. Either provide a client/apiKey or use an executor.`);let a=i(e);if(!n?.model)throw Error(`Model is required in chat options. Please specify a model in defaultModel configuration.`);let s={model:n.model,messages:a,max_tokens:n?.maxTokens||(0,r.getModelMaxOutput)(n.model),stream:!0};n?.temperature!==void 0&&(s.temperature=n.temperature);let c=n?.tools?o(n.tools):[],l=this.enableWebTools?[{type:`web_search_20250305`,name:`web_search`}]:[],u=[...c,...l];u.length>0&&(s.tools=u),n?.onProviderNativeRawPayload?.({provider:`anthropic`,apiSurface:`anthropic-messages`,payloadKind:`request`,payload:s});let d=await this.client.messages.create(s),f=0;for await(let e of d)n?.onProviderNativeRawPayload?.({provider:`anthropic`,apiSurface:`anthropic-messages`,payloadKind:`stream_event`,sequence:f,payload:e}),f++,e.type===`content_block_delta`&&e.delta.type===`text_delta`&&(yield{id:(0,t.randomUUID)(),role:`assistant`,content:e.delta.text,state:`complete`,timestamp:new Date})}supportsTools(){return!0}getCapabilities(){return{functionCalling:{supported:!0},nativeWebTools:{webSearch:this.enableWebTools?{supported:!0,enabled:!0,source:`anthropic-messages`}:{supported:!0,enabled:!1,source:`anthropic-messages`,reason:`Call configureNativeWebTools({ webSearch: true }) or set enableWebTools.`},webFetch:{supported:!1,enabled:!1,source:`anthropic-messages`,reason:`Anthropic provider exposes server web search only.`}}}}configureNativeWebTools(e){return e.webSearch===!0&&(this.enableWebTools=!0),this.validateNativeWebTools(e),this.getCapabilities()}validateConfig(){return!!this.client&&!!this.options&&!!this.options.apiKey}async dispose(){}validateMessages(e){if(!Array.isArray(e))throw Error(`Messages must be an array`);if(e.length===0)throw Error(`Messages array cannot be empty`);for(let t of e)if(!t.role||![`user`,`assistant`,`system`,`tool`].includes(t.role))throw Error(`Invalid message role: ${t.role}`)}};async function d(e,t=m){return f(e,t)}async function f(e,t){let n=await t(`https://api.anthropic.com/v1/models`,p(e.apiKey)).catch(e=>({ok:!1,status:0,json:()=>Promise.resolve({data:[]}),errorMessage:`Anthropic model refresh failed: ${e instanceof Error?e.message:String(e)}`}));if(`errorMessage`in n)return{status:`unavailable`,sourceUrl:v,message:n.errorMessage};if(!n.ok)return{status:`unavailable`,sourceUrl:v,message:`Anthropic model refresh failed: HTTP ${n.status}`};let r=await n.json(),i=new Date().toISOString(),a=(r.data??[]).filter(e=>typeof e.id==`string`&&e.id.length>0).map(e=>({id:e.id,displayName:e.display_name??e.id,lifecycle:`active`,sourceUrl:v,lastVerifiedAt:i}));return{status:`live`,sourceUrl:v,lastVerifiedAt:y,entries:a,message:`Fetched ${a.length} models from Anthropic API`}}function p(e){if(e)return{headers:{"x-api-key":e,"anthropic-version":`2023-06-01`}}}async function m(e,t){let n=await fetch(e,{...t?.headers!==void 0&&{headers:t.headers}});return{ok:n.ok,status:n.status,json:()=>n.json()}}const h=`claude-sonnet-4-6`,g=`ANTHROPIC_API_KEY`,_=`$ENV:${g}`,v=`https://platform.claude.com/docs/en/api/models/list`,y=`2026-05-04`,b=[{kind:`api-key`,label:`Anthropic API keys`,url:`https://platform.claude.com/settings/keys`,sourceUrl:`https://platform.claude.com/docs/en/api/overview`,lastVerifiedAt:`2026-05-08`}];function x(){return{type:`anthropic`,displayName:`Anthropic`,description:`Claude models through Anthropic API`,defaults:{model:h,apiKey:_},modelCatalog:{status:`fallback`,sourceUrl:v,lastVerifiedAt:y,entries:S()},setupHelpLinks:b,setupSteps:[{key:`apiKey`,title:`Anthropic API key`,defaultValue:_,masked:!0},{key:`model`,title:`Anthropic model`,defaultValue:h}],refreshModelCatalog:({profile:e})=>d(e),modelCatalogCacheTtlSeconds:86400,requiresApiKey:!0,createProvider:e=>new u({apiKey:C(e.apiKey),...e.baseURL!==void 0&&{baseURL:e.baseURL},...e.timeout!==void 0&&{timeout:e.timeout},defaultModel:e.model})}}function S(){let e=new Set,t=[];for(let n of Object.values(r.CLAUDE_MODELS))e.has(n.name)||(e.add(n.name),t.push({id:n.id,displayName:n.name,contextWindow:n.contextWindow,capabilities:[`tools`,`vision`,`json_schema`,`reasoning`,`streaming`],lifecycle:`active`,sourceUrl:v,lastVerifiedAt:y}));return t}function C(e){if(!e)throw Error(`Provider anthropic requires apiKey`);return e}function w(e){}Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return _}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return d}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return u}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return y}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return h}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return x}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return w}});
@@ -0,0 +1 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../bytedance-DVPxqEiC.cjs`);exports.BytedanceProvider=e.t;
@@ -0,0 +1,74 @@
1
+ import { IVideoGenerationProvider, IVideoGenerationRequest, IVideoJobAccepted, IVideoJobSnapshot, TProviderMediaResult, TUniversalValue } from "@robota-sdk/agent-core";
2
+
3
+ //#region src/bytedance/types.d.ts
4
+ interface IBytedanceProviderOptions {
5
+ apiKey: string;
6
+ baseUrl: string;
7
+ createVideoPath?: string;
8
+ getVideoTaskPathTemplate?: string;
9
+ cancelVideoTaskPathTemplate?: string;
10
+ cancelVideoTaskMethod?: 'POST' | 'DELETE';
11
+ timeoutMs?: number;
12
+ defaultHeaders?: Record<string, string>;
13
+ }
14
+ interface IBytedanceTaskContentText {
15
+ type: 'text';
16
+ text: string;
17
+ }
18
+ interface IBytedanceTaskContentImageUrl {
19
+ type: 'image_url';
20
+ image_url: {
21
+ url: string;
22
+ };
23
+ }
24
+ type TBytedanceTaskContent = IBytedanceTaskContentText | IBytedanceTaskContentImageUrl;
25
+ interface IBytedanceCreateVideoTaskRequest {
26
+ model: string;
27
+ content: TBytedanceTaskContent[];
28
+ generate_audio?: boolean;
29
+ ratio?: string;
30
+ duration?: number;
31
+ watermark?: boolean;
32
+ }
33
+ interface IBytedanceCreateVideoTaskResponse {
34
+ id: string;
35
+ status?: string;
36
+ created_at?: string | number;
37
+ }
38
+ interface IBytedanceTaskContentVideoUrl {
39
+ type: 'video_url';
40
+ video_url: {
41
+ url: string;
42
+ };
43
+ }
44
+ interface IBytedanceVideoTaskResponse {
45
+ id: string;
46
+ status: string;
47
+ video_url?: string;
48
+ content?: {
49
+ video_url?: string;
50
+ };
51
+ mime_type?: string;
52
+ bytes?: number;
53
+ error_message?: string;
54
+ created_at?: string | number;
55
+ updated_at?: string | number;
56
+ }
57
+ interface IBytedanceApiErrorResponse {
58
+ code?: string;
59
+ message?: string;
60
+ details?: Record<string, TUniversalValue>;
61
+ }
62
+ //#endregion
63
+ //#region src/bytedance/provider.d.ts
64
+ declare class BytedanceProvider implements IVideoGenerationProvider {
65
+ private readonly options;
66
+ constructor(options: IBytedanceProviderOptions);
67
+ createVideo(request: IVideoGenerationRequest): Promise<TProviderMediaResult<IVideoJobAccepted>>;
68
+ getVideoJob(jobId: string): Promise<TProviderMediaResult<IVideoJobSnapshot>>;
69
+ cancelVideoJob(jobId: string): Promise<TProviderMediaResult<IVideoJobSnapshot>>;
70
+ private buildContentPayload;
71
+ }
72
+ //#endregion
73
+ export { BytedanceProvider, IBytedanceApiErrorResponse, IBytedanceCreateVideoTaskRequest, IBytedanceCreateVideoTaskResponse, IBytedanceProviderOptions, IBytedanceTaskContentImageUrl, IBytedanceTaskContentText, IBytedanceTaskContentVideoUrl, IBytedanceVideoTaskResponse, TBytedanceTaskContent };
74
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/bytedance/types.ts","../../../src/bytedance/provider.ts"],"mappings":";;;UAEiB,yBAAA;EACf,MAAA;EACA,OAAA;EACA,eAAA;EACA,wBAAA;EACA,2BAAA;EACA,qBAAA;EACA,SAAA;EACA,cAAA,GAAiB,MAAM;AAAA;AAAA,UAGR,yBAAA;EACf,IAAA;EACA,IAAI;AAAA;AAAA,UAGW,6BAAA;EACf,IAAA;EACA,SAAA;IACE,GAAA;EAAA;AAAA;AAAA,KAIQ,qBAAA,GAAwB,yBAAA,GAA4B,6BAA6B;AAAA,UAE5E,gCAAA;EACf,KAAA;EACA,OAAA,EAAS,qBAAqB;EAC9B,cAAA;EACA,KAAA;EACA,QAAA;EACA,SAAA;AAAA;AAAA,UAGe,iCAAA;EACf,EAAA;EACA,MAAA;EACA,UAAA;AAAA;AAAA,UAGe,6BAAA;EACf,IAAA;EACA,SAAA;IACE,GAAA;EAAA;AAAA;AAAA,UAIa,2BAAA;EACf,EAAA;EACA,MAAA;EACA,SAAA;EACA,OAAA;IACE,SAAA;EAAA;EAEF,SAAA;EACA,KAAA;EACA,aAAA;EACA,UAAA;EACA,UAAA;AAAA;AAAA,UAGe,0BAAA;EACf,IAAA;EACA,OAAA;EACA,OAAA,GAAU,MAAM,SAAS,eAAA;AAAA;;;cC3Cd,iBAAA,YAA6B,wBAAA;EAAA,iBACvB,OAAA;cAEE,OAAA,EAAS,yBAAA;EAIf,WAAA,CACX,OAAA,EAAS,uBAAA,GACR,OAAA,CAAQ,oBAAA,CAAqB,iBAAA;EAmDnB,WAAA,CAAY,KAAA,WAAgB,OAAA,CAAQ,oBAAA,CAAqB,iBAAA;EAkBzD,cAAA,CAAe,KAAA,WAAgB,OAAA,CAAQ,oBAAA,CAAqB,iBAAA;EAAA,QAmBjE,mBAAA;AAAA"}
@@ -0,0 +1 @@
1
+ import{t as e}from"../bytedance-C_0sF_pJ.js";export{e as BytedanceProvider};
@@ -0,0 +1,2 @@
1
+ async function e(e,r){let a=new AbortController,o=setTimeout(()=>a.abort(),e.timeoutMs??6e4);try{let o=await fetch(t(e.baseUrl,r.path),{method:r.method,headers:{Authorization:`Bearer ${e.apiKey}`,"Content-Type":`application/json`,...e.defaultHeaders??{}},body:r.body,signal:a.signal}),s=await o.text();if(!o.ok)return i(o.status,s);let c=n(s);return c.ok?{ok:!0,value:c.value}:c}catch(e){return e instanceof Error&&e.name===`AbortError`?{ok:!1,error:{code:`PROVIDER_TIMEOUT`,message:`Bytedance media request timed out.`}}:{ok:!1,error:{code:`PROVIDER_UPSTREAM_ERROR`,message:e instanceof Error?e.message:`Bytedance media request failed.`}}}finally{clearTimeout(o)}}function t(e,t){return`${e.endsWith(`/`)?e.slice(0,-1):e}${t.startsWith(`/`)?t:`/${t}`}`}function n(e){try{return{ok:!0,value:JSON.parse(e)}}catch{return{ok:!1,error:{code:`PROVIDER_UPSTREAM_ERROR`,message:`Bytedance response is not valid JSON.`}}}}function r(e){try{return JSON.parse(e)}catch{return{message:e}}}function i(e,t){let n=r(t);return e===401||e===403?{ok:!1,error:{code:`PROVIDER_AUTH_ERROR`,message:n.message??`Bytedance authentication failed.`,details:n.details}}:e===404?{ok:!1,error:{code:`PROVIDER_JOB_NOT_FOUND`,message:n.message??`Bytedance video job was not found.`,details:n.details}}:e===409?{ok:!1,error:{code:`PROVIDER_JOB_NOT_CANCELLABLE`,message:n.message??`Bytedance video job cannot be cancelled in current state.`,details:n.details}}:e===429?{ok:!1,error:{code:`PROVIDER_RATE_LIMITED`,message:n.message??`Bytedance rate limit exceeded.`,details:n.details}}:e>=400&&e<500?{ok:!1,error:{code:`PROVIDER_INVALID_REQUEST`,message:n.message??`Bytedance rejected request payload.`,details:n.details}}:{ok:!1,error:{code:`PROVIDER_UPSTREAM_ERROR`,message:n.message??`Bytedance upstream request failed.`,details:n.details}}}function a(e){if(e.id.trim().length===0)return{ok:!1,error:{code:`PROVIDER_UPSTREAM_ERROR`,message:`Bytedance video job response is missing task id.`}};let t=o(e.status);return t.ok?{ok:!0,value:{jobId:e.id,status:t.value,output:l(e),error:t.value===`failed`&&e.error_message?{code:`PROVIDER_UPSTREAM_ERROR`,message:e.error_message}:void 0,updatedAt:c(e.updated_at??e.created_at)}}:t}function o(e){let t=e.trim().toLowerCase();return t===`queued`||t===`pending`||t===`submitted`?{ok:!0,value:`queued`}:t===`running`||t===`processing`||t===`in_progress`?{ok:!0,value:`running`}:t===`succeeded`||t===`success`||t===`completed`?{ok:!0,value:`succeeded`}:t===`failed`||t===`error`?{ok:!0,value:`failed`}:t===`cancelled`||t===`canceled`?{ok:!0,value:`cancelled`}:{ok:!1,error:{code:`PROVIDER_UPSTREAM_ERROR`,message:`Unexpected video job status from Bytedance: ${e}`}}}function s(e){if(typeof e!=`string`||e.trim().length===0)return{ok:!0,value:`queued`};let t=e.trim().toLowerCase();return t===`queued`||t===`pending`||t===`submitted`?{ok:!0,value:`queued`}:t===`running`||t===`processing`||t===`in_progress`?{ok:!0,value:`running`}:{ok:!1,error:{code:`PROVIDER_UPSTREAM_ERROR`,message:`Unexpected createVideo status from Bytedance: ${e}`}}}function c(e){if(typeof e==`number`&&Number.isFinite(e)){let t=e>0xe8d4a51000?e:e*1e3,n=new Date(t);if(!Number.isNaN(n.getTime()))return n.toISOString()}if(typeof e==`string`&&e.trim().length>0){let t=Number(e);if(Number.isFinite(t))return c(t);let n=new Date(e);if(!Number.isNaN(n.getTime()))return n.toISOString()}return new Date().toISOString()}function l(e){let t=typeof e.video_url==`string`&&e.video_url.trim().length>0?e.video_url:void 0,n=typeof e.content?.video_url==`string`&&e.content.video_url.trim().length>0?e.content.video_url:void 0,r=t??n;if(typeof r==`string`)return{kind:`uri`,uri:r,mimeType:e.mime_type,bytes:e.bytes}}var u=class{options;constructor(e){this.options=e}async createVideo(t){if(t.prompt.trim().length===0)return f(`Video generation requires non-empty prompt.`);if(t.model.trim().length===0)return f(`Video generation requires non-empty model.`);if(typeof t.seed==`number`)return f(`ModelArk Seedance provider does not support seed field in current contract.`);let n=this.buildContentPayload(t.prompt,t.inputImages);if(!n.ok)return n;let r={model:t.model.trim(),content:n.value,duration:t.durationSeconds,ratio:t.aspectRatio},i=await e(this.options,{path:this.options.createVideoPath??`/contents/generations/tasks`,method:`POST`,body:JSON.stringify(r)});if(!i.ok)return i;if(i.value.id.trim().length===0)return p(`Bytedance createVideo response is missing task id.`);let a=s(i.value.status);return a.ok?{ok:!0,value:{jobId:i.value.id,status:a.value,createdAt:c(i.value.created_at)}}:a}async getVideoJob(t){if(t.trim().length===0)return f(`Video job lookup requires non-empty jobId.`);let n=await e(this.options,{path:d(this.options.getVideoTaskPathTemplate??`/contents/generations/tasks/{taskId}`,t),method:`GET`});return n.ok?a(n.value):n}async cancelVideoJob(t){if(t.trim().length===0)return f(`Video job cancellation requires non-empty jobId.`);let n=this.options.cancelVideoTaskMethod??`DELETE`,r=await e(this.options,{path:d(this.options.cancelVideoTaskPathTemplate??`/contents/generations/tasks/{taskId}`,t),method:n});return r.ok?a(r.value):r}buildContentPayload(e,t){let n=e.trim();if(n.length===0)return f(`Video generation requires non-empty prompt.`);let r=[{type:`text`,text:n}];if(Array.isArray(t))for(let e of t){let t=m(e);if(!t.ok)return t;r.push({type:`image_url`,image_url:{url:t.value}})}return{ok:!0,value:r}}};function d(e,t){return e.replace(`{taskId}`,encodeURIComponent(t))}function f(e){return{ok:!1,error:{code:`PROVIDER_INVALID_REQUEST`,message:e}}}function p(e){return{ok:!1,error:{code:`PROVIDER_UPSTREAM_ERROR`,message:e}}}function m(e){return e.kind===`uri`?e.uri.trim().length===0?f(`Image uri must be non-empty.`):{ok:!0,value:e.uri}:e.data.trim().length===0?f(`Inline image data must be non-empty.`):e.mimeType.trim().length===0?f(`Inline image mimeType must be non-empty.`):{ok:!0,value:`data:${e.mimeType};base64,${e.data}`}}export{u as t};
2
+ //# sourceMappingURL=bytedance-C_0sF_pJ.js.map