Repository: anthropics/anthropic-sdk-typescript

Issue:
Question about parsed field in block content
Hello guys, I update my library in my project and now im getting constant errors on content blocks, in the response of toolRunner, multiple calls returns a block with a field "parsed" it it. It doesn't matter if it is a tool call or not. I am constantly getting an error like `messages.3.content.3.text.parsed: Extra inputs are not permitted`

Im not sure what changes and what I need to do... is there someone with the same issue that can leave a hint?




Hints from issue comments:
@tony-oldport: I'm using version 0.70.1 and when I make a call to the beta version of `messages.stream()`, in the `finalMessage` event handler, the content blocks of type `text` in the final message have an extra field added `parsed`. When I persist the final message as is and send it back to the API for the next turn in a conversation I see the same error you're getting. I think the only solution currently is to remove the 'parsed' field before persisting and sending back.@RobertCraigie: Thanks for the report, this is a bug, it should be not enumerable so this doesn't happen.@RobertCraigie: Can you try `v0.71.1`?@tony-oldport: `v0.71.1` fixed the issue for me. Thanks!

Solution patch:
diff --git a/.release-please-manifest.json b/.release-please-manifest.json
index 8cf3011..8c14a26 100644
--- a/.release-please-manifest.json
+++ b/.release-please-manifest.json
@@ -1,5 +1,5 @@
 {
-  ".": "0.71.0",
+  ".": "0.71.1",
   "packages/vertex-sdk": "0.14.1",
   "packages/bedrock-sdk": "0.26.1",
   "packages/foundry-sdk": "0.2.1"
diff --git a/.stats.yml b/.stats.yml
index 21f30da..a2b0ec5 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
 configured_endpoints: 34
 openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/anthropic%2Fanthropic-a49e89deec4e00d1da490808099d66e2001531b12d8666a7f5d0b496f760440d.yml
 openapi_spec_hash: c93ef3808c58e233b01966ff154f31ce
-config_hash: 7e9dfe17ab5c80abee5372ce746a926e
+config_hash: a5d8cd02f9a686d4e0baa7ba652e3e55
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1b9c18f..2e6a1fb 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,21 @@
 # Changelog
 
+## 0.71.1 (2025-12-04)
+
+Full Changelog: [sdk-v0.71.0...sdk-v0.71.1](https://github.com/anthropics/anthropic-sdk-typescript/compare/sdk-v0.71.0...sdk-v0.71.1)
+
+### Bug Fixes
+
+* **parser:** use correct naming for parsed text blocks ([6472bcd](https://github.com/anthropics/anthropic-sdk-typescript/commit/6472bcd222f826a131d1abf20301a57749993d2f))
+* **structured outputs:** ensure parsed is not enumerable ([860175f](https://github.com/anthropics/anthropic-sdk-typescript/commit/860175ff77caf258a0ed3a0177f53f3a4a771064)), closes [#857](https://github.com/anthropics/anthropic-sdk-typescript/issues/857)
+
+
+### Chores
+
+* add deprecation warnings for accessing .parsed ([ae7a637](https://github.com/anthropics/anthropic-sdk-typescript/commit/ae7a637b86f8fa318df2257564c0a71ae37c0381))
+* **client:** fix logger property type ([e3e4d7c](https://github.com/anthropics/anthropic-sdk-typescript/commit/e3e4d7c40c986668ed46a3f4040d60bfd2c7e76b))
+* **internal:** upgrade eslint ([5fbe661](https://github.com/anthropics/anthropic-sdk-typescript/commit/5fbe661d009446ab98c7b7488a8955238276b55e))
+
 ## 0.71.0 (2025-11-24)
 
 Full Changelog: [sdk-v0.70.1...sdk-v0.71.0](https://github.com/anthropics/anthropic-sdk-typescript/compare/sdk-v0.70.1...sdk-v0.71.0)
diff --git a/package.json b/package.json
index d14b239..6d12e46 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@anthropic-ai/sdk",
-  "version": "0.71.0",
+  "version": "0.71.1",
   "description": "The official TypeScript library for the Anthropic API",
   "author": "Anthropic <support@anthropic.com>",
   "types": "dist/index.d.ts",
@@ -46,7 +46,7 @@
     "@typescript-eslint/eslint-plugin": "8.31.1",
     "@typescript-eslint/parser": "8.31.1",
     "deep-object-diff": "^1.1.9",
-    "eslint": "^9.20.1",
+    "eslint": "^9.39.1",
     "eslint-plugin-prettier": "^5.4.1",
     "eslint-plugin-unused-imports": "^4.1.4",
     "iconv-lite": "^0.6.3",
diff --git a/packages/vertex-sdk/yarn.lock b/packages/vertex-sdk/yarn.lock
index 7492c34..9028d30 100644
--- a/packages/vertex-sdk/yarn.lock
+++ b/packages/vertex-sdk/yarn.lock
@@ -17,7 +17,7 @@
 
 "@anthropic-ai/sdk@file:../../dist":
   # x-release-please-start-version
-  version "0.71.0"
+  version "0.71.1"
   # x-release-please-end-version
   dependencies:
     json-schema-to-ts "^3.1.1"
diff --git a/src/client.ts b/src/client.ts
index e79f9f6..5418a25 100644
--- a/src/client.ts
+++ b/src/client.ts
@@ -270,7 +270,7 @@ export class BaseAnthropic {
   baseURL: string;
   maxRetries: number;
   timeout: number;
-  logger: Logger | undefined;
+  logger: Logger;
   logLevel: LogLevel | undefined;
   fetchOptions: MergedRequestInit | undefined;
 
diff --git a/src/helpers/beta/json-schema.ts b/src/helpers/beta/json-schema.ts
index 4358629..f7b7496 100644
--- a/src/helpers/beta/json-schema.ts
+++ b/src/helpers/beta/json-schema.ts
@@ -37,7 +37,7 @@ export function betaTool<const Schema extends Exclude<JSONSchema, boolean> & { t
 /**
  * Creates a JSON schema output format object from the given JSON schema.
  * If this is passed to the `.parse()` method then the response message will contain a
- * `.parsed` property that is the result of parsing the content with the given JSON schema.
+ * `.parsed_output` property that is the result of parsing the content with the given JSON schema.
  *
  */
 export function betaJSONSchemaOutputFormat<
diff --git a/src/helpers/beta/zod.ts b/src/helpers/beta/zod.ts
index 242683e..48d0e92 100644
--- a/src/helpers/beta/zod.ts
+++ b/src/helpers/beta/zod.ts
@@ -9,7 +9,7 @@ import { BetaToolResultContentBlockParam } from '../../resources/beta';
  * Creates a JSON schema output format object from the given Zod schema.
  *
  * If this is passed to the `.parse()` method then the response message will contain a
- * `.parsed` property that is the result of parsing the content with the given Zod object.
+ * `.parsed_output` property that is the result of parsing the content with the given Zod object.
  *
  * This can be passed directly to the `.create()` method but will not
  * result in any automatic parsing, you'll have to parse the response yourself.
diff --git a/src/lib/BetaMessageStream.ts b/src/lib/BetaMessageStream.ts
index 88dd0a9..b319518 100644
--- a/src/lib/BetaMessageStream.ts
+++ b/src/lib/BetaMessageStream.ts
@@ -1,4 +1,5 @@
 import { partialParse } from '../_vendor/partial-json-parser/parser';
+import type { Logger } from '../client';
 import { AnthropicError, APIUserAbortError } from '../error';
 import { isAbortError } from '../internal/errors';
 import { type RequestOptions } from '../internal/request-options';
@@ -73,8 +74,9 @@ export class BetaMessageStream<ParsedT = null> implements AsyncIterable<BetaMess
   #catchingPromiseCreated = false;
   #response: Response | null | undefined;
   #request_id: string | null | undefined;
+  #logger: Logger;
 
-  constructor(params: MessageCreateParamsBase | null) {
+  constructor(params: MessageCreateParamsBase | null, opts?: { logger?: Logger | undefined }) {
     this.#connectedPromise = new Promise<Response | null>((resolve, reject) => {
       this.#resolveConnectedPromise = resolve;
       this.#rejectConnectedPromise = reject;
@@ -93,6 +95,7 @@ export class BetaMessageStream<ParsedT = null> implements AsyncIterable<BetaMess
     this.#endPromise.catch(() => {});
 
     this.#params = params;
+    this.#logger = opts?.logger ?? console;
   }
 
   get response(): Response | null | undefined {
@@ -147,8 +150,9 @@ export class BetaMessageStream<ParsedT = null> implements AsyncIterable<BetaMess
     messages: BetaMessages,
     params: MessageCreateParamsBase,
     options?: RequestOptions,
+    { logger }: { logger?: Logger | undefined } = {},
   ): BetaMessageStream<ParsedT> {
-    const runner = new BetaMessageStream<ParsedT>(params as MessageCreateParamsStreaming);
+    const runner = new BetaMessageStream<ParsedT>(params as MessageCreateParamsStreaming, { logger });
     for (const message of params.messages) {
       runner._addMessageParam(message);
     }
@@ -479,7 +483,10 @@ export class BetaMessageStream<ParsedT = null> implements AsyncIterable<BetaMess
       }
       case 'message_stop': {
         this._addMessageParam(messageSnapshot);
-        this._addMessage(maybeParseBetaMessage(messageSnapshot, this.#params), true);
+        this._addMessage(
+          maybeParseBetaMessage(messageSnapshot, this.#params, { logger: this.#logger }),
+          true,
+        );
         break;
       }
       case 'content_block_stop': {
@@ -504,7 +511,7 @@ export class BetaMessageStream<ParsedT = null> implements AsyncIterable<BetaMess
       throw new AnthropicError(`request ended without sending any chunks`);
     }
     this.#currentMessageSnapshot = undefined;
-    return maybeParseBetaMessage(snapshot, this.#params);
+    return maybeParseBetaMessage(snapshot, this.#params, { logger: this.#logger });
   }
 
   protected async _fromReadableStream(
diff --git a/src/lib/beta-parser.ts b/src/lib/beta-parser.ts
index bcccb73..d29fbac 100644
--- a/src/lib/beta-parser.ts
+++ b/src/lib/beta-parser.ts
@@ -1,3 +1,4 @@
+import type { Logger } from '../client';
 import { AnthropicError } from '../core/error';
 import {
   BetaContentBlock,
@@ -29,22 +30,33 @@ export type ParsedBetaMessage<ParsedT> = BetaMessage & {
 };
 
 export type ParsedBetaContentBlock<ParsedT> =
-  | (BetaTextBlock & { parsed: ParsedT | null })
+  | (BetaTextBlock & { parsed_output: ParsedT | null })
   | Exclude<BetaContentBlock, BetaTextBlock>;
 
 export function maybeParseBetaMessage<Params extends BetaParseableMessageCreateParams | null>(
   message: BetaMessage,
   params: Params,
+  opts: { logger: Logger },
 ): ParsedBetaMessage<ExtractParsedContentFromBetaParams<NonNullable<Params>>> {
   if (!params || !('parse' in (params.output_format ?? {}))) {
     return {
       ...message,
       content: message.content.map((block) => {
         if (block.type === 'text') {
-          return {
-            ...block,
-            parsed: null,
-          };
+          const parsedBlock = Object.defineProperty({ ...block }, 'parsed_output', {
+            value: null,
+            enumerable: false,
+          }) as ParsedBetaContentBlock<ExtractParsedContentFromBetaParams<NonNullable<Params>>>;
+
+          return Object.defineProperty(parsedBlock, 'parsed', {
+            get() {
+              opts.logger.warn(
+                'The `parsed` property on `text` blocks is deprecated, please use `parsed_output` instead.',
+              );
+              return null;
+            },
+            enumerable: false,
+          });
         }
         return block;
       }),
@@ -52,28 +64,38 @@ export function maybeParseBetaMessage<Params extends BetaParseableMessageCreateP
     } as ParsedBetaMessage<ExtractParsedContentFromBetaParams<NonNullable<Params>>>;
   }
 
-  return parseBetaMessage(message, params);
+  return parseBetaMessage(message, params, opts);
 }
 
 export function parseBetaMessage<Params extends BetaParseableMessageCreateParams>(
   message: BetaMessage,
   params: Params,
+  opts: { logger: Logger },
 ): ParsedBetaMessage<ExtractParsedContentFromBetaParams<Params>> {
-  let firstParsed: ReturnType<typeof parseBetaOutputFormat<Params>> | null = null;
+  let firstParsedOutput: ReturnType<typeof parseBetaOutputFormat<Params>> | null = null;
 
   const content: Array<ParsedBetaContentBlock<ExtractParsedContentFromBetaParams<Params>>> =
     message.content.map((block) => {
       if (block.type === 'text') {
-        const parsed = parseBetaOutputFormat(params, block.text);
+        const parsedOutput = parseBetaOutputFormat(params, block.text);
 
-        if (firstParsed === null) {
-          firstParsed = parsed;
+        if (firstParsedOutput === null) {
+          firstParsedOutput = parsedOutput;
         }
 
-        return {
-          ...block,
-          parsed,
-        };
+        const parsedBlock = Object.defineProperty({ ...block }, 'parsed_output', {
+          value: parsedOutput,
+          enumerable: false,
+        }) as ParsedBetaContentBlock<ExtractParsedContentFromBetaParams<Params>>;
+        return Object.defineProperty(parsedBlock, 'parsed', {
+          get() {
+            opts.logger.warn(
+              'The `parsed` property on `text` blocks is deprecated, please use `parsed_output` instead.',
+            );
+            return parsedOutput;
+          },
+          enumerable: false,
+        });
       }
       return block;
     });
@@ -81,7 +103,7 @@ export function parseBetaMessage<Params extends BetaParseableMessageCreateParams
   return {
     ...message,
     content,
-    parsed_output: firstParsed,
+    parsed_output: firstParsedOutput,
   } as ParsedBetaMessage<ExtractParsedContentFromBetaParams<Params>>;
 }
 
diff --git a/src/resources/beta/messages/messages.ts b/src/resources/beta/messages/messages.ts
index 8722dae..8f9e26f 100644
--- a/src/resources/beta/messages/messages.ts
+++ b/src/resources/beta/messages/messages.ts
@@ -123,7 +123,7 @@ export class Messages extends APIResource {
 
   /**
    * Send a structured list of input messages with text and/or image content, along with an expected `output_format` and
-   * the response will be automatically parsed and available in the `parsed` property of the message.
+   * the response will be automatically parsed and available in the `parsed_output` property of the message.
    *
    * @example
    * ```ts
@@ -134,7 +134,7 @@ export class Messages extends APIResource {
    *   output_format: zodOutputFormat(z.object({ answer: z.number() }), 'math'),
    * });
    *
-   * console.log(message.parsed?.answer); // 4
+   * console.log(message.parsed_output?.answer); // 4
    * ```
    */
   parse<Params extends MessageCreateParamsNonStreaming>(
@@ -149,9 +149,9 @@ export class Messages extends APIResource {
       ]),
     };
 
-    return this.create(params, options).then((message) => parseBetaMessage(message, params)) as APIPromise<
-      ParsedBetaMessage<ExtractParsedContentFromBetaParams<Params>>
-    >;
+    return this.create(params, options).then((message) =>
+      parseBetaMessage(message, params, { logger: this._client.logger ?? console }),
+    ) as APIPromise<ParsedBetaMessage<ExtractParsedContentFromBetaParams<Params>>>;
   }
 
   /**
diff --git a/src/version.ts b/src/version.ts
index 5f6b920..a7af286 100644
--- a/src/version.ts
+++ b/src/version.ts
@@ -1 +1 @@
-export const VERSION = '0.71.0'; // x-release-please-version
+export const VERSION = '0.71.1'; // x-release-please-version
diff --git a/yarn.lock b/yarn.lock
index 991842f..5b10e36 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -355,45 +355,52 @@
   dependencies:
     "@cspotcode/source-map-consumer" "0.8.0"
 
-"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0":
+"@eslint-community/eslint-utils@^4.4.0":
   version "4.4.0"
   resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59"
   integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==
   dependencies:
     eslint-visitor-keys "^3.3.0"
 
+"@eslint-community/eslint-utils@^4.8.0":
+  version "4.9.0"
+  resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz#7308df158e064f0dd8b8fdb58aa14fa2a7f913b3"
+  integrity sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==
+  dependencies:
+    eslint-visitor-keys "^3.4.3"
+
 "@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.12.1":
   version "4.12.1"
   resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0"
   integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==
 
-"@eslint/config-array@^0.19.0":
-  version "0.19.2"
-  resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.19.2.tgz#3060b809e111abfc97adb0bb1172778b90cb46aa"
-  integrity sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==
+"@eslint/config-array@^0.21.1":
+  version "0.21.1"
+  resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.21.1.tgz#7d1b0060fea407f8301e932492ba8c18aff29713"
+  integrity sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==
   dependencies:
-    "@eslint/object-schema" "^2.1.6"
+    "@eslint/object-schema" "^2.1.7"
     debug "^4.3.1"
     minimatch "^3.1.2"
 
-"@eslint/core@^0.10.0":
-  version "0.10.0"
-  resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.10.0.tgz#23727063c21b335f752dbb3a16450f6f9cbc9091"
-  integrity sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==
+"@eslint/config-helpers@^0.4.2":
+  version "0.4.2"
+  resolved "https://registry.yarnpkg.com/@eslint/config-helpers/-/config-helpers-0.4.2.tgz#1bd006ceeb7e2e55b2b773ab318d300e1a66aeda"
+  integrity sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==
   dependencies:
-    "@types/json-schema" "^7.0.15"
+    "@eslint/core" "^0.17.0"
 
-"@eslint/core@^0.11.0":
-  version "0.11.0"
-  resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.11.0.tgz#7a9226e850922e42cbd2ba71361eacbe74352a12"
-  integrity sha512-DWUB2pksgNEb6Bz2fggIy1wh6fGgZP4Xyy/Mt0QZPiloKKXerbqq9D3SBQTlCRYOrcRPu4vuz+CGjwdfqxnoWA==
+"@eslint/core@^0.17.0":
+  version "0.17.0"
+  resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.17.0.tgz#77225820413d9617509da9342190a2019e78761c"
+  integrity sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==
   dependencies:
     "@types/json-schema" "^7.0.15"
 
-"@eslint/eslintrc@^3.2.0":
-  version "3.2.0"
-  resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.2.0.tgz#57470ac4e2e283a6bf76044d63281196e370542c"
-  integrity sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==
+"@eslint/eslintrc@^3.3.1":
+  version "3.3.3"
+  resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.3.3.tgz#26393a0806501b5e2b6a43aa588a4d8df67880ac"
+  integrity sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==
   dependencies:
     ajv "^6.12.4"
     debug "^4.3.2"
@@ -401,26 +408,26 @@
     globals "^14.0.0"
     ignore "^5.2.0"
     import-fresh "^3.2.1"
-    js-yaml "^4.1.0"
+    js-yaml "^4.1.1"
     minimatch "^3.1.2"
     strip-json-comments "^3.1.1"
 
-"@eslint/js@9.20.0":
-  version "9.20.0"
-  resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.20.0.tgz#7421bcbe74889fcd65d1be59f00130c289856eb4"
-  integrity sha512-iZA07H9io9Wn836aVTytRaNqh00Sad+EamwOVJT12GTLw1VGMFV/4JaME+JjLtr9fiGaoWgYnS54wrfWsSs4oQ==
+"@eslint/js@9.39.1":
+  version "9.39.1"
+  resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.39.1.tgz#0dd59c3a9f40e3f1882975c321470969243e0164"
+  integrity sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==
 
-"@eslint/object-schema@^2.1.6":
-  version "2.1.6"
-  resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.6.tgz#58369ab5b5b3ca117880c0f6c0b0f32f6950f24f"
-  integrity sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==
+"@eslint/object-schema@^2.1.7":
+  version "2.1.7"
+  resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.7.tgz#6e2126a1347e86a4dedf8706ec67ff8e107ebbad"
+  integrity sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==
 
-"@eslint/plugin-kit@^0.2.5":
-  version "0.2.5"
-  resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.2.5.tgz#ee07372035539e7847ef834e3f5e7b79f09e3a81"
-  integrity sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A==
+"@eslint/plugin-kit@^0.4.1":
+  version "0.4.1"
+  resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz#9779e3fd9b7ee33571a57435cf4335a1794a6cb2"
+  integrity sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==
   dependencies:
-    "@eslint/core" "^0.10.0"
+    "@eslint/core" "^0.17.0"
     levn "^0.4.1"
 
 "@humanfs/core@^0.19.1":
@@ -446,10 +453,10 @@
   resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.3.1.tgz#c72a5c76a9fbaf3488e231b13dc52c0da7bab42a"
   integrity sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==
 
-"@humanwhocodes/retry@^0.4.1":
-  version "0.4.1"
-  resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.1.tgz#9a96ce501bc62df46c4031fbd970e3cc6b10f07b"
-  integrity sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==
+"@humanwhocodes/retry@^0.4.2":
+  version "0.4.3"
+  resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.3.tgz#c2b9d2e374ee62c586d3adbea87199b1d7a7a6ba"
+  integrity sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==
 
 "@istanbuljs/load-nyc-config@^1.0.0":
   version "1.1.0"
@@ -1092,6 +1099,11 @@ acorn@^8.14.0:
   resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.0.tgz#063e2c70cac5fb4f6467f0b11152e04c682795b0"
   integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==
 
+acorn@^8.15.0:
+  version "8.15.0"
+  resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.15.0.tgz#a360898bc415edaac46c8241f6383975b930b816"
+  integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==
+
 acorn@^8.4.1:
   version "8.7.0"
   resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf"
@@ -1600,15 +1612,15 @@ eslint-plugin-unused-imports@^4.1.4:
   resolved "https://registry.yarnpkg.com/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-4.1.4.tgz#62ddc7446ccbf9aa7b6f1f0b00a980423cda2738"
   integrity sha512-YptD6IzQjDardkl0POxnnRBhU1OEePMV0nd6siHaRBbd+lyh6NAhFEobiznKU7kTsSsDeSD62Pe7kAM1b7dAZQ==
 
-eslint-scope@^8.2.0:
-  version "8.2.0"
-  resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.2.0.tgz#377aa6f1cb5dc7592cfd0b7f892fd0cf352ce442"
-  integrity sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==
+eslint-scope@^8.4.0:
+  version "8.4.0"
+  resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.4.0.tgz#88e646a207fad61436ffa39eb505147200655c82"
+  integrity sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==
   dependencies:
     esrecurse "^4.3.0"
     estraverse "^5.2.0"
 
-eslint-visitor-keys@^3.3.0:
+eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.3:
   version "3.4.3"
   resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800"
   integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==
@@ -1618,31 +1630,36 @@ eslint-visitor-keys@^4.2.0:
   resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz#687bacb2af884fcdda8a6e7d65c606f46a14cd45"
   integrity sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==
 
-eslint@^9.20.1:
-  version "9.20.1"
-  resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.20.1.tgz#923924c078f5226832449bac86662dd7e53c91d6"
-  integrity sha512-m1mM33o6dBUjxl2qb6wv6nGNwCAsns1eKtaQ4l/NPHeTvhiUPbtdfMyktxN4B3fgHIgsYh1VT3V9txblpQHq+g==
+eslint-visitor-keys@^4.2.1:
+  version "4.2.1"
+  resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz#4cfea60fe7dd0ad8e816e1ed026c1d5251b512c1"
+  integrity sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==
+
+eslint@^9.39.1:
+  version "9.39.1"
+  resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.39.1.tgz#be8bf7c6de77dcc4252b5a8dcb31c2efff74a6e5"
+  integrity sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==
   dependencies:
-    "@eslint-community/eslint-utils" "^4.2.0"
+    "@eslint-community/eslint-utils" "^4.8.0"
     "@eslint-community/regexpp" "^4.12.1"
-    "@eslint/config-array" "^0.19.0"
-    "@eslint/core" "^0.11.0"
-    "@eslint/eslintrc" "^3.2.0"
-    "@eslint/js" "9.20.0"
-    "@eslint/plugin-kit" "^0.2.5"
+    "@eslint/config-array" "^0.21.1"
+    "@eslint/config-helpers" "^0.4.2"
+    "@eslint/core" "^0.17.0"
+    "@eslint/eslintrc" "^3.3.1"
+    "@eslint/js" "9.39.1"
+    "@eslint/plugin-kit" "^0.4.1"
     "@humanfs/node" "^0.16.6"
     "@humanwhocodes/module-importer" "^1.0.1"
-    "@humanwhocodes/retry" "^0.4.1"
+    "@humanwhocodes/retry" "^0.4.2"
     "@types/estree" "^1.0.6"
-    "@types/json-schema" "^7.0.15"
     ajv "^6.12.4"
     chalk "^4.0.0"
     cross-spawn "^7.0.6"
     debug "^4.3.2"
     escape-string-regexp "^4.0.0"
-    eslint-scope "^8.2.0"
-    eslint-visitor-keys "^4.2.0"
-    espree "^10.3.0"
+    eslint-scope "^8.4.0"
+    eslint-visitor-keys "^4.2.1"
+    espree "^10.4.0"
     esquery "^1.5.0"
     esutils "^2.0.2"
     fast-deep-equal "^3.1.3"
@@ -1658,7 +1675,7 @@ eslint@^9.20.1:
     natural-compare "^1.4.0"
     optionator "^0.9.3"
 
-espree@^10.0.1, espree@^10.3.0:
+espree@^10.0.1:
   version "10.3.0"
   resolved "https://registry.yarnpkg.com/espree/-/espree-10.3.0.tgz#29267cf5b0cb98735b65e64ba07e0ed49d1eed8a"
   integrity sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==
@@ -1667,6 +1684,15 @@ espree@^10.0.1, espree@^10.3.0:
     acorn-jsx "^5.3.2"
     eslint-visitor-keys "^4.2.0"
 
+espree@^10.4.0:
+  version "10.4.0"
+  resolved "https://registry.yarnpkg.com/espree/-/espree-10.4.0.tgz#d54f4949d4629005a1fa168d937c3ff1f7e2a837"
+  integrity sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==
+  dependencies:
+    acorn "^8.15.0"
+    acorn-jsx "^5.3.2"
+    eslint-visitor-keys "^4.2.1"
+
 esprima@^4.0.0:
   version "4.0.1"
   resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
@@ -2485,10 +2511,10 @@ js-yaml@^3.13.1:
     argparse "^1.0.7"
     esprima "^4.0.0"
 
-js-yaml@^4.1.0:
-  version "4.1.0"
-  resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602"
-  integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==
+js-yaml@^4.1.1:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.1.tgz#854c292467705b699476e1a2decc0c8a3458806b"
+  integrity sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==
   dependencies:
     argparse "^2.0.1"
 



Test patch:
diff --git a/tests/api-resources/BetaMessageStream.test.ts b/tests/api-resources/BetaMessageStream.test.ts
index f548c43..b72f994 100644
--- a/tests/api-resources/BetaMessageStream.test.ts
+++ b/tests/api-resources/BetaMessageStream.test.ts
@@ -77,7 +77,6 @@ const EXPECTED_INCOMPLETE_MESSAGE = {
   type: 'message',
   content: [
     {
-      parsed: null,
       type: 'text',
       text: "I'll create a comprehensive tax guide for someone with multiple W2s and save it in a file called taxes.txt. Let me do that for you now.",
     },
diff --git a/tests/lib/parser.test.ts b/tests/lib/parser.test.ts
index 46cb466..4b55a98 100644
--- a/tests/lib/parser.test.ts
+++ b/tests/lib/parser.test.ts
@@ -7,6 +7,9 @@ import {
   parseBetaMessage,
 } from '../../src/lib/beta-parser';
 import type { BetaMessage } from '../../src/resources/beta/messages/messages';
+import { Logger } from '@anthropic-ai/sdk/client';
+
+const opts: { logger: Logger } = { logger: console };
 
 describe('Parser', () => {
   describe('zodOutputFormat', () => {
@@ -96,7 +99,7 @@ describe('Parser', () => {
         output_format: betaZodOutputFormat(schema),
       };
 
-      const parsed = parseBetaMessage(mockMessage, params);
+      const parsed = parseBetaMessage(mockMessage, params, opts);
 
       expect(parsed.parsed_output).toEqual({
         city: 'San Francisco',
@@ -105,7 +108,7 @@ describe('Parser', () => {
       expect(parsed.content[0]).toMatchObject({
         type: 'text',
         text: '{"city":"San Francisco","temperature":72}',
-        parsed: {
+        parsed_output: {
           city: 'San Francisco',
           temperature: 72,
         },
@@ -136,7 +139,7 @@ describe('Parser', () => {
         ],
       };
 
-      expect(() => parseBetaMessage(invalidMessage, params)).toThrow();
+      expect(() => parseBetaMessage(invalidMessage, params, opts)).toThrow();
     });
 
     it('handles invalid JSON', () => {
@@ -162,7 +165,7 @@ describe('Parser', () => {
         ],
       };
 
-      expect(() => parseBetaMessage(invalidMessage, params)).toThrow(AnthropicError);
+      expect(() => parseBetaMessage(invalidMessage, params, opts)).toThrow(AnthropicError);
     });
 
     it('handles messages without text blocks', () => {
@@ -182,7 +185,7 @@ describe('Parser', () => {
         content: [],
       };
 
-      const parsed = parseBetaMessage(messageWithoutText, params);
+      const parsed = parseBetaMessage(messageWithoutText, params, opts);
 
       expect(parsed.parsed_output).toBe(null);
       expect(parsed.content).toEqual([]);
@@ -216,15 +219,15 @@ describe('Parser', () => {
         ],
       };
 
-      const parsed = parseBetaMessage(multiContentMessage, params);
+      const parsed = parseBetaMessage(multiContentMessage, params, opts);
 
       expect(parsed.parsed_output).toEqual({ city: 'San Francisco' });
       expect(parsed.content).toHaveLength(2);
       expect(parsed.content[0]).toMatchObject({
-        parsed: { city: 'San Francisco' },
+        parsed_output: { city: 'San Francisco' },
       });
       expect(parsed.content[1]).toMatchObject({
-        parsed: { city: 'Los Angeles' },
+        parsed_output: { city: 'Los Angeles' },
       });
     });
   });
@@ -269,11 +272,33 @@ describe('Parser', () => {
         output_format: betaZodOutputFormat(schema),
       };
 
-      const parsed = maybeParseBetaMessage(mockMessage, params);
+      const parsed = maybeParseBetaMessage(mockMessage, params, opts);
 
       expect(parsed.parsed_output).toEqual({ city: 'San Francisco' });
     });
 
+    it('reports deprecation warnings for .parsed', () => {
+      const params: BetaParseableMessageCreateParams = {
+        model: 'claude-3-5-sonnet-20241022',
+        max_tokens: 1024,
+        messages: [{ role: 'user', content: 'test' }],
+        output_format: betaZodOutputFormat(z.object({ city: z.string() })),
+      };
+
+      const mockLogger = { warn: jest.fn() };
+
+      const parsed = maybeParseBetaMessage(mockMessage, params, { logger: mockLogger as any });
+      expect(parsed.parsed_output).toEqual({ city: 'San Francisco' });
+      expect((parsed.content[0] as any).parsed_output).toEqual({ city: 'San Francisco' });
+      expect(mockLogger.warn).toHaveBeenCalledTimes(0);
+
+      expect((parsed.content[0] as any).parsed).toEqual({ city: 'San Francisco' });
+      expect(mockLogger.warn).toHaveBeenCalledTimes(1);
+      expect(mockLogger.warn).toHaveBeenCalledWith(
+        'The `parsed` property on `text` blocks is deprecated, please use `parsed_output` instead.',
+      );
+    });
+
     it('does not parse when params have no auto-parseable input', () => {
       const params: BetaParseableMessageCreateParams = {
         model: 'claude-3-5-sonnet-20241022',
@@ -281,22 +306,22 @@ describe('Parser', () => {
         messages: [{ role: 'user', content: 'test' }],
       };
 
-      const parsed = maybeParseBetaMessage(mockMessage, params);
+      const parsed = maybeParseBetaMessage(mockMessage, params, opts);
 
       expect(parsed.parsed_output).toBe(null);
       expect(parsed.content[0]).toMatchObject({
         type: 'text',
         text: '{"city":"San Francisco"}',
-        parsed: null,
+        parsed_output: null,
       });
     });
 
     it('handles null params', () => {
-      const parsed = maybeParseBetaMessage(mockMessage, null);
+      const parsed = maybeParseBetaMessage(mockMessage, null, opts);
 
       expect(parsed.parsed_output).toBe(null);
       expect(parsed.content[0]).toMatchObject({
-        parsed: null,
+        parsed_output: null,
       });
     });
   });
diff --git a/tests/resources/beta/messages/parse.test.ts b/tests/resources/beta/messages/parse.test.ts
index e71a40d..eb86679 100644
--- a/tests/resources/beta/messages/parse.test.ts
+++ b/tests/resources/beta/messages/parse.test.ts
@@ -81,7 +81,7 @@ describe('Messages.parse()', () => {
     expect(result.content[0]).toMatchObject({
       type: 'text',
       text: '{"city":"San Francisco","temperature":72,"conditions":["sunny","clear"]}',
-      parsed: {
+      parsed_output: {
         city: 'San Francisco',
         temperature: 72,
         conditions: ['sunny', 'clear'],