prompt-cache-diagnostics.test.ts 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. import { describe, expect, test } from "bun:test"
  2. import { GenerationOptions, LLM, LLMRequest, Message, LanguageModel, ToolDefinition } from "@opencode-ai/ai"
  3. import { OpenAIChat } from "@opencode-ai/ai/protocols"
  4. import { PromptCacheDiagnostics } from "@opencode-ai/core/session/prompt-cache-diagnostics"
  5. const model = LanguageModel.make({ id: "test", provider: "test", route: OpenAIChat.route })
  6. const tool = ToolDefinition.make({
  7. name: "read",
  8. description: "Read a file",
  9. inputSchema: { type: "object", properties: {} },
  10. })
  11. const request = LLM.request({
  12. model,
  13. system: "System",
  14. prompt: "First",
  15. tools: [tool],
  16. })
  17. const compare = (current: LLMRequest) =>
  18. PromptCacheDiagnostics.compare(PromptCacheDiagnostics.snapshot(request), PromptCacheDiagnostics.snapshot(current))
  19. describe("PromptCacheDiagnostics", () => {
  20. test("distinguishes initial and stable requests", () => {
  21. const snapshot = PromptCacheDiagnostics.snapshot(request)
  22. expect(PromptCacheDiagnostics.compare(undefined, snapshot)).toEqual({ status: "initial" })
  23. expect(PromptCacheDiagnostics.compare(snapshot, snapshot)).toEqual({ status: "stable", messages: 1 })
  24. })
  25. test("recognizes append-only history", () => {
  26. const current = LLMRequest.update(request, { messages: [...request.messages, Message.assistant("Second")] })
  27. expect(compare(current)).toEqual({ status: "append-only", previousMessages: 1, currentMessages: 2 })
  28. })
  29. test("detects cache-sensitive setting changes", () => {
  30. const current = LLMRequest.update(request, { generation: GenerationOptions.make({ temperature: 0.5 }) })
  31. expect(compare(current)).toEqual({ status: "changed", component: "settings", index: 0, label: "model settings" })
  32. })
  33. test("finds the first changed prefix component", () => {
  34. const changedTool = ToolDefinition.make({ ...tool, description: "Read one file" })
  35. const current = LLMRequest.update(request, { tools: [changedTool] })
  36. expect(compare(current)).toEqual({ status: "changed", component: "tools", index: 0, label: "read" })
  37. })
  38. test("treats appended tools as a prefix change", () => {
  39. const write = ToolDefinition.make({
  40. name: "write",
  41. description: "Write a file",
  42. inputSchema: { type: "object", properties: {} },
  43. })
  44. const current = LLMRequest.update(request, { tools: [...request.tools, write] })
  45. expect(compare(current)).toEqual({ status: "changed", component: "tools", index: 1, label: "write" })
  46. })
  47. })