@framers/agentos 0.9.111 → 0.9.113

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 (47) hide show
  1. package/dist/api/generateObject.d.ts.map +1 -1
  2. package/dist/api/generateObject.js +13 -0
  3. package/dist/api/generateObject.js.map +1 -1
  4. package/dist/api/generateText.d.ts +31 -1
  5. package/dist/api/generateText.d.ts.map +1 -1
  6. package/dist/api/generateText.js +27 -0
  7. package/dist/api/generateText.js.map +1 -1
  8. package/dist/api/runtime/openaiResponseFormat.d.ts +8 -0
  9. package/dist/api/runtime/openaiResponseFormat.d.ts.map +1 -1
  10. package/dist/api/runtime/openaiResponseFormat.js +66 -1
  11. package/dist/api/runtime/openaiResponseFormat.js.map +1 -1
  12. package/dist/core/llm/providers/IProvider.d.ts +47 -0
  13. package/dist/core/llm/providers/IProvider.d.ts.map +1 -1
  14. package/dist/core/llm/providers/implementations/AnthropicProvider.d.ts +87 -8
  15. package/dist/core/llm/providers/implementations/AnthropicProvider.d.ts.map +1 -1
  16. package/dist/core/llm/providers/implementations/AnthropicProvider.js +108 -14
  17. package/dist/core/llm/providers/implementations/AnthropicProvider.js.map +1 -1
  18. package/dist/core/llm/providers/implementations/OpenRouterProvider.d.ts +43 -0
  19. package/dist/core/llm/providers/implementations/OpenRouterProvider.d.ts.map +1 -1
  20. package/dist/core/llm/providers/implementations/OpenRouterProvider.js +201 -41
  21. package/dist/core/llm/providers/implementations/OpenRouterProvider.js.map +1 -1
  22. package/dist/core/llm/providers/model-strict-tool-use.d.ts +45 -0
  23. package/dist/core/llm/providers/model-strict-tool-use.d.ts.map +1 -0
  24. package/dist/core/llm/providers/model-strict-tool-use.js +47 -0
  25. package/dist/core/llm/providers/model-strict-tool-use.js.map +1 -0
  26. package/dist/core/llm/routing/UncensoredModelCatalog.d.ts.map +1 -1
  27. package/dist/core/llm/routing/UncensoredModelCatalog.js +59 -27
  28. package/dist/core/llm/routing/UncensoredModelCatalog.js.map +1 -1
  29. package/dist/index.d.ts +1 -0
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js.map +1 -1
  32. package/dist/orchestration/compiler/SchemaLowering.d.ts +2 -1
  33. package/dist/orchestration/compiler/SchemaLowering.d.ts.map +1 -1
  34. package/dist/orchestration/compiler/SchemaLowering.js +26 -1
  35. package/dist/orchestration/compiler/SchemaLowering.js.map +1 -1
  36. package/dist/orchestration/pipeline/query/types.js +2 -2
  37. package/dist/orchestration/pipeline/query/types.js.map +1 -1
  38. package/dist/orchestration/planner/PlanningEngine.d.ts +1 -1
  39. package/dist/orchestration/planner/PlanningEngine.d.ts.map +1 -1
  40. package/dist/orchestration/planner/PlanningEngine.js +4 -2
  41. package/dist/orchestration/planner/PlanningEngine.js.map +1 -1
  42. package/dist/orchestration/planning/ProviderAssignmentEngine.js +1 -1
  43. package/dist/orchestration/planning/ProviderAssignmentEngine.js.map +1 -1
  44. package/dist/safety/evaluation/LLMJudge.d.ts.map +1 -1
  45. package/dist/safety/evaluation/LLMJudge.js +4 -1
  46. package/dist/safety/evaluation/LLMJudge.js.map +1 -1
  47. package/package.json +1 -1
@@ -159,6 +159,20 @@ export interface ModelCompletionOptions {
159
159
  * dropped on unsupported models or invalid values.
160
160
  */
161
161
  effort?: string;
162
+ /**
163
+ * Anthropic prompt-cache diagnostics (beta `cache-diagnosis-2026-04-07`).
164
+ * When set, the provider sends `diagnostics: { previous_message_id }` plus
165
+ * the beta header, and the API compares this request against the referenced
166
+ * one to explain any cache miss. Pass `previousMessageId: null` on the first
167
+ * call of a conversation to opt in; thread the previous response's `id`
168
+ * (`msg_...`) on subsequent calls. The verdict comes back on
169
+ * {@link ModelCompletionResponse.cacheDiagnostics}. Anthropic-only —
170
+ * other providers ignore the field. Never affects request processing:
171
+ * diagnostics are best-effort observability.
172
+ */
173
+ cacheDiagnostics?: {
174
+ previousMessageId: string | null;
175
+ };
162
176
  /**
163
177
  * Positive values penalize new tokens based on whether they appear in the text so far,
164
178
  * increasing the model's likelihood to talk about new topics.
@@ -220,6 +234,30 @@ export interface ModelCompletionOptions {
220
234
  };
221
235
  } | Record<string, unknown>;
222
236
  }
237
+ /**
238
+ * The first point of divergence between this request and the one referenced
239
+ * by `cacheDiagnostics.previousMessageId`, as reported by Anthropic's
240
+ * cache-diagnostics beta. `type` is one of the API's discriminants
241
+ * (`model_changed` | `system_changed` | `tools_changed` | `messages_changed`
242
+ * | `previous_message_not_found` | `unavailable`) — kept as an open string so
243
+ * new discriminants pass through without a library update. The `*_changed`
244
+ * types also carry `cacheMissedInputTokens`, an estimate of how many input
245
+ * tokens fell after the divergence point (magnitude indicator, not a billing
246
+ * number).
247
+ */
248
+ export interface CacheMissReason {
249
+ type: string;
250
+ cacheMissedInputTokens?: number;
251
+ }
252
+ /**
253
+ * Cache-diagnostics verdict for one call. `cacheMissReason: null` means the
254
+ * comparison was still running when the response serialized (inconclusive —
255
+ * check the next turn). A populated reason identifies the earliest divergence;
256
+ * fix it first, later ones may be hidden behind it.
257
+ */
258
+ export interface CacheDiagnostics {
259
+ cacheMissReason: CacheMissReason | null;
260
+ }
223
261
  /**
224
262
  * Represents token usage information from a model call, including cost estimation.
225
263
  */
@@ -267,6 +305,15 @@ export interface ModelCompletionResponse {
267
305
  choices: ModelCompletionChoice[];
268
306
  /** Token usage & optional cost metrics (present on final chunk; may be partial/omitted on deltas). */
269
307
  usage?: ModelUsage;
308
+ /**
309
+ * Anthropic cache-diagnostics verdict (beta). Present only when the request
310
+ * opted in via {@link ModelCompletionOptions.cacheDiagnostics} AND the API
311
+ * returned a verdict. `null` = a comparison ran and found no divergence (or
312
+ * this was the opt-in first turn with nothing to compare). An object with
313
+ * `cacheMissReason` identifies the earliest divergence — see
314
+ * {@link CacheDiagnostics}.
315
+ */
316
+ cacheDiagnostics?: CacheDiagnostics | null;
270
317
  /** Unified error envelope; present ONLY if an error occurred for this request/chunk. */
271
318
  error?: {
272
319
  /** Human readable message suitable for UI display or logging. */
@@ -1 +1 @@
1
- {"version":3,"file":"IProvider.d.ts","sourceRoot":"","sources":["../../../../src/core/llm/providers/IProvider.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"IProvider.d.ts","sourceRoot":"","sources":["../../../../src/core/llm/providers/IProvider.ts"],"names":[],"mappings":"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"}
@@ -16,7 +16,7 @@
16
16
  * @module backend/agentos/core/llm/providers/implementations/AnthropicProvider
17
17
  * @implements {IProvider}
18
18
  */
19
- import { IProvider, ChatMessage, ModelCompletionOptions, ModelCompletionResponse, ModelInfo, ProviderEmbeddingOptions, ProviderEmbeddingResponse } from '../IProvider';
19
+ import { IProvider, ChatMessage, ModelCompletionOptions, ModelCompletionResponse, ModelInfo, ProviderEmbeddingOptions, ProviderEmbeddingResponse, CacheDiagnostics } from '../IProvider';
20
20
  import { modelSupportsForcedToolChoice } from '../model-forced-tool-choice.js';
21
21
  export { modelSupportsForcedToolChoice };
22
22
  /**
@@ -106,6 +106,73 @@ export interface AnthropicProviderConfig {
106
106
  * model, `true` otherwise.
107
107
  */
108
108
  export declare function modelSupportsTemperature(modelId: string): boolean;
109
+ /** A single content block in an Anthropic message (text, tool_use, or tool_result). */
110
+ interface AnthropicContentBlock {
111
+ type: 'text' | 'tool_use' | 'tool_result' | 'image' | 'thinking' | 'redacted_thinking';
112
+ /** Present when type === 'text'. */
113
+ text?: string;
114
+ /** Present when type === 'thinking' — the reasoning text. */
115
+ thinking?: string;
116
+ /** Present when type === 'thinking' — opaque replay signature; preserve verbatim. */
117
+ signature?: string;
118
+ /** Present when type === 'redacted_thinking' — encrypted reasoning blob; preserve verbatim. */
119
+ data?: string;
120
+ /** Present when type === 'tool_use'. */
121
+ id?: string;
122
+ name?: string;
123
+ input?: Record<string, unknown>;
124
+ /** Present when type === 'tool_result'. */
125
+ tool_use_id?: string;
126
+ content?: string | Array<{
127
+ type: string;
128
+ text?: string;
129
+ }>;
130
+ is_error?: boolean;
131
+ /** Present when type === 'image'. */
132
+ source?: {
133
+ type: 'base64';
134
+ media_type: string;
135
+ data: string;
136
+ };
137
+ }
138
+ /** The Anthropic Messages API response shape. */
139
+ interface AnthropicMessagesResponse {
140
+ id: string;
141
+ type: 'message';
142
+ role: 'assistant';
143
+ content: AnthropicContentBlock[];
144
+ model: string;
145
+ stop_reason: 'end_turn' | 'max_tokens' | 'stop_sequence' | 'tool_use' | null;
146
+ stop_sequence: string | null;
147
+ usage: {
148
+ input_tokens: number;
149
+ output_tokens: number;
150
+ cache_creation_input_tokens?: number;
151
+ cache_read_input_tokens?: number;
152
+ };
153
+ /**
154
+ * Cache-diagnostics verdict (beta `cache-diagnosis-2026-04-07`). Returned
155
+ * only when the request carried a `diagnostics` field. Absent = not
156
+ * requested; `null` = compared with no divergence (or first-turn opt-in);
157
+ * `{ cache_miss_reason: null }` = comparison still running;
158
+ * `{ cache_miss_reason: {...} }` = earliest divergence identified.
159
+ */
160
+ diagnostics?: {
161
+ cache_miss_reason: {
162
+ type: string;
163
+ cache_missed_input_tokens?: number;
164
+ } | null;
165
+ } | null;
166
+ }
167
+ /**
168
+ * Normalize the wire-format diagnostics object into the camelCased
169
+ * {@link CacheDiagnostics} surfaced on {@link ModelCompletionResponse}.
170
+ * Preserves the API's three requested-response states losslessly:
171
+ * `null` (compared, no divergence) stays `null`; `cache_miss_reason: null`
172
+ * (comparison pending) becomes `{ cacheMissReason: null }`; a populated
173
+ * reason maps field-for-field. Exported for tests.
174
+ */
175
+ export declare function normalizeCacheDiagnostics(diagnostics: AnthropicMessagesResponse['diagnostics']): CacheDiagnostics | null;
109
176
  /**
110
177
  * Clamp a requested `max_tokens` to the target model's real output ceiling from
111
178
  * {@link ANTHROPIC_MODELS}. Anthropic returns HTTP 400 when `max_tokens` exceeds
@@ -480,13 +547,25 @@ export declare class AnthropicProvider implements IProvider {
480
547
  private nextApiKey;
481
548
  private buildHeaders;
482
549
  /**
483
- * The `anthropic-beta` header for interleaved extended thinking, returned
484
- * only when this request actually uses thinking — either it enables it
485
- * outbound (`thinking` in the body) or it replays captured thinking blocks
486
- * from a prior assistant turn. Empty otherwise, so non-thinking traffic is
487
- * byte-for-byte unchanged.
488
- */
489
- private thinkingBetaHeaders;
550
+ * The `anthropic-beta` header for every beta this request actually uses,
551
+ * comma-joined per the API convention. Currently:
552
+ *
553
+ * - `interleaved-thinking-2025-05-14` — when the request enables extended
554
+ * thinking outbound (`thinking` in the body) or replays captured thinking
555
+ * blocks from a prior assistant turn.
556
+ * - `cache-diagnosis-2026-04-07` — when the body carries a `diagnostics`
557
+ * field (see {@link ModelCompletionOptions.cacheDiagnostics}); the header
558
+ * must ride EVERY diagnosed turn or the next turn's lookup fails with
559
+ * `previous_message_not_found`.
560
+ * - `structured-outputs-2025-11-13` — when any tool definition in the body
561
+ * carries `strict: true` (the forced structured-output tool on
562
+ * strict-capable models; see modelSupportsStrictToolUse).
563
+ *
564
+ * Empty when no beta applies, so plain traffic is byte-for-byte unchanged.
565
+ */
566
+ private betaHeaders;
567
+ /** True when any tool definition in the request carries `strict: true`. */
568
+ private payloadUsesStrictTools;
490
569
  /** True when the request enables extended thinking or replays thinking blocks. */
491
570
  private payloadUsesThinking;
492
571
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"AnthropicProvider.d.ts","sourceRoot":"","sources":["../../../../../src/core/llm/providers/implementations/AnthropicProvider.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AnthropicProvider.d.ts","sourceRoot":"","sources":["../../../../../src/core/llm/providers/implementations/AnthropicProvider.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EACL,SAAS,EACT,WAAW,EAGX,sBAAsB,EACtB,uBAAuB,EAEvB,SAAS,EAET,wBAAwB,EACxB,yBAAyB,EACzB,gBAAgB,EACjB,MAAM,cAAc,CAAC;AAItB,OAAO,EAAE,6BAA6B,EAAE,MAAM,gCAAgC,CAAC;AAW/E,OAAO,EAAE,6BAA6B,EAAE,CAAC;AAMzC;;;;;;;;;GASG;AACH,MAAM,WAAW,uBAAuB;IACtC;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;;;;;OAQG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B;;;;;;;;;;OAUG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAMD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAMjE;AAMD,uFAAuF;AACvF,UAAU,qBAAqB;IAC7B,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,aAAa,GAAG,OAAO,GAAG,UAAU,GAAG,mBAAmB,CAAC;IACvF,oCAAoC;IACpC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qFAAqF;IACrF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+FAA+F;IAC/F,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,wCAAwC;IACxC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,2CAA2C;IAC3C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC1D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,qCAAqC;IACrC,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,QAAQ,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAC/D;AAED,iDAAiD;AACjD,UAAU,yBAAyB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,qBAAqB,EAAE,CAAC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,UAAU,GAAG,YAAY,GAAG,eAAe,GAAG,UAAU,GAAG,IAAI,CAAC;IAC7E,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,KAAK,EAAE;QACL,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,CAAC;QACtB,2BAA2B,CAAC,EAAE,MAAM,CAAC;QACrC,uBAAuB,CAAC,EAAE,MAAM,CAAC;KAClC,CAAC;IACF;;;;;;OAMG;IACH,WAAW,CAAC,EAAE;QACZ,iBAAiB,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,yBAAyB,CAAC,EAAE,MAAM,CAAA;SAAE,GAAG,IAAI,CAAC;KAChF,GAAG,IAAI,CAAC;CACV;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CACvC,WAAW,EAAE,yBAAyB,CAAC,aAAa,CAAC,GACpD,gBAAgB,GAAG,IAAI,CAczB;AAuND;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAMlF;AAMD;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,iBAAkB,YAAW,SAAS;IACjD,kBAAkB;IAClB,SAAgB,UAAU,EAAE,MAAM,CAAe;IACjD,kBAAkB;IACX,aAAa,EAAE,OAAO,CAAS;IACtC,kBAAkB;IACX,cAAc,CAAC,EAAE,MAAM,CAAC;IAE/B,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,OAAO,CAA2B;;IAQ1C;;;;;;;;;;;OAWG;IACU,UAAU,CAAC,MAAM,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC;IAiDvE;;;;;;;;;;;;;;;OAeG;IACU,kBAAkB,CAC7B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,WAAW,EAAE,EACvB,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,uBAAuB,CAAC;IAuCnC;;;;;;;;OAQG;IACH,OAAO,CAAC,qBAAqB;IA2B7B;;;;;;;;;;;;OAYG;YACW,wBAAwB;IAwCtC;;;;;;;OAOG;IACH,OAAO,CAAC,sBAAsB;IAqB9B;;;;;;;;;;;;OAYG;YACW,wBAAwB;IAuJtC;;;;;;;;;;;;;;;;;;;OAmBG;IACW,wBAAwB,CACpC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,WAAW,EAAE,EACvB,OAAO,EAAE,sBAAsB,GAC9B,cAAc,CAAC,uBAAuB,EAAE,IAAI,EAAE,SAAS,CAAC;IAkQ3D;;;;;;;;OAQG;IACU,kBAAkB,CAC7B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EAAE,EAChB,QAAQ,CAAC,EAAE,wBAAwB,GAClC,OAAO,CAAC,yBAAyB,CAAC;IAWrC;;;;;;;;OAQG;IACU,mBAAmB,CAC9B,MAAM,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GAC/B,OAAO,CAAC,SAAS,EAAE,CAAC;IAQvB;;;;;OAKG;IACU,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;IAK1E;;;;OAIG;IACU,WAAW,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAgB9E,kBAAkB;IACL,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAStC;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IAazB;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,mBAAmB;IA2W3B;;;;;;;;OAQG;IACH,OAAO,CAAC,wBAAwB;IAgBhC;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,6BAA6B;IA0BrC;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,kBAAkB;IAiG1B;;;;;;;;;OASG;IACH,OAAO,CAAC,eAAe;IAsBvB;;;;;;OAMG;IACH,OAAO,CAAC,iBAAiB;IAmBzB;;;;;;;;;OASG;IACH,OAAO,CAAC,uBAAuB;IAgG/B;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,aAAa;IAUrB;;;;;;OAMG;IACH,OAAO,CAAC,iBAAiB;IAczB;;;;;;;;;;;OAWG;IACH;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,OAAO,CAAC,YAAY;IAkBpB;;;;;;OAMG;IACH,OAAO,CAAC,eAAe;IAgBvB;;;;;;;;;;;;;OAaG;YACW,cAAc;IA+I5B;;;;;;;;OAQG;YACW,iBAAiB;IA+F/B;;;;;;;;OAQG;IACH;;;;;;OAMG;IACH,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,YAAY;IAQpB;;;;;;;;;;;;;;;;OAgBG;IACH,OAAO,CAAC,WAAW;IAQnB,2EAA2E;IAC3E,OAAO,CAAC,sBAAsB;IAU9B,kFAAkF;IAClF,OAAO,CAAC,mBAAmB;IAuB3B;;;;;;;;;;;;;;;OAeG;YACY,cAAc;CAmF9B"}
@@ -3,6 +3,7 @@ import { AnthropicProviderError } from '../errors/AnthropicProviderError.js';
3
3
  import { ApiKeyPool } from '../../../providers/ApiKeyPool.js';
4
4
  import { resolveThinkingPayload } from '../model-thinking.js';
5
5
  import { modelSupportsForcedToolChoice } from '../model-forced-tool-choice.js';
6
+ import { modelSupportsStrictToolUse } from '../model-strict-tool-use.js';
6
7
  import { modelSupportsEffort, isEffortLevel } from '../model-effort.js';
7
8
  import { computeRetryBackoffMs } from './retry-backoff.js';
8
9
  import { recordCacheUsage } from './cacheLeakDetector.js';
@@ -43,6 +44,29 @@ export function modelSupportsTemperature(modelId) {
43
44
  // lockstep with modelSupportsThinking.
44
45
  return !/^claude-(opus-4-(7|8)|sonnet-5|fable-5)\b/i.test(modelId);
45
46
  }
47
+ /**
48
+ * Normalize the wire-format diagnostics object into the camelCased
49
+ * {@link CacheDiagnostics} surfaced on {@link ModelCompletionResponse}.
50
+ * Preserves the API's three requested-response states losslessly:
51
+ * `null` (compared, no divergence) stays `null`; `cache_miss_reason: null`
52
+ * (comparison pending) becomes `{ cacheMissReason: null }`; a populated
53
+ * reason maps field-for-field. Exported for tests.
54
+ */
55
+ export function normalizeCacheDiagnostics(diagnostics) {
56
+ if (diagnostics == null)
57
+ return null;
58
+ const reason = diagnostics.cache_miss_reason;
59
+ return {
60
+ cacheMissReason: reason == null
61
+ ? null
62
+ : {
63
+ type: reason.type,
64
+ ...(reason.cache_missed_input_tokens !== undefined && {
65
+ cacheMissedInputTokens: reason.cache_missed_input_tokens,
66
+ }),
67
+ },
68
+ };
69
+ }
46
70
  // ---------------------------------------------------------------------------
47
71
  // Known model catalog — used by listAvailableModels / getModelInfo
48
72
  // ---------------------------------------------------------------------------
@@ -382,7 +406,15 @@ export class AnthropicProvider {
382
406
  if (!this.isRetryableStreamError(lastError) || attempt === attempts - 1) {
383
407
  throw lastError;
384
408
  }
385
- await new Promise(resolve => setTimeout(resolve, computeRetryBackoffMs(attempt)));
409
+ // Honor the server's Retry-After when the failed attempt carried one
410
+ // (429s from makeStreamRequest stash it on error.details) — parity
411
+ // with the non-stream retry path. Fall back to jittered backoff.
412
+ const retryAfterSec = lastError.details
413
+ ?.retryAfterSec;
414
+ const sleepMs = typeof retryAfterSec === 'number' && Number.isFinite(retryAfterSec) && retryAfterSec > 0
415
+ ? retryAfterSec * 1000
416
+ : computeRetryBackoffMs(attempt);
417
+ await new Promise(resolve => setTimeout(resolve, sleepMs));
386
418
  }
387
419
  }
388
420
  throw lastError;
@@ -434,6 +466,7 @@ export class AnthropicProvider {
434
466
  let outputTokens = 0;
435
467
  let cacheCreationTokens;
436
468
  let cacheReadTokens;
469
+ let diagnostics;
437
470
  let sawMessageDelta = false;
438
471
  const blocks = new Map();
439
472
  for await (const rawEvent of this.parseSseStream(stream)) {
@@ -452,6 +485,8 @@ export class AnthropicProvider {
452
485
  inputTokens = event.message.usage?.input_tokens ?? 0;
453
486
  cacheCreationTokens = event.message.usage?.cache_creation_input_tokens;
454
487
  cacheReadTokens = event.message.usage?.cache_read_input_tokens;
488
+ // Cache diagnostics ride message_start in streaming responses.
489
+ diagnostics = event.message.diagnostics;
455
490
  break;
456
491
  }
457
492
  case 'content_block_start': {
@@ -550,6 +585,7 @@ export class AnthropicProvider {
550
585
  ...(cacheCreationTokens !== undefined && { cache_creation_input_tokens: cacheCreationTokens }),
551
586
  ...(cacheReadTokens !== undefined && { cache_read_input_tokens: cacheReadTokens }),
552
587
  },
588
+ ...(diagnostics !== undefined && { diagnostics }),
553
589
  };
554
590
  }
555
591
  /**
@@ -1035,6 +1071,18 @@ export class AnthropicProvider {
1035
1071
  const oc = payload.output_config ?? {};
1036
1072
  payload.output_config = { ...oc, effort: options.effort };
1037
1073
  }
1074
+ // --- Cache diagnostics (beta cache-diagnosis-2026-04-07) ---
1075
+ // Opt-in observability: the API compares this request against the one
1076
+ // referenced by previous_message_id and reports where the prompt prefix
1077
+ // diverged (cache_miss_reason on the response). `null` opts in on the
1078
+ // first turn with nothing to compare. The matching beta header is added
1079
+ // by betaHeaders() keyed off this payload field. Best-effort by API
1080
+ // contract — diagnostics never block or fail the request.
1081
+ if (options.cacheDiagnostics !== undefined) {
1082
+ payload.diagnostics = {
1083
+ previous_message_id: options.cacheDiagnostics.previousMessageId,
1084
+ };
1085
+ }
1038
1086
  // --- Tool definitions ---
1039
1087
  const tools = this.convertToolDefs(options.tools);
1040
1088
  if (tools.length > 0) {
@@ -1066,7 +1114,20 @@ export class AnthropicProvider {
1066
1114
  // against a direct provider.generateCompletion call that
1067
1115
  // accidentally passes both responseFormat (structured-output
1068
1116
  // marker) and a tools array.
1069
- payload.tools = [{ name: sf.tool.name, input_schema: sf.tool.input_schema }];
1117
+ // Guaranteed schema conformance where the model supports strict tool
1118
+ // use (structured-outputs surface, 4.5+ generations): the API
1119
+ // validates the tool input against input_schema server-side instead
1120
+ // of best-effort adherence, so long/adversarial generations can no
1121
+ // longer drift from the schema and fail the caller's Zod parse.
1122
+ // Older models reject the unknown field ("tools.0.strict: Extra
1123
+ // inputs are not permitted"), hence the capability gate. The
1124
+ // matching `structured-outputs-2025-11-13` beta header is emitted by
1125
+ // betaHeaders() whenever a payload's tools carry the flag.
1126
+ payload.tools = [{
1127
+ name: sf.tool.name,
1128
+ input_schema: sf.tool.input_schema,
1129
+ ...(modelSupportsStrictToolUse(modelId) ? { strict: true } : {}),
1130
+ }];
1070
1131
  payload.tool_choice = { type: 'tool', name: sf.tool.name };
1071
1132
  }
1072
1133
  // --- Forced tool_choice reconciliation ---
@@ -1508,6 +1569,9 @@ export class AnthropicProvider {
1508
1569
  modelId: apiResponse.model,
1509
1570
  choices: [choice],
1510
1571
  usage,
1572
+ ...(apiResponse.diagnostics !== undefined && {
1573
+ cacheDiagnostics: normalizeCacheDiagnostics(apiResponse.diagnostics),
1574
+ }),
1511
1575
  };
1512
1576
  }
1513
1577
  /**
@@ -1656,7 +1720,7 @@ export class AnthropicProvider {
1656
1720
  // race guarantees the await resolves within requestTimeout + 500ms.
1657
1721
  const fetchPromise = fetch(url, {
1658
1722
  method,
1659
- headers: { ...headers, ...this.thinkingBetaHeaders(body), 'Content-Type': 'application/json', connection: 'close' },
1723
+ headers: { ...headers, ...this.betaHeaders(body), 'Content-Type': 'application/json', connection: 'close' },
1660
1724
  body: JSON.stringify(body),
1661
1725
  signal: controller.signal,
1662
1726
  });
@@ -1776,7 +1840,7 @@ export class AnthropicProvider {
1776
1840
  // guarantees the await ends even when the signal is ignored.
1777
1841
  const fetchPromise = fetch(url, {
1778
1842
  method: 'POST',
1779
- headers: { ...headers, ...this.thinkingBetaHeaders(body), 'Content-Type': 'application/json' },
1843
+ headers: { ...headers, ...this.betaHeaders(body), 'Content-Type': 'application/json' },
1780
1844
  body: JSON.stringify(body),
1781
1845
  signal: controller.signal,
1782
1846
  });
@@ -1803,7 +1867,16 @@ export class AnthropicProvider {
1803
1867
  if (response.status === 429) {
1804
1868
  this.keyPool?.markExhausted(apiKey);
1805
1869
  }
1806
- throw new AnthropicProviderError(errorMessage, 'STREAM_CONNECTION_FAILED', response.status, errorData.error?.type, errorData);
1870
+ // Carry the server's Retry-After (seconds) on the error so the
1871
+ // stream retry loop (streamMessagesToResponse) can honor it — the
1872
+ // non-stream path already does; without this the stream path
1873
+ // re-hit a throttled endpoint on computed backoff and burned an
1874
+ // attempt the server told us was doomed.
1875
+ const retryAfterHeader = response.headers.get('retry-after');
1876
+ const retryAfterSec = retryAfterHeader ? parseInt(retryAfterHeader, 10) : NaN;
1877
+ throw new AnthropicProviderError(errorMessage, 'STREAM_CONNECTION_FAILED', response.status, errorData.error?.type, Number.isFinite(retryAfterSec) && retryAfterSec > 0
1878
+ ? { ...errorData, retryAfterSec }
1879
+ : errorData);
1807
1880
  }
1808
1881
  if (!response.body) {
1809
1882
  throw new AnthropicProviderError('Expected a stream response but body was null.', 'STREAM_BODY_NULL');
@@ -1844,16 +1917,37 @@ export class AnthropicProvider {
1844
1917
  };
1845
1918
  }
1846
1919
  /**
1847
- * The `anthropic-beta` header for interleaved extended thinking, returned
1848
- * only when this request actually uses thinking — either it enables it
1849
- * outbound (`thinking` in the body) or it replays captured thinking blocks
1850
- * from a prior assistant turn. Empty otherwise, so non-thinking traffic is
1851
- * byte-for-byte unchanged.
1920
+ * The `anthropic-beta` header for every beta this request actually uses,
1921
+ * comma-joined per the API convention. Currently:
1922
+ *
1923
+ * - `interleaved-thinking-2025-05-14` — when the request enables extended
1924
+ * thinking outbound (`thinking` in the body) or replays captured thinking
1925
+ * blocks from a prior assistant turn.
1926
+ * - `cache-diagnosis-2026-04-07` — when the body carries a `diagnostics`
1927
+ * field (see {@link ModelCompletionOptions.cacheDiagnostics}); the header
1928
+ * must ride EVERY diagnosed turn or the next turn's lookup fails with
1929
+ * `previous_message_not_found`.
1930
+ * - `structured-outputs-2025-11-13` — when any tool definition in the body
1931
+ * carries `strict: true` (the forced structured-output tool on
1932
+ * strict-capable models; see modelSupportsStrictToolUse).
1933
+ *
1934
+ * Empty when no beta applies, so plain traffic is byte-for-byte unchanged.
1852
1935
  */
1853
- thinkingBetaHeaders(body) {
1854
- return this.payloadUsesThinking(body)
1855
- ? { 'anthropic-beta': 'interleaved-thinking-2025-05-14' }
1856
- : {};
1936
+ betaHeaders(body) {
1937
+ const betas = [];
1938
+ if (this.payloadUsesThinking(body))
1939
+ betas.push('interleaved-thinking-2025-05-14');
1940
+ if (body.diagnostics !== undefined)
1941
+ betas.push('cache-diagnosis-2026-04-07');
1942
+ if (this.payloadUsesStrictTools(body))
1943
+ betas.push('structured-outputs-2025-11-13');
1944
+ return betas.length > 0 ? { 'anthropic-beta': betas.join(',') } : {};
1945
+ }
1946
+ /** True when any tool definition in the request carries `strict: true`. */
1947
+ payloadUsesStrictTools(body) {
1948
+ const tools = body.tools;
1949
+ return (Array.isArray(tools) &&
1950
+ tools.some(t => t != null && typeof t === 'object' && t.strict === true));
1857
1951
  }
1858
1952
  /** True when the request enables extended thinking or replays thinking blocks. */
1859
1953
  payloadUsesThinking(body) {