From bed8ef8c896ac9b2fd71b1ac08642aebc1a54ac0 Mon Sep 17 00:00:00 2001 From: Thomas Kosiewski Date: Sun, 25 Oct 2026 18:37:21 +0000 Subject: [PATCH] test(effect): pin empty structuredOutputText in json generate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A JSON generate call whose result sets structuredOutputText to "" must parse "" (a deliberate selection), not fall back to the text parts. The new unit test gives valid JSON in the text parts and an empty structuredOutputText, and expects a StructuredOutputError whose responseText is "". A truthiness check in the bridge fails the test. Signed-off-by: Thomas Kosiewski --- _Generated with [`xum`](https://github.com/coder/xum) • Model: `anthropic:claude-opus-5-5` • Thinking: `high`_ Change-Id: Ibba7c5785a9482416e0173d0b49495ee469599c4 --- packages/effect/test/language-model.test.ts | 23 +++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/packages/effect/test/language-model.test.ts b/packages/effect/test/language-model.test.ts index 357ee31..48dfa81 100644 --- a/packages/effect/test/language-model.test.ts +++ b/packages/effect/test/language-model.test.ts @@ -580,6 +580,29 @@ describe("generateObject", () => { // Plain text calls keep every text part. expect(text.text).toBe(`{"city":"Bonn","temperature":9}{"city":"Berlin","temperature":21}`); }); + + it("decodes an empty structuredOutputText instead of falling back to the text parts", async () => { + // An empty string is a deliberate selection, not "unset": the text parts + // hold valid JSON, but the call must parse "" and fail. + const model = fakeModel({ + doGenerate: async () => ({ + content: [{ type: "text", text: `{"city":"Berlin","temperature":21}` }], + structuredOutputText: "", + finishReason: { unified: "stop", raw: undefined }, + usage: USAGE, + warnings: [], + }), + }); + + const Weather = Schema.Struct({ city: Schema.String, temperature: Schema.Finite }); + const exit = await Effect.runPromiseExit( + Effect.flatMap(service(model), (m) => + m.generateObject({ prompt: "weather in berlin", schema: Weather }), + ), + ); + + expect(failure(exit).reason).toMatchObject({ _tag: "StructuredOutputError", responseText: "" }); + }); }); describe("streamText", () => {