From 538a5d926fa626a00cc3dc12c555f11f82867efd Mon Sep 17 00:00:00 2001 From: t Date: Mon, 22 Jun 2026 18:18:28 -0600 Subject: libpanto ponytail-audit simplifications --- libpanto/src/anthropic_messages_json.zig | 49 ++------------------------------ 1 file changed, 3 insertions(+), 46 deletions(-) (limited to 'libpanto/src/anthropic_messages_json.zig') diff --git a/libpanto/src/anthropic_messages_json.zig b/libpanto/src/anthropic_messages_json.zig index 5f119f3..5085149 100644 --- a/libpanto/src/anthropic_messages_json.zig +++ b/libpanto/src/anthropic_messages_json.zig @@ -16,6 +16,7 @@ const Writer = std.Io.Writer; const conversation = @import("conversation.zig"); const config_mod = @import("config.zig"); const tool_registry_mod = @import("tool_registry.zig"); +const writeRawJson = @import("provider.zig").writeRawJson; // ----------------------------------------------------------------------------- // Request serialization @@ -147,44 +148,6 @@ pub fn serializeRequest( return try aw.toOwnedSlice(); } -/// Splice a pre-encoded JSON value into the current stringifier position. -/// On parse failure, emit `{}` so we never produce invalid wire JSON. -fn writeRawJson(s: *std.json.Stringify, raw: []const u8) !void { - var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator); - defer arena.deinit(); - const parsed = std.json.parseFromSlice( - std.json.Value, - arena.allocator(), - raw, - .{}, - ) catch { - try s.beginObject(); - try s.endObject(); - return; - }; - try s.write(parsed.value); -} - -fn writeToolUseInput(s: *std.json.Stringify, raw: []const u8) !void { - var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator); - defer arena.deinit(); - const parsed = std.json.parseFromSlice(std.json.Value, arena.allocator(), raw, .{}) catch { - try s.beginObject(); - try s.objectField("_invalid_input"); - try s.write(raw); - try s.endObject(); - return; - }; - if (parsed.value != .object) { - try s.beginObject(); - try s.objectField("_invalid_input"); - try s.write(raw); - try s.endObject(); - return; - } - try s.write(parsed.value); -} - /// Build the top-level Anthropic `system` string. Applies the shared /// append/replace derivation (see `conversation.effectiveSystemBlocks`), /// strips trailing newlines from each surviving block, and joins them with @@ -335,7 +298,7 @@ fn writeBlock( try s.beginObject(); try s.endObject(); } else { - try writeToolUseInput(s, input_bytes); + try writeRawJson(s, input_bytes); } if (mark_cache) try writeCacheControl(s); try s.endObject(); @@ -455,7 +418,6 @@ pub const StreamUsage = struct { pub const StreamEvent = union(StreamEventTag) { message_start: struct { - role: ?[]const u8 = null, usage: StreamUsage = .{}, }, content_block_start: struct { @@ -509,19 +471,15 @@ pub fn parseStreamEvent(allocator: Allocator, payload: []const u8) !ParsedStream const ty = type_v.string; if (std.mem.eql(u8, ty, "message_start")) { - var role: ?[]const u8 = null; var usage: StreamUsage = .{}; if (root.object.get("message")) |m| { if (m == .object) { - if (m.object.get("role")) |r| { - if (r == .string) role = r.string; - } if (m.object.get("usage")) |u| { if (u == .object) usage = parseStreamUsage(u.object); } } } - return .{ .parsed = parsed, .event = .{ .message_start = .{ .role = role, .usage = usage } } }; + return .{ .parsed = parsed, .event = .{ .message_start = .{ .usage = usage } } }; } if (std.mem.eql(u8, ty, "content_block_start")) { @@ -1119,7 +1077,6 @@ test "parseStreamEvent - message_start" { var pe = try parseStreamEvent(allocator, payload); defer pe.deinit(); try testing.expectEqual(StreamEventTag.message_start, @as(StreamEventTag, pe.event)); - try testing.expectEqualStrings("assistant", pe.event.message_start.role.?); } test "parseStreamEvent - content_block_start text" { -- cgit v1.3