agent-system-prompt.test.ts 3.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. import { describe, expect, it } from "vitest";
  2. import { buildAgentSystemPrompt } from "../agent/agent-system-prompt.js";
  3. describe("buildAgentSystemPrompt", () => {
  4. describe("no book (creation flow)", () => {
  5. it("Chinese prompt includes info collection workflow", () => {
  6. const prompt = buildAgentSystemPrompt(null, "zh");
  7. expect(prompt).toContain("建书助手");
  8. expect(prompt).toContain("收集信息");
  9. expect(prompt).toContain("题材");
  10. expect(prompt).toContain("世界观");
  11. expect(prompt).toContain("主角");
  12. expect(prompt).toContain("核心冲突");
  13. expect(prompt).toContain("architect");
  14. expect(prompt).toContain("sub_agent");
  15. expect(prompt).toContain("title");
  16. });
  17. it("English prompt includes info collection workflow", () => {
  18. const prompt = buildAgentSystemPrompt(null, "en");
  19. expect(prompt).toContain("book creation");
  20. expect(prompt).toContain("architect");
  21. expect(prompt).toContain("Genre");
  22. expect(prompt).toContain("Protagonist");
  23. expect(prompt).toContain("Core conflict");
  24. expect(prompt).toContain("title");
  25. });
  26. it("Chinese prompt forbids emoji", () => {
  27. const prompt = buildAgentSystemPrompt(null, "zh");
  28. expect(prompt).toContain("不要在回复中添加表情符号");
  29. });
  30. it("English prompt forbids emoji", () => {
  31. const prompt = buildAgentSystemPrompt(null, "en");
  32. expect(prompt).toContain("Do NOT use emoji");
  33. });
  34. it("no-book prompt does NOT mention read/edit/grep/ls", () => {
  35. const prompt = buildAgentSystemPrompt(null, "zh");
  36. expect(prompt).not.toMatch(/\bread\b.*读取/);
  37. expect(prompt).not.toContain("edit");
  38. });
  39. });
  40. describe("with book (writing flow)", () => {
  41. it("Chinese prompt includes deterministic writing tools except architect", () => {
  42. const prompt = buildAgentSystemPrompt("my-book", "zh");
  43. expect(prompt).toContain("my-book");
  44. expect(prompt).toContain("sub_agent");
  45. expect(prompt).toContain("writer");
  46. expect(prompt).toContain("auditor");
  47. expect(prompt).toContain("reviser");
  48. expect(prompt).toContain("read");
  49. expect(prompt).toContain("revise_chapter");
  50. expect(prompt).toContain("write_truth_file");
  51. expect(prompt).toContain("rename_entity");
  52. expect(prompt).toContain("patch_chapter_text");
  53. expect(prompt).toContain("grep");
  54. expect(prompt).toContain("ls");
  55. });
  56. it("with-book prompt steers high-risk edits to dedicated deterministic tools", () => {
  57. const prompt = buildAgentSystemPrompt("my-book", "zh");
  58. expect(prompt).toContain("改设定/改真相文件");
  59. expect(prompt).toContain("write_truth_file");
  60. expect(prompt).toContain("用户要求重写/精修已有章节");
  61. expect(prompt).toContain("revise_chapter");
  62. expect(prompt).not.toContain("用户想做小修改(改名字、调设定)→ 用 edit 直接修改");
  63. });
  64. it("Chinese prompt warns NOT to call architect", () => {
  65. const prompt = buildAgentSystemPrompt("my-book", "zh");
  66. expect(prompt).toContain("不要调用 architect");
  67. });
  68. it("English prompt warns NOT to call architect", () => {
  69. const prompt = buildAgentSystemPrompt("novel", "en");
  70. expect(prompt).toContain("Do NOT call architect");
  71. });
  72. it("Chinese with-book prompt forbids emoji", () => {
  73. const prompt = buildAgentSystemPrompt("my-book", "zh");
  74. expect(prompt).toContain("不要在回复中添加表情符号");
  75. });
  76. it("English with-book prompt forbids emoji", () => {
  77. const prompt = buildAgentSystemPrompt("novel", "en");
  78. expect(prompt).toContain("Do NOT use emoji");
  79. });
  80. it("with-book prompt does NOT list architect as available", () => {
  81. const prompt = buildAgentSystemPrompt("my-book", "zh");
  82. // architect 不在可用工具列表里
  83. expect(prompt).not.toMatch(/agent="architect"/);
  84. });
  85. });
  86. });