| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396 |
- "use strict";
- /**
- * AI内容生成控制器
- */
- var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
- };
- Object.defineProperty(exports, "__esModule", { value: true });
- const router_1 = __importDefault(require("@koa/router"));
- const ai_content_service_1 = require("./ai-content.service");
- const learning_path_service_1 = require("./learning-path.service");
- const router = new router_1.default();
- // ============ 学习路径 API ============
- // 创建学习路径任务
- router.post('/learning-path/create', async (ctx) => {
- const { topic, mode } = ctx.request.body;
- if (!topic || topic.trim().length === 0) {
- ctx.status = 400;
- ctx.body = { code: 400, message: '请输入学习主题' };
- return;
- }
- // 验证模式
- const generationMode = mode === 'multi-agent' ? 'multi-agent' : 'progressive';
- // 获取用户ID(如果有)
- const token = ctx.request.headers.authorization?.replace('Bearer ', '');
- let userId = null;
- if (token) {
- try {
- const jwt = require('jsonwebtoken');
- const decoded = jwt.verify(token, 'my-jwt-secret-key-2024');
- userId = decoded.userId || decoded.id || null;
- }
- catch (e) { }
- }
- const task = await (0, learning_path_service_1.createLearningPath)(userId, topic, generationMode);
- ctx.body = { code: 0, message: 'success', data: task };
- });
- // 获取用户的学习任务列表(要放在 /:id 前面,否则 /list 会被匹配为 id=list)
- router.get('/learning-path/list', async (ctx) => {
- const token = ctx.request.headers.authorization?.replace('Bearer ', '');
- let userId = null;
- if (token) {
- try {
- const jwt = require('jsonwebtoken');
- const decoded = jwt.verify(token, 'my-jwt-secret-key-2024');
- userId = decoded.userId || decoded.id || null;
- }
- catch (e) { }
- }
- const tasks = await (0, learning_path_service_1.getUserTasks)(userId);
- ctx.body = { code: 0, message: 'success', data: tasks };
- });
- // 获取学习路径详情(要放在 /list 后面)
- router.get('/learning-path/:id', async (ctx) => {
- const id = parseInt(ctx.params.id);
- if (isNaN(id)) {
- ctx.status = 400;
- ctx.body = { code: 400, message: '无效的任务ID' };
- return;
- }
- const task = await (0, learning_path_service_1.getLearningPathDetail)(id);
- if (!task) {
- ctx.status = 404;
- ctx.body = { code: 404, message: '任务不存在' };
- return;
- }
- ctx.body = { code: 0, message: 'success', data: task };
- });
- // 获取渐进模式待确认状态
- router.get('/learning-path/:id/pending', async (ctx) => {
- const id = parseInt(ctx.params.id);
- if (isNaN(id)) {
- ctx.status = 400;
- ctx.body = { code: 400, message: '无效的任务ID' };
- return;
- }
- const pending = await (0, learning_path_service_1.getPendingConfirmation)(id);
- if (!pending) {
- ctx.status = 404;
- ctx.body = { code: 404, message: '任务不存在' };
- return;
- }
- ctx.body = { code: 0, message: 'success', data: pending };
- });
- // 确认并继续生成(渐进模式)
- router.post('/learning-path/:id/confirm', async (ctx) => {
- const id = parseInt(ctx.params.id);
- if (isNaN(id)) {
- ctx.status = 400;
- ctx.body = { code: 400, message: '无效的任务ID' };
- return;
- }
- const { step, confirmedIds, modifiedItems } = ctx.request.body;
- if (!step || !confirmedIds) {
- ctx.status = 400;
- ctx.body = { code: 400, message: '缺少必要参数' };
- return;
- }
- try {
- const result = await (0, learning_path_service_1.confirmAndContinue)(id, step, confirmedIds, modifiedItems);
- ctx.body = { code: 0, message: 'success', data: result };
- }
- catch (e) {
- ctx.status = 500;
- ctx.body = { code: 500, message: e.message };
- }
- });
- // 重新生成节点(渐进模式)
- router.post('/learning-path/:id/regenerate', async (ctx) => {
- const id = parseInt(ctx.params.id);
- if (isNaN(id)) {
- ctx.status = 400;
- ctx.body = { code: 400, message: '无效的任务ID' };
- return;
- }
- const { type, nodeId, instruction } = ctx.request.body;
- if (!type || !nodeId) {
- ctx.status = 400;
- ctx.body = { code: 400, message: '缺少必要参数' };
- return;
- }
- try {
- const result = await (0, learning_path_service_1.regenerateNode)(id, type, nodeId, instruction);
- ctx.body = { code: 0, message: 'success', data: result };
- }
- catch (e) {
- ctx.status = 500;
- ctx.body = { code: 500, message: e.message };
- }
- });
- // 获取多Agent模式状态
- router.get('/learning-path/:id/status', async (ctx) => {
- const id = parseInt(ctx.params.id);
- if (isNaN(id)) {
- ctx.status = 400;
- ctx.body = { code: 400, message: '无效的任务ID' };
- return;
- }
- const status = await (0, learning_path_service_1.getAgentStatus)(id);
- if (!status) {
- ctx.status = 404;
- ctx.body = { code: 404, message: '任务不存在' };
- return;
- }
- ctx.body = { code: 0, message: 'success', data: status };
- });
- // ============ 原有的 API ============
- // 智能意图识别
- router.get('/intent/recognize', async (ctx) => {
- const { input } = ctx.query;
- const result = await ai_content_service_1.aiContentService.recognizeIntent(input);
- ctx.body = { code: 0, message: 'success', data: result };
- });
- // 获取内容类型列表
- router.get('/content-types', async (ctx) => {
- const result = ai_content_service_1.aiContentService.getContentTypes();
- ctx.body = { code: 0, message: 'success', data: result };
- });
- // 获取所有内容类型(扁平)
- router.get('/content-types/all', async (ctx) => {
- const result = ai_content_service_1.aiContentService.getAllContentTypes();
- ctx.body = { code: 0, message: 'success', data: result };
- });
- // ============ 异步生成任务 API ============
- // 创建异步生成任务
- router.post('/generate-async', async (ctx) => {
- const { prompt, targetLength } = ctx.request.body;
- if (!prompt || prompt.trim().length === 0) {
- ctx.status = 400;
- ctx.body = { code: 400, message: '请输入内容描述' };
- return;
- }
- const taskId = `gen-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
- const length = targetLength || 2000;
- // 创建任务记录
- ai_content_service_1.generateTasks.set(taskId, {
- id: taskId,
- status: 'generating',
- progress: 0,
- message: '正在创建生成任务...',
- createdAt: new Date(),
- });
- // 异步执行生成,不阻塞响应
- ai_content_service_1.aiContentService.generateContentAsync(taskId, prompt, length).catch(error => {
- console.error('❌ 异步内容生成失败:', error);
- const task = ai_content_service_1.generateTasks.get(taskId);
- if (task) {
- task.status = 'failed';
- task.error = error.message;
- task.message = '生成失败: ' + error.message;
- }
- });
- ctx.body = {
- code: 0,
- message: '任务已创建',
- data: { taskId, status: 'generating' }
- };
- });
- // 获取任务状态
- router.get('/task/:taskId', async (ctx) => {
- const { taskId } = ctx.params;
- const task = ai_content_service_1.generateTasks.get(taskId);
- if (!task) {
- ctx.status = 404;
- ctx.body = { code: 404, message: '任务不存在' };
- return;
- }
- ctx.body = {
- code: 0,
- message: 'success',
- data: {
- taskId: task.id,
- status: task.status,
- progress: task.progress,
- message: task.message,
- result: task.result,
- error: task.error,
- }
- };
- });
- // 统一内容生成接口(同步版本,保留兼容)
- router.post('/generate', async (ctx) => {
- const { prompt, targetLength } = ctx.request.body;
- const result = await ai_content_service_1.aiContentService.generateContent(prompt, targetLength || 2000);
- ctx.body = { code: 0, message: 'success', data: result };
- });
- // 获取行业列表
- router.get('/industries', async (ctx) => {
- const result = ai_content_service_1.aiContentService.getIndustries();
- ctx.body = { code: 0, message: 'success', data: result };
- });
- // 行业适配
- router.post('/adapt', async (ctx) => {
- const { content, industry } = ctx.request.body;
- const result = await ai_content_service_1.aiContentService.adaptContent(content, industry);
- ctx.body = { code: 0, message: 'success', data: result };
- });
- // 内容规划
- router.post('/plan', async (ctx) => {
- const { type, theme, targetLength } = ctx.request.body;
- const result = await ai_content_service_1.aiContentService.planContent(type, theme, targetLength);
- ctx.body = { code: 0, message: 'success', data: result };
- });
- // 生成大纲
- router.post('/outline/generate', async (ctx) => {
- const { type, theme, chapters } = ctx.request.body;
- const result = await ai_content_service_1.aiContentService.generateOutline(type, theme, chapters);
- ctx.body = { code: 0, message: 'success', data: result };
- });
- // 生成角色设定
- router.post('/characters/generate', async (ctx) => {
- const { type, genre } = ctx.request.body;
- const result = await ai_content_service_1.aiContentService.generateCharacters(type, genre);
- ctx.body = { code: 0, message: 'success', data: result };
- });
- // 分步生成内容
- router.post('/chunk/generate', async (ctx) => {
- const { outlineId, chapterIndex, chapterTitle, previousContent } = ctx.request.body;
- const result = await ai_content_service_1.aiContentService.generateChunk(outlineId, chapterIndex, chapterTitle, previousContent);
- ctx.body = { code: 0, message: 'success', data: result };
- });
- // 流式生成章节内容(SSE)
- router.post('/chunk/stream', async (ctx) => {
- const { outlineId, chapterIndex, chapterTitle, previousContent } = ctx.request.body;
- ctx.set('Content-Type', 'text/event-stream');
- ctx.set('Cache-Control', 'no-cache');
- ctx.set('Connection', 'keep-alive');
- ctx.set('X-Accel-Buffering', 'no');
- try {
- for await (const chunk of ai_content_service_1.aiContentService.streamGenerateChunk(outlineId, chapterIndex, chapterTitle, previousContent)) {
- ctx.write(`data: ${JSON.stringify(chunk)}\n\n`);
- }
- }
- catch (error) {
- ctx.write(`data: ${JSON.stringify({ type: 'error', message: error.message })}\n\n`);
- }
- ctx.end();
- });
- // 流式生成(模拟SSE)
- router.get('/stream/generate', async (ctx) => {
- const { outlineId } = ctx.query;
- ctx.set('Content-Type', 'text/event-stream');
- ctx.set('Cache-Control', 'no-cache');
- ctx.set('Connection', 'keep-alive');
- for await (const chunk of ai_content_service_1.aiContentService.streamGenerate(outlineId)) {
- ctx.write(`data: ${JSON.stringify(chunk)}\n\n`);
- if (chunk.type === 'done')
- break;
- }
- ctx.end();
- });
- // 创建生成任务
- router.post('/task/create', async (ctx) => {
- const { type, title } = ctx.request.body;
- const result = ai_content_service_1.aiContentService.createTask(type, title);
- ctx.body = { code: 0, message: 'success', data: result };
- });
- // 获取任务列表
- router.get('/tasks', async (ctx) => {
- const result = ai_content_service_1.aiContentService.getTasks();
- ctx.body = { code: 0, message: 'success', data: result };
- });
- // 章节连贯性检查
- router.post('/coherence/check', async (ctx) => {
- const { chapter1, chapter2 } = ctx.request.body;
- const result = await ai_content_service_1.aiContentService.checkCoherence(chapter1, chapter2);
- ctx.body = { code: 0, message: 'success', data: result };
- });
- // 生成衔接段
- router.post('/continuity/generate', async (ctx) => {
- const { previousChapter, nextTopic } = ctx.request.body;
- const result = await ai_content_service_1.aiContentService.generateContinuity(previousChapter, nextTopic);
- ctx.body = { code: 0, message: 'success', data: result };
- });
- // 敏感词检测
- router.post('/sensitive/check', async (ctx) => {
- const { text } = ctx.request.body;
- const result = await ai_content_service_1.aiContentService.checkSensitive(text);
- ctx.body = { code: 0, message: 'success', data: result };
- });
- // 质量评分
- router.post('/quality/score', async (ctx) => {
- const { text } = ctx.request.body;
- const result = await ai_content_service_1.aiContentService.scoreQuality(text);
- ctx.body = { code: 0, message: 'success', data: result };
- });
- // 内容优化
- router.post('/optimize', async (ctx) => {
- const { text, target } = ctx.request.body;
- const result = await ai_content_service_1.aiContentService.optimizeContent(text, target);
- ctx.body = { code: 0, message: 'success', data: result };
- });
- // 获取支持的语言
- router.get('/languages', async (ctx) => {
- const result = ai_content_service_1.aiContentService.getLanguages();
- ctx.body = { code: 0, message: 'success', data: result };
- });
- // 翻译并生成
- router.post('/translate/generate', async (ctx) => {
- const { text, targetLang, voiceStyle } = ctx.request.body;
- const result = await ai_content_service_1.aiContentService.translateAndGenerate(text, targetLang, voiceStyle);
- ctx.body = { code: 0, message: 'success', data: result };
- });
- // 智能匹配BGM
- router.post('/bgm/match', async (ctx) => {
- const { contentType, mood, genre } = ctx.request.body;
- const result = await ai_content_service_1.aiContentService.matchBGM(contentType, mood, genre);
- ctx.body = { code: 0, message: 'success', data: result };
- });
- // 获取音效列表
- router.get('/sounds', async (ctx) => {
- const result = ai_content_service_1.aiContentService.getSounds();
- ctx.body = { code: 0, message: 'success', data: result };
- });
- // 情感调节
- router.post('/emotion/adjust', async (ctx) => {
- const { text, targetEmotion } = ctx.request.body;
- const result = await ai_content_service_1.aiContentService.adjustEmotion(text, targetEmotion);
- ctx.body = { code: 0, message: 'success', data: result };
- });
- // 获取情感选项
- router.get('/emotions', async (ctx) => {
- const result = ai_content_service_1.aiContentService.getEmotions();
- ctx.body = { code: 0, message: 'success', data: result };
- });
- // 多角色对话生成
- router.post('/dialogue/generate', async (ctx) => {
- const { characters, scenario } = ctx.request.body;
- const result = await ai_content_service_1.aiContentService.generateDialogue(characters, scenario);
- ctx.body = { code: 0, message: 'success', data: result };
- });
- // SEO优化
- router.post('/seo/optimize', async (ctx) => {
- const { title, content, platform } = ctx.request.body;
- const result = await ai_content_service_1.aiContentService.optimizeSEO(title, content, platform);
- ctx.body = { code: 0, message: 'success', data: result };
- });
- // 合规检查
- router.post('/compliance/check', async (ctx) => {
- const { text, industry } = ctx.request.body;
- const result = await ai_content_service_1.aiContentService.checkCompliance(text, industry);
- ctx.body = { code: 0, message: 'success', data: result };
- });
- // 内容分析报告
- router.get('/analytics/:contentId', async (ctx) => {
- const { contentId } = ctx.params;
- const result = await ai_content_service_1.aiContentService.generateAnalytics(contentId);
- ctx.body = { code: 0, message: 'success', data: result };
- });
- // 智能续写
- router.post('/continue', async (ctx) => {
- const { text, direction } = ctx.request.body;
- const result = await ai_content_service_1.aiContentService.continueContent(text, direction);
- ctx.body = { code: 0, message: 'success', data: result };
- });
- exports.default = router;
|