import { readFileSync } from "fs"; export async function jsonToAgent(filePath, agentPromptFile='agent.txt') { let system_prompt; const res = readFileSync(`./assets/${agentPromptFile}`); if (res) { system_prompt = res.toString(); // console.log(system_prompt); } else { console.error("Failed to load system prompt"); return; } console.log('processing file:', filePath); let content; const fileRes = readFileSync(filePath); if (fileRes) { content = fileRes.toString(); } else { console.error("Failed to load JSON file"); return; } // 使用 OpenAI Chat Completions API 搭配 Structured Outputs (json_schema) const response = await fetch('https://api.openai.com/v1/chat/completions', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${process.env.OPENAI_API_KEY}` }, body: JSON.stringify({ model: "gpt-4o", messages: [ { role: "system", content: system_prompt }, { role: "user", content: content } ], store: false, response_format: { type: "json_schema", 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: "留言總數 M" }, content: { type: "string", description: "原始留言內容" }, teaser:{ type: "string", description: "10字內具備共鳴的核心情緒" }, metadata: { type: "object", description: "原始留言的後設資料", properties:{ text: { type:'string'}, published_on: { type:'integer'}, like_count: { type:'integer'}, reply_count: { type:'integer'}, username: { type:'string'}, id: { type:'string'}, code: { type:'string'}, parent_post_id: { type:'string'} }, required: ["text", "published_on", "like_count", "reply_count", "username", "id", "code", "parent_post_id"], // 在 strict: true 模式下,這必須為 false additionalProperties: false, } }, required: ["summry", "keywords", "number", "total", "content", "metadata", "teaser"], additionalProperties: false } } }, required: ["output"], additionalProperties: false } } }, temperature: 0.1 }) }); const data = await response.json(); if (data.error) { console.error("API Error:", data.error); return null; } try { // 從 choices[0].message.content 中解析 AI 回傳的 JSON 字串 const output = JSON.parse(data.choices[0].message.content); return output; } catch (err) { console.error("Failed to parse agent response as JSON:", data); return null; } }