From 340138e04cdeb7e85a9c3dd9ad1e5988ec6ece08 Mon Sep 17 00:00:00 2001 From: Krishna Das Meena Date: Thu, 3 Jul 2025 16:43:30 +0000 Subject: [PATCH 1/2] fix: handle 400 error in multi-turn SSE (closes #53) --- llm/openai/src/client.rs | 2 ++ llm/openai/src/conversions.rs | 18 +++++++++++++++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/llm/openai/src/client.rs b/llm/openai/src/client.rs index 688939a3..20c07ce2 100644 --- a/llm/openai/src/client.rs +++ b/llm/openai/src/client.rs @@ -208,6 +208,8 @@ pub enum InnerInputItem { #[serde(default)] detail: Detail, }, + #[serde(rename = "output_text")] + OutputText { text: String }, } #[derive(Debug, Clone, Serialize, Deserialize, Default)] diff --git a/llm/openai/src/conversions.rs b/llm/openai/src/conversions.rs index 43694c0f..77ebcb41 100644 --- a/llm/openai/src/conversions.rs +++ b/llm/openai/src/conversions.rs @@ -45,8 +45,9 @@ pub fn messages_to_input_items(messages: Vec) -> Vec { for message in messages { let role = to_openai_role_name(message.role).to_string(); let mut input_items = Vec::new(); + let is_assistant = role == "assistant"; // Only assistant messages get output_text for content_part in message.content { - input_items.push(content_part_to_inner_input_item(content_part)); + input_items.push(content_part_to_inner_input_item(content_part, is_assistant)); } items.push(InputItem::InputMessage { @@ -122,9 +123,15 @@ pub fn to_openai_role_name(role: Role) -> &'static str { } } -pub fn content_part_to_inner_input_item(content_part: ContentPart) -> InnerInputItem { +pub fn content_part_to_inner_input_item(content_part: ContentPart, is_assistant: bool) -> InnerInputItem { match content_part { - ContentPart::Text(msg) => InnerInputItem::TextInput { text: msg }, + ContentPart::Text(msg) => { + if is_assistant { + InnerInputItem::OutputText { text: msg } + } else { + InnerInputItem::TextInput { text: msg } + } + }, ContentPart::Image(image_reference) => match image_reference { ImageReference::Url(image_url) => InnerInputItem::ImageInput { image_url: image_url.url, @@ -234,3 +241,8 @@ pub fn create_response_metadata(response: &CreateModelResponseResponse) -> Respo provider_metadata_json: response.metadata.as_ref().map(|m| m.to_string()), } } + +fn main() { + println!("Hello, world!"); + // Or call your library code here +} From 4aa25cecc089237d3ecbbddfedf65e71183b8e79 Mon Sep 17 00:00:00 2001 From: KRISHNA DAS MEENA <97600190+Kdmeenaa@users.noreply.github.com> Date: Thu, 3 Jul 2025 22:28:35 +0530 Subject: [PATCH 2/2] fix: openai stream multi-turn bug (#53) --- .../anthropic/wit/deps/wasi\357\200\272io/error.wit" | 0 .../anthropic/wit/deps/wasi\357\200\272io/poll.wit" | 0 .../anthropic/wit/deps/wasi\357\200\272io/streams.wit" | 0 .../anthropic/wit/deps/wasi\357\200\272io/world.wit" | 0 .../error.wit => "llm/grok/wit/deps/wasi\357\200\272io/error.wit" | 0 .../poll.wit => "llm/grok/wit/deps/wasi\357\200\272io/poll.wit" | 0 .../grok/wit/deps/wasi\357\200\272io/streams.wit" | 0 .../world.wit => "llm/grok/wit/deps/wasi\357\200\272io/world.wit" | 0 .../error.wit => "llm/llm/wit/deps/wasi\357\200\272io/error.wit" | 0 .../poll.wit => "llm/llm/wit/deps/wasi\357\200\272io/poll.wit" | 0 .../llm/wit/deps/wasi\357\200\272io/streams.wit" | 0 .../world.wit => "llm/llm/wit/deps/wasi\357\200\272io/world.wit" | 0 .../ollama/wit/deps/wasi\357\200\272io/error.wit" | 0 .../poll.wit => "llm/ollama/wit/deps/wasi\357\200\272io/poll.wit" | 0 .../ollama/wit/deps/wasi\357\200\272io/streams.wit" | 0 .../ollama/wit/deps/wasi\357\200\272io/world.wit" | 0 .../openai/wit/deps/wasi\357\200\272io/error.wit" | 0 .../poll.wit => "llm/openai/wit/deps/wasi\357\200\272io/poll.wit" | 0 .../openai/wit/deps/wasi\357\200\272io/streams.wit" | 0 .../openai/wit/deps/wasi\357\200\272io/world.wit" | 0 .../openrouter/wit/deps/wasi\357\200\272io/error.wit" | 0 .../openrouter/wit/deps/wasi\357\200\272io/poll.wit" | 0 .../openrouter/wit/deps/wasi\357\200\272io/streams.wit" | 0 .../openrouter/wit/deps/wasi\357\200\272io/world.wit" | 0 .../error.wit => "llm/wit/deps/wasi\357\200\272io/error.wit" | 0 .../poll.wit => "llm/wit/deps/wasi\357\200\272io/poll.wit" | 0 .../streams.wit => "llm/wit/deps/wasi\357\200\272io/streams.wit" | 0 .../world.wit => "llm/wit/deps/wasi\357\200\272io/world.wit" | 0 28 files changed, 0 insertions(+), 0 deletions(-) rename llm/anthropic/wit/deps/wasi:io/error.wit => "llm/anthropic/wit/deps/wasi\357\200\272io/error.wit" (100%) rename llm/anthropic/wit/deps/wasi:io/poll.wit => "llm/anthropic/wit/deps/wasi\357\200\272io/poll.wit" (100%) rename llm/anthropic/wit/deps/wasi:io/streams.wit => "llm/anthropic/wit/deps/wasi\357\200\272io/streams.wit" (100%) rename llm/anthropic/wit/deps/wasi:io/world.wit => "llm/anthropic/wit/deps/wasi\357\200\272io/world.wit" (100%) rename llm/grok/wit/deps/wasi:io/error.wit => "llm/grok/wit/deps/wasi\357\200\272io/error.wit" (100%) rename llm/grok/wit/deps/wasi:io/poll.wit => "llm/grok/wit/deps/wasi\357\200\272io/poll.wit" (100%) rename llm/grok/wit/deps/wasi:io/streams.wit => "llm/grok/wit/deps/wasi\357\200\272io/streams.wit" (100%) rename llm/grok/wit/deps/wasi:io/world.wit => "llm/grok/wit/deps/wasi\357\200\272io/world.wit" (100%) rename llm/llm/wit/deps/wasi:io/error.wit => "llm/llm/wit/deps/wasi\357\200\272io/error.wit" (100%) rename llm/llm/wit/deps/wasi:io/poll.wit => "llm/llm/wit/deps/wasi\357\200\272io/poll.wit" (100%) rename llm/llm/wit/deps/wasi:io/streams.wit => "llm/llm/wit/deps/wasi\357\200\272io/streams.wit" (100%) rename llm/llm/wit/deps/wasi:io/world.wit => "llm/llm/wit/deps/wasi\357\200\272io/world.wit" (100%) rename llm/ollama/wit/deps/wasi:io/error.wit => "llm/ollama/wit/deps/wasi\357\200\272io/error.wit" (100%) rename llm/ollama/wit/deps/wasi:io/poll.wit => "llm/ollama/wit/deps/wasi\357\200\272io/poll.wit" (100%) rename llm/ollama/wit/deps/wasi:io/streams.wit => "llm/ollama/wit/deps/wasi\357\200\272io/streams.wit" (100%) rename llm/ollama/wit/deps/wasi:io/world.wit => "llm/ollama/wit/deps/wasi\357\200\272io/world.wit" (100%) rename llm/openai/wit/deps/wasi:io/error.wit => "llm/openai/wit/deps/wasi\357\200\272io/error.wit" (100%) rename llm/openai/wit/deps/wasi:io/poll.wit => "llm/openai/wit/deps/wasi\357\200\272io/poll.wit" (100%) rename llm/openai/wit/deps/wasi:io/streams.wit => "llm/openai/wit/deps/wasi\357\200\272io/streams.wit" (100%) rename llm/openai/wit/deps/wasi:io/world.wit => "llm/openai/wit/deps/wasi\357\200\272io/world.wit" (100%) rename llm/openrouter/wit/deps/wasi:io/error.wit => "llm/openrouter/wit/deps/wasi\357\200\272io/error.wit" (100%) rename llm/openrouter/wit/deps/wasi:io/poll.wit => "llm/openrouter/wit/deps/wasi\357\200\272io/poll.wit" (100%) rename llm/openrouter/wit/deps/wasi:io/streams.wit => "llm/openrouter/wit/deps/wasi\357\200\272io/streams.wit" (100%) rename llm/openrouter/wit/deps/wasi:io/world.wit => "llm/openrouter/wit/deps/wasi\357\200\272io/world.wit" (100%) rename llm/wit/deps/wasi:io/error.wit => "llm/wit/deps/wasi\357\200\272io/error.wit" (100%) rename llm/wit/deps/wasi:io/poll.wit => "llm/wit/deps/wasi\357\200\272io/poll.wit" (100%) rename llm/wit/deps/wasi:io/streams.wit => "llm/wit/deps/wasi\357\200\272io/streams.wit" (100%) rename llm/wit/deps/wasi:io/world.wit => "llm/wit/deps/wasi\357\200\272io/world.wit" (100%) diff --git a/llm/anthropic/wit/deps/wasi:io/error.wit "b/llm/anthropic/wit/deps/wasi\357\200\272io/error.wit" similarity index 100% rename from llm/anthropic/wit/deps/wasi:io/error.wit rename to "llm/anthropic/wit/deps/wasi\357\200\272io/error.wit" diff --git a/llm/anthropic/wit/deps/wasi:io/poll.wit "b/llm/anthropic/wit/deps/wasi\357\200\272io/poll.wit" similarity index 100% rename from llm/anthropic/wit/deps/wasi:io/poll.wit rename to "llm/anthropic/wit/deps/wasi\357\200\272io/poll.wit" diff --git a/llm/anthropic/wit/deps/wasi:io/streams.wit "b/llm/anthropic/wit/deps/wasi\357\200\272io/streams.wit" similarity index 100% rename from llm/anthropic/wit/deps/wasi:io/streams.wit rename to "llm/anthropic/wit/deps/wasi\357\200\272io/streams.wit" diff --git a/llm/anthropic/wit/deps/wasi:io/world.wit "b/llm/anthropic/wit/deps/wasi\357\200\272io/world.wit" similarity index 100% rename from llm/anthropic/wit/deps/wasi:io/world.wit rename to "llm/anthropic/wit/deps/wasi\357\200\272io/world.wit" diff --git a/llm/grok/wit/deps/wasi:io/error.wit "b/llm/grok/wit/deps/wasi\357\200\272io/error.wit" similarity index 100% rename from llm/grok/wit/deps/wasi:io/error.wit rename to "llm/grok/wit/deps/wasi\357\200\272io/error.wit" diff --git a/llm/grok/wit/deps/wasi:io/poll.wit "b/llm/grok/wit/deps/wasi\357\200\272io/poll.wit" similarity index 100% rename from llm/grok/wit/deps/wasi:io/poll.wit rename to "llm/grok/wit/deps/wasi\357\200\272io/poll.wit" diff --git a/llm/grok/wit/deps/wasi:io/streams.wit "b/llm/grok/wit/deps/wasi\357\200\272io/streams.wit" similarity index 100% rename from llm/grok/wit/deps/wasi:io/streams.wit rename to "llm/grok/wit/deps/wasi\357\200\272io/streams.wit" diff --git a/llm/grok/wit/deps/wasi:io/world.wit "b/llm/grok/wit/deps/wasi\357\200\272io/world.wit" similarity index 100% rename from llm/grok/wit/deps/wasi:io/world.wit rename to "llm/grok/wit/deps/wasi\357\200\272io/world.wit" diff --git a/llm/llm/wit/deps/wasi:io/error.wit "b/llm/llm/wit/deps/wasi\357\200\272io/error.wit" similarity index 100% rename from llm/llm/wit/deps/wasi:io/error.wit rename to "llm/llm/wit/deps/wasi\357\200\272io/error.wit" diff --git a/llm/llm/wit/deps/wasi:io/poll.wit "b/llm/llm/wit/deps/wasi\357\200\272io/poll.wit" similarity index 100% rename from llm/llm/wit/deps/wasi:io/poll.wit rename to "llm/llm/wit/deps/wasi\357\200\272io/poll.wit" diff --git a/llm/llm/wit/deps/wasi:io/streams.wit "b/llm/llm/wit/deps/wasi\357\200\272io/streams.wit" similarity index 100% rename from llm/llm/wit/deps/wasi:io/streams.wit rename to "llm/llm/wit/deps/wasi\357\200\272io/streams.wit" diff --git a/llm/llm/wit/deps/wasi:io/world.wit "b/llm/llm/wit/deps/wasi\357\200\272io/world.wit" similarity index 100% rename from llm/llm/wit/deps/wasi:io/world.wit rename to "llm/llm/wit/deps/wasi\357\200\272io/world.wit" diff --git a/llm/ollama/wit/deps/wasi:io/error.wit "b/llm/ollama/wit/deps/wasi\357\200\272io/error.wit" similarity index 100% rename from llm/ollama/wit/deps/wasi:io/error.wit rename to "llm/ollama/wit/deps/wasi\357\200\272io/error.wit" diff --git a/llm/ollama/wit/deps/wasi:io/poll.wit "b/llm/ollama/wit/deps/wasi\357\200\272io/poll.wit" similarity index 100% rename from llm/ollama/wit/deps/wasi:io/poll.wit rename to "llm/ollama/wit/deps/wasi\357\200\272io/poll.wit" diff --git a/llm/ollama/wit/deps/wasi:io/streams.wit "b/llm/ollama/wit/deps/wasi\357\200\272io/streams.wit" similarity index 100% rename from llm/ollama/wit/deps/wasi:io/streams.wit rename to "llm/ollama/wit/deps/wasi\357\200\272io/streams.wit" diff --git a/llm/ollama/wit/deps/wasi:io/world.wit "b/llm/ollama/wit/deps/wasi\357\200\272io/world.wit" similarity index 100% rename from llm/ollama/wit/deps/wasi:io/world.wit rename to "llm/ollama/wit/deps/wasi\357\200\272io/world.wit" diff --git a/llm/openai/wit/deps/wasi:io/error.wit "b/llm/openai/wit/deps/wasi\357\200\272io/error.wit" similarity index 100% rename from llm/openai/wit/deps/wasi:io/error.wit rename to "llm/openai/wit/deps/wasi\357\200\272io/error.wit" diff --git a/llm/openai/wit/deps/wasi:io/poll.wit "b/llm/openai/wit/deps/wasi\357\200\272io/poll.wit" similarity index 100% rename from llm/openai/wit/deps/wasi:io/poll.wit rename to "llm/openai/wit/deps/wasi\357\200\272io/poll.wit" diff --git a/llm/openai/wit/deps/wasi:io/streams.wit "b/llm/openai/wit/deps/wasi\357\200\272io/streams.wit" similarity index 100% rename from llm/openai/wit/deps/wasi:io/streams.wit rename to "llm/openai/wit/deps/wasi\357\200\272io/streams.wit" diff --git a/llm/openai/wit/deps/wasi:io/world.wit "b/llm/openai/wit/deps/wasi\357\200\272io/world.wit" similarity index 100% rename from llm/openai/wit/deps/wasi:io/world.wit rename to "llm/openai/wit/deps/wasi\357\200\272io/world.wit" diff --git a/llm/openrouter/wit/deps/wasi:io/error.wit "b/llm/openrouter/wit/deps/wasi\357\200\272io/error.wit" similarity index 100% rename from llm/openrouter/wit/deps/wasi:io/error.wit rename to "llm/openrouter/wit/deps/wasi\357\200\272io/error.wit" diff --git a/llm/openrouter/wit/deps/wasi:io/poll.wit "b/llm/openrouter/wit/deps/wasi\357\200\272io/poll.wit" similarity index 100% rename from llm/openrouter/wit/deps/wasi:io/poll.wit rename to "llm/openrouter/wit/deps/wasi\357\200\272io/poll.wit" diff --git a/llm/openrouter/wit/deps/wasi:io/streams.wit "b/llm/openrouter/wit/deps/wasi\357\200\272io/streams.wit" similarity index 100% rename from llm/openrouter/wit/deps/wasi:io/streams.wit rename to "llm/openrouter/wit/deps/wasi\357\200\272io/streams.wit" diff --git a/llm/openrouter/wit/deps/wasi:io/world.wit "b/llm/openrouter/wit/deps/wasi\357\200\272io/world.wit" similarity index 100% rename from llm/openrouter/wit/deps/wasi:io/world.wit rename to "llm/openrouter/wit/deps/wasi\357\200\272io/world.wit" diff --git a/llm/wit/deps/wasi:io/error.wit "b/llm/wit/deps/wasi\357\200\272io/error.wit" similarity index 100% rename from llm/wit/deps/wasi:io/error.wit rename to "llm/wit/deps/wasi\357\200\272io/error.wit" diff --git a/llm/wit/deps/wasi:io/poll.wit "b/llm/wit/deps/wasi\357\200\272io/poll.wit" similarity index 100% rename from llm/wit/deps/wasi:io/poll.wit rename to "llm/wit/deps/wasi\357\200\272io/poll.wit" diff --git a/llm/wit/deps/wasi:io/streams.wit "b/llm/wit/deps/wasi\357\200\272io/streams.wit" similarity index 100% rename from llm/wit/deps/wasi:io/streams.wit rename to "llm/wit/deps/wasi\357\200\272io/streams.wit" diff --git a/llm/wit/deps/wasi:io/world.wit "b/llm/wit/deps/wasi\357\200\272io/world.wit" similarity index 100% rename from llm/wit/deps/wasi:io/world.wit rename to "llm/wit/deps/wasi\357\200\272io/world.wit"