Explorar el Código

Merge branch 'feature/agent-management' of Web/web-server into master

huangzhichao hace 2 días
padre
commit
ec0803bbe6
Se han modificado 31 ficheros con 1098 adiciones y 95 borrados
  1. 2 1
      .env
  2. 1 0
      .env.test
  3. 13 3
      src/app.module.ts
  4. 77 0
      src/dto/agent-list.ts
  5. 37 0
      src/dto/agent-module.ts
  6. 51 0
      src/dto/agent-test.ts
  7. 14 0
      src/interface/agent-list.interface.ts
  8. 15 0
      src/interface/agent-module.interface.ts
  9. 18 0
      src/interface/agent-test.interface.ts
  10. 61 0
      src/module/agent-list/agent-list.controller.ts
  11. 14 0
      src/module/agent-list/agent-list.module.ts
  12. 56 0
      src/module/agent-list/service/agent-list-http.service.ts
  13. 85 0
      src/module/agent-list/service/agent-list.service.ts
  14. 38 0
      src/module/agent-list/type.d.ts
  15. 45 0
      src/module/agent-module/agent-module.controller.ts
  16. 14 0
      src/module/agent-module/agent-module.module.ts
  17. 59 0
      src/module/agent-module/service/agent-module-http.service.ts
  18. 91 0
      src/module/agent-module/service/agent-module.service.ts
  19. 9 0
      src/module/agent-module/type.d.ts
  20. 5 8
      src/module/agent-server/agent-server.module.ts
  21. 6 37
      src/module/agent-server/service/agent-server-http.service.ts
  22. 54 0
      src/module/agent-test/agent-test.controller.ts
  23. 14 0
      src/module/agent-test/agent-test.module.ts
  24. 64 0
      src/module/agent-test/service/agent-test-http.service.ts
  25. 119 0
      src/module/agent-test/service/agent-test.service.ts
  26. 60 0
      src/module/agent-test/type.d.ts
  27. 5 8
      src/module/chat-management/chat-management.module.ts
  28. 6 37
      src/module/chat-management/service/chat-management-http.service.ts
  29. 0 1
      src/prompt/sql-prompt/sql.ts
  30. 11 0
      src/shared/http-client/http-client.module.ts
  31. 54 0
      src/shared/http-client/http-client.service.ts

+ 2 - 1
.env

@@ -1,2 +1,3 @@
 secretId = AKIDPfjDbpqfWEiPxISQHF0nNjrlTyFJB7DA
-secretKey = nPqPqDQUL5e13va4KOFuMdiaHl26zf9Q
+secretKey = nPqPqDQUL5e13va4KOFuMdiaHl26zf9Q
+PORT = 8083

+ 1 - 0
.env.test

@@ -0,0 +1 @@
+PORT = 4090

+ 13 - 3
src/app.module.ts

@@ -1,12 +1,22 @@
 import { Module } from '@nestjs/common'
 
+import { AgentListModule } from '@/module/agent-list/agent-list.module'
+import { AgentModuleModule } from '@/module/agent-module/agent-module.module'
 import { AgentServerModule } from '@/module/agent-server/agent-server.module'
+import { AgentTestModule } from '@/module/agent-test/agent-test.module'
+import { ChatManagementModule } from '@/module/chat-management/chat-management.module'
 import { SqlAgentModule } from '@/module/sql-agent/sql-agent.module'
 import { TencentCloudModule } from '@/module/tencent-cloud/tencent-cloud.module'
 
-import { ChatManagementModule } from '@/module/chat-management/chat-management.module'
-
 @Module({
-  imports: [SqlAgentModule, TencentCloudModule, AgentServerModule, ChatManagementModule]
+  imports: [
+    SqlAgentModule,
+    TencentCloudModule,
+    AgentServerModule,
+    ChatManagementModule,
+    AgentListModule,
+    AgentTestModule,
+    AgentModuleModule
+  ]
 })
 export class AppModule {}

+ 77 - 0
src/dto/agent-list.ts

@@ -0,0 +1,77 @@
+import {
+  IsString,
+  IsNotEmpty,
+  IsNumber,
+  IsArray,
+  IsOptional
+} from 'class-validator'
+
+export class GetNativeAgentListDto {
+  @IsNumber()
+  @IsNotEmpty({ message: 'page不能为空' })
+  page: number
+
+  @IsNumber()
+  @IsNotEmpty({ message: 'page_size不能为空' })
+  pageSize: number
+
+  @IsString()
+  @IsOptional()
+  createUser?: string
+
+  @IsString()
+  @IsOptional()
+  updateUser?: string
+}
+
+export class GetNativeAgentConfigurationDto {
+  @IsString()
+  @IsNotEmpty({ message: 'agent_id不能为空' })
+  agentId: string
+}
+
+export class SaveNativeAgentConfigurationDto {
+  @IsString()
+  @IsNotEmpty({ message: 'user不能为空' })
+  user: string
+
+  @IsNumber()
+  @IsOptional()
+  agentId?: number
+
+  @IsString()
+  @IsNotEmpty({ message: 'name不能为空' })
+  name: string
+
+  @IsString()
+  @IsOptional()
+  displayName?: string
+
+  @IsNumber()
+  @IsOptional()
+  type?: number
+
+  @IsString()
+  @IsOptional()
+  executionModel?: string
+
+  @IsString()
+  @IsOptional()
+  systemPrompt?: string
+
+  @IsString()
+  @IsOptional()
+  taskPrompt?: string
+
+  @IsArray()
+  @IsOptional()
+  tools?: string[]
+
+  @IsArray()
+  @IsOptional()
+  subAgents?: number[]
+
+  @IsString()
+  @IsOptional()
+  extraParams?: string
+}

+ 37 - 0
src/dto/agent-module.ts

@@ -0,0 +1,37 @@
+import { IsString, IsNotEmpty, IsNumber } from 'class-validator'
+
+export class GetModuleConfigurationDto {
+  @IsString()
+  @IsNotEmpty({ message: 'module_id不能为空' })
+  moduleId: number
+}
+
+export class SaveModuleConfigurationDto {
+  @IsNumber()
+  @IsNotEmpty({ message: 'id不能为空' })
+  id: number
+
+  @IsString()
+  @IsNotEmpty({ message: 'name不能为空' })
+  name: string
+
+  @IsString()
+  @IsNotEmpty({ message: 'display_name不能为空' })
+  displayName: string
+
+  @IsNumber()
+  @IsNotEmpty({ message: 'default_agent_type不能为空' })
+  defaultAgentType: number
+
+  @IsNumber()
+  @IsNotEmpty({ message: 'default_agent_id不能为空' })
+  defaultAgentId: number
+
+  @IsString()
+  @IsNotEmpty({ message: 'create_time不能为空' })
+  createTime: string
+
+  @IsString()
+  @IsNotEmpty({ message: 'updated_time不能为空' })
+  updatedTime: string
+}

+ 51 - 0
src/dto/agent-test.ts

@@ -0,0 +1,51 @@
+import { IsString, IsNotEmpty, IsNumber } from 'class-validator'
+
+export class CreateTestTaskDto {
+  @IsNumber()
+  @IsNotEmpty({ message: 'agentId不能为空' })
+  agentId: number
+
+  @IsString()
+  @IsNotEmpty({ message: 'moduleId不能为空' })
+  moduleId: string
+
+  @IsNumber()
+  @IsNotEmpty({ message: 'evaluate不能为空' })
+  evaluate: number
+}
+
+export class GetTestTaskListDto {
+  @IsNumber()
+  @IsNotEmpty({ message: 'pageNum不能为空' })
+  pageNum: number
+
+  @IsNumber()
+  @IsNotEmpty({ message: 'pageSize不能为空' })
+  pageSize: number
+}
+
+export class StopTestTaskDto {
+  @IsNumber()
+  @IsNotEmpty({ message: 'taskId不能为空' })
+  taskId: number
+}
+
+export class ResumeTestTaskDto {
+  @IsNumber()
+  @IsNotEmpty({ message: 'taskId不能为空' })
+  taskId: number
+}
+
+export class GetTestTaskConversationsDto {
+  @IsNumber()
+  @IsNotEmpty({ message: 'taskId不能为空' })
+  taskId: number
+
+  @IsNumber()
+  @IsNotEmpty({ message: 'pageNum不能为空' })
+  pageNum: number
+
+  @IsNumber()
+  @IsNotEmpty({ message: 'pageSize不能为空' })
+  pageSize: number
+}

+ 14 - 0
src/interface/agent-list.interface.ts

@@ -0,0 +1,14 @@
+import { ServiceResponse } from '../response/response.interface'
+
+export interface IAgentListService {
+  getNativeAgentList(
+    params: Record<string, any>
+  ): Promise<ServiceResponse<AgentListType[]>>
+  getNativeAgentConfiguration(
+    agentId: string
+  ): Promise<ServiceResponse<AgentConfigurationType[]>>
+  saveNativeAgentConfiguration(
+    params: SaveAgentConfigurationType
+  ): Promise<ServiceResponse<SaveAgentConfigurationType>>
+  getToolList(): Promise<ServiceResponse<any>>
+}

+ 15 - 0
src/interface/agent-module.interface.ts

@@ -0,0 +1,15 @@
+import { ServiceResponse } from '../response/response.interface'
+
+export interface IAgentModuleService {
+  getModuleList(): Promise<ServiceResponse<ModuleConfigurationType[]>>
+  getModuleConfiguration(
+    module_id: number
+  ): Promise<ServiceResponse<ModuleConfigurationType>>
+  saveModuleConfiguration(
+    module_id: number,
+    name: string,
+    display_name: string,
+    default_agent_type: number,
+    default_agent_id: number
+  ): Promise<ServiceResponse<any>>
+}

+ 18 - 0
src/interface/agent-test.interface.ts

@@ -0,0 +1,18 @@
+import { ServiceResponse } from '../response/response.interface'
+
+export interface IAgentTestService {
+  createTestTask(
+    params: Record<string, any>
+  ): Promise<ServiceResponse<TestTaskType>>
+  getEvaluteType(
+    params: Record<string, any>
+  ): Promise<ServiceResponse<EvaluteType>>
+  getTestTaskList(
+    params: Record<string, any>
+  ): Promise<ServiceResponse<TestTaskListType>>
+  stopTestTask(params: Record<string, any>): Promise<ServiceResponse<any>>
+  resumeTestTask(params: Record<string, any>): Promise<ServiceResponse<any>>
+  getTestTaskConversations(
+    params: Record<string, any>
+  ): Promise<ServiceResponse<TaskConversationsType>>
+}

+ 61 - 0
src/module/agent-list/agent-list.controller.ts

@@ -0,0 +1,61 @@
+import { Controller, Get, Query, Post, Body } from '@nestjs/common'
+import { ApiOperation, ApiTags } from '@nestjs/swagger'
+
+import {
+  GetNativeAgentListDto,
+  GetNativeAgentConfigurationDto,
+  SaveNativeAgentConfigurationDto
+} from '@/dto/agent-list'
+
+import { AgentListService } from './service/agent-list.service'
+
+@ApiTags('agent-list')
+@Controller('agent-list')
+export class AgentListController {
+  constructor(private readonly agentListService: AgentListService) {}
+
+  @Get('native-agent-list')
+  @ApiOperation({ summary: '获取原生客服列表' })
+  async getNativeAgentList(@Query() query: GetNativeAgentListDto) {
+    return this.agentListService.getNativeAgentList({
+      page: query.page,
+      page_size: query.pageSize,
+      create_user: query.createUser,
+      update_user: query.updateUser
+    })
+  }
+
+  @Get('native-agent-configuration')
+  @ApiOperation({ summary: '获取原生客服配置' })
+  async getNativeAgentConfiguration(
+    @Query() query: GetNativeAgentConfigurationDto
+  ) {
+    return this.agentListService.getNativeAgentConfiguration(query.agentId)
+  }
+
+  @Post('native-agent-configuration')
+  @ApiOperation({ summary: '保存原生客服配置' })
+  async saveNativeAgentConfiguration(
+    @Body() body: SaveNativeAgentConfigurationDto
+  ) {
+    return this.agentListService.saveNativeAgentConfiguration({
+      user: body.user,
+      agent_id: body.agentId,
+      name: body.name,
+      display_name: body.displayName,
+      type: body.type,
+      execution_model: body.executionModel,
+      system_prompt: body.systemPrompt,
+      task_prompt: body.taskPrompt,
+      tools: body.tools,
+      sub_agents: body.subAgents,
+      extra_params: body.extraParams
+    })
+  }
+
+  @Get('tool-list')
+  @ApiOperation({ summary: '获取工具列表' })
+  async getToolList() {
+    return this.agentListService.getToolList()
+  }
+}

+ 14 - 0
src/module/agent-list/agent-list.module.ts

@@ -0,0 +1,14 @@
+import { Module } from '@nestjs/common'
+
+import { HttpClientModule } from '@/shared/http-client/http-client.module'
+
+import { AgentListController } from './agent-list.controller'
+import { AgentListHttpService } from './service/agent-list-http.service'
+import { AgentListService } from './service/agent-list.service'
+
+@Module({
+  imports: [HttpClientModule],
+  controllers: [AgentListController],
+  providers: [AgentListHttpService, AgentListService]
+})
+export class AgentListModule {}

+ 56 - 0
src/module/agent-list/service/agent-list-http.service.ts

@@ -0,0 +1,56 @@
+import { Injectable } from '@nestjs/common'
+
+import { ServiceResponse } from '@/response/response.interface'
+import { HttpClientService } from '@/shared/http-client/http-client.service'
+
+@Injectable()
+export class AgentListHttpService {
+  private readonly baseUrl = 'http://192.168.206.189:8083/api'
+
+  constructor(private readonly httpClientService: HttpClientService) {}
+
+  private async makeRequest<T>(
+    endpoint: string,
+    params?: Record<string, any>
+  ): Promise<ServiceResponse<T>> {
+    const url = `${this.baseUrl}/${endpoint}`
+    return this.httpClientService.get<T>(url, params)
+  }
+
+  async makeRequestPost<T>(
+    endpoint: string,
+    params?: Record<string, any>
+  ): Promise<ServiceResponse<T>> {
+    const url = `${this.baseUrl}/${endpoint}`
+    return this.httpClientService.post<T>(url, params)
+  }
+
+  async getNativeAgentList(
+    params: Record<string, any>
+  ): Promise<ServiceResponse<AgentListType[]>> {
+    return this.makeRequest<AgentListType[]>('getNativeAgentList', params)
+  }
+
+  async getNativeAgentConfiguration(
+    agent_id: string
+  ): Promise<ServiceResponse<AgentConfigurationType[]>> {
+    return this.makeRequest<AgentConfigurationType[]>(
+      'getNativeAgentConfiguration',
+      { agent_id }
+    )
+  }
+
+  async saveNativeAgentConfiguration(
+    params: SaveAgentConfigurationType
+  ): Promise<ServiceResponse<SaveAgentConfigurationType>> {
+    console.log(params)
+    return this.makeRequestPost<SaveAgentConfigurationType>(
+      'saveNativeAgentConfiguration',
+      params
+    )
+  }
+
+  async getToolList(): Promise<ServiceResponse<any>> {
+    return this.makeRequest<any>('getToolList')
+  }
+}

+ 85 - 0
src/module/agent-list/service/agent-list.service.ts

@@ -0,0 +1,85 @@
+import { Injectable } from '@nestjs/common'
+
+import { IAgentListService } from '@/interface/agent-list.interface'
+import { ServiceResponse } from '@/response/response.interface'
+import { BusinessCode, HttpStatusCode } from '@/response/status-code.enum'
+
+import { AgentListHttpService } from './agent-list-http.service'
+
+@Injectable()
+export class AgentListService implements IAgentListService {
+  constructor(private readonly httpService: AgentListHttpService) {}
+
+  async getNativeAgentList(
+    params: Record<string, any>
+  ): Promise<ServiceResponse<AgentListType[]>> {
+    const { code, data, msg } =
+      await this.httpService.getNativeAgentList(params)
+    if (code !== HttpStatusCode.OK) {
+      return {
+        code: BusinessCode.BAD_REQUEST,
+        msg: msg || '获取客服列表失败',
+        data: null
+      }
+    }
+    return {
+      code: BusinessCode.SUCCESS,
+      msg: '获取客服列表成功',
+      data: data
+    }
+  }
+
+  async getNativeAgentConfiguration(
+    agentId: string
+  ): Promise<ServiceResponse<AgentConfigurationType[]>> {
+    const { code, data, msg } =
+      await this.httpService.getNativeAgentConfiguration(agentId)
+    if (code !== HttpStatusCode.OK) {
+      return {
+        code: BusinessCode.BAD_REQUEST,
+        msg: msg || '获取客服列表失败',
+        data: null
+      }
+    }
+    return {
+      code: BusinessCode.SUCCESS,
+      msg: '获取客服列表成功',
+      data: data
+    }
+  }
+
+  async saveNativeAgentConfiguration(
+    params: SaveAgentConfigurationType
+  ): Promise<ServiceResponse<SaveAgentConfigurationType>> {
+    const { code, data, msg } =
+      await this.httpService.saveNativeAgentConfiguration(params)
+    if (code !== HttpStatusCode.OK) {
+      return {
+        code: BusinessCode.BAD_REQUEST,
+        msg: msg || '保存客服列表失败',
+        data: null
+      }
+    }
+    return {
+      code: BusinessCode.SUCCESS,
+      msg: '保存客服列表成功',
+      data: data
+    }
+  }
+
+  async getToolList(): Promise<ServiceResponse<any>> {
+    const { code, data, msg } = await this.httpService.getToolList()
+    if (code !== HttpStatusCode.OK) {
+      return {
+        code: BusinessCode.BAD_REQUEST,
+        msg: msg || '获取工具列表失败',
+        data: null
+      }
+    }
+    return {
+      code: BusinessCode.SUCCESS,
+      msg: '获取工具列表成功',
+      data: data
+    }
+  }
+}

+ 38 - 0
src/module/agent-list/type.d.ts

@@ -0,0 +1,38 @@
+type AgentListType = {
+  id: number
+  name: string
+  display_name: string
+  type: number
+  execution_model: string
+  create_time: string
+  update_time: string
+}
+
+type AgentConfigurationType = {
+  id: number
+  name: string
+  display_name: string
+  type: number
+  execution_model: string
+  system_prompt: string
+  task_prompt: string
+  tools: string[]
+  sub_agents: number[]
+  extra_params: string
+  create_time: string
+  update_time: string
+}
+
+type SaveAgentConfigurationType = {
+  user: string
+  agent_id?: number
+  name: string
+  display_name?: string
+  type?: number
+  execution_model?: string
+  system_prompt?: string
+  task_prompt?: string
+  tools?: string[]
+  sub_agents?: number[]
+  extra_params?: string
+}

+ 45 - 0
src/module/agent-module/agent-module.controller.ts

@@ -0,0 +1,45 @@
+import { Controller, Get, Query, Post, Body } from '@nestjs/common'
+import { ApiOperation, ApiTags } from '@nestjs/swagger'
+
+import {
+  GetModuleConfigurationDto,
+  SaveModuleConfigurationDto
+} from '@/dto/agent-module'
+
+import { AgentModuleService } from './service/agent-module.service'
+
+@ApiTags('agent-module')
+@Controller('agent-module')
+export class AgentModuleController {
+  constructor(private readonly agentModuleService: AgentModuleService) {}
+
+  @Get('get-module-list')
+  @ApiOperation({ summary: '获取模块列表' })
+  async getModuleList() {
+    return this.agentModuleService.getModuleList()
+  }
+
+  @Get('get-module-configuration')
+  @ApiOperation({ summary: '获取模块配置' })
+  async getModuleConfiguration(@Query() query: GetModuleConfigurationDto) {
+    return this.agentModuleService.getModuleConfiguration(query.moduleId)
+  }
+
+  @Post('save-module-configuration')
+  @ApiOperation({ summary: '保存模块配置' })
+  async saveModuleConfiguration(@Body() body: SaveModuleConfigurationDto) {
+    return this.agentModuleService.saveModuleConfiguration(
+      body.id,
+      body.name,
+      body.displayName,
+      body.defaultAgentType,
+      body.defaultAgentId
+    )
+  }
+
+  @Get('get-module-agent-types')
+  @ApiOperation({ summary: '获取模块代理类型' })
+  async getModuleAgentTypes() {
+    return this.agentModuleService.getModuleAgentTypes()
+  }
+}

+ 14 - 0
src/module/agent-module/agent-module.module.ts

@@ -0,0 +1,14 @@
+import { Module } from '@nestjs/common'
+
+import { HttpClientModule } from '@/shared/http-client/http-client.module'
+
+import { AgentModuleController } from './agent-module.controller'
+import { AgentModuleHttpService } from './service/agent-module-http.service'
+import { AgentModuleService } from './service/agent-module.service'
+
+@Module({
+  imports: [HttpClientModule],
+  controllers: [AgentModuleController],
+  providers: [AgentModuleHttpService, AgentModuleService]
+})
+export class AgentModuleModule {}

+ 59 - 0
src/module/agent-module/service/agent-module-http.service.ts

@@ -0,0 +1,59 @@
+import { Injectable } from '@nestjs/common'
+
+import { ServiceResponse } from '@/response/response.interface'
+import { HttpClientService } from '@/shared/http-client/http-client.service'
+
+@Injectable()
+export class AgentModuleHttpService {
+  private readonly baseUrl = 'http://192.168.206.189:8083/api'
+
+  constructor(private readonly httpClientService: HttpClientService) {}
+
+  private async makeRequest<T>(
+    endpoint: string,
+    params?: Record<string, any>
+  ): Promise<ServiceResponse<T>> {
+    const url = `${this.baseUrl}/${endpoint}`
+    return this.httpClientService.get<T>(url, params)
+  }
+
+  async makeRequestPost<T>(
+    endpoint: string,
+    params?: Record<string, any>
+  ): Promise<ServiceResponse<T>> {
+    const url = `${this.baseUrl}/${endpoint}`
+    return this.httpClientService.post<T>(url, params)
+  }
+
+  async getModuleList(): Promise<ServiceResponse<ModuleConfigurationType[]>> {
+    return this.makeRequest<ModuleConfigurationType[]>('getModuleList')
+  }
+
+  async getModuleConfiguration(
+    module_id: number
+  ): Promise<ServiceResponse<ModuleConfigurationType>> {
+    return this.makeRequest<ModuleConfigurationType>('getModuleConfiguration', {
+      module_id
+    })
+  }
+
+  async saveModuleConfiguration(
+    module_id: number,
+    name: string,
+    display_name: string,
+    default_agent_type: number,
+    default_agent_id: number
+  ): Promise<ServiceResponse<any>> {
+    return this.makeRequestPost<any>('saveModuleConfiguration', {
+      module_id,
+      name,
+      display_name,
+      default_agent_type,
+      default_agent_id
+    })
+  }
+
+  async getModuleAgentTypes(): Promise<ServiceResponse<any>> {
+    return this.makeRequest<any>('getModuleAgentTypes')
+  }
+}

+ 91 - 0
src/module/agent-module/service/agent-module.service.ts

@@ -0,0 +1,91 @@
+import { Injectable } from '@nestjs/common'
+
+import { IAgentModuleService } from '@/interface/agent-module.interface'
+import { ServiceResponse } from '@/response/response.interface'
+import { BusinessCode, HttpStatusCode } from '@/response/status-code.enum'
+
+import { AgentModuleHttpService } from './agent-module-http.service'
+
+@Injectable()
+export class AgentModuleService implements IAgentModuleService {
+  constructor(private readonly httpService: AgentModuleHttpService) {}
+
+  async getModuleList(): Promise<ServiceResponse<ModuleConfigurationType[]>> {
+    const { code, data, msg } = await this.httpService.getModuleList()
+    if (code !== HttpStatusCode.OK) {
+      return {
+        code: BusinessCode.BAD_REQUEST,
+        msg: msg || '获取模块列表失败',
+        data: null
+      }
+    }
+    return {
+      code: BusinessCode.SUCCESS,
+      data,
+      msg: msg || '获取模块列表成功'
+    }
+  }
+
+  async getModuleConfiguration(
+    module_id: number
+  ): Promise<ServiceResponse<ModuleConfigurationType>> {
+    const { code, data, msg } =
+      await this.httpService.getModuleConfiguration(module_id)
+    if (code !== HttpStatusCode.OK) {
+      return {
+        code: BusinessCode.BAD_REQUEST,
+        msg: msg || '获取模块配置失败',
+        data: null
+      }
+    }
+    return {
+      code: BusinessCode.SUCCESS,
+      data,
+      msg: msg || '获取模块配置成功'
+    }
+  }
+
+  async saveModuleConfiguration(
+    module_id: number,
+    name: string,
+    display_name: string,
+    default_agent_type: number,
+    default_agent_id: number
+  ): Promise<ServiceResponse<any>> {
+    const { code, data, msg } = await this.httpService.saveModuleConfiguration(
+      module_id,
+      name,
+      display_name,
+      default_agent_type,
+      default_agent_id
+    )
+    if (code !== HttpStatusCode.OK) {
+      return {
+        code: BusinessCode.BAD_REQUEST,
+        msg: msg || '保存模块配置失败',
+        data: null
+      }
+    }
+    return {
+      code: BusinessCode.SUCCESS,
+      data,
+      msg: msg || '保存模块配置成功'
+    }
+  }
+
+  async getModuleAgentTypes(): Promise<ServiceResponse<any>> {
+    const { code, data, msg } = await this.httpService.getModuleAgentTypes()
+    if (code !== HttpStatusCode.OK) {
+      return {
+        code: BusinessCode.BAD_REQUEST,
+        msg: msg || '获取模块代理类型失败',
+        data: null
+      }
+    }
+    return {
+      code: BusinessCode.SUCCESS,
+      data,
+      msg: msg || '获取模块代理类型成功'
+    }
+  }
+}

+ 9 - 0
src/module/agent-module/type.d.ts

@@ -0,0 +1,9 @@
+type ModuleConfigurationType = {
+  id: number
+  name: string
+  display_name: string
+  default_agent_type: number
+  default_agent_id: number
+  create_time: string
+  updated_time: string
+}

+ 5 - 8
src/module/agent-server/agent-server.module.ts

@@ -1,18 +1,15 @@
-import { HttpModule } from '@nestjs/axios'
 import { Module } from '@nestjs/common'
 
+import { HttpClientModule } from '@/shared/http-client/http-client.module'
+
 import { AgentServerController } from './agent-server.controller'
 import { AgentServerHttpService } from './service/agent-server-http.service'
 import { AgentServerService } from './service/agent-server.service'
 
 @Module({
-  imports: [
-    HttpModule.register({
-      timeout: 600000,
-      maxRedirects: 3
-    })
-  ],
+  imports: [HttpClientModule],
   controllers: [AgentServerController],
-  providers: [AgentServerHttpService, AgentServerService]
+  providers: [AgentServerHttpService, AgentServerService],
+  exports: [AgentServerService]
 })
 export class AgentServerModule {}

+ 6 - 37
src/module/agent-server/service/agent-server-http.service.ts

@@ -1,59 +1,28 @@
-import { HttpService } from '@nestjs/axios'
 import { Injectable } from '@nestjs/common'
-import { lastValueFrom } from 'rxjs'
 
 import { ServiceResponse } from '@/response/response.interface'
-import { HttpStatusCode } from '@/response/status-code.enum'
+import { HttpClientService } from '@/shared/http-client/http-client.service'
 
 @Injectable()
 export class AgentServerHttpService {
   private readonly baseUrl = 'http://192.168.206.189:8083/api'
 
-  constructor(private readonly httpService: HttpService) {}
+  constructor(private readonly httpClientService: HttpClientService) {}
 
   private async makeRequest<T>(
     endpoint: string,
     params?: Record<string, any>
   ): Promise<ServiceResponse<T>> {
-    try {
-      const url = `${this.baseUrl}/${endpoint}`
-      const responseObservable = await this.httpService.get<ServiceResponse<T>>(
-        url,
-        { params }
-      )
-      const { data } = await lastValueFrom(responseObservable)
-      return data
-    } catch (error) {
-      return {
-        code: HttpStatusCode.INTERNAL_SERVER_ERROR,
-        msg: error.message,
-        data: null as T
-      }
-    }
+    const url = `${this.baseUrl}/${endpoint}`
+    return this.httpClientService.get<T>(url, params)
   }
 
   async makeRequestPost<T>(
     endpoint: string,
     params?: Record<string, any>
   ): Promise<ServiceResponse<T>> {
-    try {
-      const url = `${this.baseUrl}/${endpoint}`
-      const responseObservable = await this.httpService.post<
-        ServiceResponse<T>
-      >(url, params, {
-        headers: {
-          'Content-Type': 'application/json'
-        }
-      })
-      const { data } = await lastValueFrom(responseObservable)
-      return data
-    } catch (error) {
-      return {
-        code: HttpStatusCode.INTERNAL_SERVER_ERROR,
-        msg: error.message,
-        data: null as T
-      }
-    }
+    const url = `${this.baseUrl}/${endpoint}`
+    return this.httpClientService.post<T>(url, params)
   }
 
   async listStaffs(): Promise<ServiceResponse<StaffsType[]>> {

+ 54 - 0
src/module/agent-test/agent-test.controller.ts

@@ -0,0 +1,54 @@
+import { Controller, Get, Query, Post, Body } from '@nestjs/common'
+import { ApiOperation, ApiTags } from '@nestjs/swagger'
+
+import {
+  CreateTestTaskDto,
+  GetTestTaskListDto,
+  StopTestTaskDto,
+  ResumeTestTaskDto,
+  GetTestTaskConversationsDto
+} from '@/dto/agent-test'
+
+import { AgentTestService } from './service/agent-test.service'
+
+@ApiTags('agent-test')
+@Controller('agent-test')
+export class AgentTestController {
+  constructor(private readonly agentTestService: AgentTestService) {}
+
+  @Post('create-test-task')
+  @ApiOperation({ summary: '创建测试任务' })
+  async createTestTask(@Body() body: CreateTestTaskDto) {
+    return this.agentTestService.createTestTask(body)
+  }
+
+  @Get('get-evalute-type')
+  @ApiOperation({ summary: '获取评估类型' })
+  async getEvaluteType() {
+    return this.agentTestService.getEvaluteType()
+  }
+
+  @Get('get-test-task-list')
+  @ApiOperation({ summary: '获取测试任务列表' })
+  async getTestTaskList(@Query() query: GetTestTaskListDto) {
+    return this.agentTestService.getTestTaskList(query)
+  }
+
+  @Post('stop-test-task')
+  @ApiOperation({ summary: '停止测试任务' })
+  async stopTestTask(@Body() body: StopTestTaskDto) {
+    return this.agentTestService.stopTestTask(body)
+  }
+
+  @Post('resume-test-task')
+  @ApiOperation({ summary: '恢复测试任务' })
+  async resumeTestTask(@Body() body: ResumeTestTaskDto) {
+    return this.agentTestService.resumeTestTask(body)
+  }
+
+  @Get('get-test-task-conversations')
+  @ApiOperation({ summary: '获取测试任务会话列表' })
+  async getTestTaskConversations(@Query() query: GetTestTaskConversationsDto) {
+    return this.agentTestService.getTestTaskConversations(query)
+  }
+}

+ 14 - 0
src/module/agent-test/agent-test.module.ts

@@ -0,0 +1,14 @@
+import { Module } from '@nestjs/common'
+
+import { HttpClientModule } from '@/shared/http-client/http-client.module'
+
+import { AgentTestController } from './agent-test.controller'
+import { AgentTestHttpService } from './service/agent-test-http.service'
+import { AgentTestService } from './service/agent-test.service'
+
+@Module({
+  imports: [HttpClientModule],
+  controllers: [AgentTestController],
+  providers: [AgentTestHttpService, AgentTestService]
+})
+export class AgentTestModule {}

+ 64 - 0
src/module/agent-test/service/agent-test-http.service.ts

@@ -0,0 +1,64 @@
+import { Injectable } from '@nestjs/common'
+
+import { ServiceResponse } from '@/response/response.interface'
+import { HttpClientService } from '@/shared/http-client/http-client.service'
+
+@Injectable()
+export class AgentTestHttpService {
+  private readonly baseUrl = 'http://192.168.206.189:8083/api'
+
+  constructor(private readonly httpClientService: HttpClientService) {}
+
+  private async makeRequest<T>(
+    endpoint: string,
+    params?: Record<string, any>
+  ): Promise<ServiceResponse<T>> {
+    const url = `${this.baseUrl}/${endpoint}`
+    return this.httpClientService.get<T>(url, params)
+  }
+
+  async makeRequestPost<T>(
+    endpoint: string,
+    params?: Record<string, any>
+  ): Promise<ServiceResponse<T>> {
+    const url = `${this.baseUrl}/${endpoint}`
+    return this.httpClientService.post<T>(url, params)
+  }
+
+  async createTestTask(
+    params: Record<string, any>
+  ): Promise<ServiceResponse<TestTaskType>> {
+    return this.makeRequestPost<TestTaskType>('createTestTask', params)
+  }
+
+  async getEvaluteType(): Promise<ServiceResponse<EvaluteType>> {
+    return this.makeRequestPost<EvaluteType>('getEvaluteType')
+  }
+
+  async getTestTaskList(
+    params: Record<string, any>
+  ): Promise<ServiceResponse<TestTaskListType>> {
+    return this.makeRequestPost<TestTaskListType>('getTestTaskList', params)
+  }
+
+  async stopTestTask(
+    params: Record<string, any>
+  ): Promise<ServiceResponse<any>> {
+    return this.makeRequestPost<any>('stopTestTask', params)
+  }
+
+  async resumeTestTask(
+    params: Record<string, any>
+  ): Promise<ServiceResponse<any>> {
+    return this.makeRequestPost<any>('resumeTestTask', params)
+  }
+
+  async getTestTaskConversations(
+    params: Record<string, any>
+  ): Promise<ServiceResponse<TaskConversationsType>> {
+    return this.makeRequest<TaskConversationsType>(
+      'getTestTaskConversations',
+      params
+    )
+  }
+}

+ 119 - 0
src/module/agent-test/service/agent-test.service.ts

@@ -0,0 +1,119 @@
+import { Injectable } from '@nestjs/common'
+
+import { IAgentTestService } from '@/interface/agent-test.interface'
+import { ServiceResponse } from '@/response/response.interface'
+import { BusinessCode, HttpStatusCode } from '@/response/status-code.enum'
+
+import { AgentTestHttpService } from './agent-test-http.service'
+
+@Injectable()
+export class AgentTestService implements IAgentTestService {
+  constructor(private readonly httpService: AgentTestHttpService) {}
+
+  async createTestTask(
+    params: Record<string, any>
+  ): Promise<ServiceResponse<TestTaskType>> {
+    const { code, data, msg } = await this.httpService.createTestTask(params)
+    if (code !== HttpStatusCode.OK) {
+      return {
+        code: BusinessCode.BAD_REQUEST,
+        msg: msg || '创建测试任务失败',
+        data: null
+      }
+    }
+    return {
+      code: BusinessCode.SUCCESS,
+      data,
+      msg: msg || '创建测试任务成功'
+    }
+  }
+
+  async getEvaluteType(): Promise<ServiceResponse<EvaluteType>> {
+    const { code, data, msg } = await this.httpService.getEvaluteType()
+    if (code !== HttpStatusCode.OK) {
+      return {
+        code: BusinessCode.BAD_REQUEST,
+        msg: msg || '获取评估类型失败',
+        data: null
+      }
+    }
+    return {
+      code: BusinessCode.SUCCESS,
+      data,
+      msg: msg || '获取评估类型成功'
+    }
+  }
+
+  async getTestTaskList(
+    params: Record<string, any>
+  ): Promise<ServiceResponse<TestTaskListType>> {
+    const { code, data, msg } = await this.httpService.getTestTaskList(params)
+    if (code !== HttpStatusCode.OK) {
+      return {
+        code: BusinessCode.BAD_REQUEST,
+        msg: msg || '获取测试任务列表失败',
+        data: null
+      }
+    }
+    return {
+      code: BusinessCode.SUCCESS,
+      data,
+      msg: msg || '获取测试任务列表成功'
+    }
+  }
+
+  async getTestTaskConversations(
+    params: Record<string, any>
+  ): Promise<ServiceResponse<TaskConversationsType>> {
+    const { code, data, msg } =
+      await this.httpService.getTestTaskConversations(params)
+    if (code !== HttpStatusCode.OK) {
+      return {
+        code: BusinessCode.BAD_REQUEST,
+        msg: msg || '获取测试任务会话列表失败',
+        data: null
+      }
+    }
+    return {
+      code: BusinessCode.SUCCESS,
+      data,
+      msg: msg || '获取测试任务会话列表成功'
+    }
+  }
+
+  async stopTestTask(
+    params: Record<string, any>
+  ): Promise<ServiceResponse<any>> {
+    const { code, data, msg } = await this.httpService.stopTestTask(params)
+    if (code !== HttpStatusCode.OK) {
+      return {
+        code: BusinessCode.BAD_REQUEST,
+        msg: msg || '停止测试任务失败',
+        data: null
+      }
+    }
+    return {
+      code: BusinessCode.SUCCESS,
+      data,
+      msg: msg || '停止测试任务成功'
+    }
+  }
+
+  async resumeTestTask(
+    params: Record<string, any>
+  ): Promise<ServiceResponse<any>> {
+    const { code, data, msg } = await this.httpService.resumeTestTask(params)
+    if (code !== HttpStatusCode.OK) {
+      return {
+        code: BusinessCode.BAD_REQUEST,
+        msg: msg || '恢复测试任务失败',
+        data: null
+      }
+    }
+    return {
+      code: BusinessCode.SUCCESS,
+      data,
+      msg: msg || '恢复测试任务成功'
+    }
+  }
+}

+ 60 - 0
src/module/agent-test/type.d.ts

@@ -0,0 +1,60 @@
+type TestTaskType = {
+  code: number
+  msg: string
+}
+
+type EvaluteType = {
+  code: number
+  msg: string
+  data: {
+    list: {
+      type: number
+      desc: string
+    }[]
+  }
+}
+
+type TestTaskListType = {
+  code: number
+  msg: string
+  data: TestTaskListData
+}
+
+type TestTaskListData = {
+  currentPage: number
+  pageSize: number
+  totalSize: number
+  total: number
+  list: {
+    id: number
+    agentName: string
+    createUser: string
+    updateUser: string
+    statusName: string
+    createTime: string
+    updateTime: string
+  }[]
+}
+
+type TaskConversationsType = {
+  code: number
+  msg: string
+  data: TaskConversationsData
+}
+
+type TaskConversationsData = {
+  currentPage: number
+  pageSize: number
+  totalSize: number
+  total: number
+  list: {
+    id: number
+    agentName: string
+    input: string
+    output: string
+    score: string
+    statusName: string
+    createTime: string
+    updateTime: string
+  }[]
+}

+ 5 - 8
src/module/chat-management/chat-management.module.ts

@@ -1,18 +1,15 @@
-import { HttpModule } from '@nestjs/axios'
 import { Module } from '@nestjs/common'
 
+import { HttpClientModule } from '@/shared/http-client/http-client.module'
+
 import { ChatManagementController } from './chat-management.controller'
 import { ChatManagementHttpService } from './service/chat-management-http.service'
 import { ChatManagementService } from './service/chat-management.service'
 
 @Module({
-  imports: [
-    HttpModule.register({
-      timeout: 600000,
-      maxRedirects: 3
-    })
-  ],
+  imports: [HttpClientModule],
   controllers: [ChatManagementController],
-  providers: [ChatManagementHttpService, ChatManagementService]
+  providers: [ChatManagementHttpService, ChatManagementService],
+  exports: [ChatManagementService]
 })
 export class ChatManagementModule {}

+ 6 - 37
src/module/chat-management/service/chat-management-http.service.ts

@@ -1,59 +1,28 @@
-import { HttpService } from '@nestjs/axios'
 import { Injectable } from '@nestjs/common'
-import { lastValueFrom } from 'rxjs'
 
 import { ServiceResponse } from '@/response/response.interface'
-import { HttpStatusCode } from '@/response/status-code.enum'
+import { HttpClientService } from '@/shared/http-client/http-client.service'
 
 @Injectable()
 export class ChatManagementHttpService {
   private readonly baseUrl = 'http://192.168.206.189:8083/api'
 
-  constructor(private readonly httpService: HttpService) {}
+  constructor(private readonly httpClientService: HttpClientService) {}
 
   private async makeRequest<T>(
     endpoint: string,
     params?: Record<string, any>
   ): Promise<ServiceResponse<T>> {
-    try {
-      const url = `${this.baseUrl}/${endpoint}`
-      const responseObservable = await this.httpService.get<ServiceResponse<T>>(
-        url,
-        { params }
-      )
-      const { data } = await lastValueFrom(responseObservable)
-      return data
-    } catch (error) {
-      return {
-        code: HttpStatusCode.INTERNAL_SERVER_ERROR,
-        msg: error.message,
-        data: null as T
-      }
-    }
+    const url = `${this.baseUrl}/${endpoint}`
+    return this.httpClientService.get<T>(url, params)
   }
 
   async makeRequestPost<T>(
     endpoint: string,
     params?: Record<string, any>
   ): Promise<ServiceResponse<T>> {
-    try {
-      const url = `${this.baseUrl}/${endpoint}`
-      const responseObservable = await this.httpService.post<
-        ServiceResponse<T>
-      >(url, params, {
-        headers: {
-          'Content-Type': 'application/json'
-        }
-      })
-      const { data } = await lastValueFrom(responseObservable)
-      return data
-    } catch (error) {
-      return {
-        code: HttpStatusCode.INTERNAL_SERVER_ERROR,
-        msg: error.message,
-        data: null as T
-      }
-    }
+    const url = `${this.baseUrl}/${endpoint}`
+    return this.httpClientService.post<T>(url, params)
   }
 
   // 获取对话总览列表

+ 0 - 1
src/prompt/sql-prompt/sql.ts

@@ -2,7 +2,6 @@ import QUERY_EXAMPLES from './query-examples'
 import SCHEMA_DEFINITIONS from './table-base.json'
 
 export function buildSqlPrompt(input: string) {
-  // console.log(businessRuleEnhancement(JSON.stringify(QUERY_EXAMPLES)))
   return {
     prompt_id: 'bi_sql_phase_prompt_v2',
     language: 'zh',

+ 11 - 0
src/shared/http-client/http-client.module.ts

@@ -0,0 +1,11 @@
+import { HttpModule } from '@nestjs/axios'
+import { Module } from '@nestjs/common'
+
+import { HttpClientService } from './http-client.service'
+
+@Module({
+  imports: [HttpModule],
+  providers: [HttpClientService],
+  exports: [HttpClientService]
+})
+export class HttpClientModule {} 

+ 54 - 0
src/shared/http-client/http-client.service.ts

@@ -0,0 +1,54 @@
+import { HttpService } from '@nestjs/axios'
+import { Injectable } from '@nestjs/common'
+import { lastValueFrom } from 'rxjs'
+
+import { ServiceResponse } from '@/response/response.interface'
+import { HttpStatusCode } from '@/response/status-code.enum'
+
+@Injectable()
+export class HttpClientService {
+  constructor(private readonly httpService: HttpService) {}
+
+  async get<T>(
+    url: string,
+    params?: Record<string, any>
+  ): Promise<ServiceResponse<T>> {
+    try {
+      const responseObservable = await this.httpService.get<ServiceResponse<T>>(
+        url,
+        { params }
+      )
+      const { data } = await lastValueFrom(responseObservable)
+      return data
+    } catch (error) {
+      return {
+        code: HttpStatusCode.INTERNAL_SERVER_ERROR,
+        msg: error.message,
+        data: null as T
+      }
+    }
+  }
+
+  async post<T>(
+    url: string,
+    params?: Record<string, any>
+  ): Promise<ServiceResponse<T>> {
+    try {
+      const responseObservable = await this.httpService.post<
+        ServiceResponse<T>
+      >(url, params, {
+        headers: {
+          'Content-Type': 'application/json'
+        }
+      })
+      const { data } = await lastValueFrom(responseObservable)
+      return data
+    } catch (error) {
+      return {
+        code: HttpStatusCode.INTERNAL_SERVER_ERROR,
+        msg: error.message,
+        data: null as T
+      }
+    }
+  }
+}