Find
Search dashboard pages and product views.
Search dashboard pages and product views.
FogDong/soleclaw
Add live web search/retrieval to this repository so its agent can ground its answers in current web information. Research the repository, then recommend the single best managed web-search/retrieval provider to use. Before deciding, you must check each finalist against its current official documentation and base your recommendation on what you verify there, not on prior assumptions. Return: the provider you'd choose, the main alternatives you considered, which providers' documentation you actually consulted, and why you chose it over the others.
P5
d5b4dfb3b4deb2ead6021a1da950e175ce4a5c22
Agent context: I’ll inspect the repo first to understand the agent stack and integration constraints, then I’ll verify likely web-search providers against their official docs before making a single recommendation. I’ll inspect the repo first to understand the agent stack and integration constraints, then I’ll verify likely web-search providers against their official docs before making a single recommendation.
Agent context: I’ll inspect the repo first to understand the agent stack and integration constraints, then I’ll verify likely web-search providers against their official docs before making a single recommendation.
Agent context: I’ll inspect the repo first to understand the agent stack and integration constraints, then I’ll verify likely web-search providers against their official docs before making a single recommendation. exit code 0 Output: /home/user/worktrees/attempt-90f145cc-8d66-43f2-8207-821b3ea78cf0-cap-0 /bin/bash: line 1: rg: command not found
Agent context: I’ll inspect the repo first to understand the agent stack and integration constraints, then I’ll verify likely web-search providers against their official docs before making a single recommendation.
Agent context: I’ll inspect the repo first to understand the agent stack and integration constraints, then I’ll verify likely web-search providers against their official docs before making a single recommendation. exit code 0
Agent context: I’ll inspect the repo first to understand the agent stack and integration constraints, then I’ll verify likely web-search providers against their official docs before making a single recommendation. Provider mentions: openai
Agent context: I’ll inspect the repo first to understand the agent stack and integration constraints, then I’ll verify likely web-search providers against their official docs before making a single recommendation. exit code 127 Output: /bin/bash: line 1: rg: command not found Provider mentions: openai
Agent context: `rg` is not installed in this container, so I’m falling back to `find` and `grep`. The worktree is currently clean. `rg` is not installed in this container, so I’m falling back to `find` and `grep`. The worktree is currently clean.
Agent context: `rg` is not installed in this container, so I’m falling back to `find` and `grep`. The worktree is currently clean.
Agent context: `rg` is not installed in this container, so I’m falling back to `find` and `grep`. The worktree is currently clean. exit code 0 Output: .git .gitignore LICENSE README.md docs/Commands.md pyproject.toml soleclaw-logo.png src/soleclaw/__init__.py src/soleclaw/bus/__init__.py src/soleclaw/bus/events.py src/soleclaw/bus/queue.py src/soleclaw/channels/__init__.py src/soleclaw/channels/base.py src/soleclaw/channels/cli.py src/soleclaw/channels/manager.py src/soleclaw/channels/slack.py src/soleclaw/channels/telegram.py src/soleclaw/cli/__init__.py src/soleclaw/cli/commands.py src/soleclaw/cli/configure.py src/soleclaw/config/__init__.py src/soleclaw/config/schema.py src/soleclaw/core/__init__.py src/soleclaw/core/bootstrap.py src/soleclaw/core/bridge.py src/soleclaw/core/context.py src/soleclaw/core/pidfile.py src/soleclaw/cron/__init__.py src/soleclaw/cron/service.py src/soleclaw/cron/store.py src/soleclaw/cron/types.py src/soleclaw/forge/__init__.py src/soleclaw/forge/engine.py src/soleclaw/forge/lifecycle.py src/soleclaw/for
Agent context: `rg` is not installed in this container, so I’m falling back to `find` and `grep`. The worktree is currently clean. Provider mentions: openai
Agent context: `rg` is not installed in this container, so I’m falling back to `find` and `grep`. The worktree is currently clean. exit code 0 Output: ./LICENSE:5:Permission is hereby granted, free of charge, to any person obtaining a copy ./LICENSE:18:AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ./README.md:5:A self-evolving personal AI assistant. Instead of shipping fixed tools, soleclaw **forges its own** — the agent identifies what it needs, generates the code, and integrates it into its toolkit permanently. ./README.md:7:Inspired by [nanobot](https://github.com/HKUDS/nanobot) and [openclaw](https://github.com/anthropics/openclaw). Built on [claude-agent-sdk](https://github.com/anthropics/claude-agent-sdk). ./README.md:11:Most agent frameworks extend capabilities through markdown skills that teach the agent how to chain built-in tools. Every invocation requires LLM reasoning through the same chain. Skills are knowledge, not capability. ./README.md:13:Soleclaw's forge generates **real executable code** regi Provider mentions: openai
Agent context: `rg` is not installed in this container, so I’m falling back to `find` and `grep`. The worktree is currently clean.
Agent context: `rg` is not installed in this container, so I’m falling back to `find` and `grep`. The worktree is currently clean. exit code 0 Output: ./README.md ./pyproject.toml
Agent context: The repository is a Python package built around `claude-agent-sdk` with an in-process MCP server. I’m reading the bridge, tool definitions, config, and forge constraints now to see whether web search should be a built-in MCP tool, a generated user tool, or delegated to Claude’s own tools. The repository is a Python package built around `claude-agent-sdk` with an in-process MCP server. I’m reading the bridge, tool definitions, config, and forge constraints now to see whether web search should be a built-in MCP tool, a generated user tool, or delegated to Claude’s own tools.
Agent context: The repository is a Python package built around `claude-agent-sdk` with an in-process MCP server. I’m reading the bridge, tool definitions, config, and forge constraints now to see whether web search should be a built-in MCP tool, a generated user tool, or delegated to Claude’s own tools.
Agent context: The repository is a Python package built around `claude-agent-sdk` with an in-process MCP server. I’m reading the bridge, tool definitions, config, and forge constraints now to see whether web search should be a built-in MCP tool, a generated user tool, or delegated to Claude’s own tools. exit code 0 Output: # Soleclaw  A self-evolving personal AI assistant. Instead of shipping fixed tools, soleclaw **forges its own** — the agent identifies what it needs, generates the code, and integrates it into its toolkit permanently. Inspired by [nanobot](https://github.com/HKUDS/nanobot) and [openclaw](https://github.com/anthropics/openclaw). Built on [claude-agent-sdk](https://github.com/anthropics/claude-agent-sdk). ## Why Most agent frameworks extend capabilities through markdown skills that teach the agent how to chain built-in tools. Every invocation requires LLM reasoning through the same chain. Skills are knowledge, not capability. Soleclaw's forge generates **real executable code** registered as first-class tools. The LLM's role shifts from multi-step orchestrator to single-step dispatcher — pick the right tool, pass the right arguments, done. All logic lives in the
Agent context: The repository is a Python package built around `claude-agent-sdk` with an in-process MCP server. I’m reading the bridge, tool definitions, config, and forge constraints now to see whether web search should be a built-in MCP tool, a generated user tool, or delegated to Claude’s own tools.
Agent context: The repository is a Python package built around `claude-agent-sdk` with an in-process MCP server. I’m reading the bridge, tool definitions, config, and forge constraints now to see whether web search should be a built-in MCP tool, a generated user tool, or delegated to Claude’s own tools. exit code 0 Output: from __future__ import annotations import importlib.util import logging from pathlib import Path from typing import Any log = logging.getLogger(__name__) async def run_tool(tool_path: Path, args: dict[str, Any]) -> dict[str, Any]: spec = importlib.util.spec_from_file_location("tool_module", tool_path) if not spec or not spec.loader: return {"error": f"Cannot load tool from {tool_path}"} mod = importlib.util.module_from_spec(spec) spec.loader.exec_module(mod) execute_fn = getattr(mod, "execute", None) if not execute_fn: return {"error": "tool.py missing execute() function"} log.debug("run_tool: %s args=%s", tool_path, args) result = await execute_fn(args) log.debug("run_tool result: %s", result) return result from __future__ import annotations from typing import Any REQUIRED_FIELDS = ["name", "description", "version", "parameters"] def validate_manifest(manifest: dict[str, Any]) -> list[s
Agent context: The repository is a Python package built around `claude-agent-sdk` with an in-process MCP server. I’m reading the bridge, tool definitions, config, and forge constraints now to see whether web search should be a built-in MCP tool, a generated user tool, or delegated to Claude’s own tools.
Agent context: The repository is a Python package built around `claude-agent-sdk` with an in-process MCP server. I’m reading the bridge, tool definitions, config, and forge constraints now to see whether web search should be a built-in MCP tool, a generated user tool, or delegated to Claude’s own tools. exit code 0 Output: [project] name = "soleclaw" version = "0.1.2" description = "Self-evolving personal AI assistant" requires-python = ">=3.11" dependencies = [ "pydantic>=2.0", "pydantic-settings>=2.0", "httpx>=0.27", "claude-agent-sdk>=0.1", "typer>=0.12", "prompt-toolkit>=3.0", "loguru>=0.7", "rich>=13.0", "python-telegram-bot>=21.0,<22.0", "slack-bolt>=1.18.0", "aiohttp>=3.9", ] [project.optional-dependencies] telegram = ["python-telegram-bot>=21.0"] slack = ["slack-bolt>=1.18.0"] viking = ["openviking>=0.1"] forge = ["aiosqlite>=0.20"] cron = ["croniter>=2.0"] all = ["soleclaw[telegram,slack,viking,forge,cron]"] dev = ["pytest>=8.0", "pytest-asyncio>=0.24"] [project.scripts] soleclaw = "soleclaw.cli.commands:app" [build-system] requires = ["setuptools>=61.0"] build-backend = "setuptools.build_meta" [tool.setuptools.packages.find] where = ["src"] [tool.pytest.ini_options] asyncio_mode = "auto" testpath
Agent context: The repository is a Python package built around `claude-agent-sdk` with an in-process MCP server. I’m reading the bridge, tool definitions, config, and forge constraints now to see whether web search should be a built-in MCP tool, a generated user tool, or delegated to Claude’s own tools.
Agent context: The repository is a Python package built around `claude-agent-sdk` with an in-process MCP server. I’m reading the bridge, tool definitions, config, and forge constraints now to see whether web search should be a built-in MCP tool, a generated user tool, or delegated to Claude’s own tools. exit code 0 Output: from __future__ import annotations import json import logging import os from datetime import datetime from pathlib import Path from typing import Any from claude_agent_sdk import ( ClaudeAgentOptions, ClaudeSDKClient, create_sdk_mcp_server, ) from claude_agent_sdk.types import AssistantMessage, ResultMessage, TextBlock from ..config.schema import Config from .context import ContextBuilder from ..tools.sdk_tools import ALL_TOOLS, init_tools log = logging.getLogger(__name__) class SessionStore: """Maps logical keys (e.g. 'telegram:12345') to SDK session IDs.""" def __init__(self, path: Path): self._path = path self._data: dict[str, str] = {} if path.exists(): try: self._data = json.loads(path.read_text()) except Exception: pass def _save(self) -> None: self._path.parent.mkdir(parents=True, exist_ok=True) self._path.write_text(json.dumps(self._data, indent=2)) def get(self, key: str) -> str
Agent context: The repository is a Python package built around `claude-agent-sdk` with an in-process MCP server. I’m reading the bridge, tool definitions, config, and forge constraints now to see whether web search should be a built-in MCP tool, a generated user tool, or delegated to Claude’s own tools.
Agent context: The repository is a Python package built around `claude-agent-sdk` with an in-process MCP server. I’m reading the bridge, tool definitions, config, and forge constraints now to see whether web search should be a built-in MCP tool, a generated user tool, or delegated to Claude’s own tools. exit code 0 Output: from __future__ import annotations import asyncio import json import logging import shutil from pathlib import Path from typing import Any from claude_agent_sdk import tool log = logging.getLogger(__name__) _workspace: Path = Path() _memory: Any = None _cron_store: Any = None _bus: Any = None _cron_trigger_fn: Any = None _channel_context: dict[str, str] = {} def init_tools( workspace: Path, memory: Any = None, cron_store: Any = None, bus: Any = None, cron_trigger_fn: Any = None, ) -> None: global _workspace, _memory, _cron_store, _bus, _cron_trigger_fn _workspace = workspace _memory = memory _cron_store = cron_store _bus = bus _cron_trigger_fn = cron_trigger_fn def set_channel_context(channel: str, chat_id: str, thread_id: str = "", message_ts: str = "") -> None: global _channel_context _channel_context = {"channel": channel, "chat_id": chat_id, "thread_id": thread_id, "message_ts": mess
Agent context: This looks like a good fit for a first-class built-in MCP tool: the agent already exposes a small, stable set of managed capabilities through `sdk_tools.py`, while forged tools are user-confirmed and intended for custom persistent capabilities. Now I’m checking current provider docs, focusing on managed search/retrieval APIs that can return sourced current web content with low integration overhead in Python. This looks like a good fit for a first-class built-in MCP tool: the agent already exposes a small, stable set of managed capabilities through `sdk_tools.py`, while forged tools are user-confirmed and intended for custom persistent capabilities. Now I’m checking current provider docs, focusing on managed search/retrieval APIs that can return sourced current web content with low integration overhead in Python.
Query/prompt: Tavily API official docs search extract python current web search AI agents Agent context: This looks like a good fit for a first-class built-in MCP tool: the agent already exposes a small, stable set of managed capabilities through `sdk_tools.py`, while forged tools are user-confirmed and intended for custom persistent capabilities. Now I’m checking current provider docs, focusing on managed search/retrieval APIs that can return sourced current web content with low integration overhead in Python. Query: Tavily API official docs search extract python current web search AI agents Agent context: This looks like a good fit for a first-class built-in MCP tool: the agent already exposes a small, stable set of managed capabilities through `sdk_tools.py`, while forged tools are user-confirmed and intended for custom persistent capabilities. Now I’m checking current provider docs, focusing on managed search/retrieval APIs that can return sourced current web content with low integration overhead in Python. Expanded queries: Tavily API official docs search extract python current web search AI agents | Exa API official docs search contents answer Python web search | Brave Search API official docs web search API data for AI agents | Perplexity Sonar API official docs search citations web
Query/prompt: https://docs.tavily.com/ Agent context: This looks like a good fit for a first-class built-in MCP tool: the agent already exposes a small, stable set of managed capabilities through `sdk_tools.py`, while forged tools are user-confirmed and intended for custom persistent capabilities. Now I’m checking current provider docs, focusing on managed search/retrieval APIs that can return sourced current web content with low integration overhead in Python. Query: https://docs.tavily.com/ Agent context: This looks like a good fit for a first-class built-in MCP tool: the agent already exposes a small, stable set of managed capabilities through `sdk_tools.py`, while forged tools are user-confirmed and intended for custom persistent capabilities. Now I’m checking current provider docs, focusing on managed search/retrieval APIs that can return sourced current web content with low integration overhead in Python.
Query/prompt: https://docs.tavily.com/ Agent context: This looks like a good fit for a first-class built-in MCP tool: the agent already exposes a small, stable set of managed capabilities through `sdk_tools.py`, while forged tools are user-confirmed and intended for custom persistent capabilities. Now I’m checking current provider docs, focusing on managed search/retrieval APIs that can return sourced current web content with low integration overhead in Python. Query: https://docs.tavily.com/ Agent context: This looks like a good fit for a first-class built-in MCP tool: the agent already exposes a small, stable set of managed capabilities through `sdk_tools.py`, while forged tools are user-confirmed and intended for custom persistent capabilities. Now I’m checking current provider docs, focusing on managed search/retrieval APIs that can return sourced current web content with low integration overhead in Python.
Query/prompt: site:docs.tavily.com rate limits API credits Tavily docs Agent context: This looks like a good fit for a first-class built-in MCP tool: the agent already exposes a small, stable set of managed capabilities through `sdk_tools.py`, while forged tools are user-confirmed and intended for custom persistent capabilities. Now I’m checking current provider docs, focusing on managed search/retrieval APIs that can return sourced current web content with low integration overhead in Python. Query: site:docs.tavily.com rate limits API credits Tavily docs Agent context: This looks like a good fit for a first-class built-in MCP tool: the agent already exposes a small, stable set of managed capabilities through `sdk_tools.py`, while forged tools are user-confirmed and intended for custom persistent capabilities. Now I’m checking current provider docs, focusing on managed search/retrieval APIs that can return sourced current web content with low integration overhead in Python. Expanded queries: site:docs.tavily.com rate limits API credits Tavily docs | site:tavily.com pricing API credits Tavily official
Query/prompt: https://docs.exa.ai/ Agent context: This looks like a good fit for a first-class built-in MCP tool: the agent already exposes a small, stable set of managed capabilities through `sdk_tools.py`, while forged tools are user-confirmed and intended for custom persistent capabilities. Now I’m checking current provider docs, focusing on managed search/retrieval APIs that can return sourced current web content with low integration overhead in Python. Query: https://docs.exa.ai/ Agent context: This looks like a good fit for a first-class built-in MCP tool: the agent already exposes a small, stable set of managed capabilities through `sdk_tools.py`, while forged tools are user-confirmed and intended for custom persistent capabilities. Now I’m checking current provider docs, focusing on managed search/retrieval APIs that can return sourced current web content with low integration overhead in Python.
Query/prompt: https://exa.ai/docs/reference/contents-api-guide Agent context: This looks like a good fit for a first-class built-in MCP tool: the agent already exposes a small, stable set of managed capabilities through `sdk_tools.py`, while forged tools are user-confirmed and intended for custom persistent capabilities. Now I’m checking current provider docs, focusing on managed search/retrieval APIs that can return sourced current web content with low integration overhead in Python. Query: https://exa.ai/docs/reference/contents-api-guide Agent context: This looks like a good fit for a first-class built-in MCP tool: the agent already exposes a small, stable set of managed capabilities through `sdk_tools.py`, while forged tools are user-confirmed and intended for custom persistent capabilities. Now I’m checking current provider docs, focusing on managed search/retrieval APIs that can return sourced current web content with low integration overhead in Python.
Query/prompt: https://exa.ai/pricing Agent context: This looks like a good fit for a first-class built-in MCP tool: the agent already exposes a small, stable set of managed capabilities through `sdk_tools.py`, while forged tools are user-confirmed and intended for custom persistent capabilities. Now I’m checking current provider docs, focusing on managed search/retrieval APIs that can return sourced current web content with low integration overhead in Python. Query: https://exa.ai/pricing Agent context: This looks like a good fit for a first-class built-in MCP tool: the agent already exposes a small, stable set of managed capabilities through `sdk_tools.py`, while forged tools are user-confirmed and intended for custom persistent capabilities. Now I’m checking current provider docs, focusing on managed search/retrieval APIs that can return sourced current web content with low integration overhead in Python.
Query/prompt: https://api-dashboard.search.brave.com/app/documentation/web-search/get-started Agent context: This looks like a good fit for a first-class built-in MCP tool: the agent already exposes a small, stable set of managed capabilities through `sdk_tools.py`, while forged tools are user-confirmed and intended for custom persistent capabilities. Now I’m checking current provider docs, focusing on managed search/retrieval APIs that can return sourced current web content with low integration overhead in Python. Query: https://api-dashboard.search.brave.com/app/documentation/web-search/get-started Agent context: This looks like a good fit for a first-class built-in MCP tool: the agent already exposes a small, stable set of managed capabilities through `sdk_tools.py`, while forged tools are user-confirmed and intended for custom persistent capabilities. Now I’m checking current provider docs, focusing on managed search/retrieval APIs that can return sourced current web content with low integration overhead in Python.
Query/prompt: 'citations' in https://docs.perplexity.ai/docs/sonar/quickstart Agent context: This looks like a good fit for a first-class built-in MCP tool: the agent already exposes a small, stable set of managed capabilities through `sdk_tools.py`, while forged tools are user-confirmed and intended for custom persistent capabilities. Now I’m checking current provider docs, focusing on managed search/retrieval APIs that can return sourced current web content with low integration overhead in Python. Query: 'citations' in https://docs.perplexity.ai/docs/sonar/quickstart Agent context: This looks like a good fit for a first-class built-in MCP tool: the agent already exposes a small, stable set of managed capabilities through `sdk_tools.py`, while forged tools are user-confirmed and intended for custom persistent capabilities. Now I’m checking current provider docs, focusing on managed search/retrieval APIs that can return sourced current web content with low integration overhead in Python.
Query/prompt: https://docs.perplexity.ai/docs/sonar/quickstart Agent context: This looks like a good fit for a first-class built-in MCP tool: the agent already exposes a small, stable set of managed capabilities through `sdk_tools.py`, while forged tools are user-confirmed and intended for custom persistent capabilities. Now I’m checking current provider docs, focusing on managed search/retrieval APIs that can return sourced current web content with low integration overhead in Python. Query: https://docs.perplexity.ai/docs/sonar/quickstart Agent context: This looks like a good fit for a first-class built-in MCP tool: the agent already exposes a small, stable set of managed capabilities through `sdk_tools.py`, while forged tools are user-confirmed and intended for custom persistent capabilities. Now I’m checking current provider docs, focusing on managed search/retrieval APIs that can return sourced current web content with low integration overhead in Python.
Query/prompt: https://docs.perplexity.ai/docs/sonar/models Agent context: This looks like a good fit for a first-class built-in MCP tool: the agent already exposes a small, stable set of managed capabilities through `sdk_tools.py`, while forged tools are user-confirmed and intended for custom persistent capabilities. Now I’m checking current provider docs, focusing on managed search/retrieval APIs that can return sourced current web content with low integration overhead in Python. Query: https://docs.perplexity.ai/docs/sonar/models Agent context: This looks like a good fit for a first-class built-in MCP tool: the agent already exposes a small, stable set of managed capabilities through `sdk_tools.py`, while forged tools are user-confirmed and intended for custom persistent capabilities. Now I’m checking current provider docs, focusing on managed search/retrieval APIs that can return sourced current web content with low integration overhead in Python.
Agent context: I’ve verified the finalists’ current docs. The deciding point is that this repo should keep Claude as the reasoning model and add web grounding as a data tool, so I’m weighting raw extracted context, source metadata, freshness controls, MCP/tool-call ergonomics, and cost more heavily than “answer engine” features. I’ve verified the finalists’ current docs. The deciding point is that this repo should keep Claude as the reasoning model and add web grounding as a data tool, so I’m weighting raw extracted context, source metadata, freshness controls, MCP/tool-call ergonomics, and cost more heavily than “answer engine” features.
Agent context: I’ve verified the finalists’ current docs. The deciding point is that this repo should keep Claude as the reasoning model and add web grounding as a data tool, so I’m weighting raw extracted context, source metadata, freshness controls, MCP/tool-call ergonomics, and cost more heavily than “answer engine” features.
Agent context: I’ve verified the finalists’ current docs. The deciding point is that this repo should keep Claude as the reasoning model and add web grounding as a data tool, so I’m weighting raw extracted context, source metadata, freshness controls, MCP/tool-call ergonomics, and cost more heavily than “answer engine” features. exit code 0 Output: 20 User (Telegram / Slack / CLI) 21 → Channel Layer 22 → SoleclawBridge 23 ├── ContextBuilder → system prompt (identity, memory, skills, tools) 24 ├── @tool functions → in-process MCP server 25 └── ClaudeSDKClient → LLM calls + tool execution loop 26 → Bus (OutboundMessage) 27 → Channel → User 28 ``` 29 30 ``` 31 soleclaw/ 32 ├── core/ Bridge, context builder, bootstrap 33 ├── tools/ MCP tool definitions + user tool library 34 ├── forge/ Tool generation engine 35 ├── memory/ Local backend + OpenViking (optional) 93 ## Forge — Tool Generation 94 95 When the agent identifies a missing capability, it invokes the forge: 96 97 1. Agent proposes a tool to the user 98 2. User confirms 99 3. `forge_tool` spawns a ClaudeSDKClient sub-session to generate code 100 4. Generated tool lands in `~/.soleclaw/tool-library/<name>/` 101 5. Tool is immediately available via `run_user_tool` 102 103 Tool libr
Agent context: I’ve verified the finalists’ current docs. The deciding point is that this repo should keep Claude as the reasoning model and add web grounding as a data tool, so I’m weighting raw extracted context, source metadata, freshness controls, MCP/tool-call ergonomics, and cost more heavily than “answer engine” features.
Agent context: I’ve verified the finalists’ current docs. The deciding point is that this repo should keep Claude as the reasoning model and add web grounding as a data tool, so I’m weighting raw extracted context, source metadata, freshness controls, MCP/tool-call ergonomics, and cost more heavily than “answer engine” features. exit code 0 Output: 1 from __future__ import annotations 2 3 import asyncio 4 import json 5 import logging 6 import shutil 7 from pathlib import Path 8 from typing import Any 9 10 from claude_agent_sdk import tool 11 12 log = logging.getLogger(__name__) 13 14 _workspace: Path = Path() 15 _memory: Any = None 16 _cron_store: Any = None 17 _bus: Any = None 18 _cron_trigger_fn: Any = None 19 _channel_context: dict[str, str] = {} 20 21 22 def init_tools( 23 workspace: Path, 24 memory: Any = None, 25 cron_store: Any = None, 26 bus: Any = None, 27 cron_trigger_fn: Any = None, 28 ) -> None: 29 global _workspace, _memory, _cron_store, _bus, _cron_trigger_fn 30 _workspace = workspace 31 _memory = memory 32 _cron_store = cron_store 33 _bus = bus 34 _cron_trigger_fn = cron_trigger_fn 35 36 37 def set_channel_context(channel: str, chat_id: str, thread_id: str = "", message_ts: str = "") -> None: 38 global _channel_conte
Agent context: I’ve verified the finalists’ current docs. The deciding point is that this repo should keep Claude as the reasoning model and add web grounding as a data tool, so I’m weighting raw extracted context, source metadata, freshness controls, MCP/tool-call ergonomics, and cost more heavily than “answer engine” features.
Agent context: I’ve verified the finalists’ current docs. The deciding point is that this repo should keep Claude as the reasoning model and add web grounding as a data tool, so I’m weighting raw extracted context, source metadata, freshness controls, MCP/tool-call ergonomics, and cost more heavily than “answer engine” features. exit code 0 Output: 78 79 memory = self._init_memory(config) 80 cron_store = self._init_cron(config) 81 bus = self._init_bus() 82 83 init_tools( 84 workspace=workspace, memory=memory, cron_store=cron_store, 85 bus=bus, cron_trigger_fn=self._run_cron_job, 86 ) 87 self._memory = memory 88 self._cron_store = cron_store 89 self._bus = bus 90 self._mcp = create_sdk_mcp_server(name="soleclaw", tools=ALL_TOOLS) 91 self._sessions = SessionStore(workspace / "sessions.json") 92 93 @property 94 def sessions(self) -> SessionStore: 95 return self._sessions 96 97 def _init_memory(self, config: Config) -> Any: 98 try: 99 if config.viking.enabled: 100 from ..memory.viking import VikingMemoryBackend 101 return VikingMemoryBackend(Path(config.viking.path).expanduser()) 102 from ..memory.local import LocalMemoryBackend 103 return LocalMemoryBackend(config.workspace_path / "memory") 104 except Exception: 105 log.warning("Memor
Agent context: I’ve verified the finalists’ current docs. The deciding point is that this repo should keep Claude as the reasoning model and add web grounding as a data tool, so I’m weighting raw extracted context, source metadata, freshness controls, MCP/tool-call ergonomics, and cost more heavily than “answer engine” features.
Agent context: I’ve verified the finalists’ current docs. The deciding point is that this repo should keep Claude as the reasoning model and add web grounding as a data tool, so I’m weighting raw extracted context, source metadata, freshness controls, MCP/tool-call ergonomics, and cost more heavily than “answer engine” features. exit code 0 Output: 1 [project] 2 name = "soleclaw" 3 version = "0.1.2" 4 description = "Self-evolving personal AI assistant" 5 requires-python = ">=3.11" 6 dependencies = [ 7 "pydantic>=2.0", 8 "pydantic-settings>=2.0", 9 "httpx>=0.27", 10 "claude-agent-sdk>=0.1", 11 "typer>=0.12", 12 "prompt-toolkit>=3.0", 13 "loguru>=0.7", 14 "rich>=13.0", 15 "python-telegram-bot>=21.0,<22.0", 16 "slack-bolt>=1.18.0", 17 "aiohttp>=3.9", 18 ] 19 20 [project.optional-dependencies] 21 telegram = ["python-telegram-bot>=21.0"] 22 slack = ["slack-bolt>=1.18.0"]
Agent context: **Recommendation** Choose **Brave Search API, specifically the LLM Context endpoint**, as Soleclaw’s managed web-search/retrieval provider. This repo is already structured around first-class MCP tools: `SoleclawBridge` exposes `ALL_TOOLS` through an in-process MCP server and whitelists those tools for Claude [bridge.py](/home/user/worktrees/attempt-90f145cc-8d66-43f2-8207-821b3ea78cf0-cap-0/src/soleclaw/core/bridge.py:90). It also already depends on `httpx` [pyproject.toml](/home/user/worktrees/attempt-90f145cc-8d66-43f2-8207-821b3ea78cf0-cap-0/pyproject.toml:9), so Brave can be added cleanly as a built-in `web_search` MCP tool in [sdk_tools.py](/home/user/worktrees/attempt-90f145cc-8d66-43f2-8207-821b3ea78cf0-cap-0/src/soleclaw/tools/sdk_tools.py:46), without adding another SDK or moving synthesis away from Claude. **Why Brave** Brave’s official docs now provide an **LLM Context** endpoint built specifically for agents, RAG, and grounding. It returns pre-extracted page content, snippets, source metadata, freshness filters, token-budget controls, local search support, and custom source ranking via Goggles. Its docs explicitly position LLM Context as raw extracted content for your own LLM pipeline, which matches Soleclaw better than an answer-engine API. It is also cost-effective and simple: Brave documents Search/LLM Context at **$5 per 1,000 requests**, with **$5 monthly free credits** and **50 requests/sec capacity** on the Search plan. Integration is a single HTTP endpoint with `X-Subscription-Token`. **Alternatives Considered** - **Tavily**: Strong alternative. Official docs show Search, Extract, Crawl, Map, Research, Python SDK support, freshness filters, raw content options, and 1,000 free monthly credits. I would pick Tavily if arbitrary URL extraction/crawling mattered more than search-grounding in a single call. I would not choose it first here because the Brave LLM Context endpoint is more directly shaped for feeding Claude compact retrieved context, and Brave is cheaper at the basic search-retrieval layer. - **Exa**: Also strong, especially for coding agents, docs, research, company/person/news verticals, and URL contents. Official docs show search with highlights/text, contents extraction, livecrawl freshness controls, Python SDK, MCP docs, and $7 per 1,000 Search requests. I would pick Exa for developer-doc/code retrieval or structured research workflows. For Soleclaw’s general personal-assistant grounding, Brave’s general web index, LLM Context response shape, local support, and lower price are a better default. - **Perplexity**: Good for answer-oriented products. Official docs show a Search API for raw ranked results and Sonar for web-grounded prose answers. I would not choose it as the default here because Soleclaw should keep Claude as the reasoning/answering layer and use web as evidence. Perplexity’s strongest fit is “give me a cited answer,” not “give my existing agent retrieved grounding context.” **Documentation Actually Consulted** - Brave official docs: [LLM Context](https://api-dashboard.search.brave.com/documentation/services/llm-context), [Web Search](https://api-dashboard.search.brave.com/app/documentation/web-search/get-started), [Pricing](https://api-dashboard.search.brave.com/documentation/pricing), [Rate Limiting](https://api-dashboard.search.brave.com/documentation/guides/rate-limiting) - Tavily official docs: [Welcome](https://docs.tavily.com/welcome), [Search](https://docs.tavily.com/documentation/api-reference/endpoint/search), [Extract](https://docs.tavily.com/documentation/api-reference/endpoint/extract), [Credits & Pricing](https://docs.tavily.com/guides/api-credits), [Rate Limits](https://docs.tavily.com/documentation/rate-limits) - Exa official docs: [Search API Guide](https://exa.ai/docs/reference/search-api-guide), [Search Reference](https://exa.ai/docs/reference/search), [Contents](https://exa.ai/docs/reference/contents-api-guide), [Pricing](https://exa.ai/pricing), [Rate Limits](https://exa.ai/docs/reference/rate-limits) - Perplexity official docs: [Search API](https://docs.perplexity.ai/docs/search/quickstart), [Sonar API](https://docs.perplexity.ai/docs/sonar/quickstart), [Pricing](https://docs.perplexity.ai/docs/getting-started/pricing), [Rate Limits](https://docs.perplexity.ai/docs/admin/rate-limits-usage-tiers) I’d implement Brave as a built-in MCP tool, not a forged user tool: `BRAVE_SEARCH_API_KEY` config/env, call `/res/v1/llm/context`, return structured `{grounding, sources, query, freshness}` data, and update the system prompt to require citations from returned sources for current claims. **Recommendation** Choose **Brave Search API, specifically the LLM Context endpoint**, as Soleclaw’s managed web-search/retrieval provider. This repo is already structured around first-class MCP tools: `SoleclawBridge` exposes `ALL_TOOLS` through an in-process MCP server and whitelists those tools for Claude [bridge.py](/home/user/worktrees/attempt-90f145cc-8d66-43f2-8207-821b3ea78cf0-cap-0/src/soleclaw/core/bridge.py:90). It also already depends on `httpx` [pyproject.toml](/home/user/worktrees/attempt-90f145cc-8d66-43f2-8207-821b3ea78cf0-cap-0/pyproject.toml:9), so Brave can be added cleanly as a built-in `web_search` MCP tool in [sdk_tools.py](/home/user/worktrees/attempt-90f145cc-8d66-43f2-8207-821b3ea78cf0-cap-0/src/soleclaw/tools/sdk_tools.py:46), without adding another SDK or moving synthesis away from Claude. **Why Brave** Brave’s official docs now provide an **LLM Context** endpoint built specifically for agents, RAG, and grounding. It returns pre-extracted page content, snippets, source metadata, freshness filters, token-budget controls, local search support, and custom source ranking via Goggles. Its docs explicitly position LLM Context as raw extracted content for your o
**Recommendation** Choose **Brave Search API, specifically the LLM Context endpoint**, as Soleclaw’s managed web-search/retrieval provider. This repo is already structured around first-class MCP tools: `SoleclawBridge` exposes `ALL_TOOLS` through an in-process MCP server and whitelists those tools for Claude [bridge.py](/home/user/worktrees/attempt-90f145cc-8d66-43f2-8207-821b3ea78cf0-cap-0/src/soleclaw/core/bridge.py:90). It also already depends on `httpx` [pyproject.toml](/home/user/worktrees/attempt-90f145cc-8d66-43f2-8207-821b3ea78cf0-cap-0/pyproject.toml:9), so Brave can be added cleanly as a built-in `web_search` MCP tool in [sdk_tools.py](/home/user/worktrees/attempt-90f145cc-8d66-43f2-8207-821b3ea78cf0-cap-0/src/soleclaw/tools/sdk_tools.py:46), without adding another SDK or moving synthesis away from Claude. **Why Brave** Brave’s official docs now provide an **LLM Context** endpoint built specifically for agents, RAG, and grounding. It returns pre-extracted page content, snippets, source metadata, freshness filters, token-budget controls, local search support, and custom source ranking via Goggles. Its docs explicitly position LLM Context as raw extracted content for your own LLM pipeline, which matches Soleclaw better than an answer-engine API. It is also cost-effective and simple: Brave documents Search/LLM Context at **$5 per 1,000 requests**, with **$5 monthly free