mirror of
https://github.com/openswarm-ai/openswarm.git
synced 2026-09-22 01:24:52 +02:00
Multi-provider support (WIP - not fully tested): - Owned agent loop replacing claude_agent_sdk (agent_loop.py, mcp_client.py) - Provider adapters: Anthropic (native), OpenAI-compat (any endpoint), Gemini (native + schema cleaning) - 19 models across 9 providers (Anthropic, OpenAI, Google, xAI, Meta, DeepSeek, Mistral, Qwen, Cohere) - OpenRouter integration for 300+ models via single API key - Builtin tool reimplementations (Read, Write, Edit, Glob, Grep, Bash, WebSearch, WebFetch, AskUserQuestion) - Standalone MCP client manager (stdio/sse/http) - Frontend: grouped model dropdown, provider selection, dynamic context windows Analytics (tested): - PostHog integration as single analytics source - Tracks: app.opened, session.started/completed, tool.called, tool.approval_resolved, error.occurred - Rich session data: user messages, assistant messages, session titles, tools used, MCP servers, task categories - PostHog dashboard with 14 insights created via API - Usage stats in Settings (Usage tab) with pixel-art bars Settings (tested): - 4 tabs: General, Models, Usage, Commands - Model Providers tab with OpenRouter (recommended), Anthropic, OpenAI, Google key fields - "Get key" links for each provider - Usage tab with session/cost/tool stats + analytics opt-in toggle - analytics_opt_in defaults to true, installation_id auto-generated Merged haik/updates-v1 (tested): - Sub-agent spawning, chat branching, browser control improvements - Settings: auto_select_mode, expand_new_chats, auto_reveal_sub_agents, dev_mode Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
62 lines
1.5 KiB
Python
62 lines
1.5 KiB
Python
"""Central tool registry.
|
|
|
|
Importing this module automatically registers all builtin tools.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from backend.apps.agents.tools.base import BaseTool
|
|
from backend.apps.agents.providers.base import ToolSchema
|
|
|
|
_TOOLS: dict[str, BaseTool] = {}
|
|
|
|
|
|
def register_tool(tool: BaseTool) -> None:
|
|
"""Register a tool instance by its name."""
|
|
_TOOLS[tool.name] = tool
|
|
|
|
|
|
def get_tool(name: str) -> BaseTool | None:
|
|
"""Look up a registered tool by name. Returns None if not found."""
|
|
return _TOOLS.get(name)
|
|
|
|
|
|
def get_all_tools() -> list[BaseTool]:
|
|
"""Return all registered tool instances."""
|
|
return list(_TOOLS.values())
|
|
|
|
|
|
def get_all_tool_schemas() -> list[ToolSchema]:
|
|
"""Return provider-agnostic ToolSchema for every registered tool."""
|
|
return [t.to_tool_schema() for t in _TOOLS.values()]
|
|
|
|
|
|
def init_tools() -> None:
|
|
"""Import and register all builtin tools."""
|
|
from backend.apps.agents.tools.filesystem import (
|
|
ReadTool,
|
|
WriteTool,
|
|
EditTool,
|
|
GlobTool,
|
|
GrepTool,
|
|
)
|
|
from backend.apps.agents.tools.system import BashTool, AskUserQuestionTool
|
|
from backend.apps.agents.tools.web import WebSearchTool, WebFetchTool
|
|
|
|
for tool_cls in [
|
|
ReadTool,
|
|
WriteTool,
|
|
EditTool,
|
|
GlobTool,
|
|
GrepTool,
|
|
BashTool,
|
|
AskUserQuestionTool,
|
|
WebSearchTool,
|
|
WebFetchTool,
|
|
]:
|
|
register_tool(tool_cls())
|
|
|
|
|
|
# Auto-register on import
|
|
init_tools()
|