ai.controller.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. "use strict";
  2. var __importDefault = (this && this.__importDefault) || function (mod) {
  3. return (mod && mod.__esModule) ? mod : { "default": mod };
  4. };
  5. Object.defineProperty(exports, "__esModule", { value: true });
  6. const router_1 = __importDefault(require("@koa/router"));
  7. const axios_1 = __importDefault(require("axios"));
  8. const config_1 = require("../../config");
  9. const router = new router_1.default();
  10. // 获取可用文本模型列表
  11. function getAvailableModels() {
  12. return config_1.config.models.getModelsByType('text').filter((m) => m.enabled !== false);
  13. }
  14. // 随机选择模型
  15. function getRandomModel() {
  16. const models = getAvailableModels();
  17. if (models.length === 0) {
  18. throw new Error('没有可用的文本模型');
  19. }
  20. return models[Math.floor(Math.random() * models.length)].id;
  21. }
  22. // AI 生成文本
  23. router.post('/generate', async (ctx) => {
  24. const { prompt, model } = ctx.request.body;
  25. if (!prompt || prompt.trim().length === 0) {
  26. ctx.status = 400;
  27. ctx.body = { code: 400, message: '请输入提示词' };
  28. return;
  29. }
  30. try {
  31. // 获取模型配置
  32. const modelId = model || getRandomModel();
  33. const modelConfig = config_1.config.models.getModel(modelId);
  34. if (!modelConfig) {
  35. ctx.status = 400;
  36. ctx.body = { code: 400, message: `模型 ${modelId} 不存在` };
  37. return;
  38. }
  39. const { apiKey, baseUrl } = modelConfig;
  40. if (!apiKey || !baseUrl) {
  41. ctx.status = 500;
  42. ctx.body = { code: 500, message: `模型 ${modelId} 缺少 API 配置` };
  43. return;
  44. }
  45. console.log(`🤖 使用模型: ${modelId}, baseUrl: ${baseUrl}`);
  46. // 调用 OpenAI-compatible API
  47. const response = await axios_1.default.post(`${baseUrl}/chat/completions`, {
  48. model: modelId,
  49. messages: [{ role: 'user', content: prompt }],
  50. }, {
  51. headers: {
  52. 'Authorization': `Bearer ${apiKey}`,
  53. 'Content-Type': 'application/json',
  54. },
  55. timeout: 120000,
  56. });
  57. const data = response.data;
  58. // 提取生成的文本
  59. const generatedText = data.choices?.[0]?.message?.content || '';
  60. ctx.body = {
  61. code: 0,
  62. message: 'success',
  63. data: {
  64. text: generatedText,
  65. model: modelId,
  66. },
  67. };
  68. }
  69. catch (error) {
  70. console.error('❌ AI 生成失败:', error.response?.data || error.message);
  71. ctx.status = 500;
  72. ctx.body = {
  73. code: 500,
  74. message: error.message || 'AI 生成失败,请稍后重试',
  75. };
  76. }
  77. });
  78. // 获取可用模型列表
  79. router.get('/models', async (ctx) => {
  80. const models = getAvailableModels();
  81. ctx.body = {
  82. code: 0,
  83. message: 'success',
  84. data: {
  85. models: models.map((m) => ({ id: m.id, name: m.name })),
  86. default: config_1.config.models.textGeneration.defaultModel,
  87. },
  88. };
  89. });
  90. exports.default = router;