lang_patch.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. #!/usr/bin/env python3
  2. import sys
  3. p = "/data/ai/audio/server/src/modules/book-generator/langgraph-controller.ts"
  4. src = open(p).read()
  5. old = """ setImmediate(async () => {
  6. try {
  7. await richOutlineNode(initState);
  8. // richOutlineNode 内部已通过 bookStore.update 写入 outlineJson
  9. await prisma.book.update({
  10. where: { id: idNum },
  11. data: { genStage: 'outline_ready' },
  12. });
  13. console.log(`[Interactive] 大纲生成完成: bookId=${bookId}`);
  14. } catch (err) {
  15. console.error(`[Interactive] 大纲生成失败: bookId=${bookId}`, err);
  16. await prisma.book.update({
  17. where: { id: idNum },
  18. data: { genStage: 'outline_failed', errorMsg: err instanceof Error ? err.message : '大纲生成失败' },
  19. });
  20. }
  21. });"""
  22. new = """ setImmediate(async () => {
  23. try {
  24. // 关键修复:richOutlineNode 内部 catch 块会 `return { error, finished: true }`
  25. // 而不是抛错,导致外层 try 看不到失败,于是这里把 `failed` 标记覆盖成 `outline_ready`。
  26. // 现在先检查返回值,如果节点内部标记失败就把 error 抛回,让 catch 走正确的分支。
  27. const result: any = await richOutlineNode(initState);
  28. if (result && (result.error || result.success === false)) {
  29. throw new Error(result.error || 'richOutlineNode 内部失败');
  30. }
  31. await prisma.book.update({
  32. where: { id: idNum },
  33. data: { genStage: 'outline_ready' },
  34. });
  35. console.log(`[Interactive] 大纲生成完成: bookId=${bookId}`);
  36. } catch (err) {
  37. console.error(`[Interactive] 大纲生成失败: bookId=${bookId}`, err);
  38. // 节点内部可能已经写了 failed / partial_outline,不要盲目覆盖。
  39. // 仅当数据库仍处于 outline_generating(说明节点没来得及写)时才补写 outline_failed。
  40. const current = await prisma.book.findUnique({ where: { id: idNum } });
  41. if (current && current.genStage === 'outline_generating') {
  42. await prisma.book.update({
  43. where: { id: idNum },
  44. data: { genStage: 'outline_failed', errorMsg: err instanceof Error ? err.message : '大纲生成失败' },
  45. });
  46. } else {
  47. console.log(`[Interactive] 保留节点内部标记: genStage=${current?.genStage}`);
  48. }
  49. }
  50. });"""
  51. if old not in src:
  52. print("ERROR: old block not found")
  53. sys.exit(1)
  54. src = src.replace(old, new, 1)
  55. open(p, 'w').write(src)
  56. print("patched langgraph-controller.ts OK")