import request from './request' import type { ApiResponse } from '@/types/api' /** LLM 调用追踪列表查询参数 */ export interface LlmTraceQuery { page?: number size?: number roleId?: string conversationId?: string intent?: string startTime?: string endTime?: string keyword?: string apiKeyId?: string errorType?: string sortField?: string sortOrder?: string } /** 分页查询调用记录 */ export function listLlmTraces(query: LlmTraceQuery = {}): Promise { const params = new URLSearchParams() params.set('page', String(query.page ?? 1)) params.set('size', String(query.size ?? 20)) if (query.roleId) params.set('roleId', query.roleId) if (query.conversationId) params.set('conversationId', query.conversationId) if (query.intent) params.set('intent', query.intent) if (query.startTime) params.set('startTime', query.startTime) if (query.endTime) params.set('endTime', query.endTime) if (query.keyword) params.set('keyword', query.keyword) if (query.apiKeyId) params.set('apiKeyId', query.apiKeyId) if (query.errorType) params.set('errorType', query.errorType) if (query.sortField) params.set('sortField', query.sortField) if (query.sortOrder) params.set('sortOrder', query.sortOrder) return request.get(`/llm-trace/list?${params.toString()}`).then(r => r.data) } /** 单条详情(含完整 system prompt) */ export function getLlmTrace(id: string): Promise { return request.get(`/llm-trace/${id}`).then(r => r.data) } /** 清理 N 天前的记录(后端返回 {success, message, deleted},无 data 字段) */ export interface CleanLlmTracesResult { success: boolean; message?: string; deleted?: number } export function cleanLlmTraces(keepDays: number): Promise { return request.post('/llm-trace/clean', { keepDays }).then(r => r.data) } /** 聚合统计(按角色或模型分组) */ export function getLlmTraceStats(groupBy: 'role' | 'model' = 'role'): Promise { return request.get(`/llm-trace/stats?groupBy=${groupBy}`).then(r => r.data) } /** 可选错误类型列表 */ export function getLlmTraceErrorTypes(): Promise { return request.get('/llm-trace/error-types').then(r => r.data) } /** 单会话调用记录(会话时间线,复用 list 接口按 conversationId 过滤) */ export function getLlmTraceConversation(conversationId: string): Promise { return request.get(`/llm-trace/list?conversationId=${encodeURIComponent(conversationId)}&size=100`).then(r => r.data) } /** 时间维度趋势统计 */ export interface LlmTraceTrendQuery { groupBy?: 'HOUR' | 'DAY' startTime?: string endTime?: string } export function getLlmTraceTrend(query: LlmTraceTrendQuery = {}): Promise { const params = new URLSearchParams() params.set('groupBy', query.groupBy ?? 'HOUR') if (query.startTime) params.set('startTime', query.startTime) if (query.endTime) params.set('endTime', query.endTime) return request.get(`/llm-trace/trend?${params.toString()}`).then(r => r.data) }