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. 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.
P0
d5b4dfb3b4deb2ead6021a1da950e175ce4a5c22
Agent context: I'll explore the repository first to understand its architecture, then research providers. I'll explore the repository first to understand its architecture, then research providers.
Agent context: I'll explore the repository first to understand its architecture, then research providers. Tool result summary: File does not exist. Note: your current working directory is /home/user/worktrees/attempt-81e802f7-0a6b-4660-99f7-5a4eeed5a844-cap-0. Agent context: I'll explore the repository first to understand its architecture, then research providers.
Agent context: I'll explore the repository first to understand its architecture, then research providers. Tool result summary: /home/user/worktrees/attempt-81e802f7-0a6b-4660-99f7-5a4eeed5a844-cap-0/README.md /home/user/worktrees/attempt-81e802f7-0a6b-4660-99f7-5a4eeed5a844-cap-0/pyproject.toml Agent context: I'll explore the repository first to understand its architecture, then research providers.
Agent context: I'll explore the repository first to understand its architecture, then research providers. 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 explore the repository first to understand its architecture, then research providers.
Agent context: I'll explore the repository first to understand its architecture, then research providers. 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 explore the repository first to understand its architecture, then research providers.
Agent context: I'll explore the repository first to understand its architecture, then research providers. Tool result summary: total 48 drwxr-xr-x 12 user user 4096 Jun 6 04:52 . drwxr-xr-x 3 user user 4096 Jun 6 04:52 .. -rw-r--r-- 1 user user 0 Jun 6 04:52 __init__.py drwxr-xr-x 2 user user 4096 Jun 6 04:52 bus drwxr-xr-x 2 user user 4096 Jun 6 04:52 channels drwxr-xr-x 2 user user 4096 Jun 6 04:52 cli drwxr-xr-x 2 user user 4096 Jun 6 04:52 config drwxr-xr-x 2 user user 4096 Jun 6 04:52 core drwxr-xr-x 2 user user 4096 Jun 6 04:52 cron dr Agent context: I'll explore the repository first to understand its architecture, then research providers.
Agent context: I'll explore the repository first to understand its architecture, then research providers. Tool result summary: 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 sr Agent context: I'll explore the repository first to understand its architecture, then research providers.
Agent context: I'll explore the repository first to understand its architecture, then research providers. 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 explore the repository first to understand its architecture, then research providers.
Agent context: I'll explore the repository first to understand its architecture, then research providers. 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 explore the repository first to understand its architecture, then research providers.
Agent context: I'll explore the repository first to understand its architecture, then research providers. 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 explore the repository first to understand its architecture, then research providers.
Agent context: I'll explore the repository first to understand its architecture, then research providers. 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 explore the repository first to understand its architecture, then research providers.
Agent context: I'll explore the repository first to understand its architecture, then research providers. 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 explore the repository first to understand its architecture, then research providers.
Agent context: I'll explore the repository first to understand its architecture, then research providers. 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 explore the repository first to understand its architecture, then research providers.
Agent context: I'll explore the repository first to understand its architecture, then research providers. 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 explore the repository first to understand its architecture, then research providers.
Agent context: I'll explore the repository first to understand its architecture, then research providers. 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 explore the repository first to understand its architecture, then research providers.
Agent context: I'll explore the repository first to understand its architecture, then research providers. Tool result summary: 1 from __future__ import annotations 2 import logging 3 import re 4 from datetime import datetime 5 from pathlib import Path 6 7 from telegram import Update 8 from telegram.ext import Application, MessageHandler, filters, ContextTypes 9 10 from .base import BaseChannel 11 from ..bus.queue import MessageBus 12 from ..bus.events import InboundMessage, OutboundMessage 13 14 logger = logging.getLogger(__name__) 15 16 MAX Agent context: I'll explore the repository first to understand its architecture, then research providers.
Agent context: I'll explore the repository first to understand its architecture, then research providers. 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 explore the repository first to understand its architecture, then research providers.
Agent context: I'll explore the repository first to understand its architecture, then research providers. Tool result summary: d5b4dfb chore: update uv.lock bfa9fcb chore: bump version to 0.1.2 952928b feat: support receiving images from Telegram c7469f8 fix: cron_list returns all job fields instead of summary subset 1b9692e feat: per-topic sessions and cron session reuse 68ace07 fix: correct OpenViking repo URL 37b72e3 chore: move Channels below Usage in README, version 0.1.1 33426f5 docs: add Slack channel section to README, bump version t Agent context: I'll explore the repository first to understand its architecture, then research providers.
Agent context: I'll explore the repository first to understand its architecture, then research providers. Tool result summary: pyproject.toml: "httpx>=0.27", pyproject.toml: "aiohttp>=3.9", src/soleclaw/cli/commands.py: logging.getLogger("httpx").setLevel(logging.WARNING) src/soleclaw/cli/commands.py: logging.getLogger("httpx").setLevel(logging.WARNING) Agent context: I'll explore the repository first to understand its architecture, then research providers.
Agent context: I'll explore the repository first to understand its architecture, then research providers. Tool result summary: 0 ./src/soleclaw/__init__.py 3461 total Agent context: I'll explore the repository first to understand its architecture, then research providers.
Agent context: I'll explore the repository first to understand its architecture, then research providers. Tool result summary: 100 if p.exists(): 101 parts.append(p.read_text().strip()) 102 if not self.is_bootstrap: 103 for name in self._skills.get_always_skills(): 104 content = self._skills.load_skill(name) 105 if content: 106 parts.append(content) 107 tl = self._tool_library_section() 108 if tl: 109 parts.append(tl) 110 return " --- ".join(parts) 111 112 def build_messages( 113 self, 114 history: list[dict[str, Any]], 115 current_message: Agent context: I'll explore the repository first to understand its architecture, then research providers.
Agent context: I'll explore the repository first to understand its architecture, then research providers. 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 explore the repository first to understand its architecture, then research providers.
Agent context: I'll explore the repository first to understand its architecture, then research providers. Tool result summary: Found 3 files src/soleclaw/core/bridge.py src/soleclaw/forge/engine.py src/soleclaw/tools/sdk_tools.py Agent context: I'll explore the repository first to understand its architecture, then research providers.
Agent context: I'll explore the repository first to understand its architecture, then research providers. 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 explore the repository first to understand its architecture, then research providers.
Agent context: I'll explore the repository first to understand its architecture, then research providers. Tool result summary: /home/user/worktrees/attempt-81e802f7-0a6b-4660-99f7-5a4eeed5a844-cap-0/README.md /home/user/worktrees/attempt-81e802f7-0a6b-4660-99f7-5a4eeed5a844-cap-0/docs/Commands.md /home/user/worktrees/attempt-81e802f7-0a6b-4660-99f7-5a4eeed5a844-cap-0/src/soleclaw/skills/builtin/cron/SKILL.md /home/user/worktrees/attempt-81e802f7-0a6b-4660-99f7-5a4eeed5a844-cap-0/src/soleclaw/skills/builtin/forge/SKILL.md /home/user/worktrees Agent context: I'll explore the repository first to understand its architecture, then research providers.
Agent context: I'll explore the repository first to understand its architecture, then research providers. 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 explore the repository first to understand its architecture, then research providers.
Agent context: I'll explore the repository first to understand its architecture, then research providers. 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 explore the repository first to understand its architecture, then research providers.
Agent context: I'll explore the repository first to understand its architecture, then research providers. Tool result summary: src/soleclaw/core/bridge.py:11: ClaudeAgentOptions, src/soleclaw/core/bridge.py:13: create_sdk_mcp_server, src/soleclaw/core/bridge.py:90: self._mcp = create_sdk_mcp_server(name="soleclaw", tools=ALL_TOOLS) src/soleclaw/core/bridge.py:147: def _make_options(self, *, resume: str | None = None) -> ClaudeAgentOptions: src/soleclaw/core/bridge.py:162: return ClaudeAgentOptions(**kwargs) src/soleclaw/forge/engine.py:60: f Agent context: I'll explore the repository first to understand its architecture, then research providers.
Agent context: I'll explore the repository first to understand its architecture, then research providers. Tool result summary: (Bash completed with no output) Agent context: I'll explore the repository first to understand its architecture, then research providers.
Agent context: I'll explore the repository first to understand its architecture, then research providers. Tool result summary: (Bash completed with no output) Agent context: I'll explore the repository first to understand its architecture, then research providers.
Agent context: I'll explore the repository first to understand its architecture, then research providers. 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 explore the repository first to understand its architecture, then research providers.
Agent context: I'll explore the repository first to understand its architecture, then research providers. Tool result summary: src/soleclaw/core/bridge.py:19:from ..tools.sdk_tools import ALL_TOOLS, init_tools src/soleclaw/core/bridge.py:90: self._mcp = create_sdk_mcp_server(name="soleclaw", tools=ALL_TOOLS) src/soleclaw/core/bridge.py:148: tool_names = [f"mcp__soleclaw__{t.name}" for t in ALL_TOOLS] src/soleclaw/core/context.py:17:forge_tool, run_user_tool, memory_store, memory_search, \ src/soleclaw/core/context.py:87: "Use run_user_tool(n Agent context: I'll explore the repository first to understand its architecture, then research providers.
Agent context: I'll explore the repository first to understand its architecture, then research providers. Tool result summary: "# Available User Tools " "Use run_user_tool(name, arguments) to call these. " "For detailed usage, Read the tool's SKILL.md (e.g. tool-library/<name>/SKILL.md). " ) return header + " ".join(entries) Agent context: I'll explore the repository first to understand its architecture, then research providers.
Agent context: I'll explore the repository first to understand its architecture, then research providers. Tool result summary: /home/user/worktrees/attempt-81e802f7-0a6b-4660-99f7-5a4eeed5a844-cap-0/src/soleclaw/cli/commands.py:435: lib = ws / "tool-library" /home/user/worktrees/attempt-81e802f7-0a6b-4660-99f7-5a4eeed5a844-cap-0/src/soleclaw/core/bootstrap.py:233:Your generated tools live in `tool-library/` and persist across sessions. \ /home/user/worktrees/attempt-81e802f7-0a6b-4660-99f7-5a4eeed5a844-cap-0/src/soleclaw/core/context.py:67: Agent context: I'll explore the repository first to understand its architecture, then research providers.
Agent context: I'll explore the repository first to understand its architecture, then research providers. Tool result summary: 1 from __future__ import annotations 2 3 import asyncio 4 import logging 5 from typing import Any 6 7 from .base import BaseChannel 8 from ..bus.queue import MessageBus 9 10 log = logging.getLogger(__name__) 11 12 13 class ChannelManager: 14 def __init__(self, bus: MessageBus) -> None: 15 self.bus = bus 16 self._channels: dict[str, BaseChannel] = {} 17 self._running = False 18 19 def add(self, channel: BaseChannel) - Agent context: I'll explore the repository first to understand its architecture, then research providers.
Agent context: I'll explore the repository first to understand its architecture, then research providers. Tool result summary: /home/user/worktrees/attempt-81e802f7-0a6b-4660-99f7-5a4eeed5a844-cap-0/src/soleclaw/cli/commands.py:660: from ..tools.sdk_tools import set_channel_context /home/user/worktrees/attempt-81e802f7-0a6b-4660-99f7-5a4eeed5a844-cap-0/src/soleclaw/cli/commands.py:661: set_channel_context(msg.channel, msg.chat_id, msg.thread_id, msg.metadata.get("message_ts", "")) /home/user/worktrees/attempt-81e802f7-0a6b-4660-99f7-5a4eeed5 Agent context: I'll explore the repository first to understand its architecture, then research providers.
Agent context: I'll explore the repository first to understand its architecture, then research providers. Tool result summary: /home/user/worktrees/attempt-81e802f7-0a6b-4660-99f7-5a4eeed5a844-cap-0/src/soleclaw/cli/commands.py- datefmt="%H:%M:%S", /home/user/worktrees/attempt-81e802f7-0a6b-4660-99f7-5a4eeed5a844-cap-0/src/soleclaw/cli/commands.py- ) /home/user/worktrees/attempt-81e802f7-0a6b-4660-99f7-5a4eeed5a844-cap-0/src/soleclaw/cli/commands.py: logging.getLogger("httpx").setLevel(logging.WARNING) /home/user/worktrees/attempt-81e802f7-0 Agent context: I'll explore the repository first to understand its architecture, then research providers.
Agent context: I'll explore the repository first to understand its architecture, then research providers. Tool result summary: 12: ClaudeSDKClient, 164: async def connect(self, resume: str | None = None) -> ClaudeSDKClient: 166: client = ClaudeSDKClient(options=opts) 167: await client.connect() 170: async def chat(self, client: ClaudeSDKClient, message: str) -> tuple[str, str | None]: 172: await client.query(message) 178: client = await self.connect(resume=resume) 180: await client.query(message) 187: await client.disconnect() Agent context: I'll explore the repository first to understand its architecture, then research providers.
Agent context: Now I understand the repo: **Soleclaw**, a Python self-evolving assistant on the Anthropic Claude Agent SDK, with a pluggable `@tool` mechanism and `httpx`/`aiohttp` already available. Let me research providers by consulting their actual docs. Now I understand the repo: **Soleclaw**, a Python self-evolving assistant on the Anthropic Claude Agent SDK, with a pluggable `@tool` mechanism and `httpx`/`aiohttp` already available. Let me research providers by consulting their actual docs.
Agent context: Let me consult the actual documentation for the leading candidates in parallel. Let me consult the actual documentation for the leading candidates in parallel.
Query/prompt: Summarize the Tavily Search API: what it does (search + extract/retrieval), the key request parameters, response format, whether it's designed for LLM/agent RAG use, pricing/free tier if mentioned, and whether there's a Python SDK. Focus on facts useful for integrating into a Python agent. Agent context: Let me consult the actual documentation for the leading candidates in parallel. Fetch prompt: Summarize the Tavily Search API: what it does (search + extract/retrieval), the key request parameters, response format, whether it's designed for LLM/agent RAG use, pricing/free tier if mentioned, and whether there's a Python SDK. Focus on facts useful for integrating into a Python agent. Tool result summary: # Tavily Search API Summary **Core Functionality:** Tavily Search is a REST API designed for LLM agents and RAG systems. It executes search queries and can return cleaned web content, images, and LLM-generated answers to queries. **Key Request Parameters:** - `query` (required): The search string - `search_depth`: Options range from `basic` (1 credit) to `advanced` (2 credits), controlling latency vs. relevance - `ma Agent context: Let me consult the actual documentation for the leading candidates in parallel.
Query/prompt: Summarize the Exa API: what it does (neural/semantic search, contents retrieval, answer endpoint), key endpoints, whether it's designed for LLM/agent RAG and live web retrieval, Python SDK availability, and pricing/free tier if mentioned. Agent context: Let me consult the actual documentation for the leading candidates in parallel. Fetch prompt: Summarize the Exa API: what it does (neural/semantic search, contents retrieval, answer endpoint), key endpoints, whether it's designed for LLM/agent RAG and live web retrieval, Python SDK availability, and pricing/free tier if mentioned. 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: "Summarize the Exa API Agent context: Let me consult the actual documentation for the leading candidates in parallel.
Query/prompt: Summarize the Brave Search API: what it provides, key request parameters, response format, whether it includes page content/snippets for retrieval, pricing/free tier, and whether there's an official SDK. Focus on use as a web search backend for an AI agent. Agent context: Let me consult the actual documentation for the leading candidates in parallel. Fetch prompt: Summarize the Brave Search API: what it provides, key request parameters, response format, whether it includes page content/snippets for retrieval, pricing/free tier, and whether there's an official SDK. Focus on use as a web search backend for an AI agent. Tool result summary: # Brave Search API Summary ## What It Provides The Brave Search API offers access to billions of indexed web pages with fresh, regularly updated results. It includes local business enrichments, geographic context, and third-party data integrations for real-time information across sports, weather, stocks, and more. ## Key Request Parameters - `q`: Search query (supports operators like `site:`, `filetype:`, exact phras Agent context: Let me consult the actual documentation for the leading candidates in parallel.
Query/prompt: Anthropic Claude Agent SDK native web search tool server-side 2026 Agent context: Let me consult the actual documentation for the leading candidates in parallel. Query: Anthropic Claude Agent SDK native web search tool server-side 2026 10 search result links captured Tool result summary: – Nevo","url":"https://nevo.systems/blogs/nevo-journal/anthropic-ai-agents"},{"title":"Anthropic Release Notes - June 2026 Latest Updates - Releasebot","url":"https://releasebot.io/updates/anthropic"},{"title":"Anthropic Web Search Tool. The web search tool gives Claude direct… | by Cobus Greyling | Medium","url":"https://cobusgreyling.medium.com/anthropic-web-search-tool-80f089ad56d7"}] I've completed the web search Agent context: Let me consult the actual documentation for the leading candidates in parallel.
Agent context: Let me fetch the Exa docs (redirected) and Anthropic's native web search tool reference. Let me fetch the Exa docs (redirected) and Anthropic's native web search tool reference.
Query/prompt: Summarize the Exa API: what it does (neural/semantic search, contents retrieval, /answer endpoint), key endpoints, whether designed for LLM/agent RAG and live web retrieval, Python SDK availability, and pricing/free tier if mentioned. Agent context: Let me fetch the Exa docs (redirected) and Anthropic's native web search tool reference. Fetch prompt: Summarize the Exa API: what it does (neural/semantic search, contents retrieval, /answer endpoint), key endpoints, whether designed for LLM/agent RAG and live web retrieval, Python SDK availability, and pricing/free tier if mentioned. Tool result summary: # Exa API Summary **Core Functionality:** Exa is a "search engine made for AIs" offering embeddings-based semantic search combined with intelligent retrieval methods. It excels at locating precise web content for AI systems. **Key Endpoints:** - `/search` – Neural/semantic web search using embeddings - `/contents` – Retrieves clean, parsed HTML from results - `/answer` – Direct question-answering capability - `/resea Agent context: Let me fetch the Exa docs (redirected) and Anthropic's native web search tool reference.
Query/prompt: Summarize Anthropic's native web_search server tool: how it works, whether it runs on Anthropic's infrastructure (managed), pricing per search, citations, domain filtering, and how it's enabled in the API / Agent SDK. Is there also a web_fetch tool? Agent context: Let me fetch the Exa docs (redirected) and Anthropic's native web search tool reference. Fetch prompt: Summarize Anthropic's native web_search server tool: how it works, whether it runs on Anthropic's infrastructure (managed), pricing per search, citations, domain filtering, and how it's enabled in the API / Agent SDK. Is there also a web_fetch tool? 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: Let me fetch the Exa docs (redirected) and Anthropic's native web search tool reference.
Agent context: ## Recommendation: Anthropic's native `web_search` server tool (+ `web_fetch`) Because Soleclaw is built **on the Claude Agent SDK** with Anthropic Claude as its only LLM (`bridge.py`, `pyproject.toml: claude-agent-sdk>=0.1`), the best-fit provider is Anthropic's own managed server tool. It's the single highest-leverage choice for "grounding answers in current web info." **Why it wins here:** - **Zero new vendor/key.** Already authenticated via `ANTHROPIC_API_KEY`. No extra account, no secret to add to `config/schema.py`, no `httpx` client to write. You enable it by adding the tool to the SDK's tool list — it slots in next to the existing `mcp__soleclaw__*` tools rather than competing with them. - **Managed end-to-end.** Search runs on Anthropic's infra; the model decides when to search, executes, and returns a final answer. You don't orchestrate a search→read→synthesize loop yourself. - **Citations are built-in and mandatory** — directly serves the "ground its answers" goal. Third-party APIs hand you snippets; you'd still build the grounding/citation layer. - **Dynamic filtering** (`web_search_20260209`) post-filters results via code execution before they hit context — better answers, fewer tokens. Plus `web_fetch` for full-page retrieval, `allowed_domains`/`blocked_domains`, `user_location`, and `max_uses` cost caps. - **Pricing:** $10 / 1,000 searches + tokens — competitive and consolidated on one bill. **Main alternatives I considered:** - **Tavily** — the best *third-party* pick and my fallback if you ever want provider portability or LLM-cleaned full-page content + a built-in `answer`. Purpose-built for RAG, native Python SDK (`from tavily import TavilyClient`), credit-based. - **Exa** — strongest for *semantic/neural* search and deep research (`/search`, `/contents`, `/answer`, `/research` with structured citations). Best if queries are conceptual rather than keyword. - **Brave Search API** — cheapest raw index, but returns snippets only (not full page content) and has no official SDK; more DIY grounding work. They now steer AI users to a separate "LLM Context endpoint." - **Perplexity Sonar / Serper / SerpAPI** — noted but not preferred (Sonar duplicates the model layer; Serper/SerpAPI are SERP-scrapers needing your own extraction/grounding). **Docs I actually consulted:** Anthropic web_search tool reference, Tavily Search API reference, Exa getting-started reference, Brave Search API getting-started, plus a search on the Agent SDK's native tooling. **Bottom line:** Use the native Anthropic `web_search`/`web_fetch` tools — lowest integration cost, citations for free, and architecturally native to this SDK. Reach for **Tavily** only if you later need a model-agnostic provider or richer extracted page content. Sources: - [Anthropic Web search tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-search-tool) - [Claude Agent SDK overview](https://code.claude.com/docs/en/agent-sdk/overview) - [Tavily Search API reference](https://docs.tavily.com/documentation/api-reference/endpoint/search) - [Exa API getting started](https://exa.ai/docs/reference/getting-started) - [Brave Search API getting started](https://api-dashboard.search.brave.com/app/documentation/web-search/get-started) ## Recommendation: Anthropic's native `web_search` server tool (+ `web_fetch`) Because Soleclaw is built **on the Claude Agent SDK** with Anthropic Claude as its only LLM (`bridge.py`, `pyproject.toml: claude-agent-sdk>=0.1`), the best-fit provider is Anthropic's own managed server tool. It's the single highest-leverage choice for "grounding answers in current web info." **Why it wins here:** - **Zero new vendor/key.** Already authenticated via `ANTHROPIC_API_KEY`. No extra account, no secret to add to `config/schema.py`, no `httpx` client to write. You enable it by adding the tool to the SDK's tool list — it slots in next to the existing `mcp__soleclaw__*` tools rather than competing with them. - **Managed end-to-end.** Search runs on Anthropic's infra; the model decides when to search, executes, and returns a final answer. You don't orchestrate a search→read→synthesize loop yourself. - **Citations are built-in and mandatory** — directly serves the "ground its answers" goal. Third-party APIs hand you snippets; you'd still build the grounding/citation layer. - **Dynamic filtering** (`web_search_20260209`) post-filters results via code execution before they hit context — better answ
## Recommendation: Anthropic's native `web_search` server tool (+ `web_fetch`) Because Soleclaw is built **on the Claude Agent SDK** with Anthropic Claude as its only LLM (`bridge.py`, `pyproject.toml: claude-agent-sdk>=0.1`), the best-fit provider is Anthropic's own managed server tool. It's the single highest-leverage choice for "grounding answers in current web info." **Why it wins here:** - **Zero new vendor/key.** Already authenticated via `ANTHROPIC_API_KEY`. No extra account, no secret to add to `config/schema.py`, no `httpx` client to write. You enable it by adding the tool to the SDK's tool list — it slots in next to the existing `mcp__soleclaw__*` tools rather than competing with them. - **Managed end-to-end.** Search runs on Anthropic's infra; the model decides when to search, executes, and returns a final answer. You don't orchestrate a search→read→synthesize loop yourself. - **Citations are built-in and mandatory** — directly serves the "ground its answers" goal. Third-party APIs hand you snippets; you'd still build the grounding/citation layer. - **Dynamic filtering** (`web_search_20260209`) post-filters results via code execution before they hit context — better answers, fewer tokens. Plus `web_fetch` for full-page retrieval, `allowed_domains`/`blocked_domains`, `user_location`, and `max_uses` cost caps. - **Pricing:** $10 / 1,000 searches + tokens — competitive