From 1a7f4d16a1f6c976d689079ad23c8be3e0bfb58f Mon Sep 17 00:00:00 2001 From: tanglong <842690096@qq.com> Date: Mon, 8 Jun 2026 18:29:56 +0800 Subject: [PATCH] =?UTF-8?q?=E9=80=BB=E8=BE=91=E5=88=86=E7=A6=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 48 ++++++++++++++ .../AgentFoundationApplication.java | 21 +++++- .../agent/AgentMessageRequest.java | 9 +++ .../agent/AgentMessageResponse.java | 14 ++++ .../agent/AgentOrchestratorService.java | 2 +- .../agent/AgentRequestContext.java | 11 ++++ .../agent/AgentRuntimeController.java | 33 ++++++++++ .../agent/OperationReportController.java | 12 +++- .../agent/OperationReportService.java | 64 +++++-------------- .../AbstractPlaceholderCapabilityHandler.java | 29 +++++++++ .../capability/AgentCapabilityDescriptor.java | 9 +++ .../capability/AgentCapabilityHandler.java | 11 ++++ .../agent/capability/CapabilityRegistry.java | 42 ++++++++++++ .../ContentGenerationCapabilityHandler.java | 17 +++++ ...stomerDashboardDailyCapabilityHandler.java | 17 +++++ .../DataSyncStatusCapabilityHandler.java | 17 +++++ ...cCallComplianceDailyCapabilityHandler.java | 17 +++++ .../PeriodSummaryReportCapabilityHandler.java | 17 +++++ ...udentAttendanceDailyCapabilityHandler.java | 17 +++++ .../WecomOperationDailyCapabilityHandler.java | 17 +++++ 20 files changed, 373 insertions(+), 51 deletions(-) create mode 100644 src/main/java/com/company/agentfoundation/agent/AgentMessageRequest.java create mode 100644 src/main/java/com/company/agentfoundation/agent/AgentMessageResponse.java create mode 100644 src/main/java/com/company/agentfoundation/agent/AgentRequestContext.java create mode 100644 src/main/java/com/company/agentfoundation/agent/AgentRuntimeController.java create mode 100644 src/main/java/com/company/agentfoundation/agent/capability/AbstractPlaceholderCapabilityHandler.java create mode 100644 src/main/java/com/company/agentfoundation/agent/capability/AgentCapabilityDescriptor.java create mode 100644 src/main/java/com/company/agentfoundation/agent/capability/AgentCapabilityHandler.java create mode 100644 src/main/java/com/company/agentfoundation/agent/capability/CapabilityRegistry.java create mode 100644 src/main/java/com/company/agentfoundation/agent/capability/ContentGenerationCapabilityHandler.java create mode 100644 src/main/java/com/company/agentfoundation/agent/capability/CustomerDashboardDailyCapabilityHandler.java create mode 100644 src/main/java/com/company/agentfoundation/agent/capability/DataSyncStatusCapabilityHandler.java create mode 100644 src/main/java/com/company/agentfoundation/agent/capability/EcCallComplianceDailyCapabilityHandler.java create mode 100644 src/main/java/com/company/agentfoundation/agent/capability/PeriodSummaryReportCapabilityHandler.java create mode 100644 src/main/java/com/company/agentfoundation/agent/capability/StudentAttendanceDailyCapabilityHandler.java create mode 100644 src/main/java/com/company/agentfoundation/agent/capability/WecomOperationDailyCapabilityHandler.java diff --git a/README.md b/README.md index a0452b2..f992e10 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,54 @@ Java Spring Boot base platform for multiple enterprise agents (CRM assistant, kn - POST `/v1/chat/completions` - GET `/v1/healthz` +## Agent Gateway Architecture +`agent-foundation` is the company AI gateway and agent orchestration service. +It should stay focused on: + +- WeCom / API entrypoints +- user identity and permission context +- intent recognition +- capability routing +- model gateway calls +- logs, audit, and runtime diagnostics + +Business-heavy features such as CRM data, knowledge base, PPT generation, +bidding documents, reports, and media operations should be implemented as +separate capability handlers first, and can later be split into independent +services. + +Current runtime flow: + +```text +WeCom / API + -> AgentOrchestratorService + -> IntentRecognitionService + -> CapabilityRegistry + -> AgentCapabilityHandler +``` + +To add a new business skill: + +1. Add a new intent in `AgentIntent`. +2. Add keyword / LLM routing rules in `IntentRecognitionService`. +3. Implement `AgentCapabilityHandler`. +4. Mark it as a Spring `@Component`. +5. Test it through `/v1/agent/messages` or WeCom. + +## Agent Runtime API +- POST `/v1/agent/messages` +- GET `/v1/agent/capabilities` + +Example: + +```bash +curl -X POST "http://127.0.0.1:8880/v1/agent/messages" \ + -H "Content-Type: application/json" \ + -H "X-Agent-Id: crm-assistant" \ + -H "X-Internal-Key: crm-dev-key" \ + -d '{"wecomUserId":"YiNianYiQingJing","message":"今日客资情况"}' +``` + ## WeCom CRM Bot Integration - Callback URL: `/v1/integrations/wecom/callback` - Receive enterprise WeCom text messages and route to `crm-assistant` diff --git a/src/main/java/com/company/agentfoundation/AgentFoundationApplication.java b/src/main/java/com/company/agentfoundation/AgentFoundationApplication.java index e8e854d..7f968ca 100644 --- a/src/main/java/com/company/agentfoundation/AgentFoundationApplication.java +++ b/src/main/java/com/company/agentfoundation/AgentFoundationApplication.java @@ -1,7 +1,26 @@ package com.company.agentfoundation; + import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.context.event.ApplicationReadyEvent; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.event.EventListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + @SpringBootApplication public class AgentFoundationApplication { - public static void main(String[] args) { SpringApplication.run(AgentFoundationApplication.class, args); } + private static final Logger log = LoggerFactory.getLogger(AgentFoundationApplication.class); + + @Value("${server.port:8080}") + private String serverPort; + + public static void main(String[] args) { + SpringApplication.run(AgentFoundationApplication.class, args); + } + + @EventListener(ApplicationReadyEvent.class) + public void onApplicationReady() { + log.info("agent-foundation startup success port={} health=/v1/healthz wecomCallback=/v1/integrations/wecom/callback agentMessages=/v1/agent/messages", serverPort); + } } diff --git a/src/main/java/com/company/agentfoundation/agent/AgentMessageRequest.java b/src/main/java/com/company/agentfoundation/agent/AgentMessageRequest.java new file mode 100644 index 0000000..b2cca04 --- /dev/null +++ b/src/main/java/com/company/agentfoundation/agent/AgentMessageRequest.java @@ -0,0 +1,9 @@ +package com.company.agentfoundation.agent; + +import jakarta.validation.constraints.NotBlank; + +public record AgentMessageRequest( + @NotBlank String message, + String wecomUserId +) { +} diff --git a/src/main/java/com/company/agentfoundation/agent/AgentMessageResponse.java b/src/main/java/com/company/agentfoundation/agent/AgentMessageResponse.java new file mode 100644 index 0000000..d4328c5 --- /dev/null +++ b/src/main/java/com/company/agentfoundation/agent/AgentMessageResponse.java @@ -0,0 +1,14 @@ +package com.company.agentfoundation.agent; + +import java.time.Instant; + +public record AgentMessageResponse( + String agentId, + String wecomUserId, + String reply, + Instant timestamp +) { + public static AgentMessageResponse of(String agentId, String wecomUserId, String reply) { + return new AgentMessageResponse(agentId, wecomUserId, reply, Instant.now()); + } +} diff --git a/src/main/java/com/company/agentfoundation/agent/AgentOrchestratorService.java b/src/main/java/com/company/agentfoundation/agent/AgentOrchestratorService.java index 1558e64..dc62881 100644 --- a/src/main/java/com/company/agentfoundation/agent/AgentOrchestratorService.java +++ b/src/main/java/com/company/agentfoundation/agent/AgentOrchestratorService.java @@ -32,7 +32,7 @@ public class AgentOrchestratorService { AgentIntent intent = intentRecognitionService.recognize(agentId, userText); log.info("agent orchestrator route fromUser={} intent={} group={}", fromUser, intent.code(), intent.mcpGroup()); if (intent != AgentIntent.GENERAL_CHAT) { - return toWecomText(operationReportService.handle(intent)); + return toWecomText(operationReportService.handle(intent, AgentRequestContext.of(agentId, fromUser, userText))); } ChatRequest request = new ChatRequest( diff --git a/src/main/java/com/company/agentfoundation/agent/AgentRequestContext.java b/src/main/java/com/company/agentfoundation/agent/AgentRequestContext.java new file mode 100644 index 0000000..e2ca35f --- /dev/null +++ b/src/main/java/com/company/agentfoundation/agent/AgentRequestContext.java @@ -0,0 +1,11 @@ +package com.company.agentfoundation.agent; + +public record AgentRequestContext( + String agentId, + String wecomUserId, + String userText +) { + public static AgentRequestContext of(String agentId, String wecomUserId, String userText) { + return new AgentRequestContext(agentId, wecomUserId, userText == null ? "" : userText); + } +} diff --git a/src/main/java/com/company/agentfoundation/agent/AgentRuntimeController.java b/src/main/java/com/company/agentfoundation/agent/AgentRuntimeController.java new file mode 100644 index 0000000..90dc13f --- /dev/null +++ b/src/main/java/com/company/agentfoundation/agent/AgentRuntimeController.java @@ -0,0 +1,33 @@ +package com.company.agentfoundation.agent; + +import com.company.agentfoundation.security.AgentAuthService; +import jakarta.validation.Valid; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/v1/agent") +public class AgentRuntimeController { + private final AgentAuthService authService; + private final AgentOrchestratorService agentOrchestratorService; + + public AgentRuntimeController(AgentAuthService authService, AgentOrchestratorService agentOrchestratorService) { + this.authService = authService; + this.agentOrchestratorService = agentOrchestratorService; + } + + @PostMapping("/messages") + public ResponseEntity handleMessage( + @RequestHeader("X-Agent-Id") String agentId, + @RequestHeader("X-Internal-Key") String internalKey, + @Valid @RequestBody AgentMessageRequest request + ) { + authService.authenticate(agentId, internalKey); + String reply = agentOrchestratorService.handleMessage(agentId, request.wecomUserId(), request.message()); + return ResponseEntity.ok(AgentMessageResponse.of(agentId, request.wecomUserId(), reply)); + } +} diff --git a/src/main/java/com/company/agentfoundation/agent/OperationReportController.java b/src/main/java/com/company/agentfoundation/agent/OperationReportController.java index 7993b7e..7645560 100644 --- a/src/main/java/com/company/agentfoundation/agent/OperationReportController.java +++ b/src/main/java/com/company/agentfoundation/agent/OperationReportController.java @@ -1,5 +1,7 @@ package com.company.agentfoundation.agent; +import com.company.agentfoundation.agent.capability.AgentCapabilityDescriptor; +import com.company.agentfoundation.agent.capability.CapabilityRegistry; import com.company.agentfoundation.security.AgentAuthService; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; @@ -12,10 +14,18 @@ import org.springframework.web.bind.annotation.RestController; public class OperationReportController { private final AgentAuthService authService; private final OperationReportService operationReportService; + private final CapabilityRegistry capabilityRegistry; - public OperationReportController(AgentAuthService authService, OperationReportService operationReportService) { + public OperationReportController(AgentAuthService authService, OperationReportService operationReportService, CapabilityRegistry capabilityRegistry) { this.authService = authService; this.operationReportService = operationReportService; + this.capabilityRegistry = capabilityRegistry; + } + + @GetMapping + public ResponseEntity> listCapabilities(@RequestHeader("X-Agent-Id") String agentId, @RequestHeader("X-Internal-Key") String internalKey) { + authService.authenticate(agentId, internalKey); + return ResponseEntity.ok(capabilityRegistry.listCapabilities()); } @GetMapping("/data-sync/status") diff --git a/src/main/java/com/company/agentfoundation/agent/OperationReportService.java b/src/main/java/com/company/agentfoundation/agent/OperationReportService.java index e73b7e4..8d2e4b8 100644 --- a/src/main/java/com/company/agentfoundation/agent/OperationReportService.java +++ b/src/main/java/com/company/agentfoundation/agent/OperationReportService.java @@ -1,77 +1,45 @@ package com.company.agentfoundation.agent; +import com.company.agentfoundation.agent.capability.CapabilityRegistry; import org.springframework.stereotype.Service; -import java.util.List; - @Service public class OperationReportService { - public AgentCapabilityResponse handle(AgentIntent intent) { - return switch (intent) { - case DATA_SYNC_STATUS -> dataSyncStatus(); - case CUSTOMER_DASHBOARD_DAILY -> customerDashboardDaily(); - case STUDENT_ATTENDANCE_DAILY -> studentAttendanceDaily(); - case WECOM_OPERATION_DAILY -> wecomOperationDaily(); - case EC_CALL_COMPLIANCE_DAILY -> ecCallComplianceDaily(); - case PERIOD_SUMMARY_REPORT -> periodSummaryReport(); - case CONTENT_GENERATION -> contentGeneration(); - case GENERAL_CHAT -> AgentCapabilityResponse.placeholder(intent, "\u901a\u7528\u5bf9\u8bdd\u80fd\u529b\u6b63\u5728\u5b8c\u5584\u4e2d\u3002", List.of("DeepSeek")); - }; + private final CapabilityRegistry capabilityRegistry; + + public OperationReportService(CapabilityRegistry capabilityRegistry) { + this.capabilityRegistry = capabilityRegistry; + } + + public AgentCapabilityResponse handle(AgentIntent intent, AgentRequestContext context) { + return capabilityRegistry.execute(intent, context); } public AgentCapabilityResponse dataSyncStatus() { - return AgentCapabilityResponse.placeholder( - AgentIntent.DATA_SYNC_STATUS, - "\u4e09\u7cfb\u7edf\u63a5\u53e3\u6253\u901a\u4e0e\u6570\u636e\u540c\u6b65\u80fd\u529b\u6b63\u5728\u5b8c\u5584\u4e2d\uff0c\u540e\u7eed\u5c06\u63a5\u5165\u5b66\u90a6\u6559\u52a1\u7cfb\u7edf\u3001\u4f01\u4e1a\u5fae\u4fe1\u3001EC \u7535\u8bdd\u76d1\u63a7\u5e73\u53f0\u3002", - List.of("\u5b66\u90a6\u6559\u52a1\u7cfb\u7edf", "\u4f01\u4e1a\u5fae\u4fe1", "EC \u7535\u8bdd\u76d1\u63a7\u5e73\u53f0") - ); + return handle(AgentIntent.DATA_SYNC_STATUS, AgentRequestContext.of(null, null, null)); } public AgentCapabilityResponse customerDashboardDaily() { - return AgentCapabilityResponse.placeholder( - AgentIntent.CUSTOMER_DASHBOARD_DAILY, - "\u5ba2\u8d44\u5927\u76d8\u6570\u636e\u6b63\u5728\u5b8c\u5584\u4e2d\uff0c\u540e\u7eed\u5c06\u8986\u76d6\u5ba2\u8d44\u65b0\u589e\u3001\u5206\u914d\u3001\u8ddf\u8fdb\u3001\u8f6c\u5316\u3001\u6d41\u5931\u4e0e\u5f02\u5e38\u98ce\u9669\u9884\u8b66\u3002", - List.of("\u5b66\u90a6\u6559\u52a1\u7cfb\u7edf", "\u4f01\u4e1a\u5fae\u4fe1", "CRM \u6570\u636e\u5e93") - ); + return handle(AgentIntent.CUSTOMER_DASHBOARD_DAILY, AgentRequestContext.of(null, null, null)); } public AgentCapabilityResponse studentAttendanceDaily() { - return AgentCapabilityResponse.placeholder( - AgentIntent.STUDENT_ATTENDANCE_DAILY, - "\u5b66\u5458\u6559\u5b66\u51fa\u52e4\u65e5\u62a5\u6b63\u5728\u5b8c\u5584\u4e2d\uff0c\u540e\u7eed\u5c06\u6c47\u603b\u6392\u8bfe\u3001\u7b7e\u5230\u51fa\u52e4\u3001\u8bfe\u540e\u8bc4\u4ef7\u548c\u8bfe\u7a0b\u6210\u679c\u7d20\u6750\u3002", - List.of("\u5b66\u90a6\u6559\u52a1\u7cfb\u7edf") - ); + return handle(AgentIntent.STUDENT_ATTENDANCE_DAILY, AgentRequestContext.of(null, null, null)); } public AgentCapabilityResponse wecomOperationDaily() { - return AgentCapabilityResponse.placeholder( - AgentIntent.WECOM_OPERATION_DAILY, - "\u4f01\u4e1a\u5fae\u4fe1\u5ba2\u6237\u8fd0\u8425\u65e5\u62a5\u6b63\u5728\u5b8c\u5584\u4e2d\uff0c\u540e\u7eed\u5c06\u7edf\u8ba1\u5ba2\u6237\u65b0\u589e\u3001\u6c9f\u901a\u6d3b\u8dc3\u5ea6\u3001\u89e6\u8fbe\u6548\u679c\u4e0e\u5ba2\u6237\u6d41\u5931\u3002", - List.of("\u4f01\u4e1a\u5fae\u4fe1") - ); + return handle(AgentIntent.WECOM_OPERATION_DAILY, AgentRequestContext.of(null, null, null)); } public AgentCapabilityResponse ecCallComplianceDaily() { - return AgentCapabilityResponse.placeholder( - AgentIntent.EC_CALL_COMPLIANCE_DAILY, - "EC \u7535\u8bdd\u5408\u89c4\u76d1\u63a7\u65e5\u62a5\u6b63\u5728\u5b8c\u5584\u4e2d\uff0c\u540e\u7eed\u5c06\u7edf\u8ba1\u5916\u547c\u603b\u91cf\u3001\u63a5\u901a\u7387\u3001\u6709\u6548\u901a\u8bdd\u65f6\u957f\u3001\u5f55\u97f3\u5408\u89c4\u4e0e\u8d26\u53f7\u98ce\u63a7\u3002", - List.of("EC \u7535\u8bdd\u76d1\u63a7\u5e73\u53f0") - ); + return handle(AgentIntent.EC_CALL_COMPLIANCE_DAILY, AgentRequestContext.of(null, null, null)); } public AgentCapabilityResponse periodSummaryReport() { - return AgentCapabilityResponse.placeholder( - AgentIntent.PERIOD_SUMMARY_REPORT, - "\u5468\u671f\u5316\u7ecf\u8425\u5468\u62a5\u3001\u6708\u62a5\u6b63\u5728\u5b8c\u5584\u4e2d\uff0c\u540e\u7eed\u5c06\u6574\u5408\u4e09\u5e73\u53f0\u6bcf\u65e5\u6570\u636e\u7528\u4e8e\u7ba1\u7406\u590d\u76d8\u548c\u7ecf\u8425\u5206\u6790\u3002", - List.of("\u5b66\u90a6\u6559\u52a1\u7cfb\u7edf", "\u4f01\u4e1a\u5fae\u4fe1", "EC \u7535\u8bdd\u76d1\u63a7\u5e73\u53f0") - ); + return handle(AgentIntent.PERIOD_SUMMARY_REPORT, AgentRequestContext.of(null, null, null)); } public AgentCapabilityResponse contentGeneration() { - return AgentCapabilityResponse.placeholder( - AgentIntent.CONTENT_GENERATION, - "\u7ecf\u8425\u5185\u5bb9\u667a\u80fd\u751f\u6210\u80fd\u529b\u6b63\u5728\u5b8c\u5584\u4e2d\uff0c\u540e\u7eed\u5c06\u652f\u6301\u5ba2\u670d\u8bdd\u672f\u3001\u670d\u52a1 SOP\u3001\u8425\u9500\u6d3b\u52a8\u65b9\u6848\u3001\u83b7\u5ba2\u6587\u6848\u548c\u7ba1\u7406\u5236\u5ea6\u751f\u6210\u3002", - List.of("DeepSeek", "\u8fd0\u8425\u77e5\u8bc6\u5e93") - ); + return handle(AgentIntent.CONTENT_GENERATION, AgentRequestContext.of(null, null, null)); } } diff --git a/src/main/java/com/company/agentfoundation/agent/capability/AbstractPlaceholderCapabilityHandler.java b/src/main/java/com/company/agentfoundation/agent/capability/AbstractPlaceholderCapabilityHandler.java new file mode 100644 index 0000000..a94685f --- /dev/null +++ b/src/main/java/com/company/agentfoundation/agent/capability/AbstractPlaceholderCapabilityHandler.java @@ -0,0 +1,29 @@ +package com.company.agentfoundation.agent.capability; + +import com.company.agentfoundation.agent.AgentCapabilityResponse; +import com.company.agentfoundation.agent.AgentIntent; +import com.company.agentfoundation.agent.AgentRequestContext; + +import java.util.List; + +abstract class AbstractPlaceholderCapabilityHandler implements AgentCapabilityHandler { + private final AgentIntent intent; + private final String message; + private final List dataSources; + + protected AbstractPlaceholderCapabilityHandler(AgentIntent intent, String message, List dataSources) { + this.intent = intent; + this.message = message; + this.dataSources = dataSources; + } + + @Override + public AgentIntent intent() { + return intent; + } + + @Override + public AgentCapabilityResponse handle(AgentRequestContext context) { + return AgentCapabilityResponse.placeholder(intent, message, dataSources); + } +} diff --git a/src/main/java/com/company/agentfoundation/agent/capability/AgentCapabilityDescriptor.java b/src/main/java/com/company/agentfoundation/agent/capability/AgentCapabilityDescriptor.java new file mode 100644 index 0000000..da76c50 --- /dev/null +++ b/src/main/java/com/company/agentfoundation/agent/capability/AgentCapabilityDescriptor.java @@ -0,0 +1,9 @@ +package com.company.agentfoundation.agent.capability; + +public record AgentCapabilityDescriptor( + String intentCode, + String title, + String mcpGroup, + String handlerClass +) { +} diff --git a/src/main/java/com/company/agentfoundation/agent/capability/AgentCapabilityHandler.java b/src/main/java/com/company/agentfoundation/agent/capability/AgentCapabilityHandler.java new file mode 100644 index 0000000..609c0bc --- /dev/null +++ b/src/main/java/com/company/agentfoundation/agent/capability/AgentCapabilityHandler.java @@ -0,0 +1,11 @@ +package com.company.agentfoundation.agent.capability; + +import com.company.agentfoundation.agent.AgentCapabilityResponse; +import com.company.agentfoundation.agent.AgentIntent; +import com.company.agentfoundation.agent.AgentRequestContext; + +public interface AgentCapabilityHandler { + AgentIntent intent(); + + AgentCapabilityResponse handle(AgentRequestContext context); +} diff --git a/src/main/java/com/company/agentfoundation/agent/capability/CapabilityRegistry.java b/src/main/java/com/company/agentfoundation/agent/capability/CapabilityRegistry.java new file mode 100644 index 0000000..11e8f34 --- /dev/null +++ b/src/main/java/com/company/agentfoundation/agent/capability/CapabilityRegistry.java @@ -0,0 +1,42 @@ +package com.company.agentfoundation.agent.capability; + +import com.company.agentfoundation.agent.AgentCapabilityResponse; +import com.company.agentfoundation.agent.AgentIntent; +import com.company.agentfoundation.agent.AgentRequestContext; +import org.springframework.stereotype.Service; + +import java.util.EnumMap; +import java.util.Comparator; +import java.util.List; +import java.util.Map; + +@Service +public class CapabilityRegistry { + private final Map handlers = new EnumMap<>(AgentIntent.class); + + public CapabilityRegistry(List handlerList) { + for (AgentCapabilityHandler handler : handlerList) { + handlers.put(handler.intent(), handler); + } + } + + public AgentCapabilityResponse execute(AgentIntent intent, AgentRequestContext context) { + AgentCapabilityHandler handler = handlers.get(intent); + if (handler == null) { + return AgentCapabilityResponse.placeholder(intent, "\u8be5\u80fd\u529b\u8fd8\u672a\u6ce8\u518c\uff0c\u8bf7\u5148\u589e\u52a0\u5bf9\u5e94\u7684 CapabilityHandler\u3002", List.of()); + } + return handler.handle(context); + } + + public List listCapabilities() { + return handlers.values().stream() + .map(handler -> new AgentCapabilityDescriptor( + handler.intent().code(), + handler.intent().title(), + handler.intent().mcpGroup(), + handler.getClass().getSimpleName() + )) + .sorted(Comparator.comparing(AgentCapabilityDescriptor::intentCode)) + .toList(); + } +} diff --git a/src/main/java/com/company/agentfoundation/agent/capability/ContentGenerationCapabilityHandler.java b/src/main/java/com/company/agentfoundation/agent/capability/ContentGenerationCapabilityHandler.java new file mode 100644 index 0000000..9c2f72f --- /dev/null +++ b/src/main/java/com/company/agentfoundation/agent/capability/ContentGenerationCapabilityHandler.java @@ -0,0 +1,17 @@ +package com.company.agentfoundation.agent.capability; + +import com.company.agentfoundation.agent.AgentIntent; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Component +public class ContentGenerationCapabilityHandler extends AbstractPlaceholderCapabilityHandler { + public ContentGenerationCapabilityHandler() { + super( + AgentIntent.CONTENT_GENERATION, + "\u7ecf\u8425\u5185\u5bb9\u667a\u80fd\u751f\u6210\u80fd\u529b\u6b63\u5728\u5b8c\u5584\u4e2d\uff0c\u540e\u7eed\u5c06\u652f\u6301\u5ba2\u670d\u8bdd\u672f\u3001\u670d\u52a1 SOP\u3001\u8425\u9500\u6d3b\u52a8\u65b9\u6848\u3001\u83b7\u5ba2\u6587\u6848\u548c\u7ba1\u7406\u5236\u5ea6\u751f\u6210\u3002", + List.of("DeepSeek", "\u8fd0\u8425\u77e5\u8bc6\u5e93") + ); + } +} diff --git a/src/main/java/com/company/agentfoundation/agent/capability/CustomerDashboardDailyCapabilityHandler.java b/src/main/java/com/company/agentfoundation/agent/capability/CustomerDashboardDailyCapabilityHandler.java new file mode 100644 index 0000000..6289200 --- /dev/null +++ b/src/main/java/com/company/agentfoundation/agent/capability/CustomerDashboardDailyCapabilityHandler.java @@ -0,0 +1,17 @@ +package com.company.agentfoundation.agent.capability; + +import com.company.agentfoundation.agent.AgentIntent; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Component +public class CustomerDashboardDailyCapabilityHandler extends AbstractPlaceholderCapabilityHandler { + public CustomerDashboardDailyCapabilityHandler() { + super( + AgentIntent.CUSTOMER_DASHBOARD_DAILY, + "\u5ba2\u8d44\u5927\u76d8\u6570\u636e\u6b63\u5728\u5b8c\u5584\u4e2d\uff0c\u540e\u7eed\u5c06\u8986\u76d6\u5ba2\u8d44\u65b0\u589e\u3001\u5206\u914d\u3001\u8ddf\u8fdb\u3001\u8f6c\u5316\u3001\u6d41\u5931\u4e0e\u5f02\u5e38\u98ce\u9669\u9884\u8b66\u3002", + List.of("\u5b66\u90a6\u6559\u52a1\u7cfb\u7edf", "\u4f01\u4e1a\u5fae\u4fe1", "CRM \u6570\u636e\u5e93") + ); + } +} diff --git a/src/main/java/com/company/agentfoundation/agent/capability/DataSyncStatusCapabilityHandler.java b/src/main/java/com/company/agentfoundation/agent/capability/DataSyncStatusCapabilityHandler.java new file mode 100644 index 0000000..e53c906 --- /dev/null +++ b/src/main/java/com/company/agentfoundation/agent/capability/DataSyncStatusCapabilityHandler.java @@ -0,0 +1,17 @@ +package com.company.agentfoundation.agent.capability; + +import com.company.agentfoundation.agent.AgentIntent; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Component +public class DataSyncStatusCapabilityHandler extends AbstractPlaceholderCapabilityHandler { + public DataSyncStatusCapabilityHandler() { + super( + AgentIntent.DATA_SYNC_STATUS, + "\u4e09\u7cfb\u7edf\u63a5\u53e3\u6253\u901a\u4e0e\u6570\u636e\u540c\u6b65\u80fd\u529b\u6b63\u5728\u5b8c\u5584\u4e2d\uff0c\u540e\u7eed\u5c06\u63a5\u5165\u5b66\u90a6\u6559\u52a1\u7cfb\u7edf\u3001\u4f01\u4e1a\u5fae\u4fe1\u3001EC \u7535\u8bdd\u76d1\u63a7\u5e73\u53f0\u3002", + List.of("\u5b66\u90a6\u6559\u52a1\u7cfb\u7edf", "\u4f01\u4e1a\u5fae\u4fe1", "EC \u7535\u8bdd\u76d1\u63a7\u5e73\u53f0") + ); + } +} diff --git a/src/main/java/com/company/agentfoundation/agent/capability/EcCallComplianceDailyCapabilityHandler.java b/src/main/java/com/company/agentfoundation/agent/capability/EcCallComplianceDailyCapabilityHandler.java new file mode 100644 index 0000000..d4a554a --- /dev/null +++ b/src/main/java/com/company/agentfoundation/agent/capability/EcCallComplianceDailyCapabilityHandler.java @@ -0,0 +1,17 @@ +package com.company.agentfoundation.agent.capability; + +import com.company.agentfoundation.agent.AgentIntent; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Component +public class EcCallComplianceDailyCapabilityHandler extends AbstractPlaceholderCapabilityHandler { + public EcCallComplianceDailyCapabilityHandler() { + super( + AgentIntent.EC_CALL_COMPLIANCE_DAILY, + "EC \u7535\u8bdd\u5408\u89c4\u76d1\u63a7\u65e5\u62a5\u6b63\u5728\u5b8c\u5584\u4e2d\uff0c\u540e\u7eed\u5c06\u7edf\u8ba1\u5916\u547c\u603b\u91cf\u3001\u63a5\u901a\u7387\u3001\u6709\u6548\u901a\u8bdd\u65f6\u957f\u3001\u5f55\u97f3\u5408\u89c4\u4e0e\u8d26\u53f7\u98ce\u63a7\u3002", + List.of("EC \u7535\u8bdd\u76d1\u63a7\u5e73\u53f0") + ); + } +} diff --git a/src/main/java/com/company/agentfoundation/agent/capability/PeriodSummaryReportCapabilityHandler.java b/src/main/java/com/company/agentfoundation/agent/capability/PeriodSummaryReportCapabilityHandler.java new file mode 100644 index 0000000..c2d4052 --- /dev/null +++ b/src/main/java/com/company/agentfoundation/agent/capability/PeriodSummaryReportCapabilityHandler.java @@ -0,0 +1,17 @@ +package com.company.agentfoundation.agent.capability; + +import com.company.agentfoundation.agent.AgentIntent; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Component +public class PeriodSummaryReportCapabilityHandler extends AbstractPlaceholderCapabilityHandler { + public PeriodSummaryReportCapabilityHandler() { + super( + AgentIntent.PERIOD_SUMMARY_REPORT, + "\u5468\u671f\u5316\u7ecf\u8425\u5468\u62a5\u3001\u6708\u62a5\u6b63\u5728\u5b8c\u5584\u4e2d\uff0c\u540e\u7eed\u5c06\u6574\u5408\u4e09\u5e73\u53f0\u6bcf\u65e5\u6570\u636e\u7528\u4e8e\u7ba1\u7406\u590d\u76d8\u548c\u7ecf\u8425\u5206\u6790\u3002", + List.of("\u5b66\u90a6\u6559\u52a1\u7cfb\u7edf", "\u4f01\u4e1a\u5fae\u4fe1", "EC \u7535\u8bdd\u76d1\u63a7\u5e73\u53f0") + ); + } +} diff --git a/src/main/java/com/company/agentfoundation/agent/capability/StudentAttendanceDailyCapabilityHandler.java b/src/main/java/com/company/agentfoundation/agent/capability/StudentAttendanceDailyCapabilityHandler.java new file mode 100644 index 0000000..f105206 --- /dev/null +++ b/src/main/java/com/company/agentfoundation/agent/capability/StudentAttendanceDailyCapabilityHandler.java @@ -0,0 +1,17 @@ +package com.company.agentfoundation.agent.capability; + +import com.company.agentfoundation.agent.AgentIntent; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Component +public class StudentAttendanceDailyCapabilityHandler extends AbstractPlaceholderCapabilityHandler { + public StudentAttendanceDailyCapabilityHandler() { + super( + AgentIntent.STUDENT_ATTENDANCE_DAILY, + "\u5b66\u5458\u6559\u5b66\u51fa\u52e4\u65e5\u62a5\u6b63\u5728\u5b8c\u5584\u4e2d\uff0c\u540e\u7eed\u5c06\u6c47\u603b\u6392\u8bfe\u3001\u7b7e\u5230\u51fa\u52e4\u3001\u8bfe\u540e\u8bc4\u4ef7\u548c\u8bfe\u7a0b\u6210\u679c\u7d20\u6750\u3002", + List.of("\u5b66\u90a6\u6559\u52a1\u7cfb\u7edf") + ); + } +} diff --git a/src/main/java/com/company/agentfoundation/agent/capability/WecomOperationDailyCapabilityHandler.java b/src/main/java/com/company/agentfoundation/agent/capability/WecomOperationDailyCapabilityHandler.java new file mode 100644 index 0000000..8e365f2 --- /dev/null +++ b/src/main/java/com/company/agentfoundation/agent/capability/WecomOperationDailyCapabilityHandler.java @@ -0,0 +1,17 @@ +package com.company.agentfoundation.agent.capability; + +import com.company.agentfoundation.agent.AgentIntent; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Component +public class WecomOperationDailyCapabilityHandler extends AbstractPlaceholderCapabilityHandler { + public WecomOperationDailyCapabilityHandler() { + super( + AgentIntent.WECOM_OPERATION_DAILY, + "\u4f01\u4e1a\u5fae\u4fe1\u5ba2\u6237\u8fd0\u8425\u65e5\u62a5\u6b63\u5728\u5b8c\u5584\u4e2d\uff0c\u540e\u7eed\u5c06\u7edf\u8ba1\u5ba2\u6237\u65b0\u589e\u3001\u6c9f\u901a\u6d3b\u8dc3\u5ea6\u3001\u89e6\u8fbe\u6548\u679c\u4e0e\u5ba2\u6237\u6d41\u5931\u3002", + List.of("\u4f01\u4e1a\u5fae\u4fe1") + ); + } +}