Skip to content

Commit d64c62b

Browse files
committed
Add tests
1 parent fe5c8ff commit d64c62b

File tree

5 files changed

+266
-96
lines changed

5 files changed

+266
-96
lines changed
Lines changed: 181 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,181 @@
1+
// npx jest src/api/transform/caching/__tests__/anthropic.test.ts
2+
3+
import OpenAI from "openai"
4+
5+
import { addCacheBreakpoints } from "../anthropic"
6+
7+
describe("addCacheBreakpoints (Anthropic)", () => {
8+
const systemPrompt = "You are a helpful assistant."
9+
10+
it("should always add a cache breakpoint to the system prompt", () => {
11+
const messages: OpenAI.Chat.ChatCompletionMessageParam[] = [
12+
{ role: "system", content: systemPrompt },
13+
{ role: "user", content: "Hello" },
14+
]
15+
16+
addCacheBreakpoints(systemPrompt, messages)
17+
18+
expect(messages[0].content).toEqual([
19+
{ type: "text", text: systemPrompt, cache_control: { type: "ephemeral" } },
20+
])
21+
})
22+
23+
it("should not add breakpoints to user messages if there are none", () => {
24+
const messages: OpenAI.Chat.ChatCompletionMessageParam[] = [{ role: "system", content: systemPrompt }]
25+
const originalMessages = JSON.parse(JSON.stringify(messages))
26+
27+
addCacheBreakpoints(systemPrompt, messages)
28+
29+
expect(messages[0].content).toEqual([
30+
{ type: "text", text: systemPrompt, cache_control: { type: "ephemeral" } },
31+
])
32+
33+
expect(messages.length).toBe(originalMessages.length)
34+
})
35+
36+
it("should add a breakpoint to the only user message if only one exists", () => {
37+
const messages: OpenAI.Chat.ChatCompletionMessageParam[] = [
38+
{ role: "system", content: systemPrompt },
39+
{ role: "user", content: "User message 1" },
40+
]
41+
42+
addCacheBreakpoints(systemPrompt, messages)
43+
44+
expect(messages[1].content).toEqual([
45+
{ type: "text", text: "User message 1", cache_control: { type: "ephemeral" } },
46+
])
47+
})
48+
49+
it("should add breakpoints to both user messages if only two exist", () => {
50+
const messages: OpenAI.Chat.ChatCompletionMessageParam[] = [
51+
{ role: "system", content: systemPrompt },
52+
{ role: "user", content: "User message 1" },
53+
{ role: "user", content: "User message 2" },
54+
]
55+
56+
addCacheBreakpoints(systemPrompt, messages)
57+
58+
expect(messages[1].content).toEqual([
59+
{ type: "text", text: "User message 1", cache_control: { type: "ephemeral" } },
60+
])
61+
62+
expect(messages[2].content).toEqual([
63+
{ type: "text", text: "User message 2", cache_control: { type: "ephemeral" } },
64+
])
65+
})
66+
67+
it("should add breakpoints to the last two user messages when more than two exist", () => {
68+
const messages: OpenAI.Chat.ChatCompletionMessageParam[] = [
69+
{ role: "system", content: systemPrompt },
70+
{ role: "user", content: "User message 1" }, // Should not get breakpoint.
71+
{ role: "user", content: "User message 2" }, // Should get breakpoint.
72+
{ role: "user", content: "User message 3" }, // Should get breakpoint.
73+
]
74+
addCacheBreakpoints(systemPrompt, messages)
75+
76+
expect(messages[1].content).toEqual([{ type: "text", text: "User message 1" }])
77+
78+
expect(messages[2].content).toEqual([
79+
{ type: "text", text: "User message 2", cache_control: { type: "ephemeral" } },
80+
])
81+
82+
expect(messages[3].content).toEqual([
83+
{ type: "text", text: "User message 3", cache_control: { type: "ephemeral" } },
84+
])
85+
})
86+
87+
it("should handle assistant messages correctly when finding last two user messages", () => {
88+
const messages: OpenAI.Chat.ChatCompletionMessageParam[] = [
89+
{ role: "system", content: systemPrompt },
90+
{ role: "user", content: "User message 1" }, // Should not get breakpoint.
91+
{ role: "assistant", content: "Assistant response 1" },
92+
{ role: "user", content: "User message 2" }, // Should get breakpoint (second to last user).
93+
{ role: "assistant", content: "Assistant response 2" },
94+
{ role: "user", content: "User message 3" }, // Should get breakpoint (last user).
95+
{ role: "assistant", content: "Assistant response 3" },
96+
]
97+
addCacheBreakpoints(systemPrompt, messages)
98+
99+
const userMessages = messages.filter((m) => m.role === "user")
100+
101+
expect(userMessages[0].content).toEqual([{ type: "text", text: "User message 1" }])
102+
103+
expect(userMessages[1].content).toEqual([
104+
{ type: "text", text: "User message 2", cache_control: { type: "ephemeral" } },
105+
])
106+
107+
expect(userMessages[2].content).toEqual([
108+
{ type: "text", text: "User message 3", cache_control: { type: "ephemeral" } },
109+
])
110+
})
111+
112+
it("should add breakpoint to the last text part if content is an array", () => {
113+
const messages: OpenAI.Chat.ChatCompletionMessageParam[] = [
114+
{ role: "system", content: systemPrompt },
115+
{ role: "user", content: "User message 1" },
116+
{
117+
role: "user",
118+
content: [
119+
{ type: "text", text: "This is the last user message." },
120+
{ type: "image_url", image_url: { url: "data:image/png;base64,..." } },
121+
{ type: "text", text: "This part should get the breakpoint." },
122+
],
123+
},
124+
]
125+
126+
addCacheBreakpoints(systemPrompt, messages)
127+
128+
expect(messages[1].content).toEqual([
129+
{ type: "text", text: "User message 1", cache_control: { type: "ephemeral" } },
130+
])
131+
132+
expect(messages[2].content).toEqual([
133+
{ type: "text", text: "This is the last user message." },
134+
{ type: "image_url", image_url: { url: "data:image/png;base64,..." } },
135+
{ type: "text", text: "This part should get the breakpoint.", cache_control: { type: "ephemeral" } },
136+
])
137+
})
138+
139+
it("should add a placeholder text part if the target message has no text parts", () => {
140+
const messages: OpenAI.Chat.ChatCompletionMessageParam[] = [
141+
{ role: "system", content: systemPrompt },
142+
{ role: "user", content: "User message 1" },
143+
{
144+
role: "user",
145+
content: [{ type: "image_url", image_url: { url: "data:image/png;base64,..." } }],
146+
},
147+
]
148+
149+
addCacheBreakpoints(systemPrompt, messages)
150+
151+
expect(messages[1].content).toEqual([
152+
{ type: "text", text: "User message 1", cache_control: { type: "ephemeral" } },
153+
])
154+
155+
expect(messages[2].content).toEqual([
156+
{ type: "image_url", image_url: { url: "data:image/png;base64,..." } },
157+
{ type: "text", text: "...", cache_control: { type: "ephemeral" } }, // Placeholder added.
158+
])
159+
})
160+
161+
it("should ensure content is array format even if no breakpoint added", () => {
162+
const messages: OpenAI.Chat.ChatCompletionMessageParam[] = [
163+
{ role: "system", content: systemPrompt },
164+
{ role: "user", content: "User message 1" }, // String content, no breakpoint.
165+
{ role: "user", content: "User message 2" }, // Gets breakpoint.
166+
{ role: "user", content: "User message 3" }, // Gets breakpoint.
167+
]
168+
169+
addCacheBreakpoints(systemPrompt, messages)
170+
171+
expect(messages[1].content).toEqual([{ type: "text", text: "User message 1" }])
172+
173+
expect(messages[2].content).toEqual([
174+
{ type: "text", text: "User message 2", cache_control: { type: "ephemeral" } },
175+
])
176+
177+
expect(messages[3].content).toEqual([
178+
{ type: "text", text: "User message 3", cache_control: { type: "ephemeral" } },
179+
])
180+
})
181+
})

0 commit comments

Comments
 (0)