@pellux/goodvibes-sdk 0.33.38 → 0.34.1

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 (199) hide show
  1. package/dist/contracts/artifacts/operator-contract.json +1383 -4
  2. package/dist/events/workflows.d.ts +4 -0
  3. package/dist/events/workflows.d.ts.map +1 -1
  4. package/dist/platform/agents/message-bus-core.d.ts +11 -0
  5. package/dist/platform/agents/message-bus-core.d.ts.map +1 -1
  6. package/dist/platform/agents/message-bus-core.js +28 -21
  7. package/dist/platform/agents/orchestrator-runner.d.ts.map +1 -1
  8. package/dist/platform/agents/orchestrator-runner.js +6 -4
  9. package/dist/platform/agents/wrfc-config.d.ts.map +1 -1
  10. package/dist/platform/agents/wrfc-config.js +16 -10
  11. package/dist/platform/agents/wrfc-controller.d.ts +26 -0
  12. package/dist/platform/agents/wrfc-controller.d.ts.map +1 -1
  13. package/dist/platform/agents/wrfc-controller.js +134 -138
  14. package/dist/platform/agents/wrfc-runtime-events.d.ts +1 -0
  15. package/dist/platform/agents/wrfc-runtime-events.d.ts.map +1 -1
  16. package/dist/platform/agents/wrfc-runtime-events.js +4 -1
  17. package/dist/platform/automation/delivery-manager.d.ts.map +1 -1
  18. package/dist/platform/automation/delivery-manager.js +1 -6
  19. package/dist/platform/batch/manager.d.ts.map +1 -1
  20. package/dist/platform/batch/manager.js +1 -3
  21. package/dist/platform/channels/policy-manager.d.ts.map +1 -1
  22. package/dist/platform/channels/policy-manager.js +1 -3
  23. package/dist/platform/channels/reply-pipeline.d.ts.map +1 -1
  24. package/dist/platform/channels/reply-pipeline.js +4 -0
  25. package/dist/platform/config/schema-domain-core.d.ts +1 -1
  26. package/dist/platform/config/schema-domain-core.d.ts.map +1 -1
  27. package/dist/platform/config/schema-domain-core.js +12 -12
  28. package/dist/platform/config/schema-domain-runtime.d.ts +1 -1
  29. package/dist/platform/config/schema-domain-runtime.d.ts.map +1 -1
  30. package/dist/platform/config/schema-domain-runtime.js +19 -18
  31. package/dist/platform/config/schema-domain-surfaces.d.ts +1 -1
  32. package/dist/platform/config/schema-domain-surfaces.d.ts.map +1 -1
  33. package/dist/platform/config/schema-domain-surfaces.js +4 -3
  34. package/dist/platform/config/schema-shared.d.ts +6 -0
  35. package/dist/platform/config/schema-shared.d.ts.map +1 -1
  36. package/dist/platform/config/schema-shared.js +21 -1
  37. package/dist/platform/control-plane/approval-broker.d.ts.map +1 -1
  38. package/dist/platform/control-plane/approval-broker.js +1 -3
  39. package/dist/platform/control-plane/method-catalog-calendar.d.ts +9 -0
  40. package/dist/platform/control-plane/method-catalog-calendar.d.ts.map +1 -0
  41. package/dist/platform/control-plane/method-catalog-calendar.js +117 -0
  42. package/dist/platform/control-plane/method-catalog-channels.d.ts.map +1 -1
  43. package/dist/platform/control-plane/method-catalog-channels.js +174 -0
  44. package/dist/platform/control-plane/method-catalog-email.d.ts +9 -0
  45. package/dist/platform/control-plane/method-catalog-email.d.ts.map +1 -0
  46. package/dist/platform/control-plane/method-catalog-email.js +101 -0
  47. package/dist/platform/control-plane/method-catalog.d.ts.map +1 -1
  48. package/dist/platform/control-plane/method-catalog.js +4 -0
  49. package/dist/platform/control-plane/session-broker-state.d.ts.map +1 -1
  50. package/dist/platform/control-plane/session-broker-state.js +1 -3
  51. package/dist/platform/core/compaction-sections.d.ts +5 -1
  52. package/dist/platform/core/compaction-sections.d.ts.map +1 -1
  53. package/dist/platform/core/compaction-sections.js +73 -66
  54. package/dist/platform/core/context-compaction.d.ts.map +1 -1
  55. package/dist/platform/core/context-compaction.js +9 -16
  56. package/dist/platform/core/orchestrator-context-runtime.d.ts +2 -2
  57. package/dist/platform/core/orchestrator-context-runtime.d.ts.map +1 -1
  58. package/dist/platform/core/orchestrator-context-runtime.js +24 -21
  59. package/dist/platform/core/orchestrator-tool-runtime.d.ts.map +1 -1
  60. package/dist/platform/core/orchestrator-tool-runtime.js +2 -1
  61. package/dist/platform/core/session-lineage.d.ts +2 -5
  62. package/dist/platform/core/session-lineage.d.ts.map +1 -1
  63. package/dist/platform/core/session-lineage.js +4 -16
  64. package/dist/platform/core/wrfc-routing.d.ts.map +1 -1
  65. package/dist/platform/core/wrfc-routing.js +1 -3
  66. package/dist/platform/daemon/http/mcp-routes.d.ts.map +1 -1
  67. package/dist/platform/daemon/http/mcp-routes.js +1 -3
  68. package/dist/platform/daemon/http/openai-compatible-routes.d.ts.map +1 -1
  69. package/dist/platform/daemon/http/openai-compatible-routes.js +1 -3
  70. package/dist/platform/daemon/http/runtime-routes.d.ts.map +1 -1
  71. package/dist/platform/daemon/http/runtime-routes.js +1 -3
  72. package/dist/platform/hooks/runners/http.d.ts.map +1 -1
  73. package/dist/platform/hooks/runners/http.js +9 -19
  74. package/dist/platform/integrations/webhooks.js +2 -11
  75. package/dist/platform/knowledge/semantic/self-improvement.d.ts.map +1 -1
  76. package/dist/platform/knowledge/semantic/self-improvement.js +2 -21
  77. package/dist/platform/mcp/client.d.ts.map +1 -1
  78. package/dist/platform/mcp/client.js +1 -3
  79. package/dist/platform/mcp/config.d.ts.map +1 -1
  80. package/dist/platform/mcp/config.js +1 -3
  81. package/dist/platform/media/builtin-generation-providers.d.ts.map +1 -1
  82. package/dist/platform/media/builtin-generation-providers.js +1 -6
  83. package/dist/platform/providers/anthropic-compat.d.ts.map +1 -1
  84. package/dist/platform/providers/anthropic-compat.js +11 -131
  85. package/dist/platform/providers/anthropic-sdk-provider.d.ts.map +1 -1
  86. package/dist/platform/providers/anthropic-sdk-provider.js +8 -42
  87. package/dist/platform/providers/anthropic-sse-assembler.d.ts +80 -0
  88. package/dist/platform/providers/anthropic-sse-assembler.d.ts.map +1 -0
  89. package/dist/platform/providers/anthropic-sse-assembler.js +146 -0
  90. package/dist/platform/providers/anthropic-stream.d.ts +30 -0
  91. package/dist/platform/providers/anthropic-stream.d.ts.map +1 -0
  92. package/dist/platform/providers/anthropic-stream.js +44 -0
  93. package/dist/platform/providers/anthropic-vertex.d.ts.map +1 -1
  94. package/dist/platform/providers/anthropic-vertex.js +1 -3
  95. package/dist/platform/providers/anthropic.d.ts.map +1 -1
  96. package/dist/platform/providers/anthropic.js +15 -151
  97. package/dist/platform/providers/capabilities.d.ts.map +1 -1
  98. package/dist/platform/providers/capabilities.js +11 -7
  99. package/dist/platform/providers/context-discovery.d.ts.map +1 -1
  100. package/dist/platform/providers/context-discovery.js +9 -16
  101. package/dist/platform/providers/context-window-fallback.d.ts +24 -0
  102. package/dist/platform/providers/context-window-fallback.d.ts.map +1 -0
  103. package/dist/platform/providers/context-window-fallback.js +48 -0
  104. package/dist/platform/providers/gemini.d.ts.map +1 -1
  105. package/dist/platform/providers/gemini.js +3 -6
  106. package/dist/platform/providers/json-ttl-cache.d.ts +35 -0
  107. package/dist/platform/providers/json-ttl-cache.d.ts.map +1 -0
  108. package/dist/platform/providers/json-ttl-cache.js +52 -0
  109. package/dist/platform/providers/llama-cpp.d.ts.map +1 -1
  110. package/dist/platform/providers/llama-cpp.js +2 -23
  111. package/dist/platform/providers/lm-studio-helpers.d.ts +1 -1
  112. package/dist/platform/providers/lm-studio-helpers.d.ts.map +1 -1
  113. package/dist/platform/providers/lm-studio-helpers.js +5 -25
  114. package/dist/platform/providers/model-benchmarks.d.ts.map +1 -1
  115. package/dist/platform/providers/model-benchmarks.js +11 -34
  116. package/dist/platform/providers/model-catalog-cache.d.ts.map +1 -1
  117. package/dist/platform/providers/model-catalog-cache.js +15 -38
  118. package/dist/platform/providers/model-catalog-synthetic.d.ts.map +1 -1
  119. package/dist/platform/providers/model-catalog-synthetic.js +3 -2
  120. package/dist/platform/providers/model-catalog.d.ts.map +1 -1
  121. package/dist/platform/providers/model-catalog.js +3 -2
  122. package/dist/platform/providers/model-limits.d.ts.map +1 -1
  123. package/dist/platform/providers/model-limits.js +18 -42
  124. package/dist/platform/providers/ollama.d.ts.map +1 -1
  125. package/dist/platform/providers/ollama.js +3 -24
  126. package/dist/platform/providers/openai-codex.d.ts.map +1 -1
  127. package/dist/platform/providers/openai-codex.js +8 -9
  128. package/dist/platform/providers/openai-compat.d.ts.map +1 -1
  129. package/dist/platform/providers/openai-compat.js +13 -40
  130. package/dist/platform/providers/openai-stream-helpers.d.ts +62 -0
  131. package/dist/platform/providers/openai-stream-helpers.d.ts.map +1 -0
  132. package/dist/platform/providers/openai-stream-helpers.js +73 -0
  133. package/dist/platform/providers/openai.d.ts.map +1 -1
  134. package/dist/platform/providers/openai.js +13 -41
  135. package/dist/platform/providers/provider-error.d.ts +17 -0
  136. package/dist/platform/providers/provider-error.d.ts.map +1 -0
  137. package/dist/platform/providers/provider-error.js +33 -0
  138. package/dist/platform/providers/provider-stop-reason.d.ts +15 -0
  139. package/dist/platform/providers/provider-stop-reason.d.ts.map +1 -0
  140. package/dist/platform/providers/provider-stop-reason.js +15 -0
  141. package/dist/platform/providers/sse-line-buffer.d.ts +13 -0
  142. package/dist/platform/providers/sse-line-buffer.d.ts.map +1 -0
  143. package/dist/platform/providers/sse-line-buffer.js +23 -0
  144. package/dist/platform/providers/tool-formats.d.ts +5 -0
  145. package/dist/platform/providers/tool-formats.d.ts.map +1 -1
  146. package/dist/platform/providers/tool-formats.js +14 -0
  147. package/dist/platform/runtime/bootstrap-runtime-events.d.ts.map +1 -1
  148. package/dist/platform/runtime/bootstrap-runtime-events.js +6 -0
  149. package/dist/platform/runtime/bootstrap-services.d.ts.map +1 -1
  150. package/dist/platform/runtime/bootstrap-services.js +4 -5
  151. package/dist/platform/runtime/emitters/workflows.d.ts +4 -0
  152. package/dist/platform/runtime/emitters/workflows.d.ts.map +1 -1
  153. package/dist/platform/runtime/emitters/workflows.js +3 -0
  154. package/dist/platform/runtime/remote/distributed-runtime-store.d.ts.map +1 -1
  155. package/dist/platform/runtime/remote/distributed-runtime-store.js +1 -3
  156. package/dist/platform/runtime/retention/pruner.js +2 -5
  157. package/dist/platform/runtime/store/helpers/reducers/lifecycle.d.ts.map +1 -1
  158. package/dist/platform/runtime/store/helpers/reducers/lifecycle.js +15 -14
  159. package/dist/platform/runtime/store/helpers/reducers/shared.d.ts +6 -0
  160. package/dist/platform/runtime/store/helpers/reducers/shared.d.ts.map +1 -1
  161. package/dist/platform/runtime/store/helpers/reducers/shared.js +8 -1
  162. package/dist/platform/runtime/telemetry/exporters/queue.d.ts.map +1 -1
  163. package/dist/platform/runtime/telemetry/exporters/queue.js +1 -7
  164. package/dist/platform/runtime/transports/http-helpers.d.ts +0 -1
  165. package/dist/platform/runtime/transports/http-helpers.d.ts.map +1 -1
  166. package/dist/platform/runtime/transports/http-helpers.js +1 -3
  167. package/dist/platform/runtime/ui-read-model-helpers.d.ts +2 -0
  168. package/dist/platform/runtime/ui-read-model-helpers.d.ts.map +1 -1
  169. package/dist/platform/runtime/ui-read-model-helpers.js +8 -0
  170. package/dist/platform/runtime/ui-read-models-core.d.ts.map +1 -1
  171. package/dist/platform/runtime/ui-read-models-core.js +3 -5
  172. package/dist/platform/runtime/ui-read-models-observability-remote.d.ts.map +1 -1
  173. package/dist/platform/runtime/ui-read-models-observability-remote.js +2 -4
  174. package/dist/platform/runtime/ui-read-models-operations.d.ts.map +1 -1
  175. package/dist/platform/runtime/ui-read-models-operations.js +8 -26
  176. package/dist/platform/scheduler/scheduler.d.ts.map +1 -1
  177. package/dist/platform/scheduler/scheduler.js +1 -3
  178. package/dist/platform/tools/exec/runtime.d.ts.map +1 -1
  179. package/dist/platform/tools/exec/runtime.js +1 -7
  180. package/dist/platform/tools/fetch/runtime.d.ts.map +1 -1
  181. package/dist/platform/tools/fetch/runtime.js +9 -20
  182. package/dist/platform/tools/shared/process-manager.d.ts.map +1 -1
  183. package/dist/platform/tools/shared/process-manager.js +1 -6
  184. package/dist/platform/utils/concurrency.d.ts +1 -0
  185. package/dist/platform/utils/concurrency.d.ts.map +1 -1
  186. package/dist/platform/utils/concurrency.js +1 -0
  187. package/dist/platform/utils/error-display.d.ts +9 -0
  188. package/dist/platform/utils/error-display.d.ts.map +1 -1
  189. package/dist/platform/utils/error-display.js +11 -0
  190. package/dist/platform/utils/fetch-with-timeout.d.ts +22 -2
  191. package/dist/platform/utils/fetch-with-timeout.d.ts.map +1 -1
  192. package/dist/platform/utils/fetch-with-timeout.js +33 -15
  193. package/dist/platform/utils/record-coerce.d.ts +5 -0
  194. package/dist/platform/utils/record-coerce.d.ts.map +1 -1
  195. package/dist/platform/utils/record-coerce.js +7 -0
  196. package/dist/platform/utils/retry.d.ts.map +1 -1
  197. package/dist/platform/utils/retry.js +2 -4
  198. package/dist/platform/version.js +1 -1
  199. package/package.json +9 -9
@@ -1,11 +1,11 @@
1
- import { REASONING_BUDGET_MAP } from './interface.js';
1
+ import { applyAnthropicThinking } from './anthropic-stream.js';
2
2
  import { ProviderError } from '../types/errors.js';
3
- import { mapAnthropicStopReason } from './stop-reason-maps.js';
4
3
  import { withRetry } from '../utils/retry.js';
5
- import { logger } from '../utils/logger.js';
6
4
  import { instrumentedLlmCall } from '../runtime/llm-observability.js';
7
- import { toAnthropicTools, toAnthropicMessages, fromAnthropicContent, parseToolCallArguments, } from './tool-formats.js';
5
+ import { toAnthropicTools, toAnthropicMessages, } from './tool-formats.js';
8
6
  import { toProviderError } from '../utils/error-display.js';
7
+ import { createAnthropicSSEState, readAnthropicSSEStream, assembleAnthropicContentBlocks } from './anthropic-sse-assembler.js';
8
+ import { resolveCompletedStopReason, withProviderStopReason } from './provider-stop-reason.js';
9
9
  import { instrumentedFetch } from '../utils/fetch-with-timeout.js';
10
10
  const ANTHROPIC_API_VERSION = '2023-06-01';
11
11
  /**
@@ -69,16 +69,7 @@ export class AnthropicCompatProvider {
69
69
  if (tools && tools.length > 0) {
70
70
  body['tools'] = toAnthropicTools(tools);
71
71
  }
72
- if (reasoningEffort && reasoningEffort !== 'instant') {
73
- const budget = REASONING_BUDGET_MAP[reasoningEffort];
74
- if (budget !== undefined && budget > 0) {
75
- body['thinking'] = { type: 'enabled', budget_tokens: budget };
76
- const currentMax = body['max_tokens'] ?? 8192;
77
- if (currentMax <= budget) {
78
- body['max_tokens'] = budget + 4096;
79
- }
80
- }
81
- }
72
+ applyAnthropicThinking(body, reasoningEffort, Infinity);
82
73
  const headers = {
83
74
  'Content-Type': 'application/json',
84
75
  'anthropic-version': ANTHROPIC_API_VERSION,
@@ -121,15 +112,7 @@ export class AnthropicCompatProvider {
121
112
  });
122
113
  }
123
114
  // Parse SSE stream
124
- let responseText = '';
125
- let inputTokens = 0;
126
- let outputTokens = 0;
127
- let cacheReadTokens = 0;
128
- let cacheWriteTokens = 0;
129
- let rawStopReason;
130
- let stopReason = 'unknown';
131
- // Accumulate tool use blocks by index
132
- const toolBlocks = new Map();
115
+ const state = createAnthropicSSEState();
133
116
  const reader = res.body?.getReader();
134
117
  if (!reader) {
135
118
  throw new ProviderError(`AnthropicCompat(${this.name}) returned no response body.`, {
@@ -139,117 +122,14 @@ export class AnthropicCompatProvider {
139
122
  phase: 'response',
140
123
  });
141
124
  }
142
- const decoder = new TextDecoder();
143
- let buffer = '';
144
- try {
145
- while (true) {
146
- const { done, value } = await reader.read();
147
- if (done)
148
- break;
149
- buffer += decoder.decode(value, { stream: true });
150
- const lines = buffer.split('\n');
151
- buffer = lines.pop() ?? '';
152
- for (const line of lines) {
153
- if (!line.startsWith('data: '))
154
- continue;
155
- const data = line.slice(6).trim();
156
- if (!data || data === '[DONE]')
157
- continue;
158
- let event;
159
- try {
160
- event = JSON.parse(data);
161
- }
162
- catch {
163
- logger.warn('AnthropicCompat SSE: failed to parse JSON chunk', {
164
- chunkPreview: data.slice(0, 200),
165
- chunkLength: data.length,
166
- });
167
- continue;
168
- }
169
- if (event.type === 'content_block_start' && event.content_block?.type === 'tool_use') {
170
- const idx = event.index ?? 0;
171
- toolBlocks.set(idx, {
172
- id: event.content_block.id ?? '',
173
- name: event.content_block.name ?? '',
174
- args: '',
175
- });
176
- if (onDelta) {
177
- onDelta({ toolCalls: [{ index: idx, id: event.content_block.id, name: event.content_block.name }] });
178
- }
179
- }
180
- else if (event.type === 'content_block_delta') {
181
- const idx = event.index ?? 0;
182
- if (event.delta?.type === 'text_delta' && event.delta.text) {
183
- responseText += event.delta.text;
184
- if (onDelta)
185
- onDelta({ content: event.delta.text });
186
- }
187
- else if (event.delta?.type === 'thinking_delta' && event.delta.thinking) {
188
- if (onDelta)
189
- onDelta({ reasoning: event.delta.thinking });
190
- }
191
- else if (event.delta?.type === 'input_json_delta' && event.delta.partial_json) {
192
- const block = toolBlocks.get(idx);
193
- if (block)
194
- block.args += event.delta.partial_json;
195
- if (onDelta) {
196
- onDelta({ toolCalls: [{ index: idx, arguments: event.delta.partial_json }] });
197
- }
198
- }
199
- }
200
- else if (event.type === 'message_delta') {
201
- if (event.delta?.stop_reason) {
202
- rawStopReason = event.delta.stop_reason;
203
- stopReason = mapAnthropicStopReason(rawStopReason);
204
- }
205
- if (event.usage?.output_tokens)
206
- outputTokens = event.usage.output_tokens;
207
- if (event.usage?.cache_read_input_tokens != null)
208
- cacheReadTokens = event.usage.cache_read_input_tokens;
209
- if (event.usage?.cache_creation_input_tokens != null)
210
- cacheWriteTokens = event.usage.cache_creation_input_tokens;
211
- }
212
- else if (event.type === 'message_start') {
213
- if (event.message?.usage) {
214
- inputTokens = event.message.usage.input_tokens;
215
- outputTokens = event.message.usage.output_tokens;
216
- cacheReadTokens = event.message.usage.cache_read_input_tokens ?? 0;
217
- cacheWriteTokens = event.message.usage.cache_creation_input_tokens ?? 0;
218
- }
219
- }
220
- }
221
- }
222
- }
223
- finally {
224
- reader.releaseLock();
225
- }
226
- // Assemble content blocks
227
- const contentBlocks = [];
228
- if (responseText) {
229
- contentBlocks.push({ type: 'text', text: responseText });
230
- }
231
- for (const [, block] of [...toolBlocks.entries()].sort(([a], [b]) => a - b)) {
232
- const parsedInput = parseToolCallArguments(block.args, {
233
- provider: this.name,
234
- toolName: block.name,
235
- callId: block.id,
236
- });
237
- if (parsedInput === undefined)
238
- continue;
239
- contentBlocks.push({
240
- type: 'tool_use',
241
- id: block.id,
242
- name: block.name,
243
- input: parsedInput,
244
- });
245
- }
246
- const { text, toolCalls } = fromAnthropicContent(contentBlocks);
125
+ await readAnthropicSSEStream(reader, state, onDelta, `AnthropicCompat(${this.name})`);
126
+ const { text, toolCalls } = assembleAnthropicContentBlocks(state.toolBlocks, state.responseText, this.name);
247
127
  return {
248
128
  content: text,
249
129
  toolCalls,
250
- usage: { inputTokens, outputTokens, cacheReadTokens, cacheWriteTokens },
251
- stopReason: stopReason === 'unknown' && text ? 'completed' : stopReason,
252
- ...(rawStopReason !== undefined ? { providerStopReason: rawStopReason } : {}),
130
+ usage: { inputTokens: state.inputTokens, outputTokens: state.outputTokens, cacheReadTokens: state.cacheReadTokens, cacheWriteTokens: state.cacheWriteTokens },
131
+ stopReason: resolveCompletedStopReason(state.stopReason, text),
132
+ ...withProviderStopReason(state.rawStopReason),
253
133
  };
254
134
  }), { provider: this.name, model: model ?? this.defaultModel })).result;
255
135
  }
@@ -1 +1 @@
1
- {"version":3,"file":"anthropic-sdk-provider.d.ts","sourceRoot":"","sources":["../../../src/platform/providers/anthropic-sdk-provider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,WAAW,EACX,YAAY,EAEZ,WAAW,EACX,uBAAuB,EACvB,2BAA2B,EAC5B,MAAM,gBAAgB,CAAC;AAiBxB,KAAK,4BAA4B,GAAG;IAClC,QAAQ,EAAE;QACR,MAAM,EAAE,OAAO,CAAC;KACjB,CAAC;CACH,CAAC;AAoBF,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,WAAW,CAAC;IACvC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IACjD,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IACpD,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IACtD,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9C,QAAQ,CAAC,mBAAmB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACnD,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/C;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,YAAY,EAAE,MAAM,4BAA4B,CAAC;IAC1D,QAAQ,CAAC,IAAI,EAAE,8BAA8B,CAAC;IAC9C,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;CAChD;AAED,qBAAa,oBAAqB,YAAW,WAAW;IAI1C,OAAO,CAAC,QAAQ,CAAC,OAAO;IAHpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;gBAEG,OAAO,EAAE,2BAA2B;IAK3D,IAAI,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAsHhD,eAAe,CAAC,IAAI,EAAE,2BAA2B,GAAG,OAAO,CAAC,uBAAuB,CAAC;CAqC3F"}
1
+ {"version":3,"file":"anthropic-sdk-provider.d.ts","sourceRoot":"","sources":["../../../src/platform/providers/anthropic-sdk-provider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,WAAW,EACX,YAAY,EAEZ,WAAW,EACX,uBAAuB,EACvB,2BAA2B,EAC5B,MAAM,gBAAgB,CAAC;AAkBxB,KAAK,4BAA4B,GAAG;IAClC,QAAQ,EAAE;QACR,MAAM,EAAE,OAAO,CAAC;KACjB,CAAC;CACH,CAAC;AAcF,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,WAAW,CAAC;IACvC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IACjD,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IACpD,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IACtD,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9C,QAAQ,CAAC,mBAAmB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACnD,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/C;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,YAAY,EAAE,MAAM,4BAA4B,CAAC;IAC1D,QAAQ,CAAC,IAAI,EAAE,8BAA8B,CAAC;IAC9C,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;CAChD;AAED,qBAAa,oBAAqB,YAAW,WAAW;IAI1C,OAAO,CAAC,QAAQ,CAAC,OAAO;IAHpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;gBAEG,OAAO,EAAE,2BAA2B;IAK3D,IAAI,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IA+FhD,eAAe,CAAC,IAAI,EAAE,2BAA2B,GAAG,OAAO,CAAC,uBAAuB,CAAC;CAqC3F"}
@@ -1,18 +1,13 @@
1
- import { REASONING_BUDGET_MAP } from './interface.js';
1
+ import { applyAnthropicThinking } from './anthropic-stream.js';
2
2
  import { mapAnthropicStopReason } from './stop-reason-maps.js';
3
- import { fromAnthropicContent, parseToolCallArguments, toAnthropicMessages, toAnthropicTools, } from './tool-formats.js';
3
+ import { normalizeAnthropicModel, toAnthropicMessages, toAnthropicTools, } from './tool-formats.js';
4
+ import { assembleAnthropicContentBlocks } from './anthropic-sse-assembler.js';
5
+ import { resolveCompletedStopReason, withProviderStopReason } from './provider-stop-reason.js';
4
6
  import { ProviderError } from '../types/errors.js';
5
7
  import { withRetry } from '../utils/retry.js';
6
8
  import { buildStandardProviderAuthRoutes } from './runtime-metadata.js';
7
9
  import { toProviderError } from '../utils/error-display.js';
8
10
  const DEFAULT_MAX_OUTPUT = 8192;
9
- function normalizeAnthropicModel(model) {
10
- if (model.startsWith('anthropic:'))
11
- return model.slice('anthropic:'.length);
12
- if (model.startsWith('anthropic/'))
13
- return model.slice('anthropic/'.length);
14
- return model;
15
- }
16
11
  export class AnthropicSdkProvider {
17
12
  options;
18
13
  name;
@@ -38,15 +33,7 @@ export class AnthropicSdkProvider {
38
33
  if (params.tools && params.tools.length > 0) {
39
34
  body['tools'] = toAnthropicTools(params.tools);
40
35
  }
41
- if (params.reasoningEffort && params.reasoningEffort !== 'instant') {
42
- const budget = REASONING_BUDGET_MAP[params.reasoningEffort];
43
- if (typeof budget === 'number' && budget > 0) {
44
- body['thinking'] = { type: 'enabled', budget_tokens: budget };
45
- const currentMax = body['max_tokens'] ?? DEFAULT_MAX_OUTPUT;
46
- if (currentMax <= budget)
47
- body['max_tokens'] = budget + 4096;
48
- }
49
- }
36
+ applyAnthropicThinking(body, params.reasoningEffort, Infinity);
50
37
  const toolBlocks = new Map();
51
38
  let responseText = '';
52
39
  let rawStopReason;
@@ -92,28 +79,7 @@ export class AnthropicSdkProvider {
92
79
  }
93
80
  }
94
81
  const finalMessage = await stream.finalMessage();
95
- const contentBlocks = [];
96
- if (responseText) {
97
- contentBlocks.push({ type: 'text', text: responseText });
98
- }
99
- for (const [, block] of [...toolBlocks.entries()].sort(([a], [b]) => a - b)) {
100
- const parsedInput = parseToolCallArguments(block.args, {
101
- provider: this.name,
102
- toolName: block.name,
103
- callId: block.id,
104
- });
105
- if (parsedInput === undefined)
106
- continue;
107
- contentBlocks.push({
108
- type: 'tool_use',
109
- id: block.id,
110
- name: block.name,
111
- input: parsedInput,
112
- });
113
- }
114
- const parsed = contentBlocks.length > 0
115
- ? fromAnthropicContent(contentBlocks)
116
- : fromAnthropicContent(finalMessage.content);
82
+ const parsed = assembleAnthropicContentBlocks(toolBlocks, responseText, this.name, finalMessage.content);
117
83
  return {
118
84
  content: parsed.text,
119
85
  toolCalls: parsed.toolCalls,
@@ -123,8 +89,8 @@ export class AnthropicSdkProvider {
123
89
  ...(finalMessage.usage.cache_read_input_tokens != null ? { cacheReadTokens: finalMessage.usage.cache_read_input_tokens } : {}),
124
90
  ...(finalMessage.usage.cache_creation_input_tokens != null ? { cacheWriteTokens: finalMessage.usage.cache_creation_input_tokens } : {}),
125
91
  },
126
- stopReason: stopReason === 'unknown' && parsed.text ? 'completed' : stopReason,
127
- ...(rawStopReason !== undefined ? { providerStopReason: rawStopReason } : {}),
92
+ stopReason: resolveCompletedStopReason(stopReason, parsed.text),
93
+ ...withProviderStopReason(rawStopReason),
128
94
  };
129
95
  }
130
96
  catch (error) {
@@ -0,0 +1,80 @@
1
+ import type { ChatStopReason, StreamDelta } from './interface.js';
2
+ import type { AnthropicContentBlock } from './tool-formats.js';
3
+ import { fromAnthropicContent } from './tool-formats.js';
4
+ /** Anthropic SSE event shape (wire format from both direct API and compat endpoints). */
5
+ export interface AnthropicSSEEvent {
6
+ type: string;
7
+ index?: number | undefined;
8
+ delta?: {
9
+ type?: string | undefined;
10
+ text?: string | undefined;
11
+ thinking?: string | undefined;
12
+ partial_json?: string | undefined;
13
+ stop_reason?: string | null | undefined;
14
+ };
15
+ content_block?: {
16
+ type: string;
17
+ id?: string | undefined;
18
+ name?: string | undefined;
19
+ };
20
+ message?: {
21
+ usage?: {
22
+ input_tokens: number;
23
+ output_tokens: number;
24
+ cache_read_input_tokens?: number | undefined;
25
+ cache_creation_input_tokens?: number | undefined;
26
+ };
27
+ };
28
+ usage?: {
29
+ input_tokens?: number | undefined;
30
+ output_tokens?: number | undefined;
31
+ cache_read_input_tokens?: number | undefined;
32
+ cache_creation_input_tokens?: number | undefined;
33
+ };
34
+ }
35
+ /** Mutable accumulator for a single Anthropic streaming response. */
36
+ export interface AnthropicSSEState {
37
+ responseText: string;
38
+ inputTokens: number;
39
+ outputTokens: number;
40
+ cacheReadTokens: number;
41
+ cacheWriteTokens: number;
42
+ rawStopReason: string | undefined;
43
+ stopReason: ChatStopReason;
44
+ toolBlocks: Map<number, {
45
+ id: string;
46
+ name: string;
47
+ args: string;
48
+ }>;
49
+ }
50
+ /** Create a fresh zero-valued SSE accumulator. */
51
+ export declare function createAnthropicSSEState(): AnthropicSSEState;
52
+ /**
53
+ * Dispatch one Anthropic SSE event into the accumulator.
54
+ * Mutates state in place and calls onDelta for real-time delivery.
55
+ */
56
+ export declare function processAnthropicSSEEvent(event: AnthropicSSEEvent, state: AnthropicSSEState, onDelta: ((delta: StreamDelta) => void) | undefined): void;
57
+ /**
58
+ * Read an Anthropic SSE stream to completion, dispatching each event through
59
+ * processAnthropicSSEEvent. Uses SseLineBuffer for correct CRLF handling.
60
+ *
61
+ * @param reader ReadableStream reader from the fetch response body.
62
+ * @param state Accumulator to mutate (created with createAnthropicSSEState).
63
+ * @param onDelta Optional streaming delta callback.
64
+ * @param providerLabel Used in warn logs, e.g. 'Anthropic' or 'AnthropicCompat(my-proxy)'.
65
+ */
66
+ export declare function readAnthropicSSEStream(reader: ReadableStreamDefaultReader<Uint8Array>, state: AnthropicSSEState, onDelta: ((delta: StreamDelta) => void) | undefined, providerLabel: string): Promise<void>;
67
+ /**
68
+ * Assemble the final content + toolCalls from accumulated streaming state.
69
+ * Sorts tool blocks by stream index, parses JSON arguments, and calls
70
+ * fromAnthropicContent to produce the canonical response shape.
71
+ *
72
+ * @param fallbackBlocks Used by the SDK provider: if no streaming content was
73
+ * accumulated, fall back to finalMessage.content instead of returning empty.
74
+ */
75
+ export declare function assembleAnthropicContentBlocks(toolBlocks: Map<number, {
76
+ id: string;
77
+ name: string;
78
+ args: string;
79
+ }>, responseText: string, providerName: string, fallbackBlocks?: AnthropicContentBlock[]): ReturnType<typeof fromAnthropicContent>;
80
+ //# sourceMappingURL=anthropic-sse-assembler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic-sse-assembler.d.ts","sourceRoot":"","sources":["../../../src/platform/providers/anthropic-sse-assembler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,146 @@
1
+ import { mapAnthropicStopReason } from './stop-reason-maps.js';
2
+ import { fromAnthropicContent, parseToolCallArguments } from './tool-formats.js';
3
+ import { logger } from '../utils/logger.js';
4
+ import { SseLineBuffer } from './sse-line-buffer.js';
5
+ /** Create a fresh zero-valued SSE accumulator. */
6
+ export function createAnthropicSSEState() {
7
+ return {
8
+ responseText: '',
9
+ inputTokens: 0,
10
+ outputTokens: 0,
11
+ cacheReadTokens: 0,
12
+ cacheWriteTokens: 0,
13
+ rawStopReason: undefined,
14
+ stopReason: 'unknown',
15
+ toolBlocks: new Map(),
16
+ };
17
+ }
18
+ /**
19
+ * Dispatch one Anthropic SSE event into the accumulator.
20
+ * Mutates state in place and calls onDelta for real-time delivery.
21
+ */
22
+ export function processAnthropicSSEEvent(event, state, onDelta) {
23
+ if (event.type === 'content_block_start' && event.content_block?.type === 'tool_use') {
24
+ const idx = event.index ?? 0;
25
+ state.toolBlocks.set(idx, {
26
+ id: event.content_block.id ?? '',
27
+ name: event.content_block.name ?? '',
28
+ args: '',
29
+ });
30
+ if (onDelta) {
31
+ onDelta({ toolCalls: [{ index: idx, id: event.content_block.id, name: event.content_block.name }] });
32
+ }
33
+ }
34
+ else if (event.type === 'content_block_delta') {
35
+ const idx = event.index ?? 0;
36
+ if (event.delta?.type === 'text_delta' && event.delta.text) {
37
+ state.responseText += event.delta.text;
38
+ if (onDelta)
39
+ onDelta({ content: event.delta.text });
40
+ }
41
+ else if (event.delta?.type === 'thinking_delta' && event.delta.thinking) {
42
+ if (onDelta)
43
+ onDelta({ reasoning: event.delta.thinking });
44
+ }
45
+ else if (event.delta?.type === 'input_json_delta' && event.delta.partial_json) {
46
+ const block = state.toolBlocks.get(idx);
47
+ if (block)
48
+ block.args += event.delta.partial_json;
49
+ if (onDelta) {
50
+ onDelta({ toolCalls: [{ index: idx, arguments: event.delta.partial_json }] });
51
+ }
52
+ }
53
+ }
54
+ else if (event.type === 'message_delta') {
55
+ if (event.delta?.stop_reason) {
56
+ state.rawStopReason = event.delta.stop_reason;
57
+ state.stopReason = mapAnthropicStopReason(state.rawStopReason);
58
+ }
59
+ if (event.usage?.output_tokens)
60
+ state.outputTokens = event.usage.output_tokens;
61
+ if (event.usage?.cache_read_input_tokens != null)
62
+ state.cacheReadTokens = event.usage.cache_read_input_tokens;
63
+ if (event.usage?.cache_creation_input_tokens != null)
64
+ state.cacheWriteTokens = event.usage.cache_creation_input_tokens;
65
+ }
66
+ else if (event.type === 'message_start') {
67
+ if (event.message?.usage) {
68
+ state.inputTokens = event.message.usage.input_tokens;
69
+ state.outputTokens = event.message.usage.output_tokens;
70
+ state.cacheReadTokens = event.message.usage.cache_read_input_tokens ?? 0;
71
+ state.cacheWriteTokens = event.message.usage.cache_creation_input_tokens ?? 0;
72
+ }
73
+ }
74
+ }
75
+ /**
76
+ * Read an Anthropic SSE stream to completion, dispatching each event through
77
+ * processAnthropicSSEEvent. Uses SseLineBuffer for correct CRLF handling.
78
+ *
79
+ * @param reader ReadableStream reader from the fetch response body.
80
+ * @param state Accumulator to mutate (created with createAnthropicSSEState).
81
+ * @param onDelta Optional streaming delta callback.
82
+ * @param providerLabel Used in warn logs, e.g. 'Anthropic' or 'AnthropicCompat(my-proxy)'.
83
+ */
84
+ export async function readAnthropicSSEStream(reader, state, onDelta, providerLabel) {
85
+ const sseBuffer = new SseLineBuffer();
86
+ try {
87
+ while (true) {
88
+ const { done, value } = await reader.read();
89
+ if (done)
90
+ break;
91
+ for (const line of sseBuffer.feed(value)) {
92
+ if (!line.startsWith('data: '))
93
+ continue;
94
+ const data = line.slice(6).trim();
95
+ if (!data || data === '[DONE]')
96
+ continue;
97
+ let event;
98
+ try {
99
+ event = JSON.parse(data);
100
+ }
101
+ catch {
102
+ logger.warn(`${providerLabel} SSE: failed to parse JSON chunk`, {
103
+ chunkPreview: data.slice(0, 200),
104
+ chunkLength: data.length,
105
+ });
106
+ continue;
107
+ }
108
+ processAnthropicSSEEvent(event, state, onDelta);
109
+ }
110
+ }
111
+ }
112
+ finally {
113
+ reader.releaseLock();
114
+ }
115
+ }
116
+ /**
117
+ * Assemble the final content + toolCalls from accumulated streaming state.
118
+ * Sorts tool blocks by stream index, parses JSON arguments, and calls
119
+ * fromAnthropicContent to produce the canonical response shape.
120
+ *
121
+ * @param fallbackBlocks Used by the SDK provider: if no streaming content was
122
+ * accumulated, fall back to finalMessage.content instead of returning empty.
123
+ */
124
+ export function assembleAnthropicContentBlocks(toolBlocks, responseText, providerName, fallbackBlocks) {
125
+ const contentBlocks = [];
126
+ if (responseText) {
127
+ contentBlocks.push({ type: 'text', text: responseText });
128
+ }
129
+ for (const [, block] of [...toolBlocks.entries()].sort(([a], [b]) => a - b)) {
130
+ const parsedInput = parseToolCallArguments(block.args, {
131
+ provider: providerName,
132
+ toolName: block.name,
133
+ callId: block.id,
134
+ });
135
+ if (parsedInput === undefined)
136
+ continue;
137
+ contentBlocks.push({
138
+ type: 'tool_use',
139
+ id: block.id,
140
+ name: block.name,
141
+ input: parsedInput,
142
+ });
143
+ }
144
+ const target = contentBlocks.length > 0 ? contentBlocks : (fallbackBlocks ?? []);
145
+ return fromAnthropicContent(target);
146
+ }
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Shared Anthropic streaming helpers.
3
+ *
4
+ * Extracted to avoid duplicating thinking-budget logic across the three
5
+ * Anthropic-family providers (anthropic.ts, anthropic-compat.ts,
6
+ * anthropic-sdk-provider.ts).
7
+ */
8
+ /**
9
+ * Extra output tokens added above the thinking budget to satisfy the
10
+ * Anthropic API invariant: max_tokens > budget_tokens.
11
+ */
12
+ export declare const ANTHROPIC_THINKING_HEADROOM = 4096;
13
+ /**
14
+ * Apply Anthropic extended-thinking parameters to a mutable request body.
15
+ *
16
+ * Sets `body.thinking` and adjusts `body.max_tokens` so that:
17
+ * - `max_tokens > budget_tokens` (Anthropic API requirement), and
18
+ * - `max_tokens <= modelOutputCap` (avoids over-cap requests).
19
+ *
20
+ * If the budget meets or exceeds the model's output cap, thinking is skipped
21
+ * entirely — it is impossible to satisfy `max_tokens > budget_tokens` within
22
+ * the cap. Pass `Infinity` for compat/SDK providers that have no per-model cap;
23
+ * this preserves the original `budget + HEADROOM` behaviour for those paths.
24
+ *
25
+ * @param body Mutable request body (mutated in place).
26
+ * @param reasoningEffort Effort label ('low'|'medium'|'high'|'instant') or falsy.
27
+ * @param modelOutputCap Maximum output tokens the model accepts.
28
+ */
29
+ export declare function applyAnthropicThinking(body: Record<string, unknown>, reasoningEffort: string | null | undefined, modelOutputCap: number): void;
30
+ //# sourceMappingURL=anthropic-stream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic-stream.d.ts","sourceRoot":"","sources":["../../../src/platform/providers/anthropic-stream.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH;;;GAGG;AACH,eAAO,MAAM,2BAA2B,OAAO,CAAC;AAEhD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,eAAe,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC1C,cAAc,EAAE,MAAM,GACrB,IAAI,CAWN"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Shared Anthropic streaming helpers.
3
+ *
4
+ * Extracted to avoid duplicating thinking-budget logic across the three
5
+ * Anthropic-family providers (anthropic.ts, anthropic-compat.ts,
6
+ * anthropic-sdk-provider.ts).
7
+ */
8
+ import { REASONING_BUDGET_MAP } from './interface.js';
9
+ /**
10
+ * Extra output tokens added above the thinking budget to satisfy the
11
+ * Anthropic API invariant: max_tokens > budget_tokens.
12
+ */
13
+ export const ANTHROPIC_THINKING_HEADROOM = 4096;
14
+ /**
15
+ * Apply Anthropic extended-thinking parameters to a mutable request body.
16
+ *
17
+ * Sets `body.thinking` and adjusts `body.max_tokens` so that:
18
+ * - `max_tokens > budget_tokens` (Anthropic API requirement), and
19
+ * - `max_tokens <= modelOutputCap` (avoids over-cap requests).
20
+ *
21
+ * If the budget meets or exceeds the model's output cap, thinking is skipped
22
+ * entirely — it is impossible to satisfy `max_tokens > budget_tokens` within
23
+ * the cap. Pass `Infinity` for compat/SDK providers that have no per-model cap;
24
+ * this preserves the original `budget + HEADROOM` behaviour for those paths.
25
+ *
26
+ * @param body Mutable request body (mutated in place).
27
+ * @param reasoningEffort Effort label ('low'|'medium'|'high'|'instant') or falsy.
28
+ * @param modelOutputCap Maximum output tokens the model accepts.
29
+ */
30
+ export function applyAnthropicThinking(body, reasoningEffort, modelOutputCap) {
31
+ if (!reasoningEffort || reasoningEffort === 'instant')
32
+ return;
33
+ const budget = REASONING_BUDGET_MAP[reasoningEffort];
34
+ if (typeof budget !== 'number' || budget <= 0)
35
+ return;
36
+ // Cannot satisfy API invariant max_tokens > budget_tokens within the model cap.
37
+ if (budget >= modelOutputCap)
38
+ return;
39
+ body['thinking'] = { type: 'enabled', budget_tokens: budget };
40
+ const currentMax = body['max_tokens'] ?? modelOutputCap;
41
+ if (currentMax <= budget) {
42
+ body['max_tokens'] = Math.min(budget + ANTHROPIC_THINKING_HEADROOM, modelOutputCap);
43
+ }
44
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"anthropic-vertex.d.ts","sourceRoot":"","sources":["../../../src/platform/providers/anthropic-vertex.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAoMnE,qBAAa,uBAAwB,SAAQ,oBAAoB;;CAmChE"}
1
+ {"version":3,"file":"anthropic-vertex.d.ts","sourceRoot":"","sources":["../../../src/platform/providers/anthropic-vertex.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAkMnE,qBAAa,uBAAwB,SAAQ,oBAAoB;;CAmChE"}
@@ -2,6 +2,7 @@ import { BaseAnthropic } from '@anthropic-ai/sdk/client';
2
2
  import * as Resources from '@anthropic-ai/sdk/resources/index';
3
3
  import { AuthClient, GoogleAuth } from 'google-auth-library';
4
4
  import { AnthropicSdkProvider } from './anthropic-sdk-provider.js';
5
+ import { isRecord } from '../utils/record-coerce.js';
5
6
  const DEFAULT_VERSION = 'vertex-2023-10-16';
6
7
  const MODEL_ENDPOINTS = new Set(['/v1/messages', '/v1/messages?beta=true']);
7
8
  const VERTEX_MODELS = [
@@ -12,9 +13,6 @@ const VERTEX_MODELS = [
12
13
  function readEnv(name) {
13
14
  return process.env[name] ?? null;
14
15
  }
15
- function isRecord(value) {
16
- return typeof value === 'object' && value !== null && !Array.isArray(value);
17
- }
18
16
  function resolveVertexBaseUrl(region) {
19
17
  if (region === 'global')
20
18
  return 'https://aiplatform.googleapis.com/v1';
@@ -1 +1 @@
1
- {"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../../src/platform/providers/anthropic.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,WAAW,EACX,YAAY,EAEZ,oBAAoB,EAKpB,uBAAuB,EACvB,2BAA2B,EAC5B,MAAM,gBAAgB,CAAC;AAKxB,OAAO,KAAK,EAAgB,eAAe,EAAE,MAAM,qBAAqB,CAAC;AA4EzE;;;;;GAKG;AACH,qBAAa,iBAAkB,YAAW,WAAW;IACnD,QAAQ,CAAC,IAAI,eAAe;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,CAAM;IAC/B,QAAQ,CAAC,KAAK,EAAE,oBAAoB,CAAC;IAErC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAqD;gBAGnF,MAAM,EAAE,MAAM,EACd,eAAe,GAAE,IAAI,CAAC,eAAe,EAAE,YAAY,GAAG,YAAY,CAA0B;IAcxF,IAAI,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAwUhD,eAAe,CAAC,IAAI,EAAE,2BAA2B,GAAG,OAAO,CAAC,uBAAuB,CAAC;IA4C1F,YAAY,IAAI,OAAO;YAIT,eAAe;YAmBf,aAAa;YAcb,WAAW;YAcX,eAAe;IAuC7B,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,6BAA6B;IAwBrC,OAAO,CAAC,uBAAuB;YAUjB,gBAAgB;IAsB9B,OAAO,CAAC,yBAAyB;IA2BjC,OAAO,CAAC,mCAAmC;CAoB5C"}
1
+ {"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../../src/platform/providers/anthropic.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,WAAW,EACX,YAAY,EAEZ,oBAAoB,EAKpB,uBAAuB,EACvB,2BAA2B,EAC5B,MAAM,gBAAgB,CAAC;AAKxB,OAAO,KAAK,EAAgB,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAgDzE;;;;;GAKG;AACH,qBAAa,iBAAkB,YAAW,WAAW;IACnD,QAAQ,CAAC,IAAI,eAAe;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,CAAM;IAC/B,QAAQ,CAAC,KAAK,EAAE,oBAAoB,CAAC;IAErC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAqD;gBAGnF,MAAM,EAAE,MAAM,EACd,eAAe,GAAE,IAAI,CAAC,eAAe,EAAE,YAAY,GAAG,YAAY,CAA0B;IAcxF,IAAI,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAwNhD,eAAe,CAAC,IAAI,EAAE,2BAA2B,GAAG,OAAO,CAAC,uBAAuB,CAAC;IA4C1F,YAAY,IAAI,OAAO;YAIT,eAAe;YAmBf,aAAa;YAcb,WAAW;YAcX,eAAe;IAuC7B,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,6BAA6B;IAiBrC,OAAO,CAAC,uBAAuB;YAUjB,gBAAgB;IAsB9B,OAAO,CAAC,yBAAyB;IA2BjC,OAAO,CAAC,mCAAmC;CAoB5C"}