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 research the repository structure first to understand the agent architecture and stack. I'll research the repository structure first to understand the agent architecture and stack.
Agent context: I'll research the repository structure first to understand the agent architecture and stack. Tool result summary: /home/user/worktrees/attempt-9c956afd-ccfa-4b8a-8b2a-28860f111472-cap-0/README.md /home/user/worktrees/attempt-9c956afd-ccfa-4b8a-8b2a-28860f111472-cap-0/pyproject.toml Agent context: I'll research the repository structure first to understand the agent architecture and stack.
Agent context: I'll research the repository structure first to understand the agent architecture and stack. Tool result summary: 1 # Soleclaw 2 3  4 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. 6 7 Inspired by [nanobot](https://github.com/HKUDS/nanobot) and [openclaw](https://github.com/anthropics/openclaw). Built on [claude-agent-sdk](https://github.com/a Agent context: I'll research the repository structure first to understand the agent architecture and stack.
Agent context: I'll research the repository structure first to understand the agent architecture and stack. Tool result summary: 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 [p Agent context: I'll research the repository structure first to understand the agent architecture and stack.
Agent context: I'll research the repository structure first to understand the agent architecture and stack. Tool result summary: total 1760 drwxr-xr-x 5 user user 4096 Jun 6 04:53 . drwxr-xr-x 3 user user 4096 Jun 6 04:53 .. -rw-r--r-- 1 user user 170 Jun 6 04:53 .git -rw-r--r-- 1 user user 81 Jun 6 04:53 .gitignore -rw-r--r-- 1 user user 1069 Jun 6 04:53 LICENSE -rw-r--r-- 1 user user 4200 Jun 6 04:53 README.md drwxr-xr-x 2 user user 4096 Jun 6 04:53 docs -rw-r--r-- 1 user user 963 Jun 6 04:53 pyproject.toml -rw-r--r-- 1 user user 1202432 Jun Agent context: I'll research the repository structure first to understand the agent architecture and stack.
Agent context: I'll research the repository structure first to understand the agent architecture and stack. Tool result summary: /home/user/worktrees/attempt-9c956afd-ccfa-4b8a-8b2a-28860f111472-cap-0/src/soleclaw/__init__.py /home/user/worktrees/attempt-9c956afd-ccfa-4b8a-8b2a-28860f111472-cap-0/src/soleclaw/bus/__init__.py /home/user/worktrees/attempt-9c956afd-ccfa-4b8a-8b2a-28860f111472-cap-0/src/soleclaw/bus/events.py /home/user/worktrees/attempt-9c956afd-ccfa-4b8a-8b2a-28860f111472-cap-0/src/soleclaw/bus/queue.py /home/user/worktrees/atte Agent context: I'll research the repository structure first to understand the agent architecture and stack.
Agent context: I'll research the repository structure first to understand the agent architecture and stack. Tool result summary: 1 from __future__ import annotations 2 3 import json 4 import logging 5 import os 6 from datetime import datetime 7 from pathlib import Path 8 from typing import Any 9 10 from claude_agent_sdk import ( 11 ClaudeAgentOptions, 12 ClaudeSDKClient, 13 create_sdk_mcp_server, 14 ) 15 from claude_agent_sdk.types import AssistantMessage, ResultMessage, TextBlock 16 17 from ..config.schema import Config 18 from .context impor Agent context: I'll research the repository structure first to understand the agent architecture and stack.
Agent context: I'll research the repository structure first to understand the agent architecture and stack. Tool result summary: 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 de Agent context: I'll research the repository structure first to understand the agent architecture and stack.
Agent context: I'll research the repository structure first to understand the agent architecture and stack. Tool result summary: 1 from __future__ import annotations 2 import json 3 import logging 4 from pathlib import Path 5 from typing import Any 6 7 from .runner import run_tool 8 from .schema import validate_manifest 9 10 log = logging.getLogger(__name__) 11 12 13 DISALLOWED_TOP_LEVEL = {"oneOf", "anyOf", "allOf", "enum", "not", "if", "then", "else"} 14 15 16 def _sanitize_parameters(params: dict[str, Any]) -> dict[str, Any]: 17 clean = {k: Agent context: I'll research the repository structure first to understand the agent architecture and stack.
Agent context: I'll research the repository structure first to understand the agent architecture and stack. Tool result summary: 1 from __future__ import annotations 2 from typing import Any 3 4 REQUIRED_FIELDS = ["name", "description", "version", "parameters"] 5 6 7 def validate_manifest(manifest: dict[str, Any]) -> list[str]: 8 errors = [] 9 for field in REQUIRED_FIELDS: 10 if field not in manifest: 11 errors.append(f"Missing required field: {field}") 12 if "parameters" in manifest and not isinstance(manifest["parameters"], dict): 13 errors. Agent context: I'll research the repository structure first to understand the agent architecture and stack.
Agent context: I'll research the repository structure first to understand the agent architecture and stack. Tool result summary: 1 from __future__ import annotations 2 import importlib.util 3 import logging 4 from pathlib import Path 5 from typing import Any 6 7 log = logging.getLogger(__name__) 8 9 10 async def run_tool(tool_path: Path, args: dict[str, Any]) -> dict[str, Any]: 11 spec = importlib.util.spec_from_file_location("tool_module", tool_path) 12 if not spec or not spec.loader: 13 return {"error": f"Cannot load tool from {tool_path}"} Agent context: I'll research the repository structure first to understand the agent architecture and stack.
Agent context: I'll research the repository structure first to understand the agent architecture and stack. Tool result summary: 1 from __future__ import annotations 2 import json 3 from datetime import datetime 4 from pathlib import Path 5 from typing import Any 6 7 from ..skills.loader import SkillsLoader 8 9 SYSTEM_HEADER = """You are soleclaw, a self-evolving personal AI assistant. 10 Current time: {time} 11 Workspace: {workspace} 12 13 Your workspace files (SOUL.md, IDENTITY.md, USER.md, AGENTS.md, etc.) are loaded below. \ 14 Follow the Agent context: I'll research the repository structure first to understand the agent architecture and stack.
Agent context: I'll research the repository structure first to understand the agent architecture and stack. Tool result summary: 1 from __future__ import annotations 2 from pathlib import Path 3 from pydantic import BaseModel, Field 4 from pydantic_settings import BaseSettings 5 6 7 class AgentConfig(BaseModel): 8 workspace: str = "~/.soleclaw" 9 model: str = "claude-sonnet-4-6" 10 max_turns: int = 20 11 max_budget_usd: float | None = None 12 13 14 class TelegramConfig(BaseModel): 15 enabled: bool = False 16 token: str = "" 17 allowed_users: l Agent context: I'll research the repository structure first to understand the agent architecture and stack.
Agent context: I'll research the repository structure first to understand the agent architecture and stack. Tool result summary: <tool_use_error>InputValidationError: Read failed due to the following issue: An unexpected parameter `command` was provided</tool_use_error> Agent context: I'll research the repository structure first to understand the agent architecture and stack.
Agent context: I'll research the repository structure first to understand the agent architecture and stack. Tool result summary: 1 from __future__ import annotations 2 import json 3 import sys 4 from pathlib import Path 5 from typing import Any 6 7 from prompt_toolkit import Application 8 from prompt_toolkit.key_binding import KeyBindings 9 from prompt_toolkit.layout import Layout 10 from prompt_toolkit.layout.containers import Window 11 from prompt_toolkit.layout.controls import FormattedTextControl 12 13 try: 14 import termios as _termios 15 Agent context: I'll research the repository structure first to understand the agent architecture and stack.
Agent context: I'll research the repository structure first to understand the agent architecture and stack. Tool result summary: /home/user/worktrees/attempt-9c956afd-ccfa-4b8a-8b2a-28860f111472-cap-0/src/soleclaw/cli/commands.py /home/user/worktrees/attempt-9c956afd-ccfa-4b8a-8b2a-28860f111472-cap-0/src/soleclaw/core/bootstrap.py /home/user/worktrees/attempt-9c956afd-ccfa-4b8a-8b2a-28860f111472-cap-0/src/soleclaw/core/context.py /home/user/worktrees/attempt-9c956afd-ccfa-4b8a-8b2a-28860f111472-cap-0/src/soleclaw/memory/base.py /home/user/work Agent context: I'll research the repository structure first to understand the agent architecture and stack.
Agent context: I'll research the repository structure first to understand the agent architecture and stack. Tool result summary: 1 from __future__ import annotations 2 import asyncio 3 import json 4 import logging 5 from pathlib import Path 6 from typing import Any 7 8 from .validator import validate_generated_tool 9 10 log = logging.getLogger(__name__) 11 12 FORGE_PROMPT = """Create a tool in {tool_dir}/ with these files: 13 14 1. manifest.json - with name, description, version, parameters (JSON Schema) 15 2. tool.py - with an async function: Agent context: I'll research the repository structure first to understand the agent architecture and stack.
Agent context: I'll research the repository structure first to understand the agent architecture and stack. Tool result summary: 1 from __future__ import annotations 2 import json 3 import shutil 4 from pathlib import Path 5 6 7 def install_tool(source_dir: Path, library_path: Path) -> None: 8 manifest = json.loads((source_dir / "manifest.json").read_text()) 9 name = manifest["name"] 10 dest = library_path / name 11 if dest.exists(): 12 shutil.rmtree(dest) 13 shutil.copytree(source_dir, dest) 14 15 16 def remove_tool(name: str, library_path: P Agent context: I'll research the repository structure first to understand the agent architecture and stack.
Agent context: I'll research the repository structure first to understand the agent architecture and stack. Tool result summary: 1 from __future__ import annotations 2 import importlib.util 3 import json 4 from pathlib import Path 5 from ..tools.library.schema import validate_manifest 6 7 8 def validate_generated_tool(tool_dir: Path) -> list[str]: 9 errors = [] 10 manifest_path = tool_dir / "manifest.json" 11 tool_path = tool_dir / "tool.py" 12 13 if not manifest_path.exists(): 14 errors.append("Missing manifest.json") 15 return errors 16 if n Agent context: I'll research the repository structure first to understand the agent architecture and stack.
Agent context: I'll research the repository structure first to understand the agent architecture and stack. Tool result summary: total 12 drwxr-xr-x 2 user user 4096 Jun 6 04:53 . drwxr-xr-x 5 user user 4096 Jun 6 04:53 .. -rw-r--r-- 1 user user 3048 Jun 6 04:53 Commands.md Agent context: I'll research the repository structure first to understand the agent architecture and stack.
Agent context: I'll research the repository structure first to understand the agent architecture and stack. Tool result summary: /home/user/worktrees/attempt-9c956afd-ccfa-4b8a-8b2a-28860f111472-cap-0/src/soleclaw/cli/commands.py: logging.getLogger("httpx").setLevel(logging.WARNING) /home/user/worktrees/attempt-9c956afd-ccfa-4b8a-8b2a-28860f111472-cap-0/src/soleclaw/cli/commands.py: logging.getLogger("httpx").setLevel(logging.WARNING) Agent context: I'll research the repository structure first to understand the agent architecture and stack.
Agent context: I'll research the repository structure first to understand the agent architecture and stack. Tool result summary: 1 from __future__ import annotations 2 import asyncio 3 from pathlib import Path 4 5 import typer 6 from rich.console import Console 7 8 from ..config.schema import Config 9 10 app = typer.Typer(name="soleclaw", help="soleclaw - Self-evolving AI assistant", no_args_is_help=True) 11 gw_app = typer.Typer(name="gateway", help="Manage the channel gateway", no_args_is_help=True) 12 sess_app = typer.Typer(name="session", h Agent context: I'll research the repository structure first to understand the agent architecture and stack.
Agent context: I'll research the repository structure first to understand the agent architecture and stack. Tool result summary: 1 from __future__ import annotations 2 from pathlib import Path 3 from typing import Any 4 5 6 class SkillsLoader: 7 def __init__(self, workspace_skills: Path | None = None, builtin_skills: Path | None = None): 8 self.workspace_skills = workspace_skills 9 self.builtin_skills = builtin_skills or Path(__file__).parent / "builtin" 10 11 def list_skills(self) -> list[dict[str, Any]]: 12 skills = [] 13 seen: set[str] = se Agent context: I'll research the repository structure first to understand the agent architecture and stack.
Agent context: I'll research the repository structure first to understand the agent architecture and stack. Tool result summary: 1 # Commands 2 3 All commands accept `--config / -c` to specify a custom config file path. Default: `~/.soleclaw/config.json`. 4 5 ## Core Commands 6 7 ### `soleclaw configure` 8 9 Interactive configuration wizard. Sets up model selection, Telegram channel, and bootstraps the workspace on first run. 10 11 ```bash 12 soleclaw configure 13 soleclaw configure -w /path/to/workspace 14 ``` 15 16 ### `soleclaw agent` 17 18 Agent context: I'll research the repository structure first to understand the agent architecture and stack.
Agent context: I'll research the repository structure first to understand the agent architecture and stack. Tool result summary: 1 from __future__ import annotations 2 3 from pathlib import Path 4 5 from rich.console import Console 6 7 console = Console() 8 9 DEFAULT_SOUL = """\ 10 # SOUL.md — Who You Are 11 12 _You're not a chatbot. You're becoming someone._ 13 14 ## Core Truths 15 16 **Be genuinely helpful, not performatively helpful.** Skip the "Great question!" \ 17 and "I'd be happy to help!" — just help. Actions speak louder than filler Agent context: I'll research the repository structure first to understand the agent architecture and stack.
Agent context: I'll research the repository structure first to understand the agent architecture and stack. Tool result summary: 100 log.info("Forge success: %s", name) 101 return {"success": True, "name": name, "path": str(tool_dir)} 102 103 log.warning("Forge validation failed: %s errors=%s", name, errors) 104 prompt = f"The generated tool has errors: {errors} Please fix them in {tool_dir}/" 105 106 return {"error": f"Failed to generate tool after {self.max_retries} attempts", "last_errors": errors} 107 Agent context: I'll research the repository structure first to understand the agent architecture and stack.
Agent context: I'll research the repository structure first to understand the agent architecture and stack. Tool result summary: (Bash completed with no output) Agent context: I'll research the repository structure first to understand the agent architecture and stack.
Agent context: I'll research the repository structure first to understand the agent architecture and stack. Tool result summary: -rw-r--r-- 1 user user 1302 Jun 6 04:53 /home/user/worktrees/attempt-9c956afd-ccfa-4b8a-8b2a-28860f111472-cap-0/tests/test_bootstrap.py -rw-r--r-- 1 user user 1974 Jun 6 04:53 /home/user/worktrees/attempt-9c956afd-ccfa-4b8a-8b2a-28860f111472-cap-0/tests/test_bridge.py -rw-r--r-- 1 user user 730 Jun 6 04:53 /home/user/worktrees/attempt-9c956afd-ccfa-4b8a-8b2a-28860f111472-cap-0/tests/test_bus.py -rw-r--r-- 1 user user Agent context: I'll research the repository structure first to understand the agent architecture and stack.
Agent context: I'll research the repository structure first to understand the agent architecture and stack. Tool result summary: 1 import json 2 from pathlib import Path 3 from soleclaw.forge.validator import validate_generated_tool 4 from soleclaw.forge.lifecycle import install_tool, list_tools, remove_tool 5 6 7 def test_validate_good_tool(tmp_path: Path): 8 tool_dir = tmp_path / "good-tool" 9 tool_dir.mkdir() 10 (tool_dir / "manifest.json").write_text(json.dumps({ 11 "name": "good-tool", "description": "works", "version": "1.0.0", 12 "param Agent context: I'll research the repository structure first to understand the agent architecture and stack.
Agent context: I'll research the repository structure first to understand the agent architecture and stack. Tool result summary: 1 import json 2 from pathlib import Path 3 from soleclaw.tools.library.registry import LibraryRegistry 4 from soleclaw.tools.library.schema import validate_manifest 5 6 7 def test_validate_manifest_valid(): 8 manifest = { 9 "name": "test-tool", 10 "description": "A test tool", 11 "version": "1.0.0", 12 "parameters": {"type": "object", "properties": {"x": {"type": "string"}}, "required": ["x"]}, 13 } 14 errors = valid Agent context: I'll research the repository structure first to understand the agent architecture and stack.
Agent context: I'll research the repository structure first to understand the agent architecture and stack. Tool result summary: 1 from __future__ import annotations 2 3 from abc import ABC, abstractmethod 4 from dataclasses import dataclass 5 from typing import Any 6 7 8 @dataclass 9 class MemoryEntry: 10 key: str 11 content: str 12 metadata: dict[str, Any] 13 14 15 class MemoryBackend(ABC): 16 @abstractmethod 17 async def get_context(self, query: str = "") -> str: ... 18 19 @abstractmethod 20 async def store(self, key: str, content: str, met Agent context: I'll research the repository structure first to understand the agent architecture and stack.
Agent context: I'll research the repository structure first to understand the agent architecture and stack. Tool result summary: 1 from __future__ import annotations 2 3 from datetime import datetime 4 from pathlib import Path 5 from typing import Any 6 7 from .base import MemoryBackend, MemoryEntry 8 9 10 class LocalMemoryBackend(MemoryBackend): 11 """File-based memory: MEMORY.md (long-term facts) + memory/YYYY-MM-DD.md (daily logs).""" 12 13 def __init__(self, workspace: Path): 14 self.workspace = workspace 15 self.memory_file = workspace / Agent context: I'll research the repository structure first to understand the agent architecture and stack.
Agent context: I'll research the repository structure first to understand the agent architecture and stack. Tool result summary: 1 from __future__ import annotations 2 from abc import ABC, abstractmethod 3 from typing import Any 4 5 from ..bus.events import InboundMessage, OutboundMessage, ReactionRequest 6 from ..bus.queue import MessageBus 7 8 9 class BaseChannel(ABC): 10 name: str = "base" 11 12 def __init__(self, config: Any, bus: MessageBus): 13 self.config = config 14 self.bus = bus 15 16 @abstractmethod 17 async def start(self) -> None: Agent context: I'll research the repository structure first to understand the agent architecture and stack.
Agent context: I'll research the repository structure first to understand the agent architecture and stack. Tool result summary: requires-python = ">=3.11" Agent context: I'll research the repository structure first to understand the agent architecture and stack.
Agent context: I'll research the repository structure first to understand the agent architecture and stack. Tool result summary: version = "2.6.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/26/30/f84a107a9c4331c14b2b586036f40965c128aa4fee4dda5d3d51cb14ad54/aiohappyeyeballs-2.6.1.tar.gz", hash = "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558", size = 22760, upload-time = "2025-03-12T01:42:48.764Z" } wheels = [ { url = "https://files.pythonhosted.org/packag Agent context: I'll research the repository structure first to understand the agent architecture and stack.
Agent context: I'll research the repository structure first to understand the agent architecture and stack. Tool result summary: /home/user/worktrees/attempt-9c956afd-ccfa-4b8a-8b2a-28860f111472-cap-0/src/soleclaw/skills Agent context: I'll research the repository structure first to understand the agent architecture and stack.
Agent context: I'll research the repository structure first to understand the agent architecture and stack. Tool result summary: /home/user/worktrees/attempt-9c956afd-ccfa-4b8a-8b2a-28860f111472-cap-0/src/soleclaw/skills/builtin/cron/SKILL.md /home/user/worktrees/attempt-9c956afd-ccfa-4b8a-8b2a-28860f111472-cap-0/src/soleclaw/skills/builtin/forge/SKILL.md /home/user/worktrees/attempt-9c956afd-ccfa-4b8a-8b2a-28860f111472-cap-0/src/soleclaw/skills/builtin/memory/SKILL.md Agent context: I'll research the repository structure first to understand the agent architecture and stack.
Agent context: I'll research the repository structure first to understand the agent architecture and stack. Tool result summary: 1 --- 2 name: forge 3 description: Manage your tool library — create, edit, list, and remove tools. 4 always: true 5 --- 6 7 # Tool Builder 8 9 You have the `forge_tool` tool for managing your tool library. 10 11 **When talking to the user, say "build a tool" or "create a tool" — never say "forge".** 12 13 **Actions:** `create`, `list`, `remove` 14 15 ## Workflow for Creating a New Tool 16 17 **You MUST follow these Agent context: I'll research the repository structure first to understand the agent architecture and stack.
Agent context: I'll research the repository structure first to understand the agent architecture and stack. Tool result summary: 1 --- 2 name: memory 3 description: Persistent file-based memory system 4 always: true 5 --- 6 7 # Memory 8 9 You have a persistent, file-based memory system. Your memory lives in two places: 10 11 - **MEMORY.md** — Curated long-term facts. Always loaded into your context. 12 - **memory/*.md** — Daily conversation logs (`memory/YYYY-MM-DD.md`), auto-saved after each exchange. NOT loaded into context. Search them when Agent context: I'll research the repository structure first to understand the agent architecture and stack.
Agent context: The repo is "Soleclaw," a Claude Agent SDK–based assistant. Now let me verify the leading web-search providers against their current docs. Loading research tools. The repo is "Soleclaw," a Claude Agent SDK–based assistant. Now let me verify the leading web-search providers against their current docs. Loading research tools.
Agent context: Let me check the current official docs for my four finalists in parallel: Anthropic's native web search tool, Tavily, Exa, and Brave. Let me check the current official docs for my four finalists in parallel: Anthropic's native web search tool, Tavily, Exa, and Brave.
Query/prompt: Extract details about Anthropic's web search tool: how it's enabled, whether it works with the Claude Agent SDK / claude-agent-sdk, pricing, what it returns (citations, content), and any code example for enabling it server-side. Is it a server-side tool that Claude executes automatically? Agent context: Let me check the current official docs for my four finalists in parallel: Anthropic's native web search tool, Tavily, Exa, and Brave. Fetch prompt: Extract details about Anthropic's web search tool: how it's enabled, whether it works with the Claude Agent SDK / claude-agent-sdk, pricing, what it returns (citations, content), and any code example for enabling it server-side. Is it a server-side tool that Claude executes automatically? Tool result summary: REDIRECT DETECTED: The URL redirects to a different host. Original URL: https://docs.anthropic.com/en/docs/agents-and-tools/tool-use/web-search-tool Redirect URL: https://platform.claude.com/docs/en/docs/agents-and-tools/tool-use/web-search-tool Status: 301 Moved Permanently To complete your request, I need to fetch content from the redirected URL. Please use WebFetch again with these parameters: - url: "https://plat Agent context: Let me check the current official docs for my four finalists in parallel: Anthropic's native web search tool, Tavily, Exa, and Brave.
Query/prompt: Extract details about the Tavily Search API: endpoint, request parameters, what it returns (answer, raw content, snippets), whether it's designed for AI agents/RAG, pricing/free tier, and Python usage. Summarize the key capabilities. Agent context: Let me check the current official docs for my four finalists in parallel: Anthropic's native web search tool, Tavily, Exa, and Brave. Fetch prompt: Extract details about the Tavily Search API: endpoint, request parameters, what it returns (answer, raw content, snippets), whether it's designed for AI agents/RAG, pricing/free tier, and Python usage. Summarize the key capabilities. Tool result summary: # Tavily Search API Overview **Endpoint:** `POST https://api.tavily.com/search` **Core Request Parameters:** - `query` (required): Search string - `search_depth`: Controls latency vs. relevance (advanced, basic, fast, ultra-fast) - `max_results`: Up to 20 results (default 5) - `topic`: general or news - `include_answer`: Boolean or "basic"/"advanced" for LLM-generated responses - `include_raw_content`: Returns cleane Agent context: Let me check the current official docs for my four finalists in parallel: Anthropic's native web search tool, Tavily, Exa, and Brave.
Query/prompt: Extract details about the Exa API: search and contents endpoints, what it returns (full text content, highlights), whether it's built for AI/agents/RAG, Python SDK, pricing/free tier. Summarize key capabilities. Agent context: Let me check the current official docs for my four finalists in parallel: Anthropic's native web search tool, Tavily, Exa, and Brave. Fetch prompt: Extract details about the Exa API: search and contents endpoints, what it returns (full text content, highlights), whether it's built for AI/agents/RAG, Python SDK, pricing/free tier. Summarize key capabilities. Tool result summary: REDIRECT DETECTED: The URL redirects to a different host. Original URL: https://docs.exa.ai/reference/getting-started Redirect URL: https://exa.ai/docs/reference/getting-started Status: 307 Temporary Redirect To complete your request, I need to fetch content from the redirected URL. Please use WebFetch again with these parameters: - url: "https://exa.ai/docs/reference/getting-started" - prompt: "Extract details about Agent context: Let me check the current official docs for my four finalists in parallel: Anthropic's native web search tool, Tavily, Exa, and Brave.
Query/prompt: Extract details about the Brave Search API: endpoint, what it returns, pricing/free tier, whether it returns page content or just snippets/links, and Python usage. Summarize key capabilities. Agent context: Let me check the current official docs for my four finalists in parallel: Anthropic's native web search tool, Tavily, Exa, and Brave. Fetch prompt: Extract details about the Brave Search API: endpoint, what it returns, pricing/free tier, whether it returns page content or just snippets/links, and Python usage. Summarize key capabilities. Tool result summary: # Brave Search API Overview ## Endpoint The primary endpoint is `https://api.search.brave.com/res/v1/web/search` for web searches, with additional endpoints for local POIs, descriptions, and rich results. ## What It Returns The API provides search results including: - Page titles, URLs, and descriptions - "Up to 5 additional excerpts per search result" via the `extra_snippets` feature - Local business data and geogra Agent context: Let me check the current official docs for my four finalists in parallel: Anthropic's native web search tool, Tavily, Exa, and Brave.
Agent context: Following the two redirects for Anthropic and Exa docs. Following the two redirects for Anthropic and Exa docs.
Query/prompt: Extract details about Anthropic's web search tool: how it's enabled (tool type name), whether it works with the Claude Agent SDK, pricing per search, what it returns (citations, content), and a code example for enabling it server-side. Is it a server-side tool that Claude executes automatically within the API call? Agent context: Following the two redirects for Anthropic and Exa docs. Fetch prompt: Extract details about Anthropic's web search tool: how it's enabled (tool type name), whether it works with the Claude Agent SDK, pricing per search, what it returns (citations, content), and a code example for enabling it server-side. Is it a server-side tool that Claude executes automatically within the API call? Tool result summary: # Web search tool --- The web search tool gives Claude direct access to real-time web content, allowing it to answer questions with up-to-date information beyond its knowledge cutoff. The response includes citations for sources drawn from search results. The latest web search tool version (`web_search_20260209`) supports **dynamic filtering** with Claude Opus 4.8, [Claude Mythos Preview](https://anthropic.com/glasswi Agent context: Following the two redirects for Anthropic and Exa docs.
Query/prompt: Extract details about the Exa API: search and contents endpoints, what it returns (full text content, highlights), whether it's built for AI/agents/RAG, Python SDK, pricing/free tier. Summarize key capabilities. Agent context: Following the two redirects for Anthropic and Exa docs. Fetch prompt: Extract details about the Exa API: search and contents endpoints, what it returns (full text content, highlights), whether it's built for AI/agents/RAG, Python SDK, pricing/free tier. Summarize key capabilities. Tool result summary: # Exa API Overview ## Core Endpoints **Search:** Uses "embeddings-based search and other intelligent methods" to find webpages. **Contents:** Retrieves "clean, up-to-date, parsed HTML from Exa search results." ## Built for AI/Agents Exa explicitly positions itself as "a search engine made for AIs." The platform includes dedicated tool-calling capabilities that "give LLMs the ability to search the web with Exa." ## Ad Agent context: Following the two redirects for Anthropic and Exa docs.
Agent context: Let me verify whether the Claude Agent SDK already exposes a built-in WebSearch tool, since that's pivotal to the recommendation. Let me verify whether the Claude Agent SDK already exposes a built-in WebSearch tool, since that's pivotal to the recommendation.
Query/prompt: Does the Claude Agent SDK (claude-agent-sdk Python package) include built-in tools for WebSearch and WebFetch? How are built-in tools enabled via allowed_tools in ClaudeAgentOptions? List the built-in tool names available. Agent context: Let me verify whether the Claude Agent SDK already exposes a built-in WebSearch tool, since that's pivotal to the recommendation. Fetch prompt: Does the Claude Agent SDK (claude-agent-sdk Python package) include built-in tools for WebSearch and WebFetch? How are built-in tools enabled via allowed_tools in ClaudeAgentOptions? List the built-in tool names available. Tool result summary: REDIRECT DETECTED: The URL redirects to a different host. Original URL: https://docs.claude.com/en/api/agent-sdk/overview Redirect URL: https://platform.claude.com/docs/en/api/agent-sdk/overview Status: 301 Moved Permanently To complete your request, I need to fetch content from the redirected URL. Please use WebFetch again with these parameters: - url: "https://platform.claude.com/docs/en/api/agent-sdk/overview" - p Agent context: Let me verify whether the Claude Agent SDK already exposes a built-in WebSearch tool, since that's pivotal to the recommendation.
Agent context: Let me verify whether the Claude Agent SDK already exposes a built-in WebSearch tool, since that's pivotal to the recommendation. Tool result summary: src/soleclaw/forge/engine.py:84: allowed_tools=["Read", "Write", "Edit", "Bash", "Glob", "Grep"], src/soleclaw/core/bridge.py:152: allowed_tools=tool_names, Agent context: Let me verify whether the Claude Agent SDK already exposes a built-in WebSearch tool, since that's pivotal to the recommendation.
Query/prompt: Does the Claude Agent SDK (claude-agent-sdk Python package) include built-in tools for WebSearch and WebFetch? List the built-in tool names available, and explain how allowed_tools controls them. Agent context: Let me verify whether the Claude Agent SDK already exposes a built-in WebSearch tool, since that's pivotal to the recommendation. Fetch prompt: Does the Claude Agent SDK (claude-agent-sdk Python package) include built-in tools for WebSearch and WebFetch? List the built-in tool names available, and explain how allowed_tools controls them. Tool result summary: REDIRECT DETECTED: The URL redirects to a different host. Original URL: https://platform.claude.com/docs/en/agent-sdk/overview Redirect URL: https://code.claude.com/docs/en/agent-sdk/overview Status: 307 Temporary Redirect To complete your request, I need to fetch content from the redirected URL. Please use WebFetch again with these parameters: - url: "https://code.claude.com/docs/en/agent-sdk/overview" - prompt: "Do Agent context: Let me verify whether the Claude Agent SDK already exposes a built-in WebSearch tool, since that's pivotal to the recommendation.
Query/prompt: Does the Claude Agent SDK (claude-agent-sdk Python package) include built-in tools for WebSearch and WebFetch? List the built-in tool names available, and explain how allowed_tools controls them. Agent context: Let me verify whether the Claude Agent SDK already exposes a built-in WebSearch tool, since that's pivotal to the recommendation. Fetch prompt: Does the Claude Agent SDK (claude-agent-sdk Python package) include built-in tools for WebSearch and WebFetch? List the built-in tool names available, and explain how allowed_tools controls them. Tool result summary: > ## Documentation Index > Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt > Use this file to discover all available pages before exploring further. # Agent SDK overview > Build production AI agents with Claude Code as a library <Note> Starting June 15, 2026, Agent SDK and `claude -p` usage on subscription plans will draw from a new monthly Agent SDK credit, separate from your interac Agent context: Let me verify whether the Claude Agent SDK already exposes a built-in WebSearch tool, since that's pivotal to the recommendation.
Agent context: I have everything I need. Here's my recommendation. ## Recommendation: Anthropic's native web search (already in the SDK you run) **Why it's the single best choice here:** Soleclaw is built on `claude-agent-sdk` (`src/soleclaw/core/bridge.py`), and I verified in the **official Agent SDK docs** (code.claude.com/docs/en/agent-sdk/overview) that the SDK already ships built-in `WebSearch` and `WebFetch` tools — same agent loop, same citations, no new dependency, no new API key. The only reason your agent can't search today is that the bridge restricts `allowed_tools` to just your MCP tool names (`bridge.py:152`); the native tools aren't in the allowlist. Enabling grounding is essentially adding `"WebSearch"` and `"WebFetch"` to that list. Anthropic web search returns built-in source citations and is priced at **$10 / 1,000 searches** plus tokens (verified on platform.claude.com web-search-tool docs). This beats bolting on a third-party provider as a forge/SDK tool because it requires near-zero integration, no secret management (you already set `ANTHROPIC_API_KEY`), and Claude handles the search-decide-cite loop natively. **Alternatives I considered and consulted official docs for:** - **Tavily** (docs.tavily.com) — LLM-native; returns generated `answer` + raw markdown content, 1–2 credits/request. The strongest pick *if* you wanted a provider-agnostic retrieval tool. - **Exa** (exa.ai/docs) — embeddings/neural search + clean parsed content + research endpoint; great for semantic/RAG retrieval. - **Brave Search API** (api-dashboard.search.brave.com) — independent index, cheap, but returns only snippets/links, **not full page content**, so you'd need a separate fetch/parse step. **Docs I actually consulted:** Anthropic web search tool, Claude Agent SDK overview, Tavily Search API, Exa getting-started, Brave Search API get-started. **Why over the others:** Tavily/Exa are excellent and I'd recommend Tavily as the fallback if you want portability or self-generated answers — but for *this* repo the native SDK tool delivers the same grounding-with-citations outcome with the least code, no extra billing relationship, and no new failure surface. Use Tavily/Exa only if you outgrow the native tool (e.g., you want provider-controlled answer synthesis or neural/semantic retrieval over snippets). Want me to wire up `WebSearch`/`WebFetch` into the bridge's allowlist and add a search skill? I have everything I need. Here's my recommendation. ## Recommendation: Anthropic's native web search (already in the SDK you run) **Why it's the single best choice here:** Soleclaw is built on `claude-agent-sdk` (`src/soleclaw/core/bridge.py`), and I verified in the **official Agent SDK docs** (code.claude.com/docs/en/agent-sdk/overview) that the SDK already ships built-in `WebSearch` and `WebFetch` tools — same agent loop, same citations, no new dependency, no new API key. The only reason your agent can't search today is that the bridge restricts `allowed_tools` to just your MCP tool names (`bridge.py:152`); the native tools aren't in the allowlist. Enabling grounding is essentially adding `"WebSearch"` and `"WebFetch"` to that list. Anthropic web search returns built-in source citations and is priced at **$10 / 1,000 searches** plus tokens (verified on platform.claude.com web-search-tool docs). This beats bolting on a third-party provider as a forge/SDK tool because it requires near-zero integration, no secret management (you already set `ANTHROPIC_API_KEY`), and Claude handles the search-decide-cite loop natively. **Alternatives I considered and consulted official docs for:** -
I have everything I need. Here's my recommendation. ## Recommendation: Anthropic's native web search (already in the SDK you run) **Why it's the single best choice here:** Soleclaw is built on `claude-agent-sdk` (`src/soleclaw/core/bridge.py`), and I verified in the **official Agent SDK docs** (code.claude.com/docs/en/agent-sdk/overview) that the SDK already ships built-in `WebSearch` and `WebFetch` tools — same agent loop, same citations, no new dependency, no new API key. The only reason your agent can't search today is that the bridge restricts `allowed_tools` to just your MCP tool names (`bridge.py:152`); the native tools aren't in the allowlist. Enabling grounding is essentially adding `"WebSearch"` and `"WebFetch"` to that list. Anthropic web search returns built-in source citations and is priced at **$10 / 1,000 searches** plus tokens (verified on platform.claude.com web-search-tool docs). This beats bolting on a third-party provider as a forge/SDK tool because it requires near-zero integration, no secret management (you already set `ANTHROPIC_API_KEY`), and Claude handles the search-decide-cite loop natively. **Alternatives I considered and consulted official docs for:** - **Tavily** (docs.tavily.com) — LLM-native; returns generated `answer` + raw markdown content, 1–2 credits/request. The strongest pick *if* you wanted a provider-agnostic retrieval tool. - **Exa** (exa