summaryrefslogtreecommitdiff
path: root/libpanto/src/provider_openai_responses.zig
diff options
context:
space:
mode:
authort <t@tjp.lol>2026-06-22 18:18:28 -0600
committert <t@tjp.lol>2026-06-23 09:34:55 -0600
commit538a5d926fa626a00cc3dc12c555f11f82867efd (patch)
tree7ea3b84ea5086d67973d0b427ec7c382eb635e50 /libpanto/src/provider_openai_responses.zig
parenta417727810cc6722b3c82e3c9e9b46982ef40a08 (diff)
libpanto ponytail-audit simplifications
Diffstat (limited to 'libpanto/src/provider_openai_responses.zig')
-rw-r--r--libpanto/src/provider_openai_responses.zig53
1 files changed, 3 insertions, 50 deletions
diff --git a/libpanto/src/provider_openai_responses.zig b/libpanto/src/provider_openai_responses.zig
index c172f6d..d764e6f 100644
--- a/libpanto/src/provider_openai_responses.zig
+++ b/libpanto/src/provider_openai_responses.zig
@@ -31,7 +31,6 @@ const stream_mod = @import("stream.zig");
const sse_mod = @import("sse.zig");
const json_mod = @import("openai_responses_json.zig");
const config_mod = @import("config.zig");
-const tool_registry_mod = @import("tool_registry.zig");
const Event = stream_mod.Event;
const EventQueue = stream_mod.EventQueue;
@@ -41,10 +40,7 @@ pub const OpenAIResponsesDialect = enum {
codex,
};
-fn decodeNameInPlace(name_buf: *conversation.TextualBlock) void {
- const decoded = tool_registry_mod.decodeName(name_buf.items, name_buf.items);
- name_buf.items.len = decoded.len;
-}
+const decodeNameInPlace = provider_mod.decodeNameInPlace;
pub const OpenAIResponsesRequest = struct {
allocator: Allocator,
@@ -104,58 +100,15 @@ pub const OpenAIResponsesRequest = struct {
);
defer self.allocator.free(extra_headers);
- rr.req = try self.http_client.request(.POST, uri, .{
- .extra_headers = extra_headers,
- .headers = .{ .accept_encoding = .{ .override = "identity" } },
- .keep_alive = false,
- .redirect_behavior = .not_allowed,
- });
+ rr.response = try provider_mod.sendRequest(self.http_client, uri, extra_headers, body, &rr.req);
rr.req_open = true;
errdefer {
rr.req.deinit();
rr.req_open = false;
}
- rr.req.transfer_encoding = .{ .content_length = body.len };
- var send_buf: [4096]u8 = undefined;
- var bw = try rr.req.sendBodyUnflushed(&send_buf);
- try bw.writer.writeAll(body);
- try bw.end();
- try rr.req.connection.?.flush();
-
- var redirect_buf: [1024]u8 = undefined;
- rr.response = try rr.req.receiveHead(&redirect_buf);
-
if (@intFromEnum(rr.response.head.status) >= 400) {
- const retry_after_ms = provider_mod.retryAfterFromHead(rr.response.head);
- const body_reader = rr.response.reader(&rr.transfer_buf);
- var err_buf: std.ArrayList(u8) = .empty;
- defer err_buf.deinit(self.allocator);
- var tmp: [1024]u8 = undefined;
- while (true) {
- const n = body_reader.readSliceShort(&tmp) catch break;
- if (n == 0) break;
- try err_buf.appendSlice(self.allocator, tmp[0..n]);
- if (err_buf.items.len > 16 * 1024) break;
- }
- const status: u16 = @intFromEnum(rr.response.head.status);
- const classified = provider_mod.classifyHttpStatus(status, err_buf.items);
- // 401/403 is routinely recovered by the turn-runner's forced token
- // refresh + reopen (see `driveTurn` in tui_app.zig). Logging it at
- // `.err` surfaces a scary "token expired" line for what is a
- // transparent, recoverable refresh. Demote it to `.debug` (still
- // captured in the debug log); the retry layer raises a hard error
- // only if recovery ultimately fails.
- if (classified == error.ProviderAuthFailed) {
- std.log.debug("openai_responses HTTP {d} (recoverable auth): {s}", .{ status, err_buf.items });
- } else {
- std.log.err("openai_responses HTTP {d}: {s}", .{ status, err_buf.items });
- }
- if (self.diag) |d| {
- d.status_code = status;
- d.retry_after_ms = retry_after_ms;
- }
- return classified;
+ return provider_mod.classifyErrorResponse(self.allocator, &rr.response, &rr.transfer_buf, self.diag, "openai_responses");
}
rr.body_reader = rr.response.reader(&rr.transfer_buf);