// @requires normalize.js context.js const VALID_CLASSIFICATIONS = [ 'ACTIONABLE_NOW', 'UNASSIGNED_ACTIONABLE', 'WAITING_REQUESTER', 'WAITING_VENDOR', 'WAITING_APPROVAL', 'SCHEDULED', 'DEPENDENCY_BLOCKED', 'NEEDS_COORDINATION', 'PROJECT_LONG_TERM', 'DUPLICATE_OR_OBSOLETE', 'INSUFFICIENT_CONTEXT', ]; const systemPrompt = [ 'Voce e um analisador operacional de chamados de TI (GLPI). Voce NAO e um atendente e NAO conversa com o usuario.', 'Use SOMENTE as informacoes fornecidas abaixo sobre o chamado. Nunca invente fatos.', 'Distinga evidencia (o que esta escrito no chamado) de inferencia (sua conclusao).', 'SLA vencido sozinho NAO e evidencia de que existe uma acao executavel agora.', 'Idade do chamado sozinha NAO e evidencia de acionabilidade.', 'Identifique: existe acao executavel hoje? quem pode executar? existe bloqueio? quem segura o bloqueio? qual a proxima acao concreta? existe data conhecida para revisao? existe evidencia nos apontamentos que justifique a conclusao?', 'Se a informacao for insuficiente para decidir com confianca, use a classificacao INSUFFICIENT_CONTEXT e confidence baixo -- nao invente uma acao.', `Responda em JSON estrito com os campos: classification (uma de: ${VALID_CLASSIFICATIONS.join(', ')}), actionable_today (boolean), confidence (0 a 1), blocker_type, waiting_for, next_action (curto, poucas palavras, sem paragrafo), suggested_action_type, business_risk (low|medium|high), reason (uma frase), evidence (lista curta de evidencias textuais encontradas).`, ].join('\n'); return $input.all().map((item) => { const data = item.json; const userPrompt = buildAiContextText(data.ticket, data.config.aiMaxContextChars); const requestBody = { model: data.config.aiModel, temperature: 0.1, response_format: { type: 'json_schema', json_schema: { name: 'ticket_classification', strict: true, schema: { type: 'object', additionalProperties: false, properties: { classification: { type: 'string', enum: VALID_CLASSIFICATIONS }, actionable_today: { type: 'boolean' }, confidence: { type: 'number' }, blocker_type: { type: ['string', 'null'] }, waiting_for: { type: ['string', 'null'] }, next_action: { type: 'string' }, suggested_action_type: { type: 'string' }, business_risk: { type: 'string' }, reason: { type: 'string' }, evidence: { type: 'array', items: { type: 'string' } }, }, required: ['classification', 'actionable_today', 'confidence', 'blocker_type', 'waiting_for', 'next_action', 'suggested_action_type', 'business_risk', 'reason', 'evidence'], }, }, }, messages: [ { role: 'system', content: systemPrompt }, { role: 'user', content: userPrompt }, ], }; return { json: { ...data, requestBody } }; });