| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- 'use strict';
- // 智能问数智能体路由:运行生命周期(异步执行 + 轮询)与会话索引
- // POST /api/agent/runs 发起运行(agent/quick 双模式),立即返回 run 记录
- // GET /api/agent/runs 会话内运行摘要列表(?entity&sessionId)
- // GET /api/agent/runs/:id 运行详情(含步骤/产物;运行中为实时进度)
- // POST /api/agent/runs/:id/cancel 请求取消(回合间隙生效)
- // GET /api/agent/sessions 会话列表(?entity)
- const { sendJson, readBody } = require('../util.js');
- const { ASK_CLIENT_CODES } = require('../middleware.js');
- const { makeChatCfg } = require('../context.js');
- const naposService = require('../../napos-service.js');
- const aitableFactory = require('../services/aitable.js');
- const agent = require('../agent/index.js');
- const agentSkills = require('../agent/skills.js');
- const digest = require('../agent/digest.js');
- const deepReport = require('../agent/deep-report.js');
- function requireEntity(query, body) {
- const entity = (body && body.entity) || query.entity
- || (naposService.store.listEntities()[0] || {}).key;
- if (!entity) {
- const e = new Error('暂无数据主体,请先完成一次同步');
- e.code = 'ASK_NO_ENTITY';
- throw e;
- }
- return entity;
- }
- function register(app, ctx) {
- // 云端协同(湖↔云比对工具用):复用 server.js 装配的服务实例(无则兜底自建)
- const aitableSvc = ctx.aitable || aitableFactory.createAitableService(ctx);
- app.post('/api/agent/runs', async ({ req, res }) => {
- const body = await readBody(req);
- const entity = requireEntity({}, body);
- // 参数类错误(空问题/未配模型/无主体)→ 400;其余交给错误边界
- try {
- const rec = agent.startRun({
- entity,
- question: body.question,
- mode: ['quick', 'agent', 'auto'].includes(body.mode) ? body.mode : 'auto',
- sessionId: body.sessionId,
- skill: body.skill,
- cloud: aitableSvc,
- cfg: makeChatCfg(ctx),
- svc: naposService,
- });
- sendJson(res, 200, { run: rec });
- } catch (e) {
- if (!ASK_CLIENT_CODES.has(e.code)) e.status = 502;
- throw e;
- }
- });
- app.get('/api/agent/runs', async ({ res, query }) => {
- const entity = requireEntity(query);
- if (!query.sessionId) return sendJson(res, 400, { error: '缺少 sessionId 参数' });
- sendJson(res, 200, { entity, runs: agent.listRuns(entity, query.sessionId) });
- });
- app.get('/api/agent/runs/:id', async ({ res, query, params }) => {
- const entity = requireEntity(query);
- const rec = agent.getRun(entity, params.id);
- if (!rec) return sendJson(res, 404, { error: '运行记录不存在' });
- sendJson(res, 200, { run: rec });
- });
- app.post('/api/agent/runs/:id/cancel', async ({ req, res, params }) => {
- await readBody(req).catch(() => ({}));
- const rec = agent.cancelRun(params.id);
- if (!rec) return sendJson(res, 404, { error: '运行记录不存在' });
- sendJson(res, 200, { run: rec });
- });
- app.get('/api/agent/sessions', async ({ res, query }) => {
- const entity = requireEntity(query);
- sendJson(res, 200, { entity, sessions: agent.listSessions(entity) });
- });
- app.del('/api/agent/sessions/:id', async ({ res, query, params }) => {
- const entity = requireEntity(query);
- const ok = agent.deleteSession(entity, params.id);
- if (!ok) return sendJson(res, 404, { error: '会话不存在' });
- sendJson(res, 200, { ok: true });
- });
- app.get('/api/agent/skills', async ({ res }) => {
- sendJson(res, 200, { skills: agentSkills.SKILLS.map(({ key, name, desc }) => ({ key, name, desc })) });
- });
- app.get('/api/agent/digests', async ({ res, query }) => {
- const entity = requireEntity(query);
- sendJson(res, 200, { entity, digests: digest.loadDigests(entity) });
- });
- // 手动重建晨报(每日自动同步后也会自动生成)
- app.post('/api/agent/digests/build', async ({ req, res }) => {
- const body = await readBody(req);
- const entity = requireEntity({}, body);
- const d = digest.buildAndSaveDigest(entity, naposService);
- sendJson(res, 200, { digest: d });
- });
- // 答案反馈:采纳(打法入语料)/ 纠错(进反馈日志供评测提炼)
- app.post('/api/agent/feedback', async ({ req, res }) => {
- const body = await readBody(req);
- const entity = requireEntity({}, body);
- const rec = agent.feedback({
- entity, runId: body.runId,
- kind: body.kind === 'up' ? 'up' : 'down',
- note: body.note,
- });
- if (!rec) return sendJson(res, 404, { error: '运行记录不存在' });
- sendJson(res, 200, { run: rec });
- });
- // 深度分析报告(确定性生成:体检/环比/归因/异常/对标/明细,自包含 HTML)
- app.get('/api/agent/report-deep', async ({ res, query }) => {
- const entity = requireEntity(query);
- const html = deepReport.buildDeepReportHtml({ entity, from: query.from, to: query.to, svc: naposService });
- res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
- return res.end(html);
- });
- }
- module.exports = { register };
|