ocr-chat.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. /**
  2. * Func 标签:ocr-chat
  3. *
  4. * 约定:src/pages/processing/func/ 目录下每个文件名就是一个"可用标签/能力"。
  5. * 本文件用于声明该标签存在(供文档/提示词/后续动态加载使用)。
  6. *
  7. * 运行时真实执行逻辑由 ActionParser + electronAPI.extractChatHistory + main-js/func/ocr-chat.js 实现。
  8. */
  9. export const tagName = 'ocr-chat';
  10. export const schema = {
  11. description: '根据图片识别对话内容,区分好友和自己的对话,输出JSON字符串格式的消息记录。',
  12. inputs: {
  13. // 按用户要求:抽象为 avatar1/avatar2,不绑定 friend/me 语义
  14. avatar1: '参与者1的头像/标识图片路径(相对于工作流目录)',
  15. avatar2: '参与者2的头像/标识图片路径(相对于工作流目录)',
  16. variable: '输出变量名(保存JSON字符串格式的消息记录)',
  17. },
  18. outputs: {
  19. variable: 'JSON字符串格式的消息记录(数组,每个元素包含 sender 和 text 字段)',
  20. },
  21. };
  22. /**
  23. * 执行 ocr-chat 功能
  24. * 这个函数会被 ActionParser 调用
  25. *
  26. * @param {Object} params - 参数对象
  27. * @param {string} params.device - 设备 ID/IP:Port
  28. * @param {string} params.avatar1 - 参与者1的头像路径
  29. * @param {string} params.avatar2 - 参与者2的头像路径
  30. * @param {string} params.folderPath - 工作流文件夹路径
  31. * @returns {Promise<{success: boolean, messagesJson?: string, messages?: Array, error?: string}>}
  32. */
  33. export async function executeOcrChat({ device, avatar1, avatar2, folderPath }) {
  34. try {
  35. if (!window.electronAPI || !window.electronAPI.extractChatHistory) {
  36. return {
  37. success: false,
  38. error: 'extractChatHistory API 不可用'
  39. };
  40. }
  41. // 调用主进程的 extractChatHistory 函数
  42. const result = await window.electronAPI.extractChatHistory(
  43. device,
  44. avatar1,
  45. avatar2,
  46. folderPath
  47. );
  48. if (!result.success) {
  49. return { success: false, error: result.error };
  50. }
  51. // 获取消息数组
  52. let messages = [];
  53. if (result.messages && Array.isArray(result.messages)) {
  54. messages = result.messages;
  55. } else if (result.messagesText) {
  56. // 如果只有文本,尝试解析(向后兼容)
  57. const lines = result.messagesText.split('\n').filter(line => line.trim());
  58. for (const line of lines) {
  59. const match = line.match(/^(对方|好友|我):\s*(.+)$/);
  60. if (match) {
  61. const senderLabel = match[1];
  62. const sender = (senderLabel === '对方' || senderLabel === '好友') ? 'friend' : 'me';
  63. const text = match[2].trim();
  64. messages.push({ sender, text });
  65. }
  66. }
  67. }
  68. // 将消息数组转换为JSON字符串
  69. const messagesJson = JSON.stringify(messages);
  70. return {
  71. success: true,
  72. messagesJson: messagesJson,
  73. messages: messages
  74. };
  75. } catch (error) {
  76. console.error('执行 ocr-chat 失败:', error);
  77. return {
  78. success: false,
  79. error: error.message || '提取聊天记录失败'
  80. };
  81. }
  82. }