You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
76 lines
3.0 KiB
76 lines
3.0 KiB
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<ApiResponse> {
|
|
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<ApiResponse> {
|
|
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<CleanLlmTracesResult> {
|
|
return request.post('/llm-trace/clean', { keepDays }).then(r => r.data)
|
|
}
|
|
|
|
/** 聚合统计(按角色或模型分组) */
|
|
export function getLlmTraceStats(groupBy: 'role' | 'model' = 'role'): Promise<ApiResponse> {
|
|
return request.get(`/llm-trace/stats?groupBy=${groupBy}`).then(r => r.data)
|
|
}
|
|
|
|
/** 可选错误类型列表 */
|
|
export function getLlmTraceErrorTypes(): Promise<ApiResponse> {
|
|
return request.get('/llm-trace/error-types').then(r => r.data)
|
|
}
|
|
|
|
/** 单会话调用记录(会话时间线,复用 list 接口按 conversationId 过滤) */
|
|
export function getLlmTraceConversation(conversationId: string): Promise<ApiResponse> {
|
|
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<ApiResponse> {
|
|
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)
|
|
}
|