Commit Diff


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();