@anthropic-ai/sdk 0.102.0 → 0.103.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 (149) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/client.d.mts +30 -7
  3. package/client.d.mts.map +1 -1
  4. package/client.d.ts +30 -7
  5. package/client.d.ts.map +1 -1
  6. package/client.js +48 -25
  7. package/client.js.map +1 -1
  8. package/client.mjs +47 -24
  9. package/client.mjs.map +1 -1
  10. package/core/middleware.d.mts +42 -5
  11. package/core/middleware.d.mts.map +1 -1
  12. package/core/middleware.d.ts +42 -5
  13. package/core/middleware.d.ts.map +1 -1
  14. package/core/middleware.js +14 -7
  15. package/core/middleware.js.map +1 -1
  16. package/core/middleware.mjs +14 -7
  17. package/core/middleware.mjs.map +1 -1
  18. package/core/streaming.d.mts +9 -0
  19. package/core/streaming.d.mts.map +1 -1
  20. package/core/streaming.d.ts +9 -0
  21. package/core/streaming.d.ts.map +1 -1
  22. package/core/streaming.js +11 -0
  23. package/core/streaming.js.map +1 -1
  24. package/core/streaming.mjs +11 -0
  25. package/core/streaming.mjs.map +1 -1
  26. package/index.d.mts +1 -0
  27. package/index.d.mts.map +1 -1
  28. package/index.d.ts +1 -0
  29. package/index.d.ts.map +1 -1
  30. package/index.js +4 -1
  31. package/index.js.map +1 -1
  32. package/index.mjs +1 -0
  33. package/index.mjs.map +1 -1
  34. package/internal/parse.d.mts.map +1 -1
  35. package/internal/parse.d.ts.map +1 -1
  36. package/internal/parse.js +0 -3
  37. package/internal/parse.js.map +1 -1
  38. package/internal/parse.mjs +0 -3
  39. package/internal/parse.mjs.map +1 -1
  40. package/internal/request-options.d.mts +46 -3
  41. package/internal/request-options.d.mts.map +1 -1
  42. package/internal/request-options.d.ts +46 -3
  43. package/internal/request-options.d.ts.map +1 -1
  44. package/internal/request-options.js +12 -1
  45. package/internal/request-options.js.map +1 -1
  46. package/internal/request-options.mjs +10 -0
  47. package/internal/request-options.mjs.map +1 -1
  48. package/internal/utils/log.d.mts +11 -1
  49. package/internal/utils/log.d.mts.map +1 -1
  50. package/internal/utils/log.d.ts +11 -1
  51. package/internal/utils/log.d.ts.map +1 -1
  52. package/internal/utils/log.js +34 -9
  53. package/internal/utils/log.js.map +1 -1
  54. package/internal/utils/log.mjs +32 -8
  55. package/internal/utils/log.mjs.map +1 -1
  56. package/lib/BetaMessageStream.d.mts.map +1 -1
  57. package/lib/BetaMessageStream.d.ts.map +1 -1
  58. package/lib/BetaMessageStream.js +5 -0
  59. package/lib/BetaMessageStream.js.map +1 -1
  60. package/lib/BetaMessageStream.mjs +5 -0
  61. package/lib/BetaMessageStream.mjs.map +1 -1
  62. package/lib/middleware.d.mts +96 -0
  63. package/lib/middleware.d.mts.map +1 -0
  64. package/lib/middleware.d.ts +96 -0
  65. package/lib/middleware.d.ts.map +1 -0
  66. package/lib/middleware.js +703 -0
  67. package/lib/middleware.js.map +1 -0
  68. package/lib/middleware.mjs +698 -0
  69. package/lib/middleware.mjs.map +1 -0
  70. package/lib/tools/BetaToolRunner.d.mts +1 -1
  71. package/lib/tools/BetaToolRunner.d.mts.map +1 -1
  72. package/lib/tools/BetaToolRunner.d.ts +1 -1
  73. package/lib/tools/BetaToolRunner.d.ts.map +1 -1
  74. package/lib/tools/BetaToolRunner.js +10 -2
  75. package/lib/tools/BetaToolRunner.js.map +1 -1
  76. package/lib/tools/BetaToolRunner.mjs +10 -2
  77. package/lib/tools/BetaToolRunner.mjs.map +1 -1
  78. package/package.json +1 -1
  79. package/resources/beta/agents/agents.d.mts +1 -1
  80. package/resources/beta/agents/agents.d.mts.map +1 -1
  81. package/resources/beta/agents/agents.d.ts +1 -1
  82. package/resources/beta/agents/agents.d.ts.map +1 -1
  83. package/resources/beta/agents/agents.js.map +1 -1
  84. package/resources/beta/agents/agents.mjs.map +1 -1
  85. package/resources/beta/beta.d.mts +3 -3
  86. package/resources/beta/beta.d.mts.map +1 -1
  87. package/resources/beta/beta.d.ts +3 -3
  88. package/resources/beta/beta.d.ts.map +1 -1
  89. package/resources/beta/beta.js.map +1 -1
  90. package/resources/beta/beta.mjs.map +1 -1
  91. package/resources/beta/index.d.mts +1 -1
  92. package/resources/beta/index.d.mts.map +1 -1
  93. package/resources/beta/index.d.ts +1 -1
  94. package/resources/beta/index.d.ts.map +1 -1
  95. package/resources/beta/index.js.map +1 -1
  96. package/resources/beta/index.mjs.map +1 -1
  97. package/resources/beta/messages/batches.d.mts +28 -0
  98. package/resources/beta/messages/batches.d.mts.map +1 -1
  99. package/resources/beta/messages/batches.d.ts +28 -0
  100. package/resources/beta/messages/batches.d.ts.map +1 -1
  101. package/resources/beta/messages/index.d.mts +1 -1
  102. package/resources/beta/messages/index.d.mts.map +1 -1
  103. package/resources/beta/messages/index.d.ts +1 -1
  104. package/resources/beta/messages/index.d.ts.map +1 -1
  105. package/resources/beta/messages/index.js.map +1 -1
  106. package/resources/beta/messages/index.mjs.map +1 -1
  107. package/resources/beta/messages/messages.d.mts +234 -6
  108. package/resources/beta/messages/messages.d.mts.map +1 -1
  109. package/resources/beta/messages/messages.d.ts +234 -6
  110. package/resources/beta/messages/messages.d.ts.map +1 -1
  111. package/resources/beta/messages/messages.js +7 -0
  112. package/resources/beta/messages/messages.js.map +1 -1
  113. package/resources/beta/messages/messages.mjs +7 -0
  114. package/resources/beta/messages/messages.mjs.map +1 -1
  115. package/resources/beta/models.d.mts +6 -0
  116. package/resources/beta/models.d.mts.map +1 -1
  117. package/resources/beta/models.d.ts +6 -0
  118. package/resources/beta/models.d.ts.map +1 -1
  119. package/resources/messages/messages.d.mts +2 -2
  120. package/resources/messages/messages.d.mts.map +1 -1
  121. package/resources/messages/messages.d.ts +2 -2
  122. package/resources/messages/messages.d.ts.map +1 -1
  123. package/resources/messages/messages.js +1 -0
  124. package/resources/messages/messages.js.map +1 -1
  125. package/resources/messages/messages.mjs +1 -0
  126. package/resources/messages/messages.mjs.map +1 -1
  127. package/src/client.ts +55 -24
  128. package/src/core/middleware.ts +53 -7
  129. package/src/core/streaming.ts +15 -0
  130. package/src/index.ts +6 -0
  131. package/src/internal/parse.ts +0 -4
  132. package/src/internal/request-options.ts +48 -3
  133. package/src/internal/utils/log.ts +39 -9
  134. package/src/lib/BetaMessageStream.ts +5 -0
  135. package/src/lib/middleware.ts +937 -0
  136. package/src/lib/tools/BetaToolRunner.ts +12 -3
  137. package/src/resources/beta/agents/agents.ts +1 -0
  138. package/src/resources/beta/beta.ts +15 -1
  139. package/src/resources/beta/index.ts +6 -0
  140. package/src/resources/beta/messages/batches.ts +30 -0
  141. package/src/resources/beta/messages/index.ts +6 -0
  142. package/src/resources/beta/messages/messages.ts +279 -5
  143. package/src/resources/beta/models.ts +7 -0
  144. package/src/resources/messages/messages.ts +4 -1
  145. package/src/version.ts +1 -1
  146. package/version.d.mts +1 -1
  147. package/version.d.ts +1 -1
  148. package/version.js +1 -1
  149. package/version.mjs +1 -1
@@ -10,7 +10,42 @@ import { type HeadersLike } from './headers';
10
10
 
11
11
  export type FinalRequestOptions = RequestOptions & { method: HTTPMethod; path: string };
12
12
 
13
- export type RequestOptions = {
13
+ /**
14
+ * Tracks which fallback a sequence of requests is pinned to.
15
+ *
16
+ * Create one (`new BetaFallbackState()`) and pass it via the `fallbackState`
17
+ * request option on every request that should share the pin — the turns of one
18
+ * conversation, or any wider scope the stickiness should apply to;
19
+ * `betaRefusalFallbackMiddleware` mutates it in place when a model refuses.
20
+ */
21
+ export class BetaFallbackState {
22
+ /**
23
+ * Index into the fallback chain the requests are pinned to.
24
+ *
25
+ * `undefined` (or -1) targets the original request params; the middleware
26
+ * sets it to the index of the fallback that accepted the request.
27
+ */
28
+ index?: number;
29
+ }
30
+
31
+ /**
32
+ * Options for an individual API request.
33
+ *
34
+ * Declared as an interface so it can be extended via declaration merging, e.g.
35
+ * to thread custom per-request context through to {@link Middleware}:
36
+ *
37
+ * ```ts
38
+ * declare module '@anthropic-ai/sdk/internal/request-options' {
39
+ * interface RequestOptions {
40
+ * myContext?: string;
41
+ * }
42
+ * }
43
+ * ```
44
+ *
45
+ * The SDK ignores properties it doesn't know about; they are visible to
46
+ * middleware on `ctx.options`.
47
+ */
48
+ export interface RequestOptions {
14
49
  /**
15
50
  * The HTTP method for the request (e.g., 'get', 'post', 'put', 'delete').
16
51
  */
@@ -70,10 +105,20 @@ export type RequestOptions = {
70
105
  /**
71
106
  * Additional {@link Middleware} to wrap this request's HTTP attempts.
72
107
  *
73
- * These run after any client-level middleware and apply to every attempt of this request, including retries.
108
+ * These run after any client-level middleware (but still outside any backend
109
+ * adaptation) and apply to every attempt of this request, including retries.
74
110
  */
75
111
  middleware?: ReadonlyArray<Middleware> | undefined;
76
112
 
113
+ /**
114
+ * Sticky state for `betaRefusalFallbackMiddleware`.
115
+ *
116
+ * The middleware records which fallback it settled on, so requests sharing
117
+ * the state skip models that already refused. Pass the same object across
118
+ * whatever scope the pin should apply to — typically a conversation.
119
+ */
120
+ fallbackState?: BetaFallbackState;
121
+
77
122
  /**
78
123
  * A unique key for this request to enable idempotency.
79
124
  */
@@ -86,7 +131,7 @@ export type RequestOptions = {
86
131
 
87
132
  __binaryResponse?: boolean | undefined;
88
133
  __streamClass?: typeof Stream;
89
- };
134
+ }
90
135
 
91
136
  export type EncodedContent = { bodyHeaders: HeadersLike; body: BodyInit };
92
137
  export type RequestEncoder = (request: { headers: NullableHeaders; body: unknown }) => EncodedContent;
@@ -1,6 +1,7 @@
1
1
  // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
2
 
3
3
  import { hasOwn } from './values';
4
+ import { readEnv } from './env';
4
5
  import { type BaseAnthropic } from '../../client';
5
6
  import { RequestOptions } from '../request-options';
6
7
 
@@ -13,6 +14,8 @@ export type Logger = {
13
14
  };
14
15
  export type LogLevel = 'off' | 'error' | 'warn' | 'info' | 'debug';
15
16
 
17
+ export const defaultLogLevel: LogLevel = 'warn';
18
+
16
19
  const levelNumbers = {
17
20
  off: 0,
18
21
  error: 200,
@@ -24,7 +27,7 @@ const levelNumbers = {
24
27
  export const parseLogLevel = (
25
28
  maybeLevel: string | undefined,
26
29
  sourceName: string,
27
- client: BaseAnthropic,
30
+ logger: Logger,
28
31
  ): LogLevel | undefined => {
29
32
  if (!maybeLevel) {
30
33
  return undefined;
@@ -32,7 +35,7 @@ export const parseLogLevel = (
32
35
  if (hasOwn(levelNumbers, maybeLevel)) {
33
36
  return maybeLevel;
34
37
  }
35
- loggerFor(client).warn(
38
+ logger.warn(
36
39
  `${sourceName} was set to ${JSON.stringify(maybeLevel)}, expected one of ${JSON.stringify(
37
40
  Object.keys(levelNumbers),
38
41
  )}`,
@@ -60,13 +63,7 @@ const noopLogger = {
60
63
 
61
64
  let cachedLoggers = /* @__PURE__ */ new WeakMap<Logger, [LogLevel, Logger]>();
62
65
 
63
- export function loggerFor(client: BaseAnthropic): Logger {
64
- const logger = client.logger;
65
- const logLevel = client.logLevel ?? 'off';
66
- if (!logger) {
67
- return noopLogger;
68
- }
69
-
66
+ function filterLogger(logger: Logger, logLevel: LogLevel): Logger {
70
67
  const cachedLogger = cachedLoggers.get(logger);
71
68
  if (cachedLogger && cachedLogger[0] === logLevel) {
72
69
  return cachedLogger[1];
@@ -84,6 +81,39 @@ export function loggerFor(client: BaseAnthropic): Logger {
84
81
  return levelLogger;
85
82
  }
86
83
 
84
+ export function loggerFor(client: BaseAnthropic): Logger {
85
+ const logger = client.logger;
86
+ const logLevel = client.logLevel ?? 'off';
87
+ if (!logger) {
88
+ return noopLogger;
89
+ }
90
+ return filterLogger(logger, logLevel);
91
+ }
92
+
93
+ let lastEnvLevel: string | undefined;
94
+ let cachedDefaultLogger: Logger | undefined;
95
+
96
+ /**
97
+ * A logger matching the client defaults — `console`, filtered to
98
+ * `ANTHROPIC_LOG` or {@link defaultLogLevel} — for contexts with no client to
99
+ * read the configured `logger`/`logLevel` from.
100
+ *
101
+ * Cached per `ANTHROPIC_LOG` value so an invalid value warns once, like a
102
+ * client construction does, rather than on every request.
103
+ */
104
+ export function defaultLogger(): Logger {
105
+ const envLevel = readEnv('ANTHROPIC_LOG');
106
+ if (!cachedDefaultLogger || envLevel !== lastEnvLevel) {
107
+ lastEnvLevel = envLevel;
108
+ cachedDefaultLogger = filterLogger(
109
+ console,
110
+ parseLogLevel(envLevel, "process.env['ANTHROPIC_LOG']", filterLogger(console, defaultLogLevel)) ??
111
+ defaultLogLevel,
112
+ );
113
+ }
114
+ return cachedDefaultLogger;
115
+ }
116
+
87
117
  export const formatRequestDetails = (details: {
88
118
  options?: RequestOptions | undefined;
89
119
  headers?: Headers | Record<string, string> | undefined;
@@ -607,6 +607,11 @@ export class BetaMessageStream<ParsedT = null> implements AsyncIterable<BetaMess
607
607
  return snapshot;
608
608
  case 'content_block_start':
609
609
  snapshot.content.push(event.content_block);
610
+ if (event.content_block.type === 'fallback') {
611
+ // the final hop's fallback block names the model that served the response —
612
+ // keeps the snapshot consistent with the relabeled non-streaming message
613
+ snapshot.model = event.content_block.to.model;
614
+ }
610
615
  return snapshot;
611
616
  case 'content_block_delta': {
612
617
  const snapshotContent = snapshot.content.at(event.index);