summaryrefslogtreecommitdiff
path: root/libpanto/src/provider_openai_chat.zig
diff options
context:
space:
mode:
Diffstat (limited to 'libpanto/src/provider_openai_chat.zig')
-rw-r--r--libpanto/src/provider_openai_chat.zig10
1 files changed, 9 insertions, 1 deletions
diff --git a/libpanto/src/provider_openai_chat.zig b/libpanto/src/provider_openai_chat.zig
index d70eb30..c454679 100644
--- a/libpanto/src/provider_openai_chat.zig
+++ b/libpanto/src/provider_openai_chat.zig
@@ -137,6 +137,14 @@ pub const OpenAIChatRequest = struct {
@intFromEnum(response.head.status),
err_buf.items,
});
+ // Detect a context-overflow rejection so the caller can
+ // compact and retry rather than treating it as a hard error.
+ // OpenAI-compatible APIs return HTTP 400 with a
+ // `context_length_exceeded` code / "maximum context length"
+ // message on the input side.
+ if (@intFromEnum(response.head.status) == 400 and provider_mod.isContextOverflowBody(err_buf.items)) {
+ return error.ContextOverflow;
+ }
return error.HttpError;
}
@@ -524,7 +532,7 @@ const StreamState = struct {
const moved_blocks = try self.blocks.toOwnedSlice(self.allocator);
defer self.allocator.free(moved_blocks);
- try conv.addAssistantMessage(moved_blocks);
+ try conv.addAssistantMessageWithUsage(moved_blocks, self.usage);
const msg = conv.messages.items[conv.messages.items.len - 1];
try receiver.onMessageComplete(msg, self.usage);