Skip to content

Commit 64f086b

Browse files
committed
Merge remote-tracking branch 'origin/pr/1' into codex/merge-pr-1
2 parents f7cdce2 + 2e88158 commit 64f086b

2 files changed

Lines changed: 55 additions & 25 deletions

File tree

core/src/llm/openai.rs

Lines changed: 8 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -669,14 +669,9 @@ impl LlmClient for OpenAiClient {
669669
as u64,
670670
);
671671
}
672-
if let Some(delta) = Self::merge_stream_text(
673-
&mut text_content,
674-
&reasoning,
675-
) {
676-
let _ = tx
677-
.send(StreamEvent::ReasoningDelta(delta))
678-
.await;
679-
}
672+
let _ = tx
673+
.send(StreamEvent::ReasoningDelta(reasoning))
674+
.await;
680675
}
681676
if !skip_content {
682677
if let Some(content) = message
@@ -720,13 +715,9 @@ impl LlmClient for OpenAiClient {
720715
as u64,
721716
);
722717
}
723-
if let Some(delta) =
724-
Self::merge_stream_text(&mut text_content, rc)
725-
{
726-
let _ = tx
727-
.send(StreamEvent::ReasoningDelta(delta))
728-
.await;
729-
}
718+
let _ = tx
719+
.send(StreamEvent::ReasoningDelta(rc.clone()))
720+
.await;
730721
}
731722

732723
if let Some(content) = delta.content {
@@ -840,11 +831,7 @@ impl LlmClient for OpenAiClient {
840831
first_token_ms =
841832
Some(request_started_at.elapsed().as_millis() as u64);
842833
}
843-
if let Some(delta) =
844-
Self::merge_stream_text(&mut text_content, &reasoning)
845-
{
846-
let _ = tx.send(StreamEvent::ReasoningDelta(delta)).await;
847-
}
834+
let _ = tx.send(StreamEvent::ReasoningDelta(reasoning)).await;
848835
}
849836
if !skip_content {
850837
if let Some(content) =
@@ -877,11 +864,7 @@ impl LlmClient for OpenAiClient {
877864
first_token_ms =
878865
Some(request_started_at.elapsed().as_millis() as u64);
879866
}
880-
if let Some(delta) =
881-
Self::merge_stream_text(&mut text_content, rc)
882-
{
883-
let _ = tx.send(StreamEvent::ReasoningDelta(delta)).await;
884-
}
867+
let _ = tx.send(StreamEvent::ReasoningDelta(rc.clone())).await;
885868
}
886869
if let Some(content) = delta.content {
887870
if first_token_ms.is_none() {

core/src/llm/tests.rs

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1391,6 +1391,53 @@ mod extra_llm_tests2 {
13911391
assert_eq!(message.reasoning_content.as_deref(), Some("done"));
13921392
}
13931393

1394+
#[tokio::test]
1395+
async fn test_openai_stream_reasoning_delta_does_not_pollute_final_text() {
1396+
let sse = vec![
1397+
"data: {\"choices\":[{\"delta\":{\"reasoning\":\"I should answer the greeting.\"},\"finish_reason\":null}],\"usage\":null}\n\n".to_string(),
1398+
"data: {\"choices\":[{\"delta\":{\"content\":\"你好\"},\"finish_reason\":null}],\"usage\":null}\n\n".to_string(),
1399+
"data: {\"choices\":[{\"delta\":{},\"finish_reason\":\"stop\"}],\"usage\":{\"prompt_tokens\":1,\"completion_tokens\":1,\"total_tokens\":2}}\n\n".to_string(),
1400+
"data: [DONE]\n\n".to_string(),
1401+
];
1402+
1403+
let client = OpenAiClient::new("key".to_string(), "glm-5.2".to_string())
1404+
.with_http_client(Arc::new(MockStreamingHttpClient { chunks: sse }));
1405+
1406+
let mut rx = client
1407+
.complete_streaming(
1408+
&[Message::user("你好")],
1409+
None,
1410+
&[],
1411+
CancellationToken::new(),
1412+
)
1413+
.await
1414+
.unwrap();
1415+
1416+
let mut text_deltas = String::new();
1417+
let mut reasoning_deltas = String::new();
1418+
let mut final_response = None;
1419+
while let Some(event) = rx.recv().await {
1420+
match event {
1421+
StreamEvent::TextDelta(delta) => text_deltas.push_str(&delta),
1422+
StreamEvent::ReasoningDelta(delta) => reasoning_deltas.push_str(&delta),
1423+
StreamEvent::Done(response) => {
1424+
final_response = Some(response);
1425+
break;
1426+
}
1427+
_ => {}
1428+
}
1429+
}
1430+
1431+
let response = final_response.expect("expected final response");
1432+
assert_eq!(text_deltas, "你好");
1433+
assert_eq!(reasoning_deltas, "I should answer the greeting.");
1434+
assert_eq!(response.text(), "你好");
1435+
assert_eq!(
1436+
response.message.reasoning_content.as_deref(),
1437+
Some("I should answer the greeting.")
1438+
);
1439+
}
1440+
13941441
// ========================================================================
13951442
// LlmConfig and create_client_with_config
13961443
// ========================================================================

0 commit comments

Comments
 (0)