summary.ts 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. import { Provider } from "@/provider/provider"
  2. import { fn } from "@/util/fn"
  3. import z from "zod"
  4. import { Session } from "."
  5. import { generateText } from "ai"
  6. import { MessageV2 } from "./message-v2"
  7. import SUMMARIZE_TURN from "./prompt/summarize-turn.txt"
  8. import { Flag } from "@/flag/flag"
  9. export namespace MessageSummary {
  10. export const summarize = fn(
  11. z.object({
  12. sessionID: z.string(),
  13. messageID: z.string(),
  14. providerID: z.string(),
  15. }),
  16. async (input) => {
  17. if (!Flag.OPENCODE_EXPERIMENTAL_TURN_SUMMARY) return
  18. const messages = await Session.messages(input.sessionID).then((msgs) =>
  19. msgs.filter(
  20. (m) => m.info.id === input.messageID || (m.info.role === "assistant" && m.info.parentID === input.messageID),
  21. ),
  22. )
  23. const small = await Provider.getSmallModel(input.providerID)
  24. if (!small) return
  25. const result = await generateText({
  26. model: small.language,
  27. messages: [
  28. {
  29. role: "system",
  30. content: SUMMARIZE_TURN,
  31. },
  32. ...MessageV2.toModelMessage(messages),
  33. ],
  34. })
  35. const userMsg = messages.find((m) => m.info.id === input.messageID)!
  36. userMsg.info.summary = {
  37. text: result.text,
  38. diffs: [],
  39. }
  40. await Session.updateMessage(userMsg.info)
  41. },
  42. )
  43. }