From 93ba4258e5056b3bcd872d803f6f94bd40c8b528 Mon Sep 17 00:00:00 2001 From: matevip Date: Mon, 12 Oct 2026 05:41:24 -0400 Subject: [PATCH] feat(runtime): migrate to Spring Boot 4, Spring AI 2 and AgentScope 2 (#660) --- README.md | 22 +- README_zh.md | 22 +- mateclaw-server/pom.xml | 96 +- .../java/vip/mate/MateClawApplication.java | 18 +- .../vip/mate/agent/AgentGraphBuilder.java | 455 ++------- .../java/vip/mate/agent/AgentService.java | 101 +- .../vip/mate/agent/GraphEventPublisher.java | 8 +- .../context/ConversationWindowManager.java | 7 +- .../mate/agent/graph/ModelToolOptions.java | 47 + .../agent/graph/NodeStreamingChatHelper.java | 127 ++- .../agent/graph/StateGraphReActAgent.java | 83 +- .../graph/edge/GoalEvaluationDispatcher.java | 6 +- .../graph/edge/ObservationDispatcher.java | 6 +- .../agent/graph/edge/ReasoningDispatcher.java | 6 +- .../graph/executor/ToolCallDeadline.java | 24 +- .../executor/ToolExecutionCheckpoint.java | 11 + ...lExecutionCheckpointRejectedException.java | 12 + .../graph/executor/ToolExecutionExecutor.java | 338 +++++-- .../lifecycle/ReActLifecycleListener.java | 140 --- .../vip/mate/agent/graph/node/ActionNode.java | 25 +- .../agent/graph/node/FinalAnswerNode.java | 6 +- .../agent/graph/node/GoalEvaluationNode.java | 8 +- .../agent/graph/node/LimitExceededNode.java | 6 +- .../agent/graph/node/ObservationNode.java | 6 +- .../mate/agent/graph/node/ReasoningNode.java | 68 +- .../agent/graph/node/SummarizingNode.java | 30 +- .../plan/StateGraphPlanExecuteAgent.java | 39 +- .../plan/edge/PlanGenerationDispatcher.java | 6 +- .../plan/edge/StepProgressDispatcher.java | 10 +- .../graph/plan/node/DirectAnswerNode.java | 6 +- .../graph/plan/node/PlanGenerationNode.java | 6 +- .../graph/plan/node/PlanSummaryNode.java | 6 +- .../graph/plan/node/StepExecutionNode.java | 425 ++++---- .../graph/plan/state/PlanStateAccessor.java | 10 +- .../graph/state/MateClawStateAccessor.java | 10 +- .../agent/graph/state/MateClawStateKeys.java | 6 + .../vip/mate/agent/runtime/AgentRuntime.java | 20 + .../agentscope/ApplicationGuardedToolkit.java | 331 +++++++ .../agentscope/GuardedToolBatchExecutor.java | 13 + .../agentscope/GuardedToolBatchResult.java | 14 + .../agentscope/NativePolicyDriver.java | 558 +++++++++++ .../agentscope/SpringToolSchemaAdapter.java | 54 + .../agentscope/ToolBatchResultAdapter.java | 121 +++ .../runtime/plan/ExplicitPlanRuntime.java | 142 +++ .../mate/agent/runtime/state/EdgeAction.java | 6 + .../mate/agent/runtime/state/NodeAction.java | 8 + .../mate/agent/runtime/state/RunState.java | 153 +++ .../vip/mate/agent/runtime/state/RunStep.java | 26 + .../runtime/state/RuntimeExecutionScope.java | 60 ++ .../health/ChannelsHealthIndicator.java | 4 +- .../mate/channel/web/ChatStreamTracker.java | 2 +- .../vip/mate/config/FlywayRepairConfig.java | 2 +- .../java/vip/mate/config/JacksonConfig.java | 2 +- .../config/PausedShutdownTaskScheduler.java | 27 + .../vip/mate/config/ProviderRetryConfig.java | 123 +++ .../vip/mate/config/SchedulingConfig.java | 2 +- .../goal/service/GoalEvaluationService.java | 16 +- .../mate/goal/service/GoalRunCoordinator.java | 34 +- .../mate/goal/service/GoalSegmentRunner.java | 19 +- .../service/GoalToolExecutionCheckpoint.java | 167 ++++ .../java/vip/mate/llm/ProviderHttpError.java | 47 + .../cache/AnthropicCacheOptionsFactory.java | 32 +- .../mate/llm/cache/CacheUsageExtractor.java | 12 +- .../mate/llm/chatgpt/ChatGPTChatModel.java | 4 +- .../chatmodel/AnthropicChatModelBuilder.java | 71 +- .../llm/chatmodel/AnthropicSdkChatModel.java | 239 +++++ .../AnthropicSdkWireInterceptor.java | 184 ++++ .../llm/chatmodel/AnthropicThinkingScope.java | 133 +++ .../mate/llm/chatmodel/ChatModelDefaults.java | 15 + .../chatmodel/ClaudeCodeChatModelBuilder.java | 142 +-- .../ClaudeCodeIdentityChatModelDecorator.java | 38 +- .../chatmodel/DashScopeChatModelBuilder.java | 311 ++---- .../DeepSeekV4ThinkingDecorator.java | 32 +- .../OpenAiCompatibleChatModelBuilder.java | 358 +------ .../OpenAiCompatibleHttpInterceptor.java | 98 ++ .../OpenAiReasoningResponseBody.java | 102 ++ .../llm/chatmodel/OpenAiRequestRewriter.java | 920 ++---------------- .../chatmodel/OpenAiWirePolicyChatModel.java | 151 +++ .../llm/chatmodel/PinnedOpenAiHttpClient.java | 262 +++++ .../chatmodel/ProviderCallCancellation.java | 30 + .../llm/chatmodel/VllmThinkingDecorator.java | 20 +- .../dashscope/NativeDashScopeChatModel.java | 412 ++++++++ .../dashscope/NativeDashScopeChatOptions.java | 128 +++ .../NativeDashScopeConnectionProperties.java | 87 ++ .../NativeDashScopeEmbeddingModel.java | 195 ++++ .../dashscope/NativeDashScopeException.java | 34 + .../dashscope/NativeDashScopeTransport.java | 325 +++++++ .../llm/dashscope/NativeDashScopeUsage.java | 15 + .../llm/embedding/EmbeddingModelFactory.java | 266 ++--- .../vip/mate/llm/gemini/GeminiChatModel.java | 5 +- .../mate/skill/service/SkillFileService.java | 60 +- .../skill/workspace/BundledSkillSyncer.java | 36 +- .../mate/skill/workspace/SkillFileSyncer.java | 12 +- .../workspace/bundle/SkillBundleFiles.java | 13 + .../mate/tool/builtin/DelegateAgentTool.java | 7 + .../tool/builtin/EnableExtensionTool.java | 2 +- .../tool/builtin/ToolExecutionContext.java | 33 + .../runtime/ApplicationMcpToolCallback.java | 79 ++ .../tool/mcp/runtime/McpClientManager.java | 13 +- .../mcp/runtime/McpToolResultCapture.java | 10 + .../tool/mcp/runtime/McpWireMetadata.java | 35 + .../runtime/ProgressAwareMcpToolCallback.java | 16 +- .../src/main/resources/application.yml | 14 +- .../V192__memory_recall_unique_identity.sql | 11 +- .../src/main/resources/docs/en/agents.md | 4 +- .../main/resources/docs/en/architecture.md | 42 +- .../main/resources/docs/en/contributing.md | 34 +- .../src/main/resources/docs/en/intro.md | 6 +- .../src/main/resources/docs/en/quickstart.md | 2 +- .../main/resources/docs/en/wecom-tuning.md | 2 +- .../src/main/resources/docs/zh/agents.md | 6 +- .../main/resources/docs/zh/architecture.md | 42 +- .../docs/zh/channel-history-freshness.md | 2 +- .../main/resources/docs/zh/contributing.md | 34 +- .../src/main/resources/docs/zh/intro.md | 6 +- .../src/main/resources/docs/zh/quickstart.md | 2 +- .../main/resources/docs/zh/wecom-tuning.md | 2 +- .../AgentGraphBuilderIdentityBlockTest.java | 5 +- .../agent/AgentServiceDshHistoryTest.java | 45 + .../agent/AgentServiceEntryContextTest.java | 315 ++++++ .../graph/LaneDPerformanceFixesTest.java | 20 +- .../agent/graph/ModelToolOptionsTest.java | 273 ++++++ ...ngChatHelperCancellationTransportTest.java | 270 +++++ ...reamingChatHelperProviderBoundaryTest.java | 204 ++++ .../agent/graph/ReturnDirectEndToEndTest.java | 16 +- .../graph/StripThinkingBoundaryTest.java | 6 +- .../edge/GoalEvaluationDispatcherTest.java | 8 +- .../graph/edge/ObservationDispatcherTest.java | 22 +- .../ReasoningDispatcherLlmCallCountTest.java | 28 +- .../graph/edge/ReasoningDispatcherTest.java | 14 +- .../graph/executor/NestedToolContextTest.java | 381 ++++++++ .../ParallelBatchCancellationTest.java | 497 ++++++++++ .../graph/executor/ToolCallDeadlineTest.java | 177 +++- .../executor/ToolCheckpointDeadlineTest.java | 88 ++ ...ExecutionExecutorStructuredResultTest.java | 36 + .../executor/ToolFatalPublicationTest.java | 125 +++ .../ToolUnknownOutcomeRecoveryTest.java | 210 ++++ .../node/ActionNodeBatchBoundaryTest.java | 85 ++ .../agent/graph/node/FinalAnswerNodeTest.java | 52 +- .../GoalEvaluationNodeContinuationTest.java | 12 +- .../node/LimitExceededNodeFallbackTest.java | 8 +- .../node/ObservationNodeDuplicateTest.java | 16 +- .../node/ObservationNodeLoopGuardTest.java | 6 +- .../graph/node/ObservationNodeRefundTest.java | 6 +- .../graph/node/ReasoningNodeOutputTest.java | 24 +- .../plan/edge/StepProgressDispatcherTest.java | 16 +- .../plan/node/DelegatedStepContractTest.java | 8 +- .../plan/node/PlanGenerationAutoGoalTest.java | 4 +- .../plan/node/PlanGenerationRoutingTest.java | 6 +- .../plan/node/PlanLifecyclePromptTest.java | 6 +- .../plan/node/PlanSummaryEmptyResultTest.java | 8 +- .../node/StepExecutionReplanContextTest.java | 4 +- .../node/StepExecutionSkillCatalogTest.java | 4 +- .../graph/plan/node/StepNativeLoopTest.java | 479 +++++++++ .../state/PlanStateAccessorUsageTest.java | 4 +- ...teClawStateAccessorTerminalAnswerTest.java | 16 +- .../runtime/RuntimeEventProjectorTest.java | 54 +- .../RuntimeEventStreamAdapterTest.java | 28 + .../ApplicationGuardedToolkitTest.java | 603 ++++++++++++ .../NativeConcurrentIsolationTest.java | 230 +++++ .../agentscope/NativePolicyDriverTest.java | 835 ++++++++++++++++ .../ProductCanonicalBoundaryTest.java | 295 ++++++ .../SpringToolSchemaAdapterTest.java | 66 ++ .../ToolBatchResultAdapterTest.java | 199 ++++ .../dsh/DshConversationHistoryTest.java | 2 +- .../runtime/plan/ExplicitPlanRuntimeTest.java | 126 +++ .../agent/runtime/state/RunStateTest.java | 202 ++++ .../state/RuntimeExecutionScopeTest.java | 260 +++++ .../GoalStateKeyDoubleRegistrationTest.java | 107 +- .../SkillStateKeyDoubleRegistrationTest.java | 78 +- .../StateKeyRegistrationCoverageTest.java | 104 +- .../WebChatApprovalInteractionTest.java | 4 +- .../webchat/WebChatAttachmentE2ETest.java | 4 +- .../webchat/WebChatAuditTrailTest.java | 23 +- .../channel/webchat/WebChatStreamE2ETest.java | 6 +- .../mate/config/OpenApiExposedAccessTest.java | 24 +- .../config/OpenApiLockedDownAccessTest.java | 44 +- .../mate/config/ProviderRetryConfigTest.java | 123 +++ .../SchedulingConfigPausedShutdownTest.java | 106 ++ .../mate/config/ServletJsonContractTest.java | 115 +++ .../OfflineGoalServiceTaskReplayTest.java | 4 +- .../GoalJsonAcceptanceIntegrationTest.java | 4 +- ...alJsonExternalApprovalIntegrationTest.java | 4 +- ...alJsonExternalDatabaseIntegrationTest.java | 4 +- .../goal/GoalJsonGraphIntegrationTest.java | 18 +- .../GoalJsonHttpRuntimeIntegrationTest.java | 12 +- .../goal/GoalPersistenceIntegrationTest.java | 4 +- .../service/CrashRecoveryProcessTest.java | 58 ++ .../goal/service/CrashRecoveryWorker.java | 278 ++++++ .../GoalCheckpointTransactionTest.java | 184 ++++ .../goal/service/GoalStreamSafetyTest.java | 324 ++++++ .../service/ToolPublicationRecoveryTest.java | 859 ++++++++++++++++ .../interop/a2a/A2aJsonRpcControllerTest.java | 4 +- .../vip/mate/llm/ProviderHttpErrorTest.java | 60 ++ .../llm/cache/PromptCacheStrategyTest.java | 16 +- .../llm/cache/SdkCacheUsageExtractorTest.java | 66 ++ .../AnthropicBoundaryOptionsTest.java | 86 ++ .../chatmodel/AnthropicSdkChatModelTest.java | 421 ++++++++ .../llm/chatmodel/ChatModelDefaultsTest.java | 123 +++ .../ClaudeCodeChatModelBuilderTest.java | 23 +- .../chatmodel/DashScopeNativeFactoryTest.java | 207 ++++ .../DeepSeekV4ThinkingDecoratorTest.java | 3 +- .../NativeProviderRuntimeToolsTest.java | 194 ++++ .../OpenAiCompatibleChatModelBuilderTest.java | 2 +- .../llm/chatmodel/OpenAiMediaTimeoutTest.java | 263 +++++ .../OpenAiProviderMigrationTest.java | 463 +++++++++ .../OpenAiReasoningResponseBodyTest.java | 84 ++ ...penAiToolSchemaNumberPreservationTest.java | 143 +-- .../chatmodel/PatchReasoningContentTest.java | 236 ++--- .../PinnedOpenAiCancellationScopeTest.java | 194 ++++ .../chatmodel/PinnedOpenAiHttpClientTest.java | 193 ++++ .../ProviderSdkCancellationIsolationTest.java | 270 +++++ .../ReasoningEffortSanitizerTest.java | 153 ++- .../VllmThinkingCompatibilityTest.java | 21 +- .../NativeDashScopeChatModelTest.java | 351 +++++++ .../NativeDashScopeChatOptionsTest.java | 55 ++ .../NativeDashScopeEmbeddingModelTest.java | 187 ++++ .../NativeDashScopeLifecycleTest.java | 507 ++++++++++ .../NativeDashScopeTransportTest.java | 209 ++++ .../embedding/EmbeddingFactoryNativeTest.java | 90 ++ .../service/MemoryRecallMigrationTest.java | 38 +- .../service/AgentRoutingTransactionTest.java | 2 +- .../skill/service/SkillBundleBinaryTest.java | 169 ++++ .../workspace/BundledSkillSyncerTest.java | 158 ++- .../WorkerDecisionTransactionTest.java | 2 +- .../tool/builtin/DelegateAgentToolTest.java | 62 ++ .../tool/document/GeneratedFileUrlTest.java | 6 + .../ApplicationMcpToolCallbackTest.java | 144 +++ .../McpClientManagerDiscoveryTest.java | 85 ++ .../McpWireMetadataSerializationTest.java | 59 ++ .../ProgressAwareMcpToolCallbackTest.java | 58 +- pom.xml | 53 +- 232 files changed, 19674 insertions(+), 3980 deletions(-) create mode 100644 mateclaw-server/src/main/java/vip/mate/agent/graph/ModelToolOptions.java create mode 100644 mateclaw-server/src/main/java/vip/mate/agent/graph/executor/ToolExecutionCheckpoint.java create mode 100644 mateclaw-server/src/main/java/vip/mate/agent/graph/executor/ToolExecutionCheckpointRejectedException.java delete mode 100644 mateclaw-server/src/main/java/vip/mate/agent/graph/lifecycle/ReActLifecycleListener.java create mode 100644 mateclaw-server/src/main/java/vip/mate/agent/runtime/AgentRuntime.java create mode 100644 mateclaw-server/src/main/java/vip/mate/agent/runtime/agentscope/ApplicationGuardedToolkit.java create mode 100644 mateclaw-server/src/main/java/vip/mate/agent/runtime/agentscope/GuardedToolBatchExecutor.java create mode 100644 mateclaw-server/src/main/java/vip/mate/agent/runtime/agentscope/GuardedToolBatchResult.java create mode 100644 mateclaw-server/src/main/java/vip/mate/agent/runtime/agentscope/NativePolicyDriver.java create mode 100644 mateclaw-server/src/main/java/vip/mate/agent/runtime/agentscope/SpringToolSchemaAdapter.java create mode 100644 mateclaw-server/src/main/java/vip/mate/agent/runtime/agentscope/ToolBatchResultAdapter.java create mode 100644 mateclaw-server/src/main/java/vip/mate/agent/runtime/plan/ExplicitPlanRuntime.java create mode 100644 mateclaw-server/src/main/java/vip/mate/agent/runtime/state/EdgeAction.java create mode 100644 mateclaw-server/src/main/java/vip/mate/agent/runtime/state/NodeAction.java create mode 100644 mateclaw-server/src/main/java/vip/mate/agent/runtime/state/RunState.java create mode 100644 mateclaw-server/src/main/java/vip/mate/agent/runtime/state/RunStep.java create mode 100644 mateclaw-server/src/main/java/vip/mate/agent/runtime/state/RuntimeExecutionScope.java create mode 100644 mateclaw-server/src/main/java/vip/mate/config/PausedShutdownTaskScheduler.java create mode 100644 mateclaw-server/src/main/java/vip/mate/config/ProviderRetryConfig.java create mode 100644 mateclaw-server/src/main/java/vip/mate/goal/service/GoalToolExecutionCheckpoint.java create mode 100644 mateclaw-server/src/main/java/vip/mate/llm/ProviderHttpError.java create mode 100644 mateclaw-server/src/main/java/vip/mate/llm/chatmodel/AnthropicSdkChatModel.java create mode 100644 mateclaw-server/src/main/java/vip/mate/llm/chatmodel/AnthropicSdkWireInterceptor.java create mode 100644 mateclaw-server/src/main/java/vip/mate/llm/chatmodel/AnthropicThinkingScope.java create mode 100644 mateclaw-server/src/main/java/vip/mate/llm/chatmodel/ChatModelDefaults.java create mode 100644 mateclaw-server/src/main/java/vip/mate/llm/chatmodel/OpenAiCompatibleHttpInterceptor.java create mode 100644 mateclaw-server/src/main/java/vip/mate/llm/chatmodel/OpenAiReasoningResponseBody.java create mode 100644 mateclaw-server/src/main/java/vip/mate/llm/chatmodel/OpenAiWirePolicyChatModel.java create mode 100644 mateclaw-server/src/main/java/vip/mate/llm/chatmodel/PinnedOpenAiHttpClient.java create mode 100644 mateclaw-server/src/main/java/vip/mate/llm/chatmodel/ProviderCallCancellation.java create mode 100644 mateclaw-server/src/main/java/vip/mate/llm/dashscope/NativeDashScopeChatModel.java create mode 100644 mateclaw-server/src/main/java/vip/mate/llm/dashscope/NativeDashScopeChatOptions.java create mode 100644 mateclaw-server/src/main/java/vip/mate/llm/dashscope/NativeDashScopeConnectionProperties.java create mode 100644 mateclaw-server/src/main/java/vip/mate/llm/dashscope/NativeDashScopeEmbeddingModel.java create mode 100644 mateclaw-server/src/main/java/vip/mate/llm/dashscope/NativeDashScopeException.java create mode 100644 mateclaw-server/src/main/java/vip/mate/llm/dashscope/NativeDashScopeTransport.java create mode 100644 mateclaw-server/src/main/java/vip/mate/llm/dashscope/NativeDashScopeUsage.java create mode 100644 mateclaw-server/src/main/java/vip/mate/tool/mcp/runtime/ApplicationMcpToolCallback.java create mode 100644 mateclaw-server/src/main/java/vip/mate/tool/mcp/runtime/McpWireMetadata.java create mode 100644 mateclaw-server/src/test/java/vip/mate/agent/AgentServiceEntryContextTest.java create mode 100644 mateclaw-server/src/test/java/vip/mate/agent/graph/ModelToolOptionsTest.java create mode 100644 mateclaw-server/src/test/java/vip/mate/agent/graph/NodeStreamingChatHelperCancellationTransportTest.java create mode 100644 mateclaw-server/src/test/java/vip/mate/agent/graph/NodeStreamingChatHelperProviderBoundaryTest.java create mode 100644 mateclaw-server/src/test/java/vip/mate/agent/graph/executor/NestedToolContextTest.java create mode 100644 mateclaw-server/src/test/java/vip/mate/agent/graph/executor/ParallelBatchCancellationTest.java create mode 100644 mateclaw-server/src/test/java/vip/mate/agent/graph/executor/ToolCheckpointDeadlineTest.java create mode 100644 mateclaw-server/src/test/java/vip/mate/agent/graph/executor/ToolFatalPublicationTest.java create mode 100644 mateclaw-server/src/test/java/vip/mate/agent/graph/executor/ToolUnknownOutcomeRecoveryTest.java create mode 100644 mateclaw-server/src/test/java/vip/mate/agent/graph/node/ActionNodeBatchBoundaryTest.java create mode 100644 mateclaw-server/src/test/java/vip/mate/agent/graph/plan/node/StepNativeLoopTest.java create mode 100644 mateclaw-server/src/test/java/vip/mate/agent/runtime/agentscope/ApplicationGuardedToolkitTest.java create mode 100644 mateclaw-server/src/test/java/vip/mate/agent/runtime/agentscope/NativeConcurrentIsolationTest.java create mode 100644 mateclaw-server/src/test/java/vip/mate/agent/runtime/agentscope/NativePolicyDriverTest.java create mode 100644 mateclaw-server/src/test/java/vip/mate/agent/runtime/agentscope/ProductCanonicalBoundaryTest.java create mode 100644 mateclaw-server/src/test/java/vip/mate/agent/runtime/agentscope/SpringToolSchemaAdapterTest.java create mode 100644 mateclaw-server/src/test/java/vip/mate/agent/runtime/agentscope/ToolBatchResultAdapterTest.java create mode 100644 mateclaw-server/src/test/java/vip/mate/agent/runtime/plan/ExplicitPlanRuntimeTest.java create mode 100644 mateclaw-server/src/test/java/vip/mate/agent/runtime/state/RunStateTest.java create mode 100644 mateclaw-server/src/test/java/vip/mate/agent/runtime/state/RuntimeExecutionScopeTest.java create mode 100644 mateclaw-server/src/test/java/vip/mate/config/ProviderRetryConfigTest.java create mode 100644 mateclaw-server/src/test/java/vip/mate/config/SchedulingConfigPausedShutdownTest.java create mode 100644 mateclaw-server/src/test/java/vip/mate/config/ServletJsonContractTest.java create mode 100644 mateclaw-server/src/test/java/vip/mate/goal/service/CrashRecoveryProcessTest.java create mode 100644 mateclaw-server/src/test/java/vip/mate/goal/service/CrashRecoveryWorker.java create mode 100644 mateclaw-server/src/test/java/vip/mate/goal/service/GoalCheckpointTransactionTest.java create mode 100644 mateclaw-server/src/test/java/vip/mate/goal/service/GoalStreamSafetyTest.java create mode 100644 mateclaw-server/src/test/java/vip/mate/goal/service/ToolPublicationRecoveryTest.java create mode 100644 mateclaw-server/src/test/java/vip/mate/llm/ProviderHttpErrorTest.java create mode 100644 mateclaw-server/src/test/java/vip/mate/llm/cache/SdkCacheUsageExtractorTest.java create mode 100644 mateclaw-server/src/test/java/vip/mate/llm/chatmodel/AnthropicBoundaryOptionsTest.java create mode 100644 mateclaw-server/src/test/java/vip/mate/llm/chatmodel/AnthropicSdkChatModelTest.java create mode 100644 mateclaw-server/src/test/java/vip/mate/llm/chatmodel/ChatModelDefaultsTest.java create mode 100644 mateclaw-server/src/test/java/vip/mate/llm/chatmodel/DashScopeNativeFactoryTest.java create mode 100644 mateclaw-server/src/test/java/vip/mate/llm/chatmodel/NativeProviderRuntimeToolsTest.java create mode 100644 mateclaw-server/src/test/java/vip/mate/llm/chatmodel/OpenAiMediaTimeoutTest.java create mode 100644 mateclaw-server/src/test/java/vip/mate/llm/chatmodel/OpenAiProviderMigrationTest.java create mode 100644 mateclaw-server/src/test/java/vip/mate/llm/chatmodel/OpenAiReasoningResponseBodyTest.java create mode 100644 mateclaw-server/src/test/java/vip/mate/llm/chatmodel/PinnedOpenAiCancellationScopeTest.java create mode 100644 mateclaw-server/src/test/java/vip/mate/llm/chatmodel/PinnedOpenAiHttpClientTest.java create mode 100644 mateclaw-server/src/test/java/vip/mate/llm/chatmodel/ProviderSdkCancellationIsolationTest.java create mode 100644 mateclaw-server/src/test/java/vip/mate/llm/dashscope/NativeDashScopeChatModelTest.java create mode 100644 mateclaw-server/src/test/java/vip/mate/llm/dashscope/NativeDashScopeChatOptionsTest.java create mode 100644 mateclaw-server/src/test/java/vip/mate/llm/dashscope/NativeDashScopeEmbeddingModelTest.java create mode 100644 mateclaw-server/src/test/java/vip/mate/llm/dashscope/NativeDashScopeLifecycleTest.java create mode 100644 mateclaw-server/src/test/java/vip/mate/llm/dashscope/NativeDashScopeTransportTest.java create mode 100644 mateclaw-server/src/test/java/vip/mate/llm/embedding/EmbeddingFactoryNativeTest.java create mode 100644 mateclaw-server/src/test/java/vip/mate/skill/service/SkillBundleBinaryTest.java create mode 100644 mateclaw-server/src/test/java/vip/mate/tool/mcp/runtime/ApplicationMcpToolCallbackTest.java create mode 100644 mateclaw-server/src/test/java/vip/mate/tool/mcp/runtime/McpClientManagerDiscoveryTest.java create mode 100644 mateclaw-server/src/test/java/vip/mate/tool/mcp/runtime/McpWireMetadataSerializationTest.java diff --git a/README.md b/README.md index 51467ed9..690688e7 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ [![Live Demo](https://img.shields.io/badge/Demo-Online-orange.svg?logo=vercel&label=Demo)](https://claw-demo.mate.vip) [![Website](https://img.shields.io/badge/Website-claw.mate.vip-blue.svg?logo=googlechrome&label=Site)](https://claw.mate.vip) [![Java Version](https://img.shields.io/badge/Java-21+-blue.svg?logo=openjdk&label=Java)](https://adoptium.net/) -[![Spring Boot](https://img.shields.io/badge/Spring%20Boot-3.5-brightgreen.svg?logo=springboot)](https://spring.io/projects/spring-boot) +[![Spring Boot](https://img.shields.io/badge/Spring%20Boot-4.1.1-brightgreen.svg?logo=springboot)](https://spring.io/projects/spring-boot) [![Vue](https://img.shields.io/badge/Vue-3-4FC08D.svg?logo=vuedotjs)](https://vuejs.org/) [![Last Commit](https://img.shields.io/github/last-commit/mateaix/mateclaw)](https://github.com/mateaix/mateclaw) [![License](https://img.shields.io/badge/license-Apache--2.0-red.svg?logo=opensourceinitiative&label=License)](LICENSE) @@ -38,7 +38,7 @@ > > Multi-user workspaces. Approval-gated sensitive actions. Full audit trail. Spring Boot Actuator health monitoring. Per-channel error isolation so one chat platform's outage doesn't take down the rest. One JAR in your environment; you control persisted data, and task content is sent only to model, channel, or tool services you explicitly configure. > -> **And underneath, a real Agent Runtime.** An employee is no longer welded to one reasoning loop. Choose the native StateGraph runtime for ReAct, Plan-and-Execute, Goals, and Team Runs, or run DeepSeek Harness as a managed external loop over SDK JSON-RPC. Both paths converge on the same conversations, workspace boundaries, Tool Guard, event projection, and lifecycle controls. +> **And underneath, a real Agent Runtime.** An employee is no longer welded to one reasoning loop. Choose the native AgentScope runtime for ReAct, Plan-and-Execute, Goals, and Team Runs, or run DeepSeek Harness as a managed external loop over SDK JSON-RPC. Both paths converge on the same conversations, workspace boundaries, Tool Guard, event projection, and lifecycle controls. Most AI tools die when their vendor has a bad day. Most forget you the moment the tab closes. Most give you a chatbox and call it a product. @@ -162,12 +162,14 @@ Same "whole widget" philosophy. Different center of gravity. ```bash # Backend -cd mateclaw-server -mvn spring-boot:run # http://localhost:18088 +# From the repository root; use its configured models and workspace +SPRING_DATASOURCE_URL="jdbc:h2:file:$PWD/data/mateclaw;MODE=MySQL;DATABASE_TO_LOWER=TRUE;CASE_INSENSITIVE_IDENTIFIERS=TRUE" \ +MATECLAW_WORKSPACE_SANDBOX_ROOT="$PWD/data/workspace" \ +mvn -pl mateclaw-server spring-boot:run # http://localhost:18088 -# Frontend +# Frontend (new terminal, from the repository root) cd mateclaw-ui -npm install && npm run dev # http://localhost:5173 +npm install && npm run dev -- --host 127.0.0.1 # http://localhost:5173 ``` Login: `admin` / `admin123` @@ -204,7 +206,7 @@ Download from [GitHub Releases](https://github.com/mateaix/mateclaw/releases). B ``` mateclaw/ -├── mateclaw-server/ Spring Boot 3.5 backend (Agent Runtime contract, native StateGraph + DSH) +├── mateclaw-server/ Spring Boot 4.1.1 backend (Agent Runtime contract, native AgentScope + DSH) ├── mateclaw-ui/ Vue 3 + TypeScript admin SPA (built into the server JAR) ├── mateclaw-desktop/ Electron desktop app (local-embedded / remote-centralized) ├── mateclaw-webchat/ Embeddable chat widget (UMD / ES bundles) @@ -222,8 +224,8 @@ Desktop binaries ship via [GitHub Releases](https://github.com/mateaix/mateclaw/ | Layer | Technology | |---|---| -| Backend | Spring Boot 3.5 · Spring AI Alibaba 1.1 · MyBatis Plus · Flyway | -| Agent Runtime | `AgentRuntimeProvider` contract · Native StateGraph (ReAct + Plan-Execute) · managed DSH JSON-RPC runtime · normalized events / lifecycle / usage · Tool Guard | +| Backend | Spring Boot 4.1.1 · Spring AI 2.0.1 · AgentScope Java 2.0.4 · MyBatis Plus · Flyway | +| Agent Runtime | `AgentRuntimeProvider` contract · Native AgentScope (ReAct + Plan-Execute) · managed DSH JSON-RPC runtime · normalized events / lifecycle / usage · Tool Guard | | Orchestration | Workflow (7 step modes · Pebble DSL) · Triggers (6 pattern types · event governance) · Wiki Transformations (1.3.0+) | | Capability Extension | SKILL.md packages · MCP (stdio / SSE / HTTP · per-agent binding) · ACP bridge (Claude Code / Codex) | | Database | H2 (dev) · PostgreSQL 16 (Docker default) · MySQL 8.0+ (supported) · Kingbase (opt-in driver) | @@ -321,7 +323,7 @@ Full story in the [v1.7.0 release notes](https://claw.mate.vip/docs/en/releases/ git clone https://github.com/mateaix/mateclaw.git cd mateclaw cd mateclaw-server && mvn clean compile -cd ../mateclaw-ui && npm install && npm run dev +cd ../mateclaw-ui && npm install && npm run dev -- --host 127.0.0.1 ``` --- diff --git a/README_zh.md b/README_zh.md index 05add63a..6473e6c8 100644 --- a/README_zh.md +++ b/README_zh.md @@ -15,7 +15,7 @@ [![在线演示](https://img.shields.io/badge/演示-在线-orange.svg?logo=vercel&label=Demo)](https://claw-demo.mate.vip) [![官网](https://img.shields.io/badge/官网-claw.mate.vip-blue.svg?logo=googlechrome&label=Site)](https://claw.mate.vip) [![Java 版本](https://img.shields.io/badge/Java-21+-blue.svg?logo=openjdk&label=Java)](https://adoptium.net/) -[![Spring Boot](https://img.shields.io/badge/Spring%20Boot-3.5-brightgreen.svg?logo=springboot)](https://spring.io/projects/spring-boot) +[![Spring Boot](https://img.shields.io/badge/Spring%20Boot-4.1.1-brightgreen.svg?logo=springboot)](https://spring.io/projects/spring-boot) [![Vue](https://img.shields.io/badge/Vue-3-4FC08D.svg?logo=vuedotjs)](https://vuejs.org/) [![最后提交](https://img.shields.io/github/last-commit/mateaix/mateclaw)](https://github.com/mateaix/mateclaw) [![许可证](https://img.shields.io/badge/license-Apache--2.0-red.svg?logo=opensourceinitiative&label=License)](LICENSE) @@ -38,7 +38,7 @@ > > 多用户工作空间。敏感操作走审批。完整审计日志。Spring Boot Actuator 健康监控。单个渠道挂掉不影响其他渠道的错误隔离。一个 JAR 包跑在自己的环境里;持久化数据由你掌控,任务所需内容只会发送到你主动配置的模型、渠道或工具服务。 > -> **底下是一套真正的 Agent Runtime。** 员工不再焊死在一套推理循环上:可以用原生 StateGraph 运行 ReAct、Plan-and-Execute、Goal 与 Team Run,也可以通过 SDK JSON-RPC 把 DeepSeek Harness 作为受管理的外部循环。两条路径最终进入同一套会话、工作空间边界、Tool Guard、事件投影与生命周期控制。 +> **底下是一套真正的 Agent Runtime。** 员工不再焊死在一套推理循环上:可以用原生 AgentScope 运行 ReAct、Plan-and-Execute、Goal 与 Team Run,也可以通过 SDK JSON-RPC 把 DeepSeek Harness 作为受管理的外部循环。两条路径最终进入同一套会话、工作空间边界、Tool Guard、事件投影与生命周期控制。 大多数 AI 工具一到厂商抽风那天就两手一摊。关一次标签页就忘了你是谁。给你一个聊天框,就敢叫产品。 @@ -162,12 +162,14 @@ RBAC + JWT。**Personal Access Token** 给无人值守脚本和 CI 使用。**We ```bash # 后端 -cd mateclaw-server -mvn spring-boot:run # http://localhost:18088 +# 从仓库根目录运行,使用根目录下已配置的模型数据库与工作空间 +SPRING_DATASOURCE_URL="jdbc:h2:file:$PWD/data/mateclaw;MODE=MySQL;DATABASE_TO_LOWER=TRUE;CASE_INSENSITIVE_IDENTIFIERS=TRUE" \ +MATECLAW_WORKSPACE_SANDBOX_ROOT="$PWD/data/workspace" \ +mvn -pl mateclaw-server spring-boot:run # http://localhost:18088 -# 前端 +# 前端(新终端,从仓库根目录进入) cd mateclaw-ui -npm install && npm run dev # http://localhost:5173 +npm install && npm run dev -- --host 127.0.0.1 # http://localhost:5173 ``` 默认登录:`admin` / `admin123` @@ -204,7 +206,7 @@ docker compose up -d # http://localhost:18080 ``` mateclaw/ -├── mateclaw-server/ Spring Boot 3.5 后端(Agent Runtime contract · Native StateGraph + DSH) +├── mateclaw-server/ Spring Boot 4.1.1 后端(Agent Runtime contract · Native AgentScope + DSH) ├── mateclaw-ui/ Vue 3 + TypeScript 管理 SPA(构建产物打进后端 JAR) ├── mateclaw-desktop/ Electron 桌面端(本地内嵌 / 远程集中双模式) ├── mateclaw-webchat/ 网页嵌入式聊天组件(UMD / ES bundle) @@ -222,8 +224,8 @@ mateclaw/ | 层次 | 技术 | |---|---| -| 后端 | Spring Boot 3.5 · Spring AI Alibaba 1.1 · MyBatis Plus · Flyway | -| Agent Runtime | `AgentRuntimeProvider` contract · Native StateGraph(ReAct + Plan-Execute)· 受管理的 DSH JSON-RPC runtime · 统一事件 / 生命周期 / 用量 · Tool Guard | +| 后端 | Spring Boot 4.1.1 · Spring AI 2.0.1 · AgentScope Java 2.0.4 · MyBatis Plus · Flyway | +| Agent Runtime | `AgentRuntimeProvider` contract · Native AgentScope(ReAct + Plan-Execute)· 受管理的 DSH JSON-RPC runtime · 统一事件 / 生命周期 / 用量 · Tool Guard | | 业务编排 | 工作流(7 step mode · Pebble DSL)· 触发器(6 pattern type · 事件治理)· Wiki 加工器(1.3.0+)| | 能力扩展 | SKILL.md 包 · MCP(stdio / SSE / HTTP · per-agent 绑定)· ACP 桥接(Claude Code / Codex) | | 数据库 | H2(开发)· PostgreSQL 16(Docker 默认)· MySQL 8.0+(支持)· Kingbase(按需驱动)| @@ -321,7 +323,7 @@ mateclaw/ git clone https://github.com/mateaix/mateclaw.git cd mateclaw cd mateclaw-server && mvn clean compile -cd ../mateclaw-ui && npm install && npm run dev +cd ../mateclaw-ui && npm install && npm run dev -- --host 127.0.0.1 ``` --- diff --git a/mateclaw-server/pom.xml b/mateclaw-server/pom.xml index 31db297f..847f0c1d 100644 --- a/mateclaw-server/pom.xml +++ b/mateclaw-server/pom.xml @@ -15,7 +15,7 @@ jar MateClaw Server - MateClaw - Java+Vue Personal AI Assistant powered by Spring AI Alibaba + MateClaw - Java+Vue Personal AI Assistant powered by Spring AI and AgentScope @@ -24,10 +24,44 @@ mateclaw-plugin-api - + org.springframework.boot - spring-boot-starter-web + spring-boot-starter-webmvc + + + org.springframework.boot + spring-boot-starter-webclient + + + + org.springframework.boot + spring-boot-jackson2 + + + org.springframework.boot + spring-boot-starter-flyway + + + io.agentscope + agentscope-core + ${agentscope.version} + + + com.squareup.okhttp3 + okhttp-jvm + + + + + com.networknt + json-schema-validator + ${networknt-schema.version} + + + org.springframework.retry + spring-retry + 2.0.12 @@ -36,23 +70,6 @@ spring-boot-starter-actuator - - - - com.alibaba.cloud.ai - spring-ai-alibaba-starter-dashscope - - - - org.springframework.boot - spring-boot-starter-webflux - - - - com.alibaba @@ -67,10 +84,9 @@ - - com.alibaba.cloud.ai - spring-ai-alibaba-graph-core + org.springframework.ai + spring-ai-client-chat @@ -85,19 +101,10 @@ spring-ai-anthropic - - + - org.springframework.ai - spring-ai-starter-mcp-client - - - org.springframework.boot - spring-boot-starter-webflux - - + io.modelcontextprotocol.sdk + mcp @@ -117,7 +124,7 @@ com.baomidou - mybatis-plus-spring-boot3-starter + mybatis-plus-spring-boot4-starter @@ -211,6 +218,10 @@ net.dv8tion JDA + + com.squareup.okhttp3 + okhttp-jvm + club.minnced @@ -396,6 +407,19 @@ test + + com.squareup.okhttp3 + mockwebserver + 4.12.0 + test + + + com.squareup.okhttp3 + okhttp-tls + 4.12.0 + test + + - 3.5.16 - 1.1.8 - 1.1.2.3 - 4.38.0 - 2.8.16 + 4.1.1 + 2.0.1 + + 5.0.0 + 3.1.1 + 2.0.4 + 3.0.1 + 0.18.3 + 4.12.0 - 3.5.16 + 3.5.17 5.8.26 0.12.6 2.0.16 - 2.18.3 1.3.12 @@ -81,6 +84,14 @@ + + + com.squareup.okhttp3 + okhttp-bom + ${okhttp.version} + pom + import + org.springframework.boot @@ -112,6 +123,15 @@ import + + + io.modelcontextprotocol.sdk + mcp-bom + ${mcp-sdk.version} + pom + import + + @@ -130,22 +150,10 @@ ${revision} - - - com.alibaba.cloud.ai - spring-ai-alibaba-starter-dashscope - ${spring-ai-alibaba.version} - - - com.alibaba.cloud.ai - spring-ai-alibaba-graph-core - ${spring-ai-alibaba.version} - - com.baomidou - mybatis-plus-spring-boot3-starter + mybatis-plus-spring-boot4-starter ${mybatis-plus.version} @@ -180,11 +188,6 @@ slf4j-api ${slf4j.version} - - com.fasterxml.jackson.core - jackson-databind - ${jackson.version} -