> ## Documentation Index
> Fetch the complete documentation index at: https://docs.keenable.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Omnigent

> Keenable as a built-in web_search backend in Omnigent, selectable via the tool's search_provider config.

*web\_search backend*

Keenable as a built-in `web_search` backend in Omnigent, selectable via the tool's `search_provider` config.

→ [View the change on GitHub](https://github.com/omnigent-ai/omnigent/pull/1722)

<video controls poster="https://app.keenable.ai/integrations/omnigent.jpg" src="https://app.keenable.ai/integrations/omnigent.mp4" style={{ width: '100%', borderRadius: '12px' }} />

pip install omnigent, then the built-in web\_search tool on the keenable backend.

## Install

### No separate install

Keenable ships as a built-in web\_search backend in Omnigent (merged upstream) — there is no separate package to install.

### Select Keenable in the agentspec

Set `search_provider` on the `web_search` tool. Omnigent never picks an engine for you — with no `search_provider` the tool returns an error naming the options.

```yaml theme={"dark"}
tools:
  builtins:
    - name: web_search
      search_provider: keenable
      api_key: keen_...           # removes the hourly request cap
      # max_results: 5            # 1-20, default 5
```

### Or drive the tool directly

`invoke` takes a JSON argument string and a `ToolContext`:

```python theme={"dark"}
import json
from omnigent.tools.base import ToolContext
from omnigent.tools.builtins.web_search import WebSearchTool

tool = WebSearchTool(config={
    "search_provider": "keenable",
    "api_key": "keen_...",
    "max_results": "3",
})
args = json.dumps({"query": "retrieval augmented generation"})
print(tool.invoke(args, ToolContext("demo", "demo")))
```

<Warning>
  **Known defect in the merged backend.** Results currently reach the model as titles and links with no page text, because the backend reads a field Keenable leaves empty for most pages. The fix is open upstream as [PR #5020](https://github.com/omnigent-ai/omnigent/pull/5020); there is no workaround in the meantime.
</Warning>

<Note>
  Add `"api_key": "keen_…"` to the config to authenticate — this removes the hourly request cap. Leave it out and the backend calls `/v1/search/public` instead, on the shared public tier at [lower rate limits](/rate-limits).
</Note>
