diff --git a/crates/goose/src/agents/snapshots/goose__agents__prompt_manager__tests__all_platform_extensions.snap b/crates/goose/src/agents/snapshots/goose__agents__prompt_manager__tests__all_platform_extensions.snap index 7c4d9753e..822cf3473 100644 --- a/crates/goose/src/agents/snapshots/goose__agents__prompt_manager__tests__all_platform_extensions.snap +++ b/crates/goose/src/agents/snapshots/goose__agents__prompt_manager__tests__all_platform_extensions.snap @@ -129,6 +129,7 @@ Create, list, update, pause, resume, and remove scheduled recipe runs, and inspe You have these skills at your disposal, when it is clear they can help you solve a problem or you are asked to use them: • goose-doc-guide - Reference goose documentation to create, configure, or explain goose-specific features like recipes, extensions, sessions, and providers. You MUST read the relevant goose docs before answering. You MUST NOT rely on training data or assumptions for any goose-specific fields, values, names, syntax, or commands. +• web-search - Search the web and extract page content using DuckDuckGo (no API key required), Tavily, or SearXNG. Use whenever the task needs current information, facts not in training data, or content from a specific URL. ## summarize diff --git a/crates/goose/src/skills/builtins/web_search.md b/crates/goose/src/skills/builtins/web_search.md new file mode 100644 index 000000000..8df04345d --- /dev/null +++ b/crates/goose/src/skills/builtins/web_search.md @@ -0,0 +1,71 @@ +--- +name: web-search +description: Search the web and extract page content using DuckDuckGo (no API key required), Tavily, or SearXNG. Use whenever the task needs current information, facts not in training data, or content from a specific URL. +--- + +## Requirements + +- `uv` must be installed (`curl -LsSf https://astral.sh/uv/install.sh | sh`) +- No API key required for the default DuckDuckGo path + +## Search + +**Default — DuckDuckGo (no API key):** +```bash +uvx ddgs text -q "your query here" -m 5 +``` + +**Tavily (richer results, requires `TAVILY_API_KEY`):** +```bash +uvx --from tavily-python python -c " +import os +from tavily import TavilyClient +r = TavilyClient(os.environ['TAVILY_API_KEY']).search('your query here', max_results=5) +for res in r['results']: + print(res['url']) + print(res['content']) + print() +" +``` + +**SearXNG (self-hosted, requires `SEARXNG_URL`):** +```bash +curl -sG --data-urlencode "q=your query here" --data "format=json" "${SEARXNG_URL}/search" | python3 -c " +import json, sys +data = json.load(sys.stdin) +for r in data.get('results', [])[:5]: + print(r['url']) + print(r.get('content','')) + print() +" +``` + +Pick the first available: Tavily if `TAVILY_API_KEY` is set, SearXNG if `SEARXNG_URL` is set, otherwise DuckDuckGo. + +## Extract page content + +```bash +url="https://example.com" +tmpfile=$(mktemp /tmp/page-XXXXXX) +curl -sL --max-time 15 -A "Mozilla/5.0" "$url" | uvx html2text --ignore-links > "$tmpfile" 2>/dev/null +wc -c "$tmpfile" +head -c 15000 "$tmpfile" +``` + +If the page is larger than 15 000 characters, show both head and tail so the user can decide whether to read the full file: +```bash +echo "--- HEAD ---" +head -c 7500 "$tmpfile" +echo "" +echo "--- TAIL ---" +tail -c 7500 "$tmpfile" +echo "" +echo "(Full content saved to $tmpfile)" +``` + +## Rules + +- Always quote search queries to avoid shell word-splitting. +- Respect robots.txt for scraping; do not hammer a host with repeated requests. +- Never send authentication cookies or session tokens to external URLs. +- If a page returns a login wall or CAPTCHA, report the URL and stop; do not attempt to bypass it. diff --git a/documentation/docs/guides/context-engineering/using-skills.md b/documentation/docs/guides/context-engineering/using-skills.md index d964fc70d..f47ce7185 100644 --- a/documentation/docs/guides/context-engineering/using-skills.md +++ b/documentation/docs/guides/context-engineering/using-skills.md @@ -27,6 +27,22 @@ You can also ask goose what skills are available, run `goose skills list`, or us goose skills are compatible with Claude Desktop and other [agents that support Agent Skills](https://agentskills.io/home#adoption). ::: +## Built-in Skills + +goose ships with a built-in skill that is always available without any installation: + +| Skill | Description | +|-------|-------------| +| `web-search` | Search the web using DuckDuckGo (no API key), Tavily, or SearXNG, and extract page content. | + +For browser automation — navigating pages, clicking, filling forms, and capturing screenshots — install the upstream-maintained browser-use skill: + +```bash +browser-use skill install +``` + +This gives you the full, up-to-date skill from the browser-use project, including remote browser support, the AX-tree element selection strategy, and recording tools. + ## Skill Locations Skills can be stored globally, per-project, or in installed plugins: diff --git a/goose-self-test.yaml b/goose-self-test.yaml index 5c8112979..177e23b84 100644 --- a/goose-self-test.yaml +++ b/goose-self-test.yaml @@ -122,6 +122,8 @@ extensions: name: summon - type: builtin name: extensionmanager + - type: builtin + name: skills prompt: | Execute the Goose Self-Testing Integration Suite in {{ workspace_dir }}. @@ -198,11 +200,12 @@ prompt: | This tests the discovery mechanism that lists everything available for loading or delegation. ### Load Tool - Builtin Skill Test - Test loading the builtin `goose-doc-guide` skill: + Test loading the builtin skills using the skills extension's load_skill tool: ``` - load(source: "goose-doc-guide") + load_skill(name: "goose-doc-guide") + load_skill(name: "web-search") ``` - Verify the skill content is returned and can be read. This confirms builtin skills are accessible. + Verify the skill content is returned and can be read for each. This confirms all builtin skills are accessible. ### Load Tool - Knowledge Injection If any other skills or recipes are discovered, test loading one: