← Back to Skills Marketplace
airaalfredsf

smart-search

by AiraAlfredSF · GitHub ↗ · v1.0.0 · MIT-0
darwinlinux ⚠ suspicious
203
Downloads
0
Stars
0
Active Installs
1
Versions
Install in OpenClaw
/install aira-smart-search
Description
Intelligent web search routing across Gemini and Brave APIs with quota management, circuit breaker, and web_fetch fallback. Routes finance queries to Gemini,...
README (SKILL.md)

smart-search

1. WHAT THIS SKILL DOES

This skill routes search queries to the best available provider, manages daily API quota per agent, logs all searches, and degrades gracefully through web scraping when APIs are unavailable. It supports two execution strategies: scheduled agents that prioritise API calls for reliable results, and a general agent that preserves API quota by trying web scraping first. All quota state is persisted to a shared JSON file so multiple agents can coordinate without overrunning daily limits.


2. WHEN TO INVOKE THIS SKILL

Use this skill whenever an agent needs to search the web for information — news, research, stock data, general queries, or any topic requiring up-to-date results.

This skill exposes three tools:

Tool Purpose
smart_search Execute a web search and return results
search_quota_status Check remaining quota for an agent or the full system
search_mark_agent_complete Release unused quota to the shared pool when an agent finishes

3. TOOL REFERENCE

smart_search

Executes a search query using the best available provider for the given agent.

Parameters:

Parameter Type Required Description
query string Yes The search query. Max 1000 characters. No control characters.
agent_id string Yes Lowercase letters, numbers, and hyphens only (e.g. stock-analysis). Use general for manual/chat searches.
force_provider string No Override routing. Accepts "gemini" or "brave" only.

Return shape:

{
  "results": "\x3Cstring or array>",
  "provider_used": "gemini | brave | web_fetch",
  "queries_remaining": 12,
  "quota_source": "agent_allocation | shared_pool | provider_direct | none",
  "fallback_used": false,
  "warning": null,
  "web_fetch_engine": null,
  "error": null
}

On failure results is null and error contains the reason.


search_quota_status

Returns quota information for a specific agent or the full quota file.

Parameters:

Parameter Type Required Description
agent_id string No If omitted, returns the full quota object.

Return shape (single agent):

{
  "agent_id": "stock-analysis",
  "gemini": { "allocated": 15, "used": 3, "remaining": 12 },
  "brave":  { "allocated": 0,  "used": 0, "remaining": 0  },
  "completed": false
}

search_mark_agent_complete

Marks an agent as done for the day and releases any unused allocation to the shared pool for other agents to use.

Parameters:

Parameter Type Required Description
agent_id string Yes The agent to mark complete.

Return shape:

{
  "agent_id": "tech-news",
  "released": { "gemini": 7, "brave": 0 },
  "message": "Agent marked complete. 7 Gemini calls released to shared pool."
}

4. TWO EXECUTION STRATEGIES

Strategy A — Scheduled agents (any agent_id except general)

Used by automated agents with a known workload. Prioritises API quality; uses web scraping only as a last resort.

Tier Provider Condition
1 Primary API (Gemini or Brave) Agent has allocation remaining
2 Fallback API (opposite provider) Primary exhausted or failed
3 DuckDuckGo web_fetch Both APIs unavailable — blocked for finance queries
4 Error All providers exhausted

Strategy B — General agent (agent_id: "general")

Used for manual chat or ad-hoc queries. Preserves API quota by trying web scraping first. Finance queries are not blocked from web_fetch in this strategy.

Tier Provider Condition
1 Google web_fetch Always attempted first
2 Bing web_fetch Google failed
3 API (Gemini or Brave) Both web_fetch failed — quota consumed only here
4 Error All providers exhausted

5. PROVIDER ROUTING RULES

Routing is automatic based on query keywords. force_provider overrides all routing.

Routes to Gemini:

Keyword
stock, share price, nse, bse, wse, nyse, nasdaq
earnings, ipo, dividend, funding round, acquisition
merger, valuation, competitor, market share
breaking, just announced, today, hours ago
spearfox, fifthspear

Routes to Brave:

Keyword
space, astronomy, nasa, esa, cosmos

If no keywords match, the query routes to the configured default_provider (defaults to brave). Gemini always wins for finance queries regardless of other keywords.

Keyword lists are configurable in openclaw.json via finance_keywords and brave_keywords arrays.


6. WEB_FETCH ENGINES

Engine Used by Role
Google Strategy B (general) Tier 1 — always tried first
Bing Strategy B (general) Tier 2 — tried if Google fails
DuckDuckGo Strategy A (scheduled) Last resort — blocked for finance queries

All engines enforce a 2-second minimum delay between consecutive calls to avoid rate-limiting. Responses are capped at 10,000 characters to protect the model context window. Prompt injection patterns are stripped from all results before they are returned.


7. QUOTA SYSTEM

Each provider has a daily limit set in openclaw.json. Each agent has its own allocation drawn from that pool. Quota is tracked separately per provider (gemini_used, brave_used).

Deduction flow for a single search call:

  1. Agent allocation — deducted first if the agent has remaining quota for the provider
  2. Shared pool — used if the agent allocation is exhausted but other agents have released unused quota
  3. Provider direct — used if the shared pool is empty but the provider daily limit has remaining headroom
  4. Fallback provider — if all sources for the primary provider are exhausted, the opposite provider is tried through the same flow
  5. web_fetch — used if both APIs are unavailable (scheduled agents only; blocked for finance queries)
  6. Error — returned if all paths are exhausted

Config owns the ceilings (daily limits, per-agent allocations). The quota file owns the live counters. Changes to openclaw.json take effect on the next call without restart.

General agent quota is only consumed when both web_fetch attempts fail.


8. CONFIG-DRIVEN BEHAVIOUR

All allocations, limits, and behaviour flags live in openclaw.json under skills.smart-search. Changes take effect on the next skill invocation with no restart required.

{
  "skills": {
    "smart-search": {
      "gemini_model": "gemini-2.0-flash",
      "default_provider": "brave",
      "strict_agents": false,
      "retry_max_attempts": 3,
      "retry_base_delay": 500,
      "finance_keywords": ["stock", "earnings"],
      "brave_keywords": ["space", "astronomy"],
      "providers": {
        "gemini": { "daily_limit": 1500 },
        "brave":  { "daily_limit": 66 }
      },
      "agent_allocations": {
        "stock-analysis": { "gemini": 15, "brave": 0 },
        "general":        { "gemini": 20, "brave": 5 }
      }
    }
  }
}
Key Default Effect
gemini_model gemini-2.0-flash Gemini model used for all API calls
default_provider brave Fallback provider when no keywords match
strict_agents false When true, rejects agent IDs not defined in config
retry_max_attempts 3 Maximum API retry attempts per call
retry_base_delay 500 Base delay in ms for exponential backoff
finance_keywords Built-in list Keywords that force Gemini routing
brave_keywords Built-in list Keywords that force Brave routing

9. API KEY SECURITY

API keys are read from the env block in openclaw.json and held in memory only for the duration of the call. They are never logged to any file, never included in any error message, and never returned in any response object. Keys are not written to disk by this skill.


10. MANUAL CHAT USAGE

For manual or chat-initiated searches, OpenClaw must pass agent_id: "general". The skill automatically uses web_fetch first for this agent, so API quota is only consumed if both Google and Bing scraping fail. This is an OpenClaw configuration responsibility — the skill does not infer the agent from context.


11. LOG ROTATION

Each day's searches are written to a .jsonl file in the logs/ subdirectory alongside the quota file:

~/.openclaw/workspace/shared/logs/search-YYYY-MM-DD.jsonl

Each line is a JSON object with: timestamp, agent_id, query, provider_used, force_provider, quota_source, queries_remaining, success, response_summary (capped at 500 chars), error, fallback_used, web_fetch_engine.

Log files older than 30 days are deleted automatically based on the filename date, not the filesystem modification time.


12. ERROR REFERENCE

Error Cause Resolution
query is required and must be a non-empty string. Missing or blank query Pass a non-empty string
query exceeds maximum length of 1000 characters. Query too long Shorten the query
query contains invalid control characters. Null bytes or control chars in query Strip control characters before calling
agent_id is required and must be a non-empty string. Missing agent_id Pass a valid agent_id
agent_id must contain only lowercase letters, numbers, and hyphens. Invalid characters in agent_id Use only [a-z0-9-]
Unknown agent: "...". Add it to openclaw.json to use it. strict_agents is true, agent not in config Add agent to config or disable strict_agents
Invalid force_provider: "...". Use "gemini" or "brave". Unknown provider name Use gemini or brave only
Perplexity is not yet implemented. force_provider set to perplexity Use gemini or brave
GEMINI_API_KEY is not configured in openclaw.json. Missing API key Add key to openclaw.json env block
Brave Search is not configured. Add BRAVE_API_KEY to openclaw.json to enable it. Missing API key Add key to openclaw.json env block
Gemini model ... is unavailable. Model name incorrect or deprecated Update gemini_model in config
Gemini API error: 4xx Bad request or auth failure Check API key and query
Brave API error: 4xx Bad request or auth failure Check API key
Gemini returned an empty response. API responded but returned no text Retry or check query
Brave returned no results. API returned empty results array Try a different query
Finance and time-sensitive queries require Gemini or Brave API. Finance query hit the web_fetch fallback block Ensure API quota is available for finance queries
All search providers exhausted or unavailable. All tiers failed Check API keys, quota, and network
... circuit is open. Try again later. Provider hit 3 consecutive failures Wait 60 seconds for circuit to reset
Quota file is locked. Try again. Concurrent write contention Retry the call
Cannot read openclaw.json. Check OPENCLAW_CONFIG_PATH. Config file missing or unreadable Check file path and permissions
Invalid JSON input. stdin payload was not valid JSON Ensure the harness sends valid JSON
Unknown tool: ... Tool name not recognised Use smart_search, search_quota_status, or search_mark_agent_complete
Agent ... not found in quota. agent_id not in quota file Call smart_search first to register the agent
Agent ... is already marked complete for today. Double-complete call No action needed; agent is already released

13. EXAMPLES

Example 1 — Manual chat finance query, Google web_fetch succeeds

{ "tool": "smart_search", "args": { "query": "today AAPL stock price", "agent_id": "general" } }

Strategy B: Google web_fetch is tried first. Succeeds. Zero API quota consumed.

{
  "results": "\x3Chtml content from Google>",
  "provider_used": "web_fetch",
  "queries_remaining": 20,
  "quota_source": "none",
  "fallback_used": true,
  "warning": "Result retrieved via web scraping. Quality may be lower than API results.",
  "web_fetch_engine": "google"
}

Example 2 — Manual chat finance query, both web_fetch fail, API fallback triggered

{ "tool": "smart_search", "args": { "query": "today AAPL stock price", "agent_id": "general" } }

Strategy B: Google fails, Bing fails. Gemini API is called (finance keyword routes to Gemini). Quota consumed.

{
  "results": "Apple (AAPL) is trading at $189.42...",
  "provider_used": "gemini",
  "queries_remaining": 19,
  "quota_source": "agent_allocation",
  "fallback_used": false,
  "warning": null,
  "web_fetch_engine": null
}

Example 3 — Manual chat general query, Google web_fetch succeeds

{ "tool": "smart_search", "args": { "query": "best noise-cancelling headphones 2025", "agent_id": "general" } }

Strategy B: No finance keywords. Google web_fetch tried first. Succeeds. Zero API quota consumed.

{
  "results": "\x3Chtml content from Google>",
  "provider_used": "web_fetch",
  "queries_remaining": 20,
  "quota_source": "none",
  "fallback_used": true,
  "warning": "Result retrieved via web scraping. Quality may be lower than API results.",
  "web_fetch_engine": "google"
}

Example 4 — Scheduled agent finance query, Gemini API, agent has allocation

{ "tool": "smart_search", "args": { "query": "NSE market open today", "agent_id": "stock-analysis" } }

Strategy A: Finance keyword routes to Gemini. Agent has 12 remaining. API call succeeds.

{
  "results": "The NSE opened at 22,450 points today...",
  "provider_used": "gemini",
  "queries_remaining": 11,
  "quota_source": "agent_allocation",
  "fallback_used": false,
  "warning": null,
  "web_fetch_engine": null
}

Example 5 — Scheduled agent, both APIs exhausted, finance query → hard error

{ "tool": "smart_search", "args": { "query": "NSE market open today", "agent_id": "stock-analysis" } }

Strategy A: Gemini exhausted, Brave exhausted. Finance keyword blocks DuckDuckGo fallback.

{
  "results": null,
  "provider_used": null,
  "queries_remaining": 0,
  "quota_source": "none",
  "fallback_used": false,
  "warning": null,
  "web_fetch_engine": null,
  "error": "Finance and time-sensitive queries require Gemini or Brave API. web_fetch fallback is not permitted for this query type."
}

Example 6 — Scheduled agent, both APIs exhausted, general query → DuckDuckGo web_fetch

{ "tool": "smart_search", "args": { "query": "latest AI research papers", "agent_id": "tech-news" } }

Strategy A: Gemini exhausted, Brave exhausted. No finance keywords — DuckDuckGo web_fetch is permitted.

{
  "results": "\x3Chtml content from DuckDuckGo>",
  "provider_used": "web_fetch",
  "queries_remaining": 0,
  "quota_source": "none",
  "fallback_used": true,
  "warning": "Result retrieved via web scraping. Quality may be lower than API results.",
  "web_fetch_engine": "duckduckgo"
}
Usage Guidance
This skill appears to implement what it claims, but it under-declares sensitive requirements. Before installing: 1) Confirm you are willing to store API keys (GEMINI_API_KEY, BRAVE_API_KEY) in your global ~/.openclaw/openclaw.json and understand that the skill will read that file. 2) Review and restrict filesystem permissions on ~/.openclaw/workspace/shared so other users/processes cannot read logs or quota; the skill will write search logs and a shared quota file there. 3) If you keep other secrets in openclaw.json, move them or use a separate config to avoid exposing them. 4) Audit index.js locally (it’s included) to ensure there are no unexpected external endpoints; run setup.sh in a controlled environment since npm install will execute dependency install scripts. 5) Ask the author to update registry metadata to declare required env vars (GEMINI_API_KEY, BRAVE_API_KEY) and to document retention/rotation policy for logs. If you need stricter isolation, run the skill under a dedicated user account or sandbox.
Capability Analysis
Type: OpenClaw Skill Name: aira-smart-search Version: 1.0.0 The 'smart-search' skill is a legitimate utility for routing search queries between Gemini, Brave, and web-scraping fallbacks. It demonstrates high security awareness by implementing an SSRF guard (isSafeUrl) to prevent internal network requests, a prompt-injection filter (stripInjection) to sanitize search results before they reach the agent, and strict input validation in index.js. The quota management and logging behaviors are transparent, localized to the OpenClaw workspace, and align entirely with the stated functional purpose.
Capability Assessment
Purpose & Capability
The skill claims to route searches via Gemini and Brave APIs and to use a shared quota file. The implementation expects GEMINI_API_KEY and BRAVE_API_KEY to live in the top-level env block of ~/.openclaw/openclaw.json and uses a shared quota file under ~/.openclaw/workspace/shared. However the registry metadata declares no required environment variables or primary credential — that is inconsistent and under-declares the sensitive credentials and global config access the skill needs.
Instruction Scope
SKILL.md and index.js instruct the agent to read the global openclaw.json, read/write a shared quota JSON at ~/.openclaw/workspace/shared/search-quota.json, and log all searches to a logs directory next to the quota file. That means user queries (possibly sensitive) are persisted to disk and are visible to other agents/processes that can read that directory. The skill also performs web_fetch fallbacks and calls external providers — expected for this skill, but the persistent logging and global config reads expand the data surface beyond simple per-agent ephemeral operations.
Install Mechanism
There is no remote download; the repository includes code and two shell scripts (setup.sh and reset-quota.sh). setup.sh runs 'npm install' (traceable dependency 'proper-lockfile') and creates ~/.openclaw workspace and quota file. This is moderate-risk because code will be executed locally and npm install runs arbitrary package scripts, but no external ad-hoc binary download URLs or URL shorteners are used.
Credentials
Although the registry lists no required env vars, the code reads config.env.GEMINI_API_KEY and config.env.BRAVE_API_KEY from the global openclaw.json. It also respects SEARCH_QUOTA_PATH and OPENCLAW_CONFIG_PATH overrides. Reading the entire openclaw.json can expose other top-level env secrets stored there. The skill therefore requires access to sensitive API keys and a shared filesystem location — these are not declared in the metadata and are broader than indicated.
Persistence & Privilege
The skill persists live quota state and search logs to a shared workspace under the user's home directory and uses file locking to coordinate concurrent access. Persisting full search logs (and potentially query results) to a shared file increases the risk of leaking sensitive queries to other local agents or users. The skill does not request 'always: true' and does not modify other skills, but its write access to a shared path and global config file is a privileged capability that should be acknowledged.
How to Use
  1. Make sure OpenClaw is installed (local or Docker)
  2. Run the install command in chat: /install aira-smart-search
  3. After installation, invoke the skill by name or use /aira-smart-search
  4. Provide required inputs per the skill's parameter spec and get structured output
Version History
v1.0.0
smart-search 1.0.0 — Initial release with multi-provider web search, automatic routing logic, and robust quota management. - Added automatic search routing between Gemini and Brave APIs, with web scraping fallback if APIs are unavailable. - Introduced daily quota management per agent and shared pool, with persistent coordination across agents. - Developed two execution strategies: scheduled agents prioritize APIs; general agent prioritizes scraping to save quota. - Exposed three tools: `smart_search` for search, `search_quota_status` for quota checking, and `search_mark_agent_complete`. - All allocations, provider routing rules, and quota ceilings are config-driven and reloadable without restart.
Metadata
Slug aira-smart-search
Version 1.0.0
License MIT-0
All-time Installs 0
Active Installs 0
Total Versions 1
Frequently Asked Questions

What is smart-search?

Intelligent web search routing across Gemini and Brave APIs with quota management, circuit breaker, and web_fetch fallback. Routes finance queries to Gemini,... It is an AI Agent Skill for Claude Code / OpenClaw, with 203 downloads so far.

How do I install smart-search?

Run "/install aira-smart-search" in the OpenClaw or Claude Code chat to install it in one step — no extra setup required.

Is smart-search free?

Yes, smart-search is completely free, licensed under MIT-0. You can download, install and use it at no cost.

Which platforms does smart-search support?

smart-search is cross-platform and runs anywhere OpenClaw / Claude Code is available (darwin, linux).

Who created smart-search?

It is built and maintained by AiraAlfredSF (@airaalfredsf); the current version is v1.0.0.

💬 Comments