@anthropic-ai/sdk 0.126.0 → 0.127.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 (166) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/client.d.mts +10 -9
  3. package/client.d.mts.map +1 -1
  4. package/client.d.ts +10 -9
  5. package/client.d.ts.map +1 -1
  6. package/client.js +33 -19
  7. package/client.js.map +1 -1
  8. package/client.mjs +34 -20
  9. package/client.mjs.map +1 -1
  10. package/internal/parse.d.mts.map +1 -1
  11. package/internal/parse.d.ts.map +1 -1
  12. package/internal/parse.js +2 -2
  13. package/internal/parse.js.map +1 -1
  14. package/internal/parse.mjs +3 -3
  15. package/internal/parse.mjs.map +1 -1
  16. package/internal/shims.d.mts +3 -3
  17. package/internal/shims.d.mts.map +1 -1
  18. package/internal/shims.d.ts +3 -3
  19. package/internal/shims.d.ts.map +1 -1
  20. package/internal/shims.js.map +1 -1
  21. package/internal/shims.mjs.map +1 -1
  22. package/internal/utils/log.d.mts +7 -12
  23. package/internal/utils/log.d.mts.map +1 -1
  24. package/internal/utils/log.d.ts +7 -12
  25. package/internal/utils/log.d.ts.map +1 -1
  26. package/internal/utils/log.js +12 -0
  27. package/internal/utils/log.js.map +1 -1
  28. package/internal/utils/log.mjs +11 -0
  29. package/internal/utils/log.mjs.map +1 -1
  30. package/lib/BetaMessageStream.d.mts.map +1 -1
  31. package/lib/BetaMessageStream.d.ts.map +1 -1
  32. package/lib/BetaMessageStream.js +7 -5
  33. package/lib/BetaMessageStream.js.map +1 -1
  34. package/lib/BetaMessageStream.mjs +7 -5
  35. package/lib/BetaMessageStream.mjs.map +1 -1
  36. package/lib/beta-parser.d.mts +1 -3
  37. package/lib/beta-parser.d.mts.map +1 -1
  38. package/lib/beta-parser.d.ts +1 -3
  39. package/lib/beta-parser.d.ts.map +1 -1
  40. package/lib/beta-parser.js.map +1 -1
  41. package/lib/beta-parser.mjs.map +1 -1
  42. package/lib/internal/stub.d.mts +2 -0
  43. package/lib/internal/stub.d.mts.map +1 -0
  44. package/lib/internal/stub.d.ts +2 -0
  45. package/lib/internal/stub.d.ts.map +1 -0
  46. package/lib/internal/stub.js +6 -0
  47. package/lib/internal/stub.js.map +1 -0
  48. package/lib/internal/stub.mjs +3 -0
  49. package/lib/internal/stub.mjs.map +1 -0
  50. package/lib/internal/types.d.mts +5 -0
  51. package/lib/internal/types.d.mts.map +1 -0
  52. package/lib/internal/types.d.ts +5 -0
  53. package/lib/internal/types.d.ts.map +1 -0
  54. package/lib/internal/types.js +3 -0
  55. package/lib/internal/types.js.map +1 -0
  56. package/lib/internal/types.mjs +2 -0
  57. package/lib/internal/types.mjs.map +1 -0
  58. package/lib/middleware.js +6 -1
  59. package/lib/middleware.js.map +1 -1
  60. package/lib/middleware.mjs +6 -1
  61. package/lib/middleware.mjs.map +1 -1
  62. package/lib/parser.d.mts +1 -3
  63. package/lib/parser.d.mts.map +1 -1
  64. package/lib/parser.d.ts +1 -3
  65. package/lib/parser.d.ts.map +1 -1
  66. package/lib/parser.js.map +1 -1
  67. package/lib/parser.mjs.map +1 -1
  68. package/lib/tools/BetaToolRunner.d.mts +21 -6
  69. package/lib/tools/BetaToolRunner.d.mts.map +1 -1
  70. package/lib/tools/BetaToolRunner.d.ts +21 -6
  71. package/lib/tools/BetaToolRunner.d.ts.map +1 -1
  72. package/lib/tools/BetaToolRunner.js +125 -23
  73. package/lib/tools/BetaToolRunner.js.map +1 -1
  74. package/lib/tools/BetaToolRunner.mjs +125 -23
  75. package/lib/tools/BetaToolRunner.mjs.map +1 -1
  76. package/lib/transform-json-schema.js +7 -5
  77. package/lib/transform-json-schema.js.map +1 -1
  78. package/lib/transform-json-schema.mjs +7 -5
  79. package/lib/transform-json-schema.mjs.map +1 -1
  80. package/package.json +2 -1
  81. package/resources/beta/deployment-runs.d.mts +4 -0
  82. package/resources/beta/deployment-runs.d.mts.map +1 -1
  83. package/resources/beta/deployment-runs.d.ts +4 -0
  84. package/resources/beta/deployment-runs.d.ts.map +1 -1
  85. package/resources/beta/deployments.d.mts +5 -0
  86. package/resources/beta/deployments.d.mts.map +1 -1
  87. package/resources/beta/deployments.d.ts +5 -0
  88. package/resources/beta/deployments.d.ts.map +1 -1
  89. package/resources/beta/dreams.d.mts +17 -0
  90. package/resources/beta/dreams.d.mts.map +1 -1
  91. package/resources/beta/dreams.d.ts +17 -0
  92. package/resources/beta/dreams.d.ts.map +1 -1
  93. package/resources/beta/memory-stores/memories.d.mts +6 -0
  94. package/resources/beta/memory-stores/memories.d.mts.map +1 -1
  95. package/resources/beta/memory-stores/memories.d.ts +6 -0
  96. package/resources/beta/memory-stores/memories.d.ts.map +1 -1
  97. package/resources/beta/memory-stores/memory-versions.d.mts +7 -0
  98. package/resources/beta/memory-stores/memory-versions.d.mts.map +1 -1
  99. package/resources/beta/memory-stores/memory-versions.d.ts +7 -0
  100. package/resources/beta/memory-stores/memory-versions.d.ts.map +1 -1
  101. package/resources/beta/messages/messages.d.mts +1 -1
  102. package/resources/beta/messages/messages.d.ts +1 -1
  103. package/resources/beta/organization/index.d.mts +1 -1
  104. package/resources/beta/organization/index.d.mts.map +1 -1
  105. package/resources/beta/organization/index.d.ts +1 -1
  106. package/resources/beta/organization/index.d.ts.map +1 -1
  107. package/resources/beta/organization/index.js.map +1 -1
  108. package/resources/beta/organization/index.mjs.map +1 -1
  109. package/resources/beta/organization/organization.d.mts +2 -2
  110. package/resources/beta/organization/organization.d.mts.map +1 -1
  111. package/resources/beta/organization/organization.d.ts +2 -2
  112. package/resources/beta/organization/organization.d.ts.map +1 -1
  113. package/resources/beta/organization/organization.js.map +1 -1
  114. package/resources/beta/organization/organization.mjs.map +1 -1
  115. package/resources/beta/organization/rate-limits.d.mts +87 -5
  116. package/resources/beta/organization/rate-limits.d.mts.map +1 -1
  117. package/resources/beta/organization/rate-limits.d.ts +87 -5
  118. package/resources/beta/organization/rate-limits.d.ts.map +1 -1
  119. package/resources/beta/organization/workspaces/rate-limits.d.mts +9 -4
  120. package/resources/beta/organization/workspaces/rate-limits.d.mts.map +1 -1
  121. package/resources/beta/organization/workspaces/rate-limits.d.ts +9 -4
  122. package/resources/beta/organization/workspaces/rate-limits.d.ts.map +1 -1
  123. package/resources/beta/organization/workspaces/rate-limits.js.map +1 -1
  124. package/resources/beta/organization/workspaces/rate-limits.mjs.map +1 -1
  125. package/resources/beta/sessions/sessions.d.mts +6 -0
  126. package/resources/beta/sessions/sessions.d.mts.map +1 -1
  127. package/resources/beta/sessions/sessions.d.ts +6 -0
  128. package/resources/beta/sessions/sessions.d.ts.map +1 -1
  129. package/resources/beta/sessions/sessions.js.map +1 -1
  130. package/resources/beta/sessions/sessions.mjs.map +1 -1
  131. package/resources/beta/tunnels/certificates.d.mts +2 -2
  132. package/resources/beta/tunnels/certificates.d.ts +2 -2
  133. package/resources/beta/vaults/credentials.d.mts +19 -5
  134. package/resources/beta/vaults/credentials.d.mts.map +1 -1
  135. package/resources/beta/vaults/credentials.d.ts +19 -5
  136. package/resources/beta/vaults/credentials.d.ts.map +1 -1
  137. package/src/client.ts +82 -71
  138. package/src/internal/parse.ts +8 -11
  139. package/src/internal/shims.ts +4 -3
  140. package/src/internal/utils/log.ts +16 -2
  141. package/src/lib/BetaMessageStream.ts +7 -5
  142. package/src/lib/beta-parser.ts +1 -3
  143. package/src/lib/internal/stub.ts +2 -0
  144. package/src/lib/internal/types.ts +2 -0
  145. package/src/lib/middleware.ts +6 -1
  146. package/src/lib/parser.ts +1 -3
  147. package/src/lib/tools/BetaToolRunner.ts +157 -24
  148. package/src/lib/transform-json-schema.ts +8 -6
  149. package/src/resources/beta/deployment-runs.ts +4 -0
  150. package/src/resources/beta/deployments.ts +5 -0
  151. package/src/resources/beta/dreams.ts +17 -0
  152. package/src/resources/beta/memory-stores/memories.ts +6 -0
  153. package/src/resources/beta/memory-stores/memory-versions.ts +7 -0
  154. package/src/resources/beta/messages/messages.ts +1 -1
  155. package/src/resources/beta/organization/index.ts +6 -0
  156. package/src/resources/beta/organization/organization.ts +12 -0
  157. package/src/resources/beta/organization/rate-limits.ts +112 -4
  158. package/src/resources/beta/organization/workspaces/rate-limits.ts +16 -4
  159. package/src/resources/beta/sessions/sessions.ts +6 -0
  160. package/src/resources/beta/tunnels/certificates.ts +2 -2
  161. package/src/resources/beta/vaults/credentials.ts +19 -5
  162. package/src/version.ts +1 -1
  163. package/version.d.mts +1 -1
  164. package/version.d.ts +1 -1
  165. package/version.js +1 -1
  166. package/version.mjs +1 -1
package/src/client.ts CHANGED
@@ -31,12 +31,16 @@ export type { Middleware, MiddlewareContext, MiddlewareNext } from './core/middl
31
31
  export type { APIRequest } from './core/api';
32
32
  import * as Pagination from './core/pagination';
33
33
  import {
34
+ type BidirectionalPageCursor,
34
35
  type BidirectionalPageCursorParams,
35
36
  BidirectionalPageCursorResponse,
37
+ type Page,
38
+ type PageCursor,
36
39
  type PageCursorParams,
37
40
  PageCursorResponse,
38
41
  type PageParams,
39
42
  PageResponse,
43
+ type TokenPage,
40
44
  type TokenPageParams,
41
45
  TokenPageResponse,
42
46
  } from './core/pagination';
@@ -358,8 +362,8 @@ import { readEnv } from './internal/utils/env';
358
362
  import {
359
363
  type LogLevel,
360
364
  type Logger,
365
+ debugLogRequestDetails,
361
366
  defaultLogLevel,
362
- formatRequestDetails,
363
367
  loggerFor,
364
368
  parseLogLevel,
365
369
  } from './internal/utils/log';
@@ -1046,7 +1050,7 @@ export class BaseAnthropic {
1046
1050
  ?.split(',')
1047
1051
  .map((s) => s.trim());
1048
1052
  if (!existing?.includes(OAUTH_API_BETA_HEADER)) {
1049
- headers.append('anthropic-beta', OAUTH_API_BETA_HEADER);
1053
+ headers.set('anthropic-beta', [...(existing ?? []), OAUTH_API_BETA_HEADER].join(','));
1050
1054
  }
1051
1055
  request.headers = headers;
1052
1056
  }
@@ -1119,7 +1123,10 @@ export class BaseAnthropic {
1119
1123
  retryOfRequestLogID: string | undefined,
1120
1124
  ): Promise<APIResponseProps> {
1121
1125
  const options = await optionsInput;
1122
- const maxRetries = validatePositiveInteger('maxRetries', options.maxRetries ?? this.maxRetries);
1126
+ let maxRetries = validatePositiveInteger('maxRetries', options.maxRetries ?? this.maxRetries);
1127
+ if (this.isStreamBody(options.body)) {
1128
+ maxRetries = 0;
1129
+ }
1123
1130
  if (retriesRemaining == null) {
1124
1131
  retriesRemaining = maxRetries;
1125
1132
  // Top-level call: reset per-request auth flags so a reused options object
@@ -1172,43 +1179,42 @@ export class BaseAnthropic {
1172
1179
  this.middleware.length > 0 || !!options.middleware?.length || this.backendMiddleware().length > 0;
1173
1180
  if (hasMiddleware && !isTimeout && !isRetryableError(response)) {
1174
1181
  loggerFor(this).info(`[${requestLogID}] middleware error (not retryable)`);
1175
- loggerFor(this).debug(
1176
- `[${requestLogID}] middleware error (not retryable)`,
1177
- formatRequestDetails({
1178
- retryOfRequestLogID,
1179
- url,
1180
- durationMs: headersTime - startTime,
1181
- message: response.message,
1182
- }),
1183
- );
1182
+ debugLogRequestDetails(loggerFor(this), `[${requestLogID}] middleware error (not retryable)`, {
1183
+ retryOfRequestLogID,
1184
+ url,
1185
+ durationMs: headersTime - startTime,
1186
+ message: response.message,
1187
+ });
1184
1188
  throw response;
1185
1189
  }
1186
1190
  if (retriesRemaining) {
1187
1191
  loggerFor(this).info(
1188
1192
  `[${requestLogID}] connection ${isTimeout ? 'timed out' : 'failed'} - ${retryMessage}`,
1189
1193
  );
1190
- loggerFor(this).debug(
1194
+ debugLogRequestDetails(
1195
+ loggerFor(this),
1191
1196
  `[${requestLogID}] connection ${isTimeout ? 'timed out' : 'failed'} (${retryMessage})`,
1192
- formatRequestDetails({
1197
+ {
1193
1198
  retryOfRequestLogID,
1194
1199
  url,
1195
1200
  durationMs: headersTime - startTime,
1196
1201
  message: response.message,
1197
- }),
1202
+ },
1198
1203
  );
1199
1204
  return this.retryRequest(options, retriesRemaining, retryOfRequestLogID ?? requestLogID);
1200
1205
  }
1201
1206
  loggerFor(this).info(
1202
1207
  `[${requestLogID}] connection ${isTimeout ? 'timed out' : 'failed'} - error; no more retries left`,
1203
1208
  );
1204
- loggerFor(this).debug(
1209
+ debugLogRequestDetails(
1210
+ loggerFor(this),
1205
1211
  `[${requestLogID}] connection ${isTimeout ? 'timed out' : 'failed'} (error; no more retries left)`,
1206
- formatRequestDetails({
1212
+ {
1207
1213
  retryOfRequestLogID,
1208
1214
  url,
1209
1215
  durationMs: headersTime - startTime,
1210
1216
  message: response.message,
1211
- }),
1217
+ },
1212
1218
  );
1213
1219
  if (isTimeout) {
1214
1220
  throw new Errors.APIConnectionTimeoutError();
@@ -1238,16 +1244,13 @@ export class BaseAnthropic {
1238
1244
  await Shims.CancelReadableStream(response.body);
1239
1245
  releaseRequestSignal(controller);
1240
1246
  loggerFor(this).info(`${responseInfo} - ${retryMessage}`);
1241
- loggerFor(this).debug(
1242
- `[${requestLogID}] response error (${retryMessage})`,
1243
- formatRequestDetails({
1244
- retryOfRequestLogID,
1245
- url: response.url,
1246
- status: response.status,
1247
- headers: response.headers,
1248
- durationMs: headersTime - startTime,
1249
- }),
1250
- );
1247
+ debugLogRequestDetails(loggerFor(this), `[${requestLogID}] response error (${retryMessage})`, {
1248
+ retryOfRequestLogID,
1249
+ url: response.url,
1250
+ status: response.status,
1251
+ headers: response.headers,
1252
+ durationMs: headersTime - startTime,
1253
+ });
1251
1254
  return this.retryRequest(
1252
1255
  options,
1253
1256
  retriesRemaining,
@@ -1264,17 +1267,14 @@ export class BaseAnthropic {
1264
1267
  const errJSON = safeJSON(errText) as any;
1265
1268
  const errMessage = errJSON ? undefined : errText;
1266
1269
 
1267
- loggerFor(this).debug(
1268
- `[${requestLogID}] response error (${retryMessage})`,
1269
- formatRequestDetails({
1270
- retryOfRequestLogID,
1271
- url: response.url,
1272
- status: response.status,
1273
- headers: response.headers,
1274
- message: errMessage,
1275
- durationMs: Date.now() - startTime,
1276
- }),
1277
- );
1270
+ debugLogRequestDetails(loggerFor(this), `[${requestLogID}] response error (${retryMessage})`, {
1271
+ retryOfRequestLogID,
1272
+ url: response.url,
1273
+ status: response.status,
1274
+ headers: response.headers,
1275
+ message: errMessage,
1276
+ durationMs: Date.now() - startTime,
1277
+ });
1278
1278
 
1279
1279
  releaseRequestSignal(controller);
1280
1280
  const err = this.makeStatusError(response.status, errJSON, errMessage, response.headers);
@@ -1282,16 +1282,13 @@ export class BaseAnthropic {
1282
1282
  }
1283
1283
 
1284
1284
  loggerFor(this).info(responseInfo);
1285
- loggerFor(this).debug(
1286
- `[${requestLogID}] response start`,
1287
- formatRequestDetails({
1288
- retryOfRequestLogID,
1289
- url: response.url,
1290
- status: response.status,
1291
- headers: response.headers,
1292
- durationMs: headersTime - startTime,
1293
- }),
1294
- );
1285
+ debugLogRequestDetails(loggerFor(this), `[${requestLogID}] response start`, {
1286
+ retryOfRequestLogID,
1287
+ url: response.url,
1288
+ status: response.status,
1289
+ headers: response.headers,
1290
+ durationMs: headersTime - startTime,
1291
+ });
1295
1292
 
1296
1293
  armAbandonmentBackstop(response.body ?? response, controller);
1297
1294
  return { response, options, controller, requestLogID, retryOfRequestLogID, startTime };
@@ -1390,16 +1387,13 @@ export class BaseAnthropic {
1390
1387
  await this.prepareRequest(innerInit, { url: innerUrlStr, options: requestOptions });
1391
1388
 
1392
1389
  if (logCtx) {
1393
- loggerFor(this).debug(
1394
- `[${logCtx.requestLogID}] sending request`,
1395
- formatRequestDetails({
1396
- retryOfRequestLogID: logCtx.retryOfRequestLogID,
1397
- method: innerInit.method,
1398
- url: innerUrlStr,
1399
- options: requestOptions,
1400
- headers: innerInit.headers,
1401
- }),
1402
- );
1390
+ debugLogRequestDetails(loggerFor(this), `[${logCtx.requestLogID}] sending request`, {
1391
+ retryOfRequestLogID: logCtx.retryOfRequestLogID,
1392
+ method: innerInit.method,
1393
+ url: innerUrlStr,
1394
+ options: requestOptions,
1395
+ headers: innerInit.headers,
1396
+ });
1403
1397
  }
1404
1398
 
1405
1399
  return timedFetch(innerUrl, innerInit);
@@ -1628,11 +1622,7 @@ export class BaseAnthropic {
1628
1622
  ((globalThis as any).ReadableStream && body instanceof (globalThis as any).ReadableStream)
1629
1623
  ) {
1630
1624
  return { bodyHeaders: undefined, body: body as BodyInit };
1631
- } else if (
1632
- typeof body === 'object' &&
1633
- (Symbol.asyncIterator in body ||
1634
- (Symbol.iterator in body && 'next' in body && typeof body.next === 'function'))
1635
- ) {
1625
+ } else if (this.isStreamBody(body)) {
1636
1626
  return { bodyHeaders: undefined, body: Shims.ReadableStreamFrom(body as AsyncIterable<Uint8Array>) };
1637
1627
  } else if (
1638
1628
  typeof body === 'object' &&
@@ -1647,6 +1637,22 @@ export class BaseAnthropic {
1647
1637
  }
1648
1638
  }
1649
1639
 
1640
+ /**
1641
+ * Whether `body` is sent as a stream, which can be read only once:
1642
+ * a `ReadableStream`, an async iterable or an iterator.
1643
+ */
1644
+ private isStreamBody(body: unknown): boolean {
1645
+ if ((globalThis as any).ReadableStream && body instanceof (globalThis as any).ReadableStream) {
1646
+ return true;
1647
+ }
1648
+ return (
1649
+ typeof body === 'object' &&
1650
+ body !== null &&
1651
+ (Symbol.asyncIterator in body ||
1652
+ (Symbol.iterator in body && 'next' in body && typeof body.next === 'function'))
1653
+ );
1654
+ }
1655
+
1650
1656
  static Anthropic = this;
1651
1657
  static HUMAN_PROMPT = HUMAN_PROMPT;
1652
1658
  static AI_PROMPT = AI_PROMPT;
@@ -1694,17 +1700,22 @@ export declare namespace Anthropic {
1694
1700
 
1695
1701
  export type { ApiKeySetter };
1696
1702
 
1697
- export import Page = Pagination.Page;
1698
- export { type PageParams as PageParams, type PageResponse as PageResponse };
1703
+ export { type Page as Page, type PageParams as PageParams, type PageResponse as PageResponse };
1699
1704
 
1700
- export import TokenPage = Pagination.TokenPage;
1701
- export { type TokenPageParams as TokenPageParams, type TokenPageResponse as TokenPageResponse };
1705
+ export {
1706
+ type TokenPage as TokenPage,
1707
+ type TokenPageParams as TokenPageParams,
1708
+ type TokenPageResponse as TokenPageResponse,
1709
+ };
1702
1710
 
1703
- export import PageCursor = Pagination.PageCursor;
1704
- export { type PageCursorParams as PageCursorParams, type PageCursorResponse as PageCursorResponse };
1711
+ export {
1712
+ type PageCursor as PageCursor,
1713
+ type PageCursorParams as PageCursorParams,
1714
+ type PageCursorResponse as PageCursorResponse,
1715
+ };
1705
1716
 
1706
- export import BidirectionalPageCursor = Pagination.BidirectionalPageCursor;
1707
1717
  export {
1718
+ type BidirectionalPageCursor as BidirectionalPageCursor,
1708
1719
  type BidirectionalPageCursorParams as BidirectionalPageCursorParams,
1709
1720
  type BidirectionalPageCursorResponse as BidirectionalPageCursorResponse,
1710
1721
  };
@@ -1,7 +1,7 @@
1
1
  import type { FinalRequestOptions } from './request-options';
2
2
  import { Stream } from '../core/streaming';
3
3
  import { type BaseAnthropic } from '../client';
4
- import { formatRequestDetails, loggerFor } from './utils/log';
4
+ import { debugLogRequestDetails, loggerFor } from './utils/log';
5
5
  import { releaseRequestSignal } from './request-signal';
6
6
  import type { AbstractPage } from '../core/pagination';
7
7
 
@@ -63,16 +63,13 @@ export async function defaultParseResponse<T>(
63
63
  releaseRequestSignal(props.controller);
64
64
  }
65
65
  });
66
- loggerFor(client).debug(
67
- `[${requestLogID}] response parsed`,
68
- formatRequestDetails({
69
- retryOfRequestLogID,
70
- url: response.url,
71
- status: response.status,
72
- body,
73
- durationMs: Date.now() - startTime,
74
- }),
75
- );
66
+ debugLogRequestDetails(loggerFor(client), `[${requestLogID}] response parsed`, {
67
+ retryOfRequestLogID,
68
+ url: response.url,
69
+ status: response.status,
70
+ body,
71
+ durationMs: Date.now() - startTime,
72
+ });
76
73
  return body;
77
74
  }
78
75
 
@@ -6,7 +6,7 @@
6
6
  */
7
7
 
8
8
  import type { Fetch } from './builtin-types';
9
- import type { ReadableStream } from './shim-types';
9
+ import type { ReadableStream as ReadableStreamType } from './shim-types';
10
10
 
11
11
  export function getDefaultFetch(): Fetch {
12
12
  if (typeof fetch !== 'undefined') {
@@ -18,9 +18,10 @@ export function getDefaultFetch(): Fetch {
18
18
  );
19
19
  }
20
20
 
21
+ // The runtime's global ReadableStream constructor, not the type imported above as ReadableStreamType.
21
22
  type ReadableStreamArgs = ConstructorParameters<typeof ReadableStream>;
22
23
 
23
- export function makeReadableStream(...args: ReadableStreamArgs): ReadableStream {
24
+ export function makeReadableStream(...args: ReadableStreamArgs): ReadableStreamType {
24
25
  const ReadableStream = (globalThis as any).ReadableStream;
25
26
  if (typeof ReadableStream === 'undefined') {
26
27
  // Note: All of the platforms / runtimes we officially support already define
@@ -33,7 +34,7 @@ export function makeReadableStream(...args: ReadableStreamArgs): ReadableStream
33
34
  return new ReadableStream(...args);
34
35
  }
35
36
 
36
- export function ReadableStreamFrom<T>(iterable: Iterable<T> | AsyncIterable<T>): ReadableStream<T> {
37
+ export function ReadableStreamFrom<T>(iterable: Iterable<T> | AsyncIterable<T>): ReadableStreamType<T> {
37
38
  let iter: AsyncIterator<T> | Iterator<T> =
38
39
  Symbol.asyncIterator in iterable ? iterable[Symbol.asyncIterator]() : iterable[Symbol.iterator]();
39
40
 
@@ -112,7 +112,7 @@ export function defaultLogger(): Logger {
112
112
  return cachedDefaultLogger;
113
113
  }
114
114
 
115
- export const formatRequestDetails = (details: {
115
+ type RequestDetails = {
116
116
  options?: RequestOptions | undefined;
117
117
  headers?: Headers | Record<string, string> | undefined;
118
118
  retryOfRequestLogID?: string | undefined;
@@ -123,7 +123,21 @@ export const formatRequestDetails = (details: {
123
123
  durationMs?: number | undefined;
124
124
  message?: unknown;
125
125
  body?: unknown;
126
- }) => {
126
+ };
127
+
128
+ /**
129
+ * Logs `details` at debug level. Formatting copies headers and options, so it
130
+ * runs only when debug logging is enabled.
131
+ */
132
+ export function debugLogRequestDetails(logger: Logger, message: string, details: RequestDetails): void {
133
+ // `loggerFor` filters disabled levels to `noop`.
134
+ if (logger.debug === noop) {
135
+ return;
136
+ }
137
+ logger.debug(message, formatRequestDetails(details));
138
+ }
139
+
140
+ export const formatRequestDetails = (details: RequestDetails) => {
127
141
  if (details.options) {
128
142
  details.options = { ...details.options };
129
143
  delete details.options['headers']; // redundant + leaks internals
@@ -695,11 +695,13 @@ export class BetaMessageStream<ParsedT = null> implements AsyncIterable<BetaMess
695
695
  }
696
696
  case 'compaction_delta': {
697
697
  if (snapshotContent?.type === 'compaction') {
698
- snapshot.content[event.index] = {
699
- ...snapshotContent,
700
- content: (snapshotContent.content || '') + event.delta.content,
701
- encrypted_content: event.delta.encrypted_content,
702
- };
698
+ // The delta carries the block's final value (null content = failed compaction), so assign.
699
+ const block = { ...snapshotContent, content: event.delta.content };
700
+ // beta-gated key: only copy it when the server sent it
701
+ if ('encrypted_content' in event.delta) {
702
+ block.encrypted_content = event.delta.encrypted_content;
703
+ }
704
+ snapshot.content[event.index] = block;
703
705
  }
704
706
  break;
705
707
  }
@@ -8,9 +8,7 @@ import {
8
8
  BetaTextBlock,
9
9
  MessageCreateParams,
10
10
  } from '../resources/beta/messages/messages';
11
-
12
- // vendored from typefest just to make things look a bit nicer on hover
13
- type Simplify<T> = { [KeyType in keyof T]: T[KeyType] } & {};
11
+ import type { Simplify } from './internal/types';
14
12
 
15
13
  type AutoParseableBetaOutputConfig = Omit<BetaOutputConfig, 'format'> & {
16
14
  format?: BetaJSONOutputFormat | AutoParseableBetaOutputFormat<any> | null;
@@ -0,0 +1,2 @@
1
+ // placeholder so the build has a `lib/internal` module to check the exports map against
2
+ export const stub = true;
@@ -0,0 +1,2 @@
1
+ /** Flattens an intersection type so it reads better on hover; vendored from type-fest. */
2
+ export type Simplify<T> = { [KeyType in keyof T]: T[KeyType] } & {};
@@ -895,6 +895,11 @@ function applyDelta(
895
895
  break;
896
896
  }
897
897
  case 'compaction_delta': {
898
+ // The delta carries the block's final value; the start event is only a null-content shell.
899
+ block.content = delta.content;
900
+ if ('encrypted_content' in delta) {
901
+ block.encrypted_content = delta.encrypted_content;
902
+ }
898
903
  break;
899
904
  }
900
905
  default:
@@ -933,8 +938,8 @@ function withMiddlewareHeaders(request: APIRequest, betas: readonly AnthropicBet
933
938
  );
934
939
  for (const beta of betas) {
935
940
  if (!existing.has(beta)) {
936
- headers.append('anthropic-beta', beta);
937
941
  existing.add(beta);
942
+ headers.set('anthropic-beta', [...existing].join(','));
938
943
  }
939
944
  }
940
945
  headers.set(
package/src/lib/parser.ts CHANGED
@@ -8,9 +8,7 @@ import {
8
8
  TextBlock,
9
9
  MessageCreateParams,
10
10
  } from '../resources/messages/messages';
11
-
12
- // vendored from typefest just to make things look a bit nicer on hover
13
- type Simplify<T> = { [KeyType in keyof T]: T[KeyType] } & {};
11
+ import type { Simplify } from './internal/types';
14
12
 
15
13
  type AutoParseableOutputConfig = Omit<OutputConfig, 'format'> & {
16
14
  format?: JSONOutputFormat | AutoParseableOutputFormat<any> | null;