summaryrefslogtreecommitdiff
path: root/libpanto/src/anthropic_messages_json.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/anthropic_messages_json.zig
parenta417727810cc6722b3c82e3c9e9b46982ef40a08 (diff)
libpanto ponytail-audit simplifications
Diffstat (limited to 'libpanto/src/anthropic_messages_json.zig')
-rw-r--r--libpanto/src/anthropic_messages_json.zig49
1 files changed, 3 insertions, 46 deletions
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" {