134 lines
3.0 KiB
TypeScript
134 lines
3.0 KiB
TypeScript
import { Injectable } from '@nestjs/common';
|
|
import { ConfigService } from '@nestjs/config';
|
|
|
|
/**
|
|
* 经验数据传输对象
|
|
*/
|
|
export interface ExperienceDto {
|
|
id: string;
|
|
experienceType: string;
|
|
content: string;
|
|
scenario: string;
|
|
confidence: number;
|
|
relatedCategory?: string;
|
|
sourceConversationIds: string[];
|
|
verificationStatus: string;
|
|
isActive: boolean;
|
|
usageCount: number;
|
|
positiveCount: number;
|
|
negativeCount: number;
|
|
createdAt: Date;
|
|
updatedAt: Date;
|
|
}
|
|
|
|
/**
|
|
* 经验统计数据传输对象
|
|
*/
|
|
export interface ExperienceStatisticsDto {
|
|
total: number;
|
|
byStatus: Record<string, number>;
|
|
byType: Record<string, number>;
|
|
}
|
|
|
|
/**
|
|
* Knowledge Service 客户端
|
|
* 用于调用 knowledge-service 的内部 API
|
|
*/
|
|
@Injectable()
|
|
export class KnowledgeClient {
|
|
private readonly baseUrl: string;
|
|
|
|
constructor(private configService: ConfigService) {
|
|
this.baseUrl = this.configService.get<string>(
|
|
'KNOWLEDGE_SERVICE_URL',
|
|
'http://knowledge-service:3005',
|
|
);
|
|
}
|
|
|
|
/**
|
|
* 保存经验
|
|
*/
|
|
async saveExperience(params: {
|
|
experienceType: string;
|
|
content: string;
|
|
scenario: string;
|
|
confidence: number;
|
|
relatedCategory?: string;
|
|
sourceConversationId: string;
|
|
}): Promise<ExperienceDto> {
|
|
const url = `${this.baseUrl}/api/internal/experiences`;
|
|
|
|
try {
|
|
const response = await fetch(url, {
|
|
method: 'POST',
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
},
|
|
body: JSON.stringify(params),
|
|
});
|
|
const data = await response.json();
|
|
|
|
if (!data.success) {
|
|
throw new Error('Failed to save experience');
|
|
}
|
|
|
|
return data.data;
|
|
} catch (error) {
|
|
console.error('[KnowledgeClient] Error saving experience:', error);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 获取经验统计
|
|
*/
|
|
async getStatistics(): Promise<ExperienceStatisticsDto> {
|
|
const url = `${this.baseUrl}/api/internal/experiences/statistics`;
|
|
|
|
try {
|
|
const response = await fetch(url);
|
|
const data = await response.json();
|
|
|
|
if (!data.success) {
|
|
throw new Error('Failed to get statistics');
|
|
}
|
|
|
|
return data.data;
|
|
} catch (error) {
|
|
console.error('[KnowledgeClient] Error getting statistics:', error);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 统计经验数量
|
|
*/
|
|
async countExperiences(options: {
|
|
status?: string;
|
|
isActive?: boolean;
|
|
}): Promise<number> {
|
|
const params = new URLSearchParams();
|
|
|
|
if (options.status) params.append('status', options.status);
|
|
if (options.isActive !== undefined) {
|
|
params.append('isActive', options.isActive.toString());
|
|
}
|
|
|
|
const url = `${this.baseUrl}/api/internal/experiences/count?${params.toString()}`;
|
|
|
|
try {
|
|
const response = await fetch(url);
|
|
const data = await response.json();
|
|
|
|
if (!data.success) {
|
|
throw new Error('Failed to count experiences');
|
|
}
|
|
|
|
return data.data.count;
|
|
} catch (error) {
|
|
console.error('[KnowledgeClient] Error counting experiences:', error);
|
|
throw error;
|
|
}
|
|
}
|
|
}
|