commit 3f83e196092e9ddcb3fcece455be1b57ab878757 from: Isaac Meerleo date: Fri Jul 17 22:52:14 2026 UTC Cover Claude Assistant carrier variants commit - 99b06fce055e09aed16dc6ff082cde94778aeb83 commit + 3f83e196092e9ddcb3fcece455be1b57ab878757 blob - 02d88851f9889a8792817b47330d3e1529848d0d blob + 48eaf5f449f7486f007abe8fb8f9298959a6493a --- regress/claude_subscription/claude_subscription_test.c +++ regress/claude_subscription/claude_subscription_test.c @@ -329,7 +329,8 @@ test_system_before_tool_result(void) { struct claude_sub_req req; struct msglist conv; - struct msg *m; + struct msg *assistant, *m, *results; + struct block *call; struct buf out; struct json j; char *role, *text; @@ -337,10 +338,10 @@ test_system_before_tool_result(void) int block, content, message, messages; TAILQ_INIT(&conv); - m = msg_new(ROLE_ASSISTANT); - msg_add_tool_use(m, "tu_1", "read", "{}", 2); + assistant = m = msg_new(ROLE_ASSISTANT); + call = msg_add_tool_use(m, "tu_1", "read", "{}", 2); TAILQ_INSERT_TAIL(&conv, m, entry); - m = msg_new(ROLE_USER); + results = m = msg_new(ROLE_USER); msg_add_tool_result(m, "tu_1", "body", 4, 0); TAILQ_INSERT_TAIL(&conv, m, entry); memset(&req, 0, sizeof(req)); @@ -349,6 +350,7 @@ test_system_before_tool_result(void) req.system = "stored-system"; req.systemlen = strlen(req.system); req.conv = &conv; + req.cache = 1; req.cache_tail_msg = -1; buf_init(&out); CHECK(claude_sub_build_request(&out, &req) == 0); @@ -375,12 +377,58 @@ test_system_before_tool_result(void) CHECK(role != NULL && len == 4 && memcmp(role, "user", 4) == 0); free(role); CHECK(has(&out, "\"tool_use_id\":\"tu_1\"")); + CHECK(count_cache(&out) == 1); + CHECK(TAILQ_FIRST(&conv) == assistant && TAILQ_LAST(&conv, msglist) == + results && TAILQ_FIRST(&assistant->blocks) == call); json_done(&j); buf_free(&out); msglist_free(&conv); } static void +test_system_before_suffix_assistant(void) +{ + struct claude_sub_req req; + struct msglist conv; + struct msg *suffix; + struct buf out; + struct json j; + char *role; + size_t len; + int message, messages; + + TAILQ_INIT(&conv); + suffix = msg_new(ROLE_ASSISTANT); + msg_add_text(suffix, "retained", 8); + memset(&req, 0, sizeof(req)); + req.model = "claude-sonnet-4-6"; + req.max_tokens = 4096; + req.system = "stored-system"; + req.systemlen = strlen(req.system); + req.conv = &conv; + req.suffix = suffix; + req.cache_tail_msg = -1; + buf_init(&out); + CHECK(claude_sub_build_request(&out, &req) == 0); + CHECK(json_parse(&j, out.data, out.len, 0) == 0); + messages = json_obj_get(&j, 0, "messages"); + CHECK(json_arr_len(&j, messages) == 2); + message = json_arr_get(&j, messages, 0); + role = json_string(&j, message, "role", &len); + CHECK(role != NULL && len == 4 && memcmp(role, "user", 4) == 0); + free(role); + message = json_arr_get(&j, messages, 1); + role = json_string(&j, message, "role", &len); + CHECK(role != NULL && len == 9 && memcmp(role, "assistant", 9) == 0); + free(role); + CHECK(TAILQ_FIRST(&suffix->blocks)->textlen == 8 && + memcmp(TAILQ_FIRST(&suffix->blocks)->text, "retained", 8) == 0); + json_done(&j); + buf_free(&out); + msg_free(suffix); +} + +static void test_headers(void) { char headers[8192]; @@ -455,6 +503,7 @@ main(void) test_duplicate_tools(); test_request_tools(); test_system_before_tool_result(); + test_system_before_suffix_assistant(); test_headers(); test_unicode_billing();