diff options
| author | t <t@tjp.lol> | 2026-06-22 18:18:28 -0600 |
|---|---|---|
| committer | t <t@tjp.lol> | 2026-06-23 09:34:55 -0600 |
| commit | 538a5d926fa626a00cc3dc12c555f11f82867efd (patch) | |
| tree | 7ea3b84ea5086d67973d0b427ec7c382eb635e50 /libpanto/src/provider_openai_responses.zig | |
| parent | a417727810cc6722b3c82e3c9e9b46982ef40a08 (diff) | |
libpanto ponytail-audit simplifications
Diffstat (limited to 'libpanto/src/provider_openai_responses.zig')
| -rw-r--r-- | libpanto/src/provider_openai_responses.zig | 53 |
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); |
