import { readFileSync } from "fs"; export async function jsonToAgent(filePath, agentPromptFile='agent.txt') { console.log('processing file:', filePath); let content; let simple_content; const fileRes = readFileSync(filePath); if (fileRes) { const filecontent = fileRes.toString(); // simplify content let jsonData; try { jsonData = JSON.parse(filecontent); } catch (err) { console.error("Failed to parse JSON file:", err); return; } content = jsonData; let simplify = { input: [] }; simplify.input.push(jsonData.thread.text); jsonData.replies.forEach(element => { simplify.input.push(element.text); }); simple_content = JSON.stringify(simplify); // console.log(simple_content); } else { console.error("Failed to load JSON file"); return; } // return; console.log('sending to agent...', content.replies.length + 1); // 使用 OpenAI Chat Completions API 搭配 Structured Outputs (json_schema) const response = await fetch('https://api.openai.com/v1/responses', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${process.env.OPENAI_API_KEY}` }, body: JSON.stringify({ // model: "gpt-4.1-mini", // input: [ // { role: "system", content: system_prompt.replaceAll("{{N}}", content.replies.length + 1) }, // { role: "user", content: simple_content } // ], prompt:{ id: "pmpt_69607acd9c10819696e7a25fd66cdd6b016fc7e2ef2c3ca5", // version: "4", variables:{ count: (content.replies.length + 1).toString(), content: simple_content } }, store: false, text: { format:{ type: "json_schema", name: "conversation_analysis", strict: true, schema: { type: "object", properties: { output: { type: "array", description: "包含對話中所有留言的分析陣列", items: { type: "object", properties: { summry: { type: "string", description: "簡短精煉的全域對話主題(20字以內)。注意:此欄位在所有 array items 中必須完全一致。" }, keywords: { type: "array", items: { type: "string" }, description: "從留言中提取的關鍵字(事件、概念、情緒等)" }, number: { type: "integer", description: "目前留言的序號" }, total: { type: "integer", description: "留言總數 count" }, content: { type: "string", description: "原始留言內容" }, teaser:{ type: "string", description: "10字內具備共鳴的核心情緒" } }, required: ["summry", "keywords", "number", "total", "content", "teaser"], additionalProperties: false } } }, required: ["output"], additionalProperties: false } } } }) }); const data = await response.json(); if (data.error) { console.error("API Error:", data.error); return null; } try { // 從 choices[0].message.content 中解析 AI 回傳的 JSON 字串 let output_content = data.output.find(item => item.type === "message"); if (!output_content) { console.error("No message content found in agent response:", data); return data; } // console.log("Raw agent content:", output_content); // parse JSON let output = JSON.parse(output_content.content[0].text); // console.log("Agent output:", output); // add metadata info output.output= output.output.map((item, index) => { let metadata= index==0? content.thread : content.replies[index -1]; return { ...item, metadata: metadata }; }); return output; } catch (err) { console.error("Failed to parse agent response as JSON:", err); return data; } } export async function parseTest(filepath){ const fileRes = readFileSync(filepath); if (!fileRes) { console.error("Failed to load JSON file"); return; } const filecontent = fileRes.toString(); let data; try { data = JSON.parse(filecontent); } catch (err) { console.error("Failed to parse JSON file:", err); return; } try { // 從 choices[0].message.content 中解析 AI 回傳的 JSON 字串 let output_content = data.output.find(item => item.type === "message"); if (!output_content) { console.error("No message content found in agent response:", data); return data; } // console.log("Raw agent content:", output_content); // parse JSON let output = JSON.parse(output_content.content[0].text); // console.log("Agent output:", output); // add metadata info output.output= output.output.map((item, index) => { let metadata= index==0? content.thread : content.replies[index -1]; return { ...item, metadata: metadata }; }); return output; } catch (err) { console.error("Failed to parse agent response as JSON:", err); return data; } }