commit - 99b06fce055e09aed16dc6ff082cde94778aeb83
commit + 3f83e196092e9ddcb3fcece455be1b57ab878757
blob - 02d88851f9889a8792817b47330d3e1529848d0d
blob + 48eaf5f449f7486f007abe8fb8f9298959a6493a
--- regress/claude_subscription/claude_subscription_test.c
+++ regress/claude_subscription/claude_subscription_test.c
{
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;
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));
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);
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];
test_duplicate_tools();
test_request_tools();
test_system_before_tool_result();
+ test_system_before_suffix_assistant();
test_headers();
test_unicode_billing();