From e2afb38d57df822a5f67efacc13dd040be0f216d Mon Sep 17 00:00:00 2001 From: Christopher Trott Date: Wed, 5 Nov 2025 11:02:23 +0900 Subject: [PATCH 1/3] Set instructions param in OpenAILanguageModel --- .../Models/OpenAILanguageModel.swift | 27 ++++++++++++++----- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/Sources/AnyLanguageModel/Models/OpenAILanguageModel.swift b/Sources/AnyLanguageModel/Models/OpenAILanguageModel.swift index c6f2f486..33dee870 100644 --- a/Sources/AnyLanguageModel/Models/OpenAILanguageModel.swift +++ b/Sources/AnyLanguageModel/Models/OpenAILanguageModel.swift @@ -87,9 +87,13 @@ public struct OpenAILanguageModel: LanguageModel { fatalError("OpenAILanguageModel only supports generating String content") } - let messages = [ - OpenAIMessage(role: .user, content: .text(prompt.description)) - ] + var messages: [OpenAIMessage] = [] + if let instructions = session.instructions, + !instructions.description.isEmpty + { + messages.append(OpenAIMessage(role: .system, content: .text(instructions.description))) + } + messages.append(OpenAIMessage(role: .user, content: .text(prompt.description))) // Convert tools if any are available in the session let openAITools: [OpenAITool]? = { @@ -231,9 +235,13 @@ public struct OpenAILanguageModel: LanguageModel { fatalError("OpenAILanguageModel only supports generating String content") } - let messages = [ - OpenAIMessage(role: .user, content: .text(prompt.description)) - ] + var messages: [OpenAIMessage] = [] + if let instructions = session.instructions, + !instructions.description.isEmpty + { + messages.append(OpenAIMessage(role: .system, content: .text(instructions.description))) + } + messages.append(OpenAIMessage(role: .user, content: .text(prompt.description))) // Convert tools if any are available in the session let openAITools: [OpenAITool]? = { @@ -435,7 +443,8 @@ private enum Responses { options: GenerationOptions, stream: Bool ) -> JSONValue { - // Extract the user message content for the input parameter + // Extract the system and user message content for the request + let systemMessage = messages.first { $0.role == .system } let userMessage = messages.first { $0.role == .user } let inputText = if case .text(let text) = userMessage?.content { text } else { "" } @@ -445,6 +454,10 @@ private enum Responses { "stream": .bool(stream), ] + if case .text(let instructions) = systemMessage?.content, !instructions.isEmpty { + body["instructions"] = .string(instructions) + } + if let tools { body["tools"] = .array(tools.map { $0.jsonValue(for: .responses) }) } From 1a4f75b476c76afa2f424a4d1c415338a2e09ff4 Mon Sep 17 00:00:00 2001 From: Christopher Trott Date: Wed, 5 Nov 2025 11:17:31 +0900 Subject: [PATCH 2/3] Don't check for empty string --- Sources/AnyLanguageModel/Models/OpenAILanguageModel.swift | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/Sources/AnyLanguageModel/Models/OpenAILanguageModel.swift b/Sources/AnyLanguageModel/Models/OpenAILanguageModel.swift index 33dee870..648d8ae6 100644 --- a/Sources/AnyLanguageModel/Models/OpenAILanguageModel.swift +++ b/Sources/AnyLanguageModel/Models/OpenAILanguageModel.swift @@ -88,9 +88,7 @@ public struct OpenAILanguageModel: LanguageModel { } var messages: [OpenAIMessage] = [] - if let instructions = session.instructions, - !instructions.description.isEmpty - { + if let instructions = session.instructions { messages.append(OpenAIMessage(role: .system, content: .text(instructions.description))) } messages.append(OpenAIMessage(role: .user, content: .text(prompt.description))) @@ -236,9 +234,7 @@ public struct OpenAILanguageModel: LanguageModel { } var messages: [OpenAIMessage] = [] - if let instructions = session.instructions, - !instructions.description.isEmpty - { + if let instructions = session.instructions { messages.append(OpenAIMessage(role: .system, content: .text(instructions.description))) } messages.append(OpenAIMessage(role: .user, content: .text(prompt.description))) From 0808738ade90e00ea039478e71f534fb985abb2c Mon Sep 17 00:00:00 2001 From: Christopher Trott Date: Wed, 5 Nov 2025 11:25:45 +0900 Subject: [PATCH 3/3] Don't check for empty string --- Sources/AnyLanguageModel/Models/OpenAILanguageModel.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/AnyLanguageModel/Models/OpenAILanguageModel.swift b/Sources/AnyLanguageModel/Models/OpenAILanguageModel.swift index 648d8ae6..e09afef3 100644 --- a/Sources/AnyLanguageModel/Models/OpenAILanguageModel.swift +++ b/Sources/AnyLanguageModel/Models/OpenAILanguageModel.swift @@ -450,7 +450,7 @@ private enum Responses { "stream": .bool(stream), ] - if case .text(let instructions) = systemMessage?.content, !instructions.isEmpty { + if case .text(let instructions) = systemMessage?.content { body["instructions"] = .string(instructions) }