summaryrefslogtreecommitdiff
path: root/examples/server/server.cpp
diff options
context:
space:
mode:
authorKawrakow <iwankawrakow@gmail.com>2025-06-17 10:32:53 +0300
committerGitHub <noreply@github.com>2025-06-17 10:32:53 +0300
commit8b3002bba2ea64b1de9ca2ff87207d8c37b0f08e (patch)
treeb291c2b7d332bd3771251ed0659136318294870a /examples/server/server.cpp
parent0f8f8b32e2d0c7e3ac8bbafee6965dcd1305d002 (diff)
Send [DONE] for OAI compatibility (#470)
Co-authored-by: Iwan Kawrakow <iwan.kawrakow@gmail.com>
Diffstat (limited to 'examples/server/server.cpp')
-rw-r--r--examples/server/server.cpp15
1 files changed, 13 insertions, 2 deletions
diff --git a/examples/server/server.cpp b/examples/server/server.cpp
index f9991035..31f7383e 100644
--- a/examples/server/server.cpp
+++ b/examples/server/server.cpp
@@ -3394,7 +3394,8 @@ int main(int argc, char ** argv) {
}
ctx_server.queue_results.remove_waiting_task_id(id_task);
} else {
- const auto chunked_content_provider = [id_task, &ctx_server, completion_id](size_t, httplib::DataSink & sink) {
+ const auto chunked_content_provider = [id_task, &ctx_server, completion_id, send_done = params.send_done](size_t, httplib::DataSink & sink) {
+ bool successful_completion = false;
while (true) {
server_task_result result = ctx_server.queue_results.recv(id_task);
if (!result.error) {
@@ -3414,6 +3415,7 @@ int main(int argc, char ** argv) {
}
}
if (result.stop) {
+ successful_completion = true;
break;
}
} else {
@@ -3429,9 +3431,18 @@ int main(int argc, char ** argv) {
break;
}
}
+ bool ok = true;
+ if (send_done && successful_completion) {
+ static const std::string done_message = "data: [DONE]\n\n";
+ LOG_VERBOSE("data stream", {{"to_send", done_message}});
+ if (!sink.write(done_message.c_str(), done_message.size())) {
+ // If writing [DONE] fails, the stream is likely already problematic.
+ ok = false;
+ }
+ }
sink.done();
ctx_server.queue_results.remove_waiting_task_id(id_task);
- return true;
+ return ok;
};
auto on_complete = [id_task, &ctx_server](bool) {