n8n-nodes-openai-analytics
Version:
n8n node for OpenAI Analytics
113 lines (112 loc) • 4.51 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.textClassifierAgent = void 0;
const simpleMemory_1 = require("./simpleMemory");
/**
* 텍스트 분류 에이전트
* AI Agent, LLM Model, 메모리 노드를 조합한 구조
*/
async function textClassifierAgent(context) {
var _a, _b;
const { openai, functionThis, i, items } = context;
// 매개변수
const operation = functionThis.getNodeParameter('textClassifierAgentOperation', i);
const targetText = functionThis.getNodeParameter('agentTargetText', i);
const categories = functionThis.getNodeParameter('agentCategories', i);
const model = functionThis.getNodeParameter('agentModel', i, 'gpt-3.5-turbo');
const useMemory = functionThis.getNodeParameter('useMemory', i, true);
const memoryKey = functionThis.getNodeParameter('memoryKey', i, 'default');
// 기본 프롬프트
const systemPrompt = `당신은 텍스트를 정확하게 분류하는 AI 에이전트입니다.
주어진 텍스트를 다음 카테고리 중 하나로 분류해야 합니다:
${categories.map(cat => `- ${cat}`).join('\n')}
응답 형식:
{
"category": "선택한 카테고리명",
"confidence": 0.95, // 확신도 (0~1 사이 숫자)
"reasoning": "분류 이유에 대한 간략한 설명"
}`;
const userPrompt = `다음 텍스트를 분류해주세요: "${targetText}"`;
// 이전 대화 내역 가져오기
let conversationHistory = [];
if (useMemory) {
const memoryData = simpleMemory_1.memoryInstance.retrieve(`${memoryKey}_history`);
if (memoryData && Array.isArray(memoryData.messages)) {
conversationHistory = memoryData.messages;
}
}
// 메시지 배열 구성
const messages = [
{ role: 'system', content: systemPrompt },
...conversationHistory,
{ role: 'user', content: userPrompt }
];
try {
// 요청 파라미터
const apiParams = {
model,
messages,
temperature: 0.2,
response_format: { type: "json_object" },
};
// OpenAI API 호출
const response = await openai.chat.completions.create(apiParams);
// 응답 처리
const aiResponse = ((_b = (_a = response.choices[0]) === null || _a === void 0 ? void 0 : _a.message) === null || _b === void 0 ? void 0 : _b.content) || '';
let result = {};
try {
// JSON 응답 파싱
result = JSON.parse(aiResponse);
}
catch (e) {
// JSON 파싱 실패시 텍스트 응답 처리
result = {
category: aiResponse.includes(':') ? aiResponse.split(':')[1].trim() : aiResponse.trim(),
confidence: 0.7,
reasoning: "응답이 구조화되지 않아 텍스트에서 추출했습니다."
};
}
// 이력 저장
if (useMemory) {
const newHistory = [
...conversationHistory,
{ role: 'user', content: userPrompt },
{ role: 'assistant', content: aiResponse }
];
// 최대 10개 메시지만 유지 (오래된 메시지 제거)
const limitedHistory = newHistory.slice(-10);
simpleMemory_1.memoryInstance.store(`${memoryKey}_history`, { messages: limitedHistory });
simpleMemory_1.memoryInstance.store(`${memoryKey}_lastResult`, result);
}
// 일반적인 반환 객체 (모든 경우에 사용)
const outputJson = {
...result,
originalText: targetText,
categories: categories,
model: model,
};
// 분기 작업을 위한 메타데이터 추가
if (operation === 'branch') {
// 각 카테고리에 대한 출력 여부 정보를 메타데이터에 포함
const branchData = {};
for (const category of categories) {
branchData[category] = result.category === category;
}
// 메타데이터에 분기 정보 추가
outputJson._categoryBranches = branchData;
}
return {
json: outputJson
};
}
catch (error) {
return {
json: {
success: false,
error: error.message,
}
};
}
}
exports.textClassifierAgent = textClassifierAgent;
//# sourceMappingURL=textClassifierAgent.js.map