feat: 新增 core/agents 模块和 nanobot

- 新增 agents 模块,包含 agent、api、skills 等子模块
- 新增 nanobot 项目,支持多渠道集成
- 添加启动脚本 start-all.bat 和 start-all.sh

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-13 21:29:12 +08:00
parent ecb6be6463
commit 249e7e577a
167 changed files with 31315 additions and 0 deletions

107
core/agents/tools/sync.py Normal file
View File

@@ -0,0 +1,107 @@
"""Tool synchronization between Python Agent and Go backend."""
import asyncio
import logging
from typing import Any
import aiohttp
logger = logging.getLogger(__name__)
class ToolSyncClient:
"""Client for syncing tools to Go backend."""
def __init__(self, base_url: str, agent_id: str = "default"):
"""Initialize tool sync client.
Args:
base_url: Go backend base URL
agent_id: Agent ID
"""
self.base_url = base_url.rstrip("/")
self.agent_id = agent_id
self._session = None
async def _get_session(self) -> aiohttp.ClientSession:
"""Get or create aiohttp session."""
if self._session is None or self._session.closed:
self._session = aiohttp.ClientSession()
return self._session
async def close(self) -> None:
"""Close the session."""
if self._session and not self._session.closed:
await self._session.close()
async def sync_tools(
self,
tools: list[dict[str, Any]],
) -> tuple[int, str]:
"""Sync tools to Go backend.
Args:
tools: List of tool definitions
Returns:
Tuple of (synced_count, message)
"""
url = f"{self.base_url}/tool/sync-from-python"
# Transform tools to match Go backend format
python_tools = []
for tool in tools:
func = tool.get("function", {})
python_tools.append({
"name": func.get("name"),
"description": func.get("description"),
"parameters": func.get("parameters", "{}"),
"category": "python", # Default category for Python tools
})
payload = {"tools": python_tools}
try:
session = await self._get_session()
async with session.post(url, json=payload) as response:
if response.status == 200:
result = await response.json()
count = result.get("synced_count", 0)
return count, f"Synced {count} tools successfully"
else:
text = await response.text()
return 0, f"Failed to sync tools: {response.status} - {text}"
except Exception as e:
logger.error(f"Error syncing tools: {e}")
return 0, f"Error syncing tools: {e}"
async def sync_registry_tools(
registry,
base_url: str,
agent_id: str = "default",
) -> tuple[int, str]:
"""Sync tools from a ToolRegistry to Go backend.
Args:
registry: ToolRegistry instance
base_url: Go backend base URL
agent_id: Agent ID
Returns:
Tuple of (synced_count, message)
"""
client = ToolSyncClient(base_url, agent_id)
try:
# Get all tool definitions
tools = registry.get_definitions()
if not tools:
return 0, "No tools to sync"
# Sync tools
count, message = await client.sync_tools(tools)
return count, message
finally:
await client.close()