@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.
- package/CHANGELOG.md +35 -0
- package/client.d.mts +2 -2
- package/client.d.mts.map +1 -1
- package/client.d.ts +2 -2
- package/client.d.ts.map +1 -1
- package/client.js.map +1 -1
- package/client.mjs.map +1 -1
- package/core/streaming.d.mts.map +1 -1
- package/core/streaming.d.ts.map +1 -1
- package/core/streaming.js +2 -1
- package/core/streaming.js.map +1 -1
- package/core/streaming.mjs +2 -1
- package/core/streaming.mjs.map +1 -1
- package/helpers/beta/mcp.d.mts +1 -1
- package/helpers/beta/mcp.d.mts.map +1 -1
- package/helpers/beta/mcp.d.ts +1 -1
- package/helpers/beta/mcp.d.ts.map +1 -1
- package/helpers/beta/mcp.js +1 -1
- package/helpers/beta/mcp.js.map +1 -1
- package/helpers/beta/mcp.mjs +1 -1
- package/helpers/beta/mcp.mjs.map +1 -1
- package/internal/headers.d.mts +7 -0
- package/internal/headers.d.mts.map +1 -1
- package/internal/headers.d.ts +7 -0
- package/internal/headers.d.ts.map +1 -1
- package/internal/headers.js +45 -4
- package/internal/headers.js.map +1 -1
- package/internal/headers.mjs +43 -3
- package/internal/headers.mjs.map +1 -1
- package/internal/message-stream-utils.d.mts +10 -0
- package/internal/message-stream-utils.d.mts.map +1 -0
- package/internal/message-stream-utils.d.ts +10 -0
- package/internal/message-stream-utils.d.ts.map +1 -0
- package/internal/message-stream-utils.js +34 -0
- package/internal/message-stream-utils.js.map +1 -0
- package/internal/message-stream-utils.mjs +30 -0
- package/internal/message-stream-utils.mjs.map +1 -0
- package/internal/stainless-helper-header.d.mts +60 -0
- package/internal/stainless-helper-header.d.mts.map +1 -0
- package/internal/stainless-helper-header.d.ts +60 -0
- package/internal/stainless-helper-header.d.ts.map +1 -0
- package/{lib → internal}/stainless-helper-header.js +27 -6
- package/internal/stainless-helper-header.js.map +1 -0
- package/{lib → internal}/stainless-helper-header.mjs +25 -5
- package/internal/stainless-helper-header.mjs.map +1 -0
- package/lib/BetaMessageStream.d.mts.map +1 -1
- package/lib/BetaMessageStream.d.ts.map +1 -1
- package/lib/BetaMessageStream.js +38 -28
- package/lib/BetaMessageStream.js.map +1 -1
- package/lib/BetaMessageStream.mjs +38 -28
- package/lib/BetaMessageStream.mjs.map +1 -1
- package/lib/MessageStream.d.mts.map +1 -1
- package/lib/MessageStream.d.ts.map +1 -1
- package/lib/MessageStream.js +20 -23
- package/lib/MessageStream.js.map +1 -1
- package/lib/MessageStream.mjs +17 -20
- package/lib/MessageStream.mjs.map +1 -1
- package/lib/helper-client.d.mts +2 -20
- package/lib/helper-client.d.mts.map +1 -1
- package/lib/helper-client.d.ts +2 -20
- package/lib/helper-client.d.ts.map +1 -1
- package/lib/helper-client.js +2 -1
- package/lib/helper-client.js.map +1 -1
- package/lib/helper-client.mjs +2 -1
- package/lib/helper-client.mjs.map +1 -1
- package/lib/middleware.d.mts.map +1 -1
- package/lib/middleware.d.ts.map +1 -1
- package/lib/middleware.js +14 -6
- package/lib/middleware.js.map +1 -1
- package/lib/middleware.mjs +14 -6
- package/lib/middleware.mjs.map +1 -1
- package/lib/tools/BetaToolRunner.d.mts.map +1 -1
- package/lib/tools/BetaToolRunner.d.ts.map +1 -1
- package/lib/tools/BetaToolRunner.js +11 -5
- package/lib/tools/BetaToolRunner.js.map +1 -1
- package/lib/tools/BetaToolRunner.mjs +11 -5
- package/lib/tools/BetaToolRunner.mjs.map +1 -1
- package/lib/tools/SessionToolRunner.d.mts.map +1 -1
- package/lib/tools/SessionToolRunner.d.ts.map +1 -1
- package/lib/tools/SessionToolRunner.js +2 -3
- package/lib/tools/SessionToolRunner.js.map +1 -1
- package/lib/tools/SessionToolRunner.mjs +2 -3
- package/lib/tools/SessionToolRunner.mjs.map +1 -1
- package/package.json +1 -1
- package/resources/beta/agents/agents.d.mts +7 -2
- package/resources/beta/agents/agents.d.mts.map +1 -1
- package/resources/beta/agents/agents.d.ts +7 -2
- package/resources/beta/agents/agents.d.ts.map +1 -1
- package/resources/beta/agents/agents.js.map +1 -1
- package/resources/beta/agents/agents.mjs.map +1 -1
- package/resources/beta/beta.d.mts +4 -4
- package/resources/beta/beta.d.mts.map +1 -1
- package/resources/beta/beta.d.ts +4 -4
- package/resources/beta/beta.d.ts.map +1 -1
- package/resources/beta/beta.js.map +1 -1
- package/resources/beta/beta.mjs.map +1 -1
- package/resources/beta/files.js +1 -1
- package/resources/beta/files.js.map +1 -1
- package/resources/beta/files.mjs +1 -1
- package/resources/beta/files.mjs.map +1 -1
- package/resources/beta/index.d.mts +2 -2
- package/resources/beta/index.d.mts.map +1 -1
- package/resources/beta/index.d.ts +2 -2
- package/resources/beta/index.d.ts.map +1 -1
- package/resources/beta/index.js.map +1 -1
- package/resources/beta/index.mjs.map +1 -1
- package/resources/beta/messages/batches.d.mts +8 -5
- package/resources/beta/messages/batches.d.mts.map +1 -1
- package/resources/beta/messages/batches.d.ts +8 -5
- package/resources/beta/messages/batches.d.ts.map +1 -1
- package/resources/beta/messages/batches.js +5 -2
- package/resources/beta/messages/batches.js.map +1 -1
- package/resources/beta/messages/batches.mjs +5 -2
- package/resources/beta/messages/batches.mjs.map +1 -1
- package/resources/beta/messages/index.d.mts +1 -1
- package/resources/beta/messages/index.d.mts.map +1 -1
- package/resources/beta/messages/index.d.ts +1 -1
- package/resources/beta/messages/index.d.ts.map +1 -1
- package/resources/beta/messages/index.js.map +1 -1
- package/resources/beta/messages/index.mjs.map +1 -1
- package/resources/beta/messages/messages.d.mts +94 -51
- package/resources/beta/messages/messages.d.mts.map +1 -1
- package/resources/beta/messages/messages.d.ts +94 -51
- package/resources/beta/messages/messages.d.ts.map +1 -1
- package/resources/beta/messages/messages.js +6 -3
- package/resources/beta/messages/messages.js.map +1 -1
- package/resources/beta/messages/messages.mjs +6 -3
- package/resources/beta/messages/messages.mjs.map +1 -1
- package/resources/beta/webhooks.d.mts +11 -2
- package/resources/beta/webhooks.d.mts.map +1 -1
- package/resources/beta/webhooks.d.ts +11 -2
- package/resources/beta/webhooks.d.ts.map +1 -1
- package/resources/index.d.mts +1 -1
- package/resources/index.d.mts.map +1 -1
- package/resources/index.d.ts +1 -1
- package/resources/index.d.ts.map +1 -1
- package/resources/index.js.map +1 -1
- package/resources/index.mjs.map +1 -1
- package/resources/messages/batches.d.mts +11 -3
- package/resources/messages/batches.d.mts.map +1 -1
- package/resources/messages/batches.d.ts +11 -3
- package/resources/messages/batches.d.ts.map +1 -1
- package/resources/messages/batches.js +10 -2
- package/resources/messages/batches.js.map +1 -1
- package/resources/messages/batches.mjs +10 -2
- package/resources/messages/batches.mjs.map +1 -1
- package/resources/messages/index.d.mts +1 -1
- package/resources/messages/index.d.mts.map +1 -1
- package/resources/messages/index.d.ts +1 -1
- package/resources/messages/index.d.ts.map +1 -1
- package/resources/messages/index.js.map +1 -1
- package/resources/messages/index.mjs.map +1 -1
- package/resources/messages/messages.d.mts +84 -48
- package/resources/messages/messages.d.mts.map +1 -1
- package/resources/messages/messages.d.ts +84 -48
- package/resources/messages/messages.d.ts.map +1 -1
- package/resources/messages/messages.js +9 -4
- package/resources/messages/messages.js.map +1 -1
- package/resources/messages/messages.mjs +9 -4
- package/resources/messages/messages.mjs.map +1 -1
- package/src/client.ts +2 -0
- package/src/core/streaming.ts +2 -1
- package/src/helpers/beta/mcp.ts +1 -1
- package/src/internal/headers.ts +47 -4
- package/src/internal/message-stream-utils.ts +30 -0
- package/src/internal/stainless-helper-header.ts +122 -0
- package/src/lib/BetaMessageStream.ts +39 -31
- package/src/lib/MessageStream.ts +17 -23
- package/src/lib/helper-client.ts +6 -9
- package/src/lib/middleware.ts +17 -5
- package/src/lib/tools/BetaToolRunner.ts +15 -6
- package/src/lib/tools/SessionToolRunner.ts +2 -4
- package/src/resources/beta/agents/agents.ts +7 -2
- package/src/resources/beta/beta.ts +6 -0
- package/src/resources/beta/files.ts +1 -1
- package/src/resources/beta/index.ts +3 -0
- package/src/resources/beta/messages/batches.ts +14 -8
- package/src/resources/beta/messages/index.ts +2 -0
- package/src/resources/beta/messages/messages.ts +157 -51
- package/src/resources/beta/webhooks.ts +16 -1
- package/src/resources/index.ts +1 -0
- package/src/resources/messages/batches.ts +21 -4
- package/src/resources/messages/index.ts +1 -0
- package/src/resources/messages/messages.ts +134 -50
- package/src/version.ts +1 -1
- package/version.d.mts +1 -1
- package/version.d.ts +1 -1
- package/version.js +1 -1
- package/version.mjs +1 -1
- package/lib/stainless-helper-header.d.mts +0 -34
- package/lib/stainless-helper-header.d.mts.map +0 -1
- package/lib/stainless-helper-header.d.ts +0 -34
- package/lib/stainless-helper-header.d.ts.map +0 -1
- package/lib/stainless-helper-header.js.map +0 -1
- package/lib/stainless-helper-header.mjs.map +0 -1
- 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":";AAAA,sFAAsF;;;;AAGtF,qDAAkD;AAElD,uDAAsD;AAEtD,
|
|
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 "../../
|
|
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(
|
|
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([
|
|
36
|
-
|
|
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":"AAAA,sFAAsF;AAGtF,OAAO,EAAE,WAAW,EAAE,gCAA4B;AAElD,OAAO,EAAE,YAAY,EAAE,mCAA+B;AAEtD,OAAO,EAAE,qBAAqB,EAAE,
|
|
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,
|
package/src/core/streaming.ts
CHANGED
|
@@ -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;
|
package/src/helpers/beta/mcp.ts
CHANGED
|
@@ -22,7 +22,7 @@ import {
|
|
|
22
22
|
SDK_HELPER_SYMBOL,
|
|
23
23
|
collectStainlessHelpers,
|
|
24
24
|
stainlessHelperHeader,
|
|
25
|
-
} from '../../
|
|
25
|
+
} from '../../internal/stainless-helper-header';
|
|
26
26
|
import { fromBase64 } from '../../internal/utils/base64';
|
|
27
27
|
|
|
28
28
|
export { SDK_HELPER_SYMBOL, collectStainlessHelpers, stainlessHelperHeader };
|
package/src/internal/headers.ts
CHANGED
|
@@ -29,7 +29,9 @@ export type NullableHeaders = {
|
|
|
29
29
|
nulls: Set<string>;
|
|
30
30
|
};
|
|
31
31
|
|
|
32
|
-
function* iterateHeaders(
|
|
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
|
|
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,
|
|
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 (
|
|
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 {
|
|
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,
|
|
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) &&
|
|
466
|
-
|
|
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
|
-
|
|
641
|
-
|
|
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: {
|
package/src/lib/MessageStream.ts
CHANGED
|
@@ -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,
|
|
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) &&
|
|
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
|
-
|
|
630
|
-
|
|
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
|
|
package/src/lib/helper-client.ts
CHANGED
|
@@ -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:
|
|
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
|
-
{
|
|
77
|
+
{ [STAINLESS_HELPER_HEADER]: helper },
|
|
81
78
|
]);
|
|
82
79
|
return client.withOptions({
|
|
83
80
|
apiKey: null,
|
package/src/lib/middleware.ts
CHANGED
|
@@ -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
|
-
|
|
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: {
|
|
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
|
|
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
|
|