From ac53763bf20688bec39ca37ee1924d1a117a267d Mon Sep 17 00:00:00 2001 From: Afloat Date: Wed, 11 Nov 2026 17:39:31 +0800 Subject: [PATCH] fix(serve): accept reasoning history without optional raw content --- .../tests/unit/cli/serve_protocol_test.cpp | 19 +++++++++++++++++++ edge0-infer/tools/cli/serve_protocol.cpp | 5 ++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/edge0-infer/tests/unit/cli/serve_protocol_test.cpp b/edge0-infer/tests/unit/cli/serve_protocol_test.cpp index 3ed63969..bd64760c 100644 --- a/edge0-infer/tests/unit/cli/serve_protocol_test.cpp +++ b/edge0-infer/tests/unit/cli/serve_protocol_test.cpp @@ -55,6 +55,25 @@ void metrics_contract() { } } int main(int argc,char** argv) { + { + const auto request=Json::parse(R"({"model":"test","input":[ + {"role":"user","content":"first"}, + {"type":"reasoning","id":"rs_a","summary":[]}, + {"role":"assistant","content":"answer"}, + {"role":"user","content":"next"}]})"); + auto parsed=portal::parse(request,Protocol::responses,"test"); + CHECK(parsed.input.messages.size()==3); + CHECK(parsed.input.messages[1].content=="answer" && !parsed.input.messages[1].reasoning_content); + auto with_content=request; + with_content["input"][1]["content"]=Json::array({{{"type","reasoning_text"},{"text","reason"}}}); + parsed=portal::parse(with_content,Protocol::responses,"test"); + CHECK(parsed.input.messages.size()==3 && *parsed.input.messages[1].reasoning_content=="reason"); + auto no_assistant=request;no_assistant["input"].erase(2); + parsed=portal::parse(no_assistant,Protocol::responses,"test"); + CHECK(parsed.input.messages.size()==2 && parsed.input.messages[1].content=="next"); + auto malformed=request;malformed["input"][1]["content"]=nullptr; + rejects(malformed,Protocol::responses); + } metrics_contract(); CHECK(argc==2); std::ifstream input(argv[1]);Json fixtures;input>>fixtures; diff --git a/edge0-infer/tools/cli/serve_protocol.cpp b/edge0-infer/tools/cli/serve_protocol.cpp index b32a25c4..ef5599bd 100644 --- a/edge0-infer/tools/cli/serve_protocol.cpp +++ b/edge0-infer/tools/cli/serve_protocol.cpp @@ -210,7 +210,10 @@ Request parse(const Json& j, Protocol protocol, const std::string& alias) { edge0::TextMessage msg{"tool",content(required(item,"output"),{"input_text"},"input.output")};msg.tool_call_id=str(required(item,"call_id"),"input.call_id");r.input.messages.push_back(std::move(msg)); } else if(type=="reasoning") { keys(item,{"type","id","content","summary","status"},"input"); - auto text=content(required(item,"content"),{"reasoning_text"},"input.content");auto& msg=assistant();if(!msg.reasoning_content)msg.reasoning_content="";*msg.reasoning_content+=text; + if (item.contains("content")) { + auto text=content(item["content"],{"reasoning_text"},"input.content"); + auto& msg=assistant();if(!msg.reasoning_content)msg.reasoning_content="";*msg.reasoning_content+=text; + } } else bad("input.type","Unsupported input item","unsupported_value"); } }