api-server/src/modules/admin-ai-chat/admin-ai-chat.service.ts

64 lines
2.1 KiB
TypeScript
Raw Normal View History

import { Injectable, Logger } from '@nestjs/common';
import type { AiChatDto } from './dto/ai-chat.dto';
const HERMES_API_URL = 'http://10.2.0.7:8642/v1/chat/completions';
const HERMES_API_KEY = 'zhixi-hermes-key-2026';
const SYSTEM_PROMPT = '你是知习管理后台的 AI 任务助理,帮助管理员处理日常任务、解答问题。请用简洁专业的中文回复。';
@Injectable()
export class AdminAiChatService {
private readonly logger = new Logger(AdminAiChatService.name);
constructor() {}
async chat(dto: AiChatDto) {
const systemMessages = dto.messages.filter(m => m.role === 'system');
const hasSystemPrompt = systemMessages.length > 0;
const messages = hasSystemPrompt
? dto.messages
: [{ role: 'system' as const, content: SYSTEM_PROMPT }, ...dto.messages];
return await this.callHermes(messages);
}
private async callHermes(messages: Array<{ role: string; content: string }>) {
const start = Date.now();
const resp = await fetch(HERMES_API_URL, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Authorization: 'Bearer ' + HERMES_API_KEY,
},
body: JSON.stringify({
model: 'hermes-agent',
messages,
temperature: 0.7,
max_tokens: 4096,
}),
signal: AbortSignal.timeout(120_000),
});
if (!resp.ok) {
const text = await resp.text().catch(() => '');
throw new Error(`Hermes API error ${resp.status}: ${text}`);
}
const data = await resp.json();
const content = data.choices?.[0]?.message?.content || '';
const usage = data.usage || {};
this.logger.log('Hermes chat: ' + (Date.now() - start) + 'ms, tokens: ' +
(usage.prompt_tokens || 0) + '/' + (usage.completion_tokens || 0));
return { content, usage: { model: 'hermes-agent', inputTokens: usage.prompt_tokens, outputTokens: usage.completion_tokens } };
}
getDashboardConfig() {
return {
url: 'http://10.2.0.7:9119',
apiUrl: 'http://10.2.0.7:8642/v1',
description: 'Hermes Agent Dashboard — 4核4G 上的 AI Agent',
};
}
}