mirror of
https://github.com/HKUDS/nanobot.git
synced 2026-08-08 05:18:49 +03:00
feat(providers): support DeepSeek Responses API (#5197)
This commit is contained in:
@@ -150,6 +150,22 @@ class TestConvertMessages:
|
||||
assert items[0]["content"][0]["type"] == "output_text"
|
||||
assert items[0]["content"][0]["text"] == "I'll help"
|
||||
|
||||
def test_preserves_deepseek_reasoning_content(self):
|
||||
_, items = convert_messages([
|
||||
{"role": "assistant", "reasoning_content": "think first", "content": "answer"},
|
||||
], preserve_reasoning=True)
|
||||
|
||||
assert items == [
|
||||
{"type": "reasoning", "content": "think first"},
|
||||
{
|
||||
"type": "message",
|
||||
"role": "assistant",
|
||||
"content": [{"type": "output_text", "text": "answer"}],
|
||||
"status": "completed",
|
||||
"id": "msg_0",
|
||||
},
|
||||
]
|
||||
|
||||
def test_assistant_empty_content_skipped(self):
|
||||
_, items = convert_messages([{"role": "assistant", "content": ""}])
|
||||
assert len(items) == 0
|
||||
@@ -539,6 +555,22 @@ class TestParseResponseOutput:
|
||||
assert result.content == "42"
|
||||
assert result.reasoning_content == "I think therefore I am."
|
||||
|
||||
def test_deepseek_reasoning_content_extracted(self):
|
||||
resp = {
|
||||
"output": [
|
||||
{"type": "reasoning", "content": "think first"},
|
||||
{"type": "message", "content": [
|
||||
{"type": "output_text", "text": "answer"},
|
||||
]},
|
||||
],
|
||||
"status": "completed", "usage": {},
|
||||
}
|
||||
|
||||
result = parse_response_output(resp)
|
||||
|
||||
assert result.content == "answer"
|
||||
assert result.reasoning_content == "think first"
|
||||
|
||||
def test_empty_output(self):
|
||||
resp = {"output": [], "status": "completed", "usage": {}}
|
||||
result = parse_response_output(resp)
|
||||
@@ -1633,6 +1665,30 @@ class TestConsumeSdkStream:
|
||||
_, _, _, _, reasoning = await consume_sdk_stream(stream())
|
||||
assert reasoning == "thinking..."
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_deepseek_reasoning_text_streamed(self):
|
||||
events = [
|
||||
MagicMock(type="response.reasoning_text.delta", delta="step 1 "),
|
||||
MagicMock(type="response.reasoning_text.delta", delta="step 2"),
|
||||
MagicMock(type="response.reasoning_text.done", text="step 1 step 2"),
|
||||
]
|
||||
emitted: list[str] = []
|
||||
|
||||
async def stream():
|
||||
for event in events:
|
||||
yield event
|
||||
|
||||
async def on_reasoning_delta(delta: str) -> None:
|
||||
emitted.append(delta)
|
||||
|
||||
_, _, _, _, reasoning = await consume_sdk_stream(
|
||||
stream(),
|
||||
on_reasoning_delta=on_reasoning_delta,
|
||||
)
|
||||
|
||||
assert reasoning == "step 1 step 2"
|
||||
assert emitted == ["step 1 ", "step 2"]
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_error_event_raises(self):
|
||||
ev = MagicMock(type="error", error="rate_limit_exceeded")
|
||||
|
||||
Reference in New Issue
Block a user