@anthropic-ai/sdk 0.104.2 → 0.106.0

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 (196) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/client.d.mts +2 -2
  3. package/client.d.mts.map +1 -1
  4. package/client.d.ts +2 -2
  5. package/client.d.ts.map +1 -1
  6. package/client.js.map +1 -1
  7. package/client.mjs.map +1 -1
  8. package/core/streaming.d.mts.map +1 -1
  9. package/core/streaming.d.ts.map +1 -1
  10. package/core/streaming.js +2 -1
  11. package/core/streaming.js.map +1 -1
  12. package/core/streaming.mjs +2 -1
  13. package/core/streaming.mjs.map +1 -1
  14. package/helpers/beta/mcp.d.mts +1 -1
  15. package/helpers/beta/mcp.d.mts.map +1 -1
  16. package/helpers/beta/mcp.d.ts +1 -1
  17. package/helpers/beta/mcp.d.ts.map +1 -1
  18. package/helpers/beta/mcp.js +1 -1
  19. package/helpers/beta/mcp.js.map +1 -1
  20. package/helpers/beta/mcp.mjs +1 -1
  21. package/helpers/beta/mcp.mjs.map +1 -1
  22. package/internal/headers.d.mts +7 -0
  23. package/internal/headers.d.mts.map +1 -1
  24. package/internal/headers.d.ts +7 -0
  25. package/internal/headers.d.ts.map +1 -1
  26. package/internal/headers.js +45 -4
  27. package/internal/headers.js.map +1 -1
  28. package/internal/headers.mjs +43 -3
  29. package/internal/headers.mjs.map +1 -1
  30. package/internal/message-stream-utils.d.mts +10 -0
  31. package/internal/message-stream-utils.d.mts.map +1 -0
  32. package/internal/message-stream-utils.d.ts +10 -0
  33. package/internal/message-stream-utils.d.ts.map +1 -0
  34. package/internal/message-stream-utils.js +34 -0
  35. package/internal/message-stream-utils.js.map +1 -0
  36. package/internal/message-stream-utils.mjs +30 -0
  37. package/internal/message-stream-utils.mjs.map +1 -0
  38. package/internal/stainless-helper-header.d.mts +60 -0
  39. package/internal/stainless-helper-header.d.mts.map +1 -0
  40. package/internal/stainless-helper-header.d.ts +60 -0
  41. package/internal/stainless-helper-header.d.ts.map +1 -0
  42. package/{lib → internal}/stainless-helper-header.js +27 -6
  43. package/internal/stainless-helper-header.js.map +1 -0
  44. package/{lib → internal}/stainless-helper-header.mjs +25 -5
  45. package/internal/stainless-helper-header.mjs.map +1 -0
  46. package/lib/BetaMessageStream.d.mts.map +1 -1
  47. package/lib/BetaMessageStream.d.ts.map +1 -1
  48. package/lib/BetaMessageStream.js +38 -28
  49. package/lib/BetaMessageStream.js.map +1 -1
  50. package/lib/BetaMessageStream.mjs +38 -28
  51. package/lib/BetaMessageStream.mjs.map +1 -1
  52. package/lib/MessageStream.d.mts.map +1 -1
  53. package/lib/MessageStream.d.ts.map +1 -1
  54. package/lib/MessageStream.js +20 -23
  55. package/lib/MessageStream.js.map +1 -1
  56. package/lib/MessageStream.mjs +17 -20
  57. package/lib/MessageStream.mjs.map +1 -1
  58. package/lib/helper-client.d.mts +2 -20
  59. package/lib/helper-client.d.mts.map +1 -1
  60. package/lib/helper-client.d.ts +2 -20
  61. package/lib/helper-client.d.ts.map +1 -1
  62. package/lib/helper-client.js +2 -1
  63. package/lib/helper-client.js.map +1 -1
  64. package/lib/helper-client.mjs +2 -1
  65. package/lib/helper-client.mjs.map +1 -1
  66. package/lib/middleware.d.mts.map +1 -1
  67. package/lib/middleware.d.ts.map +1 -1
  68. package/lib/middleware.js +14 -6
  69. package/lib/middleware.js.map +1 -1
  70. package/lib/middleware.mjs +14 -6
  71. package/lib/middleware.mjs.map +1 -1
  72. package/lib/tools/BetaToolRunner.d.mts.map +1 -1
  73. package/lib/tools/BetaToolRunner.d.ts.map +1 -1
  74. package/lib/tools/BetaToolRunner.js +11 -5
  75. package/lib/tools/BetaToolRunner.js.map +1 -1
  76. package/lib/tools/BetaToolRunner.mjs +11 -5
  77. package/lib/tools/BetaToolRunner.mjs.map +1 -1
  78. package/lib/tools/SessionToolRunner.d.mts.map +1 -1
  79. package/lib/tools/SessionToolRunner.d.ts.map +1 -1
  80. package/lib/tools/SessionToolRunner.js +2 -3
  81. package/lib/tools/SessionToolRunner.js.map +1 -1
  82. package/lib/tools/SessionToolRunner.mjs +2 -3
  83. package/lib/tools/SessionToolRunner.mjs.map +1 -1
  84. package/package.json +1 -1
  85. package/resources/beta/agents/agents.d.mts +7 -2
  86. package/resources/beta/agents/agents.d.mts.map +1 -1
  87. package/resources/beta/agents/agents.d.ts +7 -2
  88. package/resources/beta/agents/agents.d.ts.map +1 -1
  89. package/resources/beta/agents/agents.js.map +1 -1
  90. package/resources/beta/agents/agents.mjs.map +1 -1
  91. package/resources/beta/beta.d.mts +4 -4
  92. package/resources/beta/beta.d.mts.map +1 -1
  93. package/resources/beta/beta.d.ts +4 -4
  94. package/resources/beta/beta.d.ts.map +1 -1
  95. package/resources/beta/beta.js.map +1 -1
  96. package/resources/beta/beta.mjs.map +1 -1
  97. package/resources/beta/files.js +1 -1
  98. package/resources/beta/files.js.map +1 -1
  99. package/resources/beta/files.mjs +1 -1
  100. package/resources/beta/files.mjs.map +1 -1
  101. package/resources/beta/index.d.mts +2 -2
  102. package/resources/beta/index.d.mts.map +1 -1
  103. package/resources/beta/index.d.ts +2 -2
  104. package/resources/beta/index.d.ts.map +1 -1
  105. package/resources/beta/index.js.map +1 -1
  106. package/resources/beta/index.mjs.map +1 -1
  107. package/resources/beta/messages/batches.d.mts +8 -5
  108. package/resources/beta/messages/batches.d.mts.map +1 -1
  109. package/resources/beta/messages/batches.d.ts +8 -5
  110. package/resources/beta/messages/batches.d.ts.map +1 -1
  111. package/resources/beta/messages/batches.js +5 -2
  112. package/resources/beta/messages/batches.js.map +1 -1
  113. package/resources/beta/messages/batches.mjs +5 -2
  114. package/resources/beta/messages/batches.mjs.map +1 -1
  115. package/resources/beta/messages/index.d.mts +1 -1
  116. package/resources/beta/messages/index.d.mts.map +1 -1
  117. package/resources/beta/messages/index.d.ts +1 -1
  118. package/resources/beta/messages/index.d.ts.map +1 -1
  119. package/resources/beta/messages/index.js.map +1 -1
  120. package/resources/beta/messages/index.mjs.map +1 -1
  121. package/resources/beta/messages/messages.d.mts +94 -51
  122. package/resources/beta/messages/messages.d.mts.map +1 -1
  123. package/resources/beta/messages/messages.d.ts +94 -51
  124. package/resources/beta/messages/messages.d.ts.map +1 -1
  125. package/resources/beta/messages/messages.js +6 -3
  126. package/resources/beta/messages/messages.js.map +1 -1
  127. package/resources/beta/messages/messages.mjs +6 -3
  128. package/resources/beta/messages/messages.mjs.map +1 -1
  129. package/resources/beta/webhooks.d.mts +11 -2
  130. package/resources/beta/webhooks.d.mts.map +1 -1
  131. package/resources/beta/webhooks.d.ts +11 -2
  132. package/resources/beta/webhooks.d.ts.map +1 -1
  133. package/resources/index.d.mts +1 -1
  134. package/resources/index.d.mts.map +1 -1
  135. package/resources/index.d.ts +1 -1
  136. package/resources/index.d.ts.map +1 -1
  137. package/resources/index.js.map +1 -1
  138. package/resources/index.mjs.map +1 -1
  139. package/resources/messages/batches.d.mts +11 -3
  140. package/resources/messages/batches.d.mts.map +1 -1
  141. package/resources/messages/batches.d.ts +11 -3
  142. package/resources/messages/batches.d.ts.map +1 -1
  143. package/resources/messages/batches.js +10 -2
  144. package/resources/messages/batches.js.map +1 -1
  145. package/resources/messages/batches.mjs +10 -2
  146. package/resources/messages/batches.mjs.map +1 -1
  147. package/resources/messages/index.d.mts +1 -1
  148. package/resources/messages/index.d.mts.map +1 -1
  149. package/resources/messages/index.d.ts +1 -1
  150. package/resources/messages/index.d.ts.map +1 -1
  151. package/resources/messages/index.js.map +1 -1
  152. package/resources/messages/index.mjs.map +1 -1
  153. package/resources/messages/messages.d.mts +84 -48
  154. package/resources/messages/messages.d.mts.map +1 -1
  155. package/resources/messages/messages.d.ts +84 -48
  156. package/resources/messages/messages.d.ts.map +1 -1
  157. package/resources/messages/messages.js +9 -4
  158. package/resources/messages/messages.js.map +1 -1
  159. package/resources/messages/messages.mjs +9 -4
  160. package/resources/messages/messages.mjs.map +1 -1
  161. package/src/client.ts +2 -0
  162. package/src/core/streaming.ts +2 -1
  163. package/src/helpers/beta/mcp.ts +1 -1
  164. package/src/internal/headers.ts +47 -4
  165. package/src/internal/message-stream-utils.ts +30 -0
  166. package/src/internal/stainless-helper-header.ts +122 -0
  167. package/src/lib/BetaMessageStream.ts +39 -31
  168. package/src/lib/MessageStream.ts +17 -23
  169. package/src/lib/helper-client.ts +6 -9
  170. package/src/lib/middleware.ts +17 -5
  171. package/src/lib/tools/BetaToolRunner.ts +15 -6
  172. package/src/lib/tools/SessionToolRunner.ts +2 -4
  173. package/src/resources/beta/agents/agents.ts +7 -2
  174. package/src/resources/beta/beta.ts +6 -0
  175. package/src/resources/beta/files.ts +1 -1
  176. package/src/resources/beta/index.ts +3 -0
  177. package/src/resources/beta/messages/batches.ts +14 -8
  178. package/src/resources/beta/messages/index.ts +2 -0
  179. package/src/resources/beta/messages/messages.ts +157 -51
  180. package/src/resources/beta/webhooks.ts +16 -1
  181. package/src/resources/index.ts +1 -0
  182. package/src/resources/messages/batches.ts +21 -4
  183. package/src/resources/messages/index.ts +1 -0
  184. package/src/resources/messages/messages.ts +134 -50
  185. package/src/version.ts +1 -1
  186. package/version.d.mts +1 -1
  187. package/version.d.ts +1 -1
  188. package/version.js +1 -1
  189. package/version.mjs +1 -1
  190. package/lib/stainless-helper-header.d.mts +0 -34
  191. package/lib/stainless-helper-header.d.mts.map +0 -1
  192. package/lib/stainless-helper-header.d.ts +0 -34
  193. package/lib/stainless-helper-header.d.ts.map +0 -1
  194. package/lib/stainless-helper-header.js.map +0 -1
  195. package/lib/stainless-helper-header.mjs.map +0 -1
  196. package/src/lib/stainless-helper-header.ts +0 -80
@@ -1 +1 @@
1
- {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/resources/messages/messages.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/resources/messages/messages.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
2
  import { APIResource } from "../../core/resource.mjs";
3
3
  import { buildHeaders } from "../../internal/headers.mjs";
4
- import { stainlessHelperHeader } from "../../lib/stainless-helper-header.mjs";
4
+ import { stainlessHelperHeader } from "../../internal/stainless-helper-header.mjs";
5
5
  import { MessageStream } from "../../lib/MessageStream.mjs";
6
6
  import { parseMessage, } from "../../lib/parser.mjs";
7
7
  import * as BatchesAPI from "./batches.mjs";
@@ -12,7 +12,8 @@ export class Messages extends APIResource {
12
12
  super(...arguments);
13
13
  this.batches = new BatchesAPI.Batches(this._client);
14
14
  }
15
- create(body, options) {
15
+ create(params, options) {
16
+ const { user_profile_id, ...body } = params;
16
17
  if (body.model in DEPRECATED_MODELS) {
17
18
  console.warn(`The model '${body.model}' is deprecated and will reach end-of-life on ${DEPRECATED_MODELS[body.model]}\nPlease migrate to a newer model. Visit https://docs.anthropic.com/en/docs/resources/model-deprecations for more information.`);
18
19
  }
@@ -32,8 +33,12 @@ export class Messages extends APIResource {
32
33
  body,
33
34
  timeout: timeout ?? 600000,
34
35
  ...options,
35
- headers: buildHeaders([helperHeader, options?.headers]),
36
- stream: body.stream ?? false,
36
+ headers: buildHeaders([
37
+ { ...(user_profile_id != null ? { 'anthropic-user-profile-id': user_profile_id } : undefined) },
38
+ helperHeader,
39
+ options?.headers,
40
+ ]),
41
+ stream: params.stream ?? false,
37
42
  });
38
43
  }
39
44
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"messages.mjs","sourceRoot":"","sources":["../../src/resources/messages/messages.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"messages.mjs","sourceRoot":"","sources":["../../src/resources/messages/messages.ts"],"names":[],"mappings":"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"}
package/src/client.ts CHANGED
@@ -108,6 +108,7 @@ import {
108
108
  CodeExecutionTool20250522,
109
109
  CodeExecutionTool20250825,
110
110
  CodeExecutionTool20260120,
111
+ CodeExecutionTool20260521,
111
112
  CodeExecutionToolResultBlock,
112
113
  CodeExecutionToolResultBlockContent,
113
114
  CodeExecutionToolResultBlockParam,
@@ -1625,6 +1626,7 @@ export declare namespace Anthropic {
1625
1626
  type CodeExecutionTool20250522 as CodeExecutionTool20250522,
1626
1627
  type CodeExecutionTool20250825 as CodeExecutionTool20250825,
1627
1628
  type CodeExecutionTool20260120 as CodeExecutionTool20260120,
1629
+ type CodeExecutionTool20260521 as CodeExecutionTool20260521,
1628
1630
  type CodeExecutionToolResultBlock as CodeExecutionToolResultBlock,
1629
1631
  type CodeExecutionToolResultBlockContent as CodeExecutionToolResultBlockContent,
1630
1632
  type CodeExecutionToolResultBlockParam as CodeExecutionToolResultBlockParam,
@@ -117,7 +117,8 @@ export class Stream<Item> implements AsyncIterable<Item> {
117
117
  sse.event === 'session.thread_status_running' ||
118
118
  sse.event === 'session.thread_status_idle' ||
119
119
  sse.event === 'session.thread_status_rescheduled' ||
120
- sse.event === 'session.thread_status_terminated'
120
+ sse.event === 'session.thread_status_terminated' ||
121
+ sse.event === 'system.message'
121
122
  ) {
122
123
  try {
123
124
  yield JSON.parse(sse.data) as Item;
@@ -22,7 +22,7 @@ import {
22
22
  SDK_HELPER_SYMBOL,
23
23
  collectStainlessHelpers,
24
24
  stainlessHelperHeader,
25
- } from '../../lib/stainless-helper-header';
25
+ } from '../../internal/stainless-helper-header';
26
26
  import { fromBase64 } from '../../internal/utils/base64';
27
27
 
28
28
  export { SDK_HELPER_SYMBOL, collectStainlessHelpers, stainlessHelperHeader };
@@ -29,7 +29,9 @@ export type NullableHeaders = {
29
29
  nulls: Set<string>;
30
30
  };
31
31
 
32
- function* iterateHeaders(headers: HeadersLike): IterableIterator<readonly [string, string | null]> {
32
+ function* iterateHeaders(
33
+ headers: HeadersLike,
34
+ ): IterableIterator<readonly [string, string | null | ClearSentinel]> {
33
35
  if (!headers) return;
34
36
 
35
37
  if (brand_privateNullableHeaders in headers) {
@@ -60,16 +62,43 @@ function* iterateHeaders(headers: HeadersLike): IterableIterator<readonly [strin
60
62
  if (value === undefined) continue;
61
63
 
62
64
  // Objects keys always overwrite older headers, they never append.
63
- // Yield a null to clear the header before adding the new values.
65
+ // Yield the clear sentinel before adding the new values, so the
66
+ // consumer can tell this synthetic "clear-before-set" apart from a
67
+ // user's explicit `null` (= remove).
64
68
  if (shouldClear && !didClear) {
65
69
  didClear = true;
66
- yield [name, null];
70
+ yield [name, clearSentinel];
67
71
  }
68
72
  yield [name, value];
69
73
  }
70
74
  }
71
75
  }
72
76
 
77
+ /** Distinguishes iterateHeaders' synthetic clear-before-set from a user `null`. */
78
+ const clearSentinel = Symbol('clear');
79
+ type ClearSentinel = typeof clearSentinel;
80
+
81
+ /**
82
+ * Headers whose values accumulate across {@link buildHeaders} sources instead
83
+ * of the later source's value replacing the earlier one. Values are
84
+ * comma-appended (deduplicated, order-preserving) into a single header line.
85
+ */
86
+ export const APPEND_HEADERS: ReadonlySet<string> = new Set(['x-stainless-helper']);
87
+
88
+ export const appendHeaderValue = (existing: string | null, addition: string): string => {
89
+ const tokens =
90
+ existing ?
91
+ existing
92
+ .split(',')
93
+ .map((t) => t.trim())
94
+ .filter(Boolean)
95
+ : [];
96
+ for (const tok of addition.split(',').map((t) => t.trim())) {
97
+ if (tok && !tokens.includes(tok)) tokens.push(tok);
98
+ }
99
+ return tokens.join(', ');
100
+ };
101
+
73
102
  export const buildHeaders = (newHeaders: HeadersLike[]): NullableHeaders => {
74
103
  const targetHeaders = new Headers();
75
104
  const nullHeaders = new Set<string>();
@@ -77,9 +106,23 @@ export const buildHeaders = (newHeaders: HeadersLike[]): NullableHeaders => {
77
106
  const seenHeaders = new Set<string>();
78
107
  for (const [name, value] of iterateHeaders(headers)) {
79
108
  const lowerName = name.toLowerCase();
80
- if (!seenHeaders.has(lowerName)) {
109
+ if (APPEND_HEADERS.has(lowerName)) {
110
+ // Accumulating headers ignore the synthetic clear-before-set; an
111
+ // explicit `null` (any source shape) is honored as removal.
112
+ if (value === clearSentinel) continue;
113
+ if (value === null) {
114
+ targetHeaders.delete(name);
115
+ nullHeaders.add(lowerName);
116
+ } else {
117
+ targetHeaders.set(name, appendHeaderValue(targetHeaders.get(name), value));
118
+ nullHeaders.delete(lowerName);
119
+ }
120
+ continue;
121
+ }
122
+ if (value === clearSentinel || !seenHeaders.has(lowerName)) {
81
123
  targetHeaders.delete(name);
82
124
  seenHeaders.add(lowerName);
125
+ if (value === clearSentinel) continue;
83
126
  }
84
127
  if (value === null) {
85
128
  targetHeaders.delete(name);
@@ -0,0 +1,30 @@
1
+ import { partialParse } from '../_vendor/partial-json-parser/parser';
2
+
3
+ export const JSON_BUF_PROPERTY = '__json_buf';
4
+
5
+ /**
6
+ * Copies a tool-use block with an updated `__json_buf`, installing `.input` as
7
+ * a memoized getter so the partial-JSON parse happens on first read instead of
8
+ * on every delta.
9
+ */
10
+ export function withLazyInput<T extends { input: unknown }>(prev: T, jsonBuf: string): T {
11
+ const next = {} as T;
12
+ for (const key of Object.keys(prev) as (keyof T)[]) {
13
+ if (key !== 'input') next[key] = prev[key];
14
+ }
15
+ Object.defineProperty(next, JSON_BUF_PROPERTY, { value: jsonBuf, enumerable: false, writable: true });
16
+ let input: unknown;
17
+ let parsed = false;
18
+ Object.defineProperty(next, 'input', {
19
+ enumerable: true,
20
+ configurable: true,
21
+ get() {
22
+ if (!parsed) {
23
+ input = jsonBuf ? partialParse(jsonBuf) : {};
24
+ parsed = true;
25
+ }
26
+ return input;
27
+ },
28
+ });
29
+ return next;
30
+ }
@@ -0,0 +1,122 @@
1
+ /**
2
+ * Single source of truth for the `x-stainless-helper` telemetry header — the
3
+ * key, the closed value vocabulary, and per-object helper tagging. The
4
+ * append-don't-clobber merge for the header itself lives in
5
+ * {@link import('../internal/headers').buildHeaders} via `APPEND_HEADERS`.
6
+ */
7
+
8
+ /**
9
+ * Telemetry header naming the SDK helper(s) a request came from. Always this
10
+ * lowercase form; `buildHeaders` matches it case-insensitively for its append
11
+ * semantics, but a single canonical casing keeps every call site greppable.
12
+ */
13
+ export const STAINLESS_HELPER_HEADER = 'x-stainless-helper';
14
+
15
+ /** Telemetry header naming the SDK method (e.g. `stream`) in use. */
16
+ export const STAINLESS_HELPER_METHOD_HEADER = 'x-stainless-helper-method';
17
+
18
+ /**
19
+ * The closed set of helper telemetry tags, shared verbatim across SDKs. A
20
+ * typo at any call site is a type error rather than silently mistagged
21
+ * telemetry. Existing values keep their original spellings — telemetry
22
+ * consumers match on them, so renames lose history. New tags are hyphenated
23
+ * lowercase.
24
+ */
25
+ export type StainlessHelperHeaderValue =
26
+ | 'BetaToolRunner'
27
+ | 'betaZodTool'
28
+ | 'compaction'
29
+ | 'environments-work-poller'
30
+ | 'environments-worker'
31
+ | 'fallback-refusal-middleware'
32
+ | 'mcpContent'
33
+ | 'mcpMessage'
34
+ | 'mcpResourceToContent'
35
+ | 'mcpResourceToFile'
36
+ | 'mcpTool'
37
+ | 'session-tool-runner';
38
+
39
+ /**
40
+ * The `{ 'x-stainless-helper': value }` header dict, for passing into
41
+ * `buildHeaders` (which comma-appends `x-stainless-helper` across sources)
42
+ * or as `defaultHeaders`/per-request `headers`.
43
+ */
44
+ export function helperHeader(value: StainlessHelperHeaderValue): { [STAINLESS_HELPER_HEADER]: string } {
45
+ return { [STAINLESS_HELPER_HEADER]: value };
46
+ }
47
+
48
+ /**
49
+ * Symbol used to mark objects created by SDK helpers for tracking.
50
+ * The value is the helper name (e.g., 'mcpTool', 'betaZodTool').
51
+ */
52
+ export const SDK_HELPER_SYMBOL = Symbol('anthropic.sdk.stainlessHelper');
53
+
54
+ type StainlessHelperObject = { [SDK_HELPER_SYMBOL]: string };
55
+
56
+ export function wasCreatedByStainlessHelper(value: unknown): value is StainlessHelperObject {
57
+ return typeof value === 'object' && value !== null && SDK_HELPER_SYMBOL in value;
58
+ }
59
+
60
+ /**
61
+ * Collects helper names from tools and messages arrays.
62
+ * Returns a deduplicated array of helper names found.
63
+ */
64
+ export function collectStainlessHelpers(
65
+ tools: readonly unknown[] | undefined,
66
+ messages: readonly unknown[] | undefined,
67
+ ): string[] {
68
+ const helpers = new Set<string>();
69
+
70
+ // Collect from tools
71
+ if (tools) {
72
+ for (const tool of tools) {
73
+ if (wasCreatedByStainlessHelper(tool)) {
74
+ helpers.add(tool[SDK_HELPER_SYMBOL]);
75
+ }
76
+ }
77
+ }
78
+
79
+ // Collect from messages and their content blocks
80
+ if (messages) {
81
+ for (const message of messages) {
82
+ if (wasCreatedByStainlessHelper(message)) {
83
+ helpers.add(message[SDK_HELPER_SYMBOL]);
84
+ }
85
+
86
+ const content = (message as { content?: unknown }).content;
87
+ if (Array.isArray(content)) {
88
+ for (const block of content) {
89
+ if (wasCreatedByStainlessHelper(block)) {
90
+ helpers.add(block[SDK_HELPER_SYMBOL]);
91
+ }
92
+ }
93
+ }
94
+ }
95
+ }
96
+
97
+ return Array.from(helpers);
98
+ }
99
+
100
+ /**
101
+ * Builds x-stainless-helper header value from tools and messages.
102
+ * Returns an empty object if no helpers are found.
103
+ */
104
+ export function stainlessHelperHeader(
105
+ tools: readonly unknown[] | undefined,
106
+ messages: readonly unknown[] | undefined,
107
+ ): { 'x-stainless-helper'?: string } {
108
+ const helpers = collectStainlessHelpers(tools, messages);
109
+ if (helpers.length === 0) return {};
110
+ return { [STAINLESS_HELPER_HEADER]: helpers.join(', ') };
111
+ }
112
+
113
+ /**
114
+ * Builds x-stainless-helper header value from a file object.
115
+ * Returns an empty object if the file is not marked with a helper.
116
+ */
117
+ export function stainlessHelperHeaderFromFile(file: unknown): { 'x-stainless-helper'?: string } {
118
+ if (wasCreatedByStainlessHelper(file)) {
119
+ return { [STAINLESS_HELPER_HEADER]: file[SDK_HELPER_SYMBOL] };
120
+ }
121
+ return {};
122
+ }
@@ -1,4 +1,4 @@
1
- import { partialParse } from '../_vendor/partial-json-parser/parser';
1
+ import { STAINLESS_HELPER_METHOD_HEADER } from '../internal/stainless-helper-header';
2
2
  import type { Logger } from '../client';
3
3
  import { AnthropicError, APIUserAbortError } from '../error';
4
4
  import { isAbortError } from '../internal/errors';
@@ -20,6 +20,7 @@ import {
20
20
  } from '../resources/beta/messages/messages';
21
21
  import { Stream } from '../streaming';
22
22
  import { maybeParseBetaMessage, type ParsedBetaMessage } from './beta-parser';
23
+ import { JSON_BUF_PROPERTY, withLazyInput } from '../internal/message-stream-utils';
23
24
 
24
25
  export interface MessageStreamEvents {
25
26
  connect: () => void;
@@ -43,8 +44,6 @@ type MessageStreamEventListeners<Event extends keyof MessageStreamEvents> = {
43
44
  once?: boolean;
44
45
  }[];
45
46
 
46
- const JSON_BUF_PROPERTY = '__json_buf';
47
-
48
47
  export type TracksToolInput = BetaToolUseBlock | BetaServerToolUseBlock | BetaMCPToolUseBlock;
49
48
 
50
49
  function tracksToolInput(content: BetaContentBlock): content is TracksToolInput {
@@ -164,7 +163,7 @@ export class BetaMessageStream<ParsedT = null> implements AsyncIterable<BetaMess
164
163
  runner._createMessage(
165
164
  messages,
166
165
  { ...params, stream: true },
167
- { ...options, headers: { ...options?.headers, 'X-Stainless-Helper-Method': 'stream' } },
166
+ { ...options, headers: { ...options?.headers, [STAINLESS_HELPER_METHOD_HEADER]: 'stream' } },
168
167
  ),
169
168
  );
170
169
  return runner;
@@ -462,8 +461,15 @@ export class BetaMessageStream<ParsedT = null> implements AsyncIterable<BetaMess
462
461
  break;
463
462
  }
464
463
  case 'input_json_delta': {
465
- if (tracksToolInput(content) && content.input) {
466
- this._emit('inputJson', event.delta.partial_json, content.input);
464
+ if (tracksToolInput(content) && this.#listeners.inputJson?.length) {
465
+ let jsonSnapshot: unknown;
466
+ try {
467
+ jsonSnapshot = content.input;
468
+ } catch (err) {
469
+ this.#handleError(this.#toolInputParseError(content, err));
470
+ break;
471
+ }
472
+ this._emit('inputJson', event.delta.partial_json, jsonSnapshot);
467
473
  }
468
474
  break;
469
475
  }
@@ -637,30 +643,8 @@ export class BetaMessageStream<ParsedT = null> implements AsyncIterable<BetaMess
637
643
  }
638
644
  case 'input_json_delta': {
639
645
  if (snapshotContent && tracksToolInput(snapshotContent)) {
640
- // we need to keep track of the raw JSON string as well so that we can
641
- // re-parse it for each delta, for now we just store it as an untyped
642
- // non-enumerable property on the snapshot
643
- let jsonBuf = (snapshotContent as any)[JSON_BUF_PROPERTY] || '';
644
- jsonBuf += event.delta.partial_json;
645
-
646
- const newContent = { ...snapshotContent };
647
- Object.defineProperty(newContent, JSON_BUF_PROPERTY, {
648
- value: jsonBuf,
649
- enumerable: false,
650
- writable: true,
651
- });
652
-
653
- if (jsonBuf) {
654
- try {
655
- newContent.input = partialParse(jsonBuf);
656
- } catch (err) {
657
- const error = new AnthropicError(
658
- `Unable to parse tool parameter JSON from model. Please retry your request or adjust your prompt. Error: ${err}. JSON: ${jsonBuf}`,
659
- );
660
- this.#handleError(error);
661
- }
662
- }
663
- snapshot.content[event.index] = newContent;
646
+ const jsonBuf = ((snapshotContent as any)[JSON_BUF_PROPERTY] || '') + event.delta.partial_json;
647
+ snapshot.content[event.index] = withLazyInput(snapshotContent, jsonBuf);
664
648
  }
665
649
  break;
666
650
  }
@@ -697,11 +681,35 @@ export class BetaMessageStream<ParsedT = null> implements AsyncIterable<BetaMess
697
681
  }
698
682
  return snapshot;
699
683
  }
700
- case 'content_block_stop':
684
+ case 'content_block_stop': {
685
+ const snapshotContent = snapshot.content.at(event.index);
686
+ if (snapshotContent && tracksToolInput(snapshotContent) && JSON_BUF_PROPERTY in snapshotContent) {
687
+ let input: unknown;
688
+ try {
689
+ input = snapshotContent.input;
690
+ } catch (err) {
691
+ input = {};
692
+ this.#handleError(this.#toolInputParseError(snapshotContent, err));
693
+ }
694
+ Object.defineProperty(snapshotContent, 'input', {
695
+ value: input,
696
+ enumerable: true,
697
+ configurable: true,
698
+ writable: true,
699
+ });
700
+ }
701
701
  return snapshot;
702
+ }
702
703
  }
703
704
  }
704
705
 
706
+ #toolInputParseError(block: TracksToolInput, err: unknown): AnthropicError {
707
+ const jsonBuf = (block as any)[JSON_BUF_PROPERTY];
708
+ return new AnthropicError(
709
+ `Unable to parse tool parameter JSON from model. Please retry your request or adjust your prompt. Error: ${err}. JSON: ${jsonBuf}`,
710
+ );
711
+ }
712
+
705
713
  [Symbol.asyncIterator](): AsyncIterator<BetaMessageStreamEvent> {
706
714
  const pushQueue: BetaMessageStreamEvent[] = [];
707
715
  const readQueue: {
@@ -1,3 +1,4 @@
1
+ import { STAINLESS_HELPER_METHOD_HEADER } from '../internal/stainless-helper-header';
1
2
  import { isAbortError } from '../internal/errors';
2
3
  import { AnthropicError, APIUserAbortError } from '../error';
3
4
  import {
@@ -14,10 +15,10 @@ import {
14
15
  type ServerToolUseBlock,
15
16
  } from '../resources/messages';
16
17
  import { Stream } from '../streaming';
17
- import { partialParse } from '../_vendor/partial-json-parser/parser';
18
18
  import { RequestOptions } from '../internal/request-options';
19
19
  import type { Logger } from '../client';
20
20
  import { maybeParseMessage, type ParsedMessage } from './parser';
21
+ import { JSON_BUF_PROPERTY, withLazyInput } from '../internal/message-stream-utils';
21
22
 
22
23
  export interface MessageStreamEvents<ParsedT = null> {
23
24
  connect: () => void;
@@ -40,8 +41,6 @@ type MessageStreamEventListeners<ParsedT, Event extends keyof MessageStreamEvent
40
41
  once?: boolean;
41
42
  }[];
42
43
 
43
- const JSON_BUF_PROPERTY = '__json_buf';
44
-
45
44
  export type TracksToolInput = ToolUseBlock | ServerToolUseBlock;
46
45
 
47
46
  function tracksToolInput(content: ContentBlock): content is TracksToolInput {
@@ -163,7 +162,7 @@ export class MessageStream<ParsedT = null> implements AsyncIterable<MessageStrea
163
162
  runner._createMessage(
164
163
  messages,
165
164
  { ...params, stream: true },
166
- { ...options, headers: { ...options?.headers, 'X-Stainless-Helper-Method': 'stream' } },
165
+ { ...options, headers: { ...options?.headers, [STAINLESS_HELPER_METHOD_HEADER]: 'stream' } },
167
166
  ),
168
167
  );
169
168
  return runner;
@@ -470,7 +469,7 @@ export class MessageStream<ParsedT = null> implements AsyncIterable<MessageStrea
470
469
  break;
471
470
  }
472
471
  case 'input_json_delta': {
473
- if (tracksToolInput(content) && content.input) {
472
+ if (tracksToolInput(content) && this.#listeners.inputJson?.length) {
474
473
  this._emit('inputJson', event.delta.partial_json, content.input);
475
474
  }
476
475
  break;
@@ -626,23 +625,8 @@ export class MessageStream<ParsedT = null> implements AsyncIterable<MessageStrea
626
625
  }
627
626
  case 'input_json_delta': {
628
627
  if (snapshotContent && tracksToolInput(snapshotContent)) {
629
- // we need to keep track of the raw JSON string as well so that we can
630
- // re-parse it for each delta, for now we just store it as an untyped
631
- // non-enumerable property on the snapshot
632
- let jsonBuf = (snapshotContent as any)[JSON_BUF_PROPERTY] || '';
633
- jsonBuf += event.delta.partial_json;
634
-
635
- const newContent = { ...snapshotContent };
636
- Object.defineProperty(newContent, JSON_BUF_PROPERTY, {
637
- value: jsonBuf,
638
- enumerable: false,
639
- writable: true,
640
- });
641
-
642
- if (jsonBuf) {
643
- newContent.input = partialParse(jsonBuf);
644
- }
645
- snapshot.content[event.index] = newContent;
628
+ const jsonBuf = ((snapshotContent as any)[JSON_BUF_PROPERTY] || '') + event.delta.partial_json;
629
+ snapshot.content[event.index] = withLazyInput(snapshotContent, jsonBuf);
646
630
  }
647
631
  break;
648
632
  }
@@ -670,8 +654,18 @@ export class MessageStream<ParsedT = null> implements AsyncIterable<MessageStrea
670
654
 
671
655
  return snapshot;
672
656
  }
673
- case 'content_block_stop':
657
+ case 'content_block_stop': {
658
+ const snapshotContent = snapshot.content.at(event.index);
659
+ if (snapshotContent && tracksToolInput(snapshotContent) && JSON_BUF_PROPERTY in snapshotContent) {
660
+ Object.defineProperty(snapshotContent, 'input', {
661
+ value: snapshotContent.input,
662
+ enumerable: true,
663
+ configurable: true,
664
+ writable: true,
665
+ });
666
+ }
674
667
  return snapshot;
668
+ }
675
669
  }
676
670
  }
677
671
 
@@ -1,6 +1,10 @@
1
1
  import { AnthropicError } from '../core/error';
2
2
  import type { Anthropic } from '../client';
3
3
  import { buildHeaders, type HeadersLike, type NullableHeaders } from '../internal/headers';
4
+ import {
5
+ STAINLESS_HELPER_HEADER,
6
+ type StainlessHelperHeaderValue,
7
+ } from '../internal/stainless-helper-header';
4
8
 
5
9
  /**
6
10
  * Shared util for building a runner-helper-bound sub-client.
@@ -16,13 +20,6 @@ import { buildHeaders, type HeadersLike, type NullableHeaders } from '../interna
16
20
  * {@link copyClientForHelper} is the one shared construction.
17
21
  */
18
22
 
19
- /**
20
- * The closed set of `x-stainless-helper` telemetry tags the runner helpers
21
- * stamp on outgoing requests. Constrained as a string union so a typo at any
22
- * call site is a type error rather than silently mistagged telemetry.
23
- */
24
- export type HelperTag = 'environments-work-poller' | 'environments-worker' | 'session-tool-runner';
25
-
26
23
  interface ClientInternalAccess {
27
24
  _options: { defaultHeaders?: HeadersLike };
28
25
  _authState?: { extraHeaders?: Record<string, string> };
@@ -54,7 +51,7 @@ interface ClientInternalAccess {
54
51
  */
55
52
  export function copyClientForHelper<T extends Anthropic>(
56
53
  client: T,
57
- { authToken, helper }: { authToken: string; helper: HelperTag },
54
+ { authToken, helper }: { authToken: string; helper: StainlessHelperHeaderValue },
58
55
  ): T {
59
56
  if (!authToken) {
60
57
  throw new AnthropicError(
@@ -77,7 +74,7 @@ export function copyClientForHelper<T extends Anthropic>(
77
74
  const defaultHeaders: NullableHeaders = buildHeaders([
78
75
  inheritedAuthExtraHeaders,
79
76
  parentDefaults,
80
- { 'x-stainless-helper': helper },
77
+ { [STAINLESS_HELPER_HEADER]: helper },
81
78
  ]);
82
79
  return client.withOptions({
83
80
  apiKey: null,
@@ -3,6 +3,8 @@ import { AnthropicError } from '../core/error';
3
3
  import type { Middleware, MiddlewareContext, MiddlewareNext } from '../core/middleware';
4
4
  import { Stream, type ServerSentEvent } from '../core/streaming';
5
5
  import { isAbortError } from '../internal/errors';
6
+ import { appendHeaderValue } from '../internal/headers';
7
+ import { STAINLESS_HELPER_HEADER } from '../internal/stainless-helper-header';
6
8
  import { safeJSON } from '../internal/utils/values';
7
9
  import type { AnthropicBeta } from '../resources/beta/beta';
8
10
  import type {
@@ -179,8 +181,9 @@ export function betaRefusalFallbackMiddleware(
179
181
  ((error: BetaRefusalFallbackError) =>
180
182
  ctx.logger.error(`anthropic-sdk: betaRefusalFallbackMiddleware: ${error.message}`));
181
183
 
182
- // Send the configured betas on this and every hop request derived from it.
183
- request = appendBetas(request, options.betas ?? DEFAULT_BETAS);
184
+ // Send the configured betas on this and every hop request derived from it,
185
+ // and tag this and every hop with the middleware's helper telemetry.
186
+ request = withMiddlewareHeaders(request, options.betas ?? DEFAULT_BETAS);
184
187
 
185
188
  const body = stripFallbackBlocks(ctx.options.body as MessageCreateParams);
186
189
  const state = ctx.options.fallbackState;
@@ -265,6 +268,7 @@ export function betaRefusalFallbackMiddleware(
265
268
  // against an untyped body that carried no `model` field.
266
269
  from: { model: requestedModel ?? message.model },
267
270
  to: { model: entry.model },
271
+ trigger: { type: 'refusal', category: message.stop_details?.category ?? null },
268
272
  });
269
273
  requestedModel = entry.model;
270
274
  res = await next({
@@ -435,7 +439,12 @@ async function* splicedEvents(
435
439
  yield emit<BetaRawContentBlockStartEvent>('content_block_start', {
436
440
  type: 'content_block_start',
437
441
  index: fbIndex,
438
- content_block: { type: 'fallback', from: { model: fromModel }, to: { model } },
442
+ content_block: {
443
+ type: 'fallback',
444
+ from: { model: fromModel },
445
+ to: { model },
446
+ trigger: { type: 'refusal', category: refusalDetails?.category ?? null },
447
+ },
439
448
  });
440
449
  yield emit<BetaRawContentBlockStopEvent>('content_block_stop', {
441
450
  type: 'content_block_stop',
@@ -845,8 +854,7 @@ function toPrefillBlocks(responseBlocks: any[]): BetaContentBlockParam[] {
845
854
  * A copy of `request` with `betas` appended to its `anthropic-beta` header,
846
855
  * skipping values already present (set by the caller or another middleware).
847
856
  */
848
- function appendBetas(request: APIRequest, betas: readonly AnthropicBeta[]): APIRequest {
849
- if (!betas.length) return request;
857
+ function withMiddlewareHeaders(request: APIRequest, betas: readonly AnthropicBeta[]): APIRequest {
850
858
  const headers = new Headers(request.headers);
851
859
  const existing = new Set(
852
860
  headers
@@ -860,6 +868,10 @@ function appendBetas(request: APIRequest, betas: readonly AnthropicBeta[]): APIR
860
868
  existing.add(beta);
861
869
  }
862
870
  }
871
+ headers.set(
872
+ STAINLESS_HELPER_HEADER,
873
+ appendHeaderValue(headers.get(STAINLESS_HELPER_HEADER), 'fallback-refusal-middleware'),
874
+ );
863
875
  return { ...request, headers };
864
876
  }
865
877