diff --git a/.changeset/fix-openai-system-input-text.md b/.changeset/fix-openai-system-input-text.md new file mode 100644 index 00000000000..830f6d00e12 --- /dev/null +++ b/.changeset/fix-openai-system-input-text.md @@ -0,0 +1,5 @@ +--- +"@effect/ai-openai": patch +--- + +Encode OpenAI Responses API system messages as typed input text content. diff --git a/packages/ai/openai/src/OpenAiLanguageModel.ts b/packages/ai/openai/src/OpenAiLanguageModel.ts index aff410fbeb0..0ef31bf518c 100644 --- a/packages/ai/openai/src/OpenAiLanguageModel.ts +++ b/packages/ai/openai/src/OpenAiLanguageModel.ts @@ -816,7 +816,7 @@ const prepareMessages = Effect.fnUntraced( case "system": { messages.push({ role: getSystemMessageMode(config.model as string), - content: message.content + content: [{ type: "input_text", text: message.content }] }) break } diff --git a/packages/ai/openai/test/OpenAiLanguageModel.test.ts b/packages/ai/openai/test/OpenAiLanguageModel.test.ts index c39b968bfd1..1250b88b922 100644 --- a/packages/ai/openai/test/OpenAiLanguageModel.test.ts +++ b/packages/ai/openai/test/OpenAiLanguageModel.test.ts @@ -46,7 +46,10 @@ describe("OpenAiLanguageModel", () => { const systemMessage = body.input.find((m: any) => m.role === "system") assert.isDefined(systemMessage) - strictEqual(systemMessage.content, "You are a helpful assistant") + deepStrictEqual(systemMessage.content, [{ + type: "input_text", + text: "You are a helpful assistant" + }]) }).pipe(Effect.provide(makeTestLayer()))) it.effect("uses developer role for reasoning models", () => @@ -63,7 +66,10 @@ describe("OpenAiLanguageModel", () => { const devMessage = body.input.find((m: any) => m.role === "developer") assert.isDefined(devMessage) - strictEqual(devMessage.content, "You are a helpful assistant") + deepStrictEqual(devMessage.content, [{ + type: "input_text", + text: "You are a helpful assistant" + }]) }).pipe(Effect.provide(makeTestLayer({ body: { model: "o1" } })))) it.effect("uses developer role for gpt-5 models", () =>