mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-08-01 21:02:12 +03:00
feat(skills): add 5 CLI skills + split AgentSkills / OmniSkills pages
- Add skills/omniroute-cli/SKILL.md — CLI entry point (install, global flags, output formats, env vars) - Add skills/omniroute-cli-admin/SKILL.md — server lifecycle, setup, doctor, backup, autostart, tunnels - Add skills/omniroute-cli-providers/SKILL.md — provider connections, keys, OAuth, models, combos, quota - Add skills/omniroute-cli-cloud/SKILL.md — Codex / Devin / Jules cloud agent task workflow - Add skills/omniroute-cli-eval/SKILL.md — eval suites, run + watch, scorecard, CI integration - Update agentSkills.ts: add category field (api | cli), add 5 new CLI skills (18 total) - Create /dashboard/agent-skills page (AgentSkills) with API + CLI sections and copy-URL buttons - Remove AI Skills tab from /dashboard/skills (OmniSkills) — now a separate page - Add agent-skills to sidebar (CLI section) with i18n keys omniSkills + agentSkills - Update skills/README.md and omniroute/SKILL.md index tables
This commit is contained in:
53
skills/README.md
Normal file
53
skills/README.md
Normal file
@@ -0,0 +1,53 @@
|
||||
# OmniRoute AI Agent Skills
|
||||
|
||||
Drop-in skills that let any AI agent (Claude Desktop, ChatGPT, Cursor, Cline, Continue, etc.)
|
||||
consume OmniRoute via OpenAI-compatible REST in one fetch.
|
||||
|
||||
## How agents use these
|
||||
|
||||
```
|
||||
User to agent: "Use OmniRoute for code-gen. Fetch this URL and follow it:
|
||||
https://raw.githubusercontent.com/diegosouzapw/OmniRoute/main/skills/omniroute/SKILL.md"
|
||||
```
|
||||
|
||||
The agent retrieves the manifest, sees the setup + endpoints, and routes calls
|
||||
through `$OMNIROUTE_URL/v1/...` with `Authorization: Bearer $OMNIROUTE_KEY`.
|
||||
|
||||
## Skills index
|
||||
|
||||
| Capability | Manifest |
|
||||
| ------------------------ | -------------------------------------------------------------------- |
|
||||
| Entry point + setup | [omniroute/SKILL.md](omniroute/SKILL.md) |
|
||||
| Chat / code-gen | [omniroute-chat/SKILL.md](omniroute-chat/SKILL.md) |
|
||||
| Image generation | [omniroute-image/SKILL.md](omniroute-image/SKILL.md) |
|
||||
| Text-to-speech | [omniroute-tts/SKILL.md](omniroute-tts/SKILL.md) |
|
||||
| Speech-to-text | [omniroute-stt/SKILL.md](omniroute-stt/SKILL.md) |
|
||||
| Embeddings | [omniroute-embeddings/SKILL.md](omniroute-embeddings/SKILL.md) |
|
||||
| Web search | [omniroute-web-search/SKILL.md](omniroute-web-search/SKILL.md) |
|
||||
| Web fetch (URL→markdown) | [omniroute-web-fetch/SKILL.md](omniroute-web-fetch/SKILL.md) |
|
||||
| MCP server (37 tools) | [omniroute-mcp/SKILL.md](omniroute-mcp/SKILL.md) |
|
||||
| A2A protocol | [omniroute-a2a/SKILL.md](omniroute-a2a/SKILL.md) |
|
||||
| Routing & combos | [omniroute-routing/SKILL.md](omniroute-routing/SKILL.md) |
|
||||
| Token compression | [omniroute-compression/SKILL.md](omniroute-compression/SKILL.md) |
|
||||
| Monitoring & health | [omniroute-monitoring/SKILL.md](omniroute-monitoring/SKILL.md) |
|
||||
| CLI entry point | [omniroute-cli/SKILL.md](omniroute-cli/SKILL.md) |
|
||||
| CLI admin & lifecycle | [omniroute-cli-admin/SKILL.md](omniroute-cli-admin/SKILL.md) |
|
||||
| CLI providers & keys | [omniroute-cli-providers/SKILL.md](omniroute-cli-providers/SKILL.md) |
|
||||
| CLI cloud agents | [omniroute-cli-cloud/SKILL.md](omniroute-cli-cloud/SKILL.md) |
|
||||
| CLI evals & benchmarks | [omniroute-cli-eval/SKILL.md](omniroute-cli-eval/SKILL.md) |
|
||||
|
||||
## Format
|
||||
|
||||
Each `SKILL.md` follows the Anthropic skill manifest spec with YAML frontmatter
|
||||
(`name`, `description`) and a self-contained markdown body: setup, endpoints,
|
||||
examples, and error codes. Assume the reader is an agent with no prior context.
|
||||
|
||||
## Skills exclusive to OmniRoute
|
||||
|
||||
These 5 skills have no equivalent in other AI routers:
|
||||
|
||||
- `omniroute-mcp` — 37 MCP tools (memory, skills, providers, routing, compression) over SSE/stdio/HTTP
|
||||
- `omniroute-a2a` — 5 A2A skills (smart-routing, quota, discovery, cost, health) via JSON-RPC 2.0
|
||||
- `omniroute-routing` — create/configure combos, 14 strategies, Auto-combo scoring, fallback chains
|
||||
- `omniroute-compression` — RTK + Caveman + stacked mode + MCP accessibility filter (60–90% token savings)
|
||||
- `omniroute-monitoring` — circuit breakers, p50/p95/p99 latency, budget guard, MCP audit log
|
||||
145
skills/omniroute-cli-admin/SKILL.md
Normal file
145
skills/omniroute-cli-admin/SKILL.md
Normal file
@@ -0,0 +1,145 @@
|
||||
---
|
||||
name: omniroute-cli-admin
|
||||
description: Manage the OmniRoute server lifecycle via CLI — start/stop/restart, non-interactive setup, diagnostics (omniroute doctor), backup/restore, autostart, and tunnel management. Use when the user wants to operate the OmniRoute server, automate provisioning, or troubleshoot the runtime.
|
||||
---
|
||||
|
||||
# OmniRoute — CLI Admin
|
||||
|
||||
Requires the `omniroute` CLI. See [CLI entry-point skill](https://raw.githubusercontent.com/diegosouzapw/OmniRoute/main/skills/omniroute-cli/SKILL.md) for install + global flags.
|
||||
|
||||
## Server lifecycle
|
||||
|
||||
```bash
|
||||
omniroute # Start server (default port 20128)
|
||||
omniroute serve # Explicit alias
|
||||
omniroute --port 3000 # Override port
|
||||
omniroute --no-open # Don't auto-open browser
|
||||
omniroute --mcp # Start as MCP server (stdio transport)
|
||||
|
||||
omniroute stop # Stop the running server
|
||||
omniroute restart # Restart the server
|
||||
|
||||
omniroute dashboard # Open dashboard in browser
|
||||
omniroute open # Alias for dashboard
|
||||
omniroute status # Runtime status (uptime, requests, providers)
|
||||
```
|
||||
|
||||
## Setup & provisioning
|
||||
|
||||
### Interactive wizard
|
||||
|
||||
```bash
|
||||
omniroute setup # Step-by-step interactive setup
|
||||
```
|
||||
|
||||
### Non-interactive (CI / Docker)
|
||||
|
||||
```bash
|
||||
omniroute setup --non-interactive \
|
||||
--password 'admin-password' \
|
||||
--add-provider \
|
||||
--provider openai \
|
||||
--api-key 'sk-...' \
|
||||
--test-provider
|
||||
```
|
||||
|
||||
Environment variables for non-interactive setup:
|
||||
|
||||
| Variable | Purpose |
|
||||
| ----------------------------- | -------------------------------------------- |
|
||||
| `OMNIROUTE_SETUP_PASSWORD` | Admin password (≥8 chars) |
|
||||
| `OMNIROUTE_PROVIDER` | Provider id (e.g. `openai`, `anthropic`) |
|
||||
| `OMNIROUTE_PROVIDER_NAME` | Display name for the connection |
|
||||
| `OMNIROUTE_PROVIDER_BASE_URL` | Optional OpenAI-compatible base URL override |
|
||||
| `OMNIROUTE_API_KEY` | Provider API key |
|
||||
| `OMNIROUTE_DEFAULT_MODEL` | Optional default model |
|
||||
| `DATA_DIR` | Override OmniRoute data directory |
|
||||
|
||||
## Diagnostics
|
||||
|
||||
```bash
|
||||
omniroute doctor # Full health check
|
||||
omniroute doctor --json # Machine-readable JSON
|
||||
omniroute doctor --no-liveness # Skip HTTP health probe
|
||||
omniroute doctor --host 0.0.0.0 # Override liveness host
|
||||
omniroute doctor --liveness-url <url> # Full URL override
|
||||
```
|
||||
|
||||
Checks performed: Config, Database, Storage/encryption, Port, Node runtime, Native binary (better-sqlite3), Memory, Server liveness.
|
||||
|
||||
Exit code is non-zero if any check fails — useful in CI:
|
||||
|
||||
```bash
|
||||
omniroute doctor --json | jq '.checks[] | select(.status=="fail")'
|
||||
```
|
||||
|
||||
## Backup & restore
|
||||
|
||||
```bash
|
||||
omniroute backup # Snapshot config + SQLite DB to ~/.omniroute/backups/
|
||||
omniroute restore # Restore from a previous snapshot (interactive picker)
|
||||
```
|
||||
|
||||
## Autostart (system tray / startup)
|
||||
|
||||
```bash
|
||||
omniroute autostart enable # Register OmniRoute as a system startup item
|
||||
omniroute autostart disable # Remove startup registration
|
||||
omniroute autostart status # Show current autostart state
|
||||
```
|
||||
|
||||
On Linux: creates a systemd user unit. On macOS: LaunchAgent plist. On Windows: registry startup entry.
|
||||
|
||||
## Tunnels (public URL)
|
||||
|
||||
Expose a local OmniRoute instance via a secure tunnel:
|
||||
|
||||
```bash
|
||||
omniroute tunnel list # List active tunnels
|
||||
omniroute tunnel create cloudflare # Start a Cloudflare Tunnel (free)
|
||||
omniroute tunnel create tailscale # Start a Tailscale funnel
|
||||
omniroute tunnel create ngrok # Start an ngrok tunnel
|
||||
omniroute tunnel stop <id> # Stop a running tunnel
|
||||
```
|
||||
|
||||
The tunnel URL is printed and can be used as `OMNIROUTE_BASE_URL` from remote machines.
|
||||
|
||||
## Config & environment
|
||||
|
||||
```bash
|
||||
omniroute config show # Display current effective configuration
|
||||
omniroute env show # List all OmniRoute environment variables
|
||||
omniroute env get <KEY> # Get a single env var value
|
||||
omniroute env set <KEY> <value> # Set an env var (temporary — until restart)
|
||||
```
|
||||
|
||||
## Recovery
|
||||
|
||||
```bash
|
||||
omniroute reset-password # Reset the admin password interactively
|
||||
omniroute reset-encrypted-columns # Dry-run: show encrypted credential columns
|
||||
omniroute reset-encrypted-columns --force # Null out encrypted credentials in SQLite
|
||||
```
|
||||
|
||||
Use `reset-encrypted-columns --force` only if `STORAGE_ENCRYPTION_KEY` was lost and you need to re-enter all provider API keys.
|
||||
|
||||
## Logs
|
||||
|
||||
```bash
|
||||
omniroute logs # Stream live request logs
|
||||
omniroute logs --json # JSON log entries
|
||||
omniroute logs --search <term> # Filter by term
|
||||
omniroute logs --follow # Tail mode (keep streaming)
|
||||
```
|
||||
|
||||
## Update
|
||||
|
||||
```bash
|
||||
omniroute update # Check for a newer version and prompt to update
|
||||
```
|
||||
|
||||
## Errors
|
||||
|
||||
- `doctor` shows `STORAGE_ENCRYPTION_KEY missing` → set the key in `.env` or run `reset-encrypted-columns --force` to wipe and re-enter credentials
|
||||
- `doctor` reports native binary fail → `npm rebuild better-sqlite3` in the OmniRoute app directory
|
||||
- `tunnel create cloudflare` hangs → ensure `cloudflared` is installed: `brew install cloudflare/cloudflare/cloudflared`
|
||||
120
skills/omniroute-cli-cloud/SKILL.md
Normal file
120
skills/omniroute-cli-cloud/SKILL.md
Normal file
@@ -0,0 +1,120 @@
|
||||
---
|
||||
name: omniroute-cli-cloud
|
||||
description: Control OmniRoute cloud agents (OpenAI Codex, Devin, Jules) from the CLI — create tasks, track status, approve plans, send messages, and manage sources. Use when the user wants to automate cloud coding agent workflows via the terminal.
|
||||
---
|
||||
|
||||
# OmniRoute — CLI Cloud Agents
|
||||
|
||||
Requires the `omniroute` CLI. See [CLI entry-point skill](https://raw.githubusercontent.com/diegosouzapw/OmniRoute/main/skills/omniroute-cli/SKILL.md) for install + global flags.
|
||||
|
||||
## Supported agents
|
||||
|
||||
| Agent | ID | Auth required |
|
||||
| -------------- | ------- | -------------- |
|
||||
| OpenAI Codex | `codex` | OpenAI API key |
|
||||
| Devin | `devin` | Devin API key |
|
||||
| Jules (Google) | `jules` | Google OAuth |
|
||||
|
||||
## Authenticate an agent
|
||||
|
||||
```bash
|
||||
omniroute cloud codex auth # Set / refresh Codex API key
|
||||
omniroute cloud devin auth # Set / refresh Devin API key
|
||||
omniroute cloud jules auth # OAuth login for Jules (opens browser)
|
||||
```
|
||||
|
||||
## List all agents
|
||||
|
||||
```bash
|
||||
omniroute cloud agents # Show all configured cloud agents + status
|
||||
omniroute cloud agents --json
|
||||
```
|
||||
|
||||
## Create a task
|
||||
|
||||
```bash
|
||||
omniroute cloud codex task create \
|
||||
--title "Add OAuth to the auth module" \
|
||||
--prompt "Implement Google OAuth 2.0 login in src/auth/oauth.ts"
|
||||
|
||||
omniroute cloud codex task create \
|
||||
--title "Fix test failures" \
|
||||
--prompt-file ./task-description.md # Read prompt from a file
|
||||
```
|
||||
|
||||
Same syntax for `devin` and `jules`:
|
||||
|
||||
```bash
|
||||
omniroute cloud devin task create --title "..." --prompt "..."
|
||||
omniroute cloud jules task create --title "..." --prompt "..."
|
||||
```
|
||||
|
||||
## List tasks
|
||||
|
||||
```bash
|
||||
omniroute cloud codex task list # All Codex tasks (table)
|
||||
omniroute cloud codex task list --json # JSON output
|
||||
```
|
||||
|
||||
## Get task details
|
||||
|
||||
```bash
|
||||
omniroute cloud codex task get <taskId> # Full task record
|
||||
omniroute cloud codex task status <taskId> # Status + progress only
|
||||
```
|
||||
|
||||
Task status values: `running`, `completed`, `failed`, `cancelled`.
|
||||
|
||||
## Approve a plan
|
||||
|
||||
Devin and Jules may pause for plan approval before writing code:
|
||||
|
||||
```bash
|
||||
omniroute cloud devin task approve <taskId> # Approve the proposed plan
|
||||
omniroute cloud jules task approve <taskId>
|
||||
```
|
||||
|
||||
## Send a message to a running task
|
||||
|
||||
```bash
|
||||
omniroute cloud codex task message <taskId> "Focus on the backend only, skip the UI"
|
||||
```
|
||||
|
||||
## List task sources (files touched)
|
||||
|
||||
```bash
|
||||
omniroute cloud codex task sources <taskId> # Files changed / created by the task
|
||||
```
|
||||
|
||||
## Cancel a task
|
||||
|
||||
```bash
|
||||
omniroute cloud codex task cancel <taskId>
|
||||
omniroute cloud devin task cancel <taskId>
|
||||
```
|
||||
|
||||
## Typical workflow
|
||||
|
||||
```bash
|
||||
# 1. Authenticate
|
||||
omniroute cloud codex auth
|
||||
|
||||
# 2. Create a task
|
||||
TASK_ID=$(omniroute cloud codex task create \
|
||||
--title "Refactor auth module" \
|
||||
--prompt "Extract JWT logic to src/auth/jwt.ts" \
|
||||
--output json | jq -r '.id')
|
||||
|
||||
# 3. Poll status
|
||||
omniroute cloud codex task status $TASK_ID
|
||||
|
||||
# 4. View touched files when complete
|
||||
omniroute cloud codex task sources $TASK_ID
|
||||
```
|
||||
|
||||
## Errors
|
||||
|
||||
- `auth required` → run `omniroute cloud <agent> auth` before any task commands
|
||||
- `task create` fails with 402 → agent billing limit reached; check your Codex/Devin/Jules account
|
||||
- `task approve` fails with 404 → task does not have a pending plan; check status first
|
||||
- `jules auth` browser flow fails → ensure Google account has Jules access; try `omniroute cloud jules auth` again
|
||||
113
skills/omniroute-cli-eval/SKILL.md
Normal file
113
skills/omniroute-cli-eval/SKILL.md
Normal file
@@ -0,0 +1,113 @@
|
||||
---
|
||||
name: omniroute-cli-eval
|
||||
description: Run and manage OmniRoute eval suites from the CLI — create suites, run benchmarks, watch live results, view scorecards, and compare model performance. Use when the user wants to benchmark models, validate quality regressions, or automate LLM evals in CI.
|
||||
---
|
||||
|
||||
# OmniRoute — CLI Evals
|
||||
|
||||
Requires the `omniroute` CLI. See [CLI entry-point skill](https://raw.githubusercontent.com/diegosouzapw/OmniRoute/main/skills/omniroute-cli/SKILL.md) for install + global flags.
|
||||
|
||||
## What are evals?
|
||||
|
||||
Evals are automated test suites that score LLM outputs against expected answers or rubrics. OmniRoute stores suites and run results in its local database.
|
||||
|
||||
## Eval suites
|
||||
|
||||
```bash
|
||||
omniroute eval suites list # List all eval suites
|
||||
omniroute eval suites list --json # JSON output
|
||||
|
||||
omniroute eval suites get <suiteId> # Full suite definition
|
||||
```
|
||||
|
||||
### Create a suite
|
||||
|
||||
```bash
|
||||
omniroute eval suites create \
|
||||
--name "code-quality" \
|
||||
--rubric "exact-match" \
|
||||
--samples-file ./samples.jsonl # JSONL: {input, expected_output}
|
||||
```
|
||||
|
||||
Rubric options: `exact-match`, `contains`, `llm-judge`, `regex`.
|
||||
|
||||
`--samples-file` format (one JSON object per line):
|
||||
|
||||
```jsonl
|
||||
{"input": "What is 2+2?", "expected_output": "4"}
|
||||
{"input": "Translate 'hello' to Spanish", "expected_output": "hola"}
|
||||
```
|
||||
|
||||
## Run an eval
|
||||
|
||||
```bash
|
||||
omniroute eval suites run <suiteId> \
|
||||
--model claude-sonnet-4-6 # Run suite against a specific model
|
||||
|
||||
omniroute eval suites run <suiteId> \
|
||||
--model gpt-4o \
|
||||
--watch # Live TUI progress (EvalWatch)
|
||||
```
|
||||
|
||||
The run is asynchronous. Use `--watch` for a live terminal dashboard or poll manually:
|
||||
|
||||
```bash
|
||||
RUN_ID=$(omniroute eval suites run <suiteId> --model claude-sonnet-4-6 --output json | jq -r '.id')
|
||||
omniroute eval get $RUN_ID
|
||||
```
|
||||
|
||||
## Manage runs
|
||||
|
||||
```bash
|
||||
omniroute eval list # List all eval runs
|
||||
omniroute eval list --json
|
||||
|
||||
omniroute eval get <runId> # Run details (status, model, score)
|
||||
omniroute eval results <runId> # Per-sample results
|
||||
omniroute eval scorecard <runId> # Full scorecard with pass/fail per sample
|
||||
omniroute eval cancel <runId> # Cancel a running eval
|
||||
```
|
||||
|
||||
## Scorecard output
|
||||
|
||||
```bash
|
||||
omniroute eval scorecard <runId> --output json
|
||||
```
|
||||
|
||||
Response fields per sample:
|
||||
|
||||
```json
|
||||
{
|
||||
"id": "sample-1",
|
||||
"score": 0.95,
|
||||
"passed": true,
|
||||
"input": "What is 2+2?",
|
||||
"output": "4",
|
||||
"expected": "4"
|
||||
}
|
||||
```
|
||||
|
||||
## Comparing models
|
||||
|
||||
Run the same suite against multiple models and compare:
|
||||
|
||||
```bash
|
||||
for MODEL in claude-sonnet-4-6 gpt-4o gemini-2.0-flash; do
|
||||
omniroute eval suites run $SUITE_ID --model $MODEL --output json | jq '{model: .model, score: .score}'
|
||||
done
|
||||
```
|
||||
|
||||
## CI integration
|
||||
|
||||
```bash
|
||||
# Run and fail CI if score drops below threshold
|
||||
SCORE=$(omniroute eval suites run $SUITE_ID --model claude-sonnet-4-6 --output json | jq -r '.score')
|
||||
python3 -c "import sys; score=float('$SCORE'); sys.exit(0 if score >= 0.90 else 1)"
|
||||
```
|
||||
|
||||
## Errors
|
||||
|
||||
- `suites create` fails with `invalid rubric` → use one of: `exact-match`, `contains`, `llm-judge`, `regex`
|
||||
- `suites run` returns `model not found` → verify model ID with `omniroute models --search <name>`
|
||||
- `eval get` shows `status: failed` → check `omniroute logs --search eval` for error details
|
||||
- `scorecard` returns empty results → the run may still be `running`; poll `omniroute eval get <runId>` until `status` is `completed`
|
||||
145
skills/omniroute-cli-providers/SKILL.md
Normal file
145
skills/omniroute-cli-providers/SKILL.md
Normal file
@@ -0,0 +1,145 @@
|
||||
---
|
||||
name: omniroute-cli-providers
|
||||
description: Manage OmniRoute provider connections, API keys, and routing combos via CLI — add/list/test/remove providers, rotate keys, run OAuth flows, list models, and create/switch combos. Use when the user wants to configure providers, manage credentials, or set up routing from the terminal.
|
||||
---
|
||||
|
||||
# OmniRoute — CLI Providers & Keys
|
||||
|
||||
Requires the `omniroute` CLI. See [CLI entry-point skill](https://raw.githubusercontent.com/diegosouzapw/OmniRoute/main/skills/omniroute-cli/SKILL.md) for install + global flags.
|
||||
|
||||
## Provider catalog (available providers)
|
||||
|
||||
```bash
|
||||
omniroute providers available # Full OmniRoute provider catalog
|
||||
omniroute providers available --search openai # Filter by id, name, alias
|
||||
omniroute providers available --category api-key # Filter by category
|
||||
omniroute providers available --json # Machine-readable JSON
|
||||
```
|
||||
|
||||
Categories: `api-key`, `oauth`, `free`, `local`, `combo`.
|
||||
|
||||
## Configured provider connections
|
||||
|
||||
```bash
|
||||
omniroute providers list # Connections in your DB
|
||||
omniroute providers list --json
|
||||
```
|
||||
|
||||
## Testing connections
|
||||
|
||||
```bash
|
||||
omniroute providers test <id|name> # Test one configured connection
|
||||
omniroute providers test-all # Test every active connection (TUI progress)
|
||||
omniroute providers validate # Local-only structural validation (no HTTP)
|
||||
```
|
||||
|
||||
`test-all` opens an interactive TUI that shows live pass/fail per connection. Use `--json` to get a machine-readable result:
|
||||
|
||||
```bash
|
||||
omniroute providers test-all --json
|
||||
```
|
||||
|
||||
## API key management (OmniRoute keys)
|
||||
|
||||
These manage the OmniRoute API keys issued under **API Manager** — not provider credentials.
|
||||
|
||||
```bash
|
||||
omniroute keys list # List all OmniRoute API keys
|
||||
omniroute keys add <provider> [apiKey] # Add an API key for a provider
|
||||
omniroute keys remove <provider> # Remove an API key
|
||||
omniroute keys regenerate <id> # Regenerate (rotate) a key
|
||||
omniroute keys revoke <id> # Revoke a key (disables it)
|
||||
omniroute keys reveal <id> # Show the full key value
|
||||
omniroute keys usage <id> # Show usage stats for a key
|
||||
|
||||
omniroute keys rotate <id> # Rotate + revoke old key atomically
|
||||
omniroute keys expiration list # List key expiration times
|
||||
```
|
||||
|
||||
### Key policies
|
||||
|
||||
```bash
|
||||
omniroute keys policy show <id> # Show rate-limit / permission policy
|
||||
omniroute keys policy set <id> \
|
||||
--rate-limit 100 \
|
||||
--rate-window minute \
|
||||
--permissions chat,models # Set policy on a key
|
||||
```
|
||||
|
||||
## Models
|
||||
|
||||
```bash
|
||||
omniroute models # List all models (all providers)
|
||||
omniroute models openai # Filter by provider
|
||||
omniroute models --search gpt # Search by name
|
||||
omniroute models --json # JSON output
|
||||
```
|
||||
|
||||
## OAuth providers
|
||||
|
||||
```bash
|
||||
omniroute oauth list # List OAuth-configured providers
|
||||
omniroute oauth login <provider> # Start browser-based OAuth flow
|
||||
omniroute oauth logout <provider> # Revoke OAuth token
|
||||
omniroute oauth status <provider> # Show token state + expiry
|
||||
omniroute oauth refresh <provider> # Force token refresh
|
||||
```
|
||||
|
||||
For OAuth providers (Gemini, Windsurf, Antigravity, etc.) the `login` command opens the OmniRoute dashboard OAuth flow in your browser.
|
||||
|
||||
## Provider nodes (multi-account routing)
|
||||
|
||||
Provider nodes let you attach multiple API keys / accounts to one logical provider for round-robin or failover.
|
||||
|
||||
```bash
|
||||
omniroute nodes list <provider> # List nodes for a provider
|
||||
omniroute nodes add <provider> --api-key <key> # Add a node
|
||||
omniroute nodes remove <provider> <nodeId> # Remove a node
|
||||
omniroute nodes test <provider> <nodeId> # Test one node
|
||||
```
|
||||
|
||||
## Routing combos (CLI)
|
||||
|
||||
Create and manage routing combos from the terminal:
|
||||
|
||||
```bash
|
||||
omniroute combo list # List all combos
|
||||
omniroute combo create <name> \
|
||||
--strategy priority \
|
||||
--targets anthropic/claude-opus-4-7,openai/gpt-4o # Create combo
|
||||
omniroute combo switch <name> # Activate a combo as default
|
||||
omniroute combo delete <name> # Delete a combo
|
||||
omniroute combo suggest --task "code review" # Ask OmniRoute to recommend a combo
|
||||
```
|
||||
|
||||
For the full REST API for combos see [omniroute-routing skill](https://raw.githubusercontent.com/diegosouzapw/OmniRoute/main/skills/omniroute-routing/SKILL.md).
|
||||
|
||||
## Quota & usage
|
||||
|
||||
```bash
|
||||
omniroute quota # Provider quota usage + reset times
|
||||
omniroute usage # Request + token usage summary
|
||||
omniroute cost # Cost breakdown (by provider/model)
|
||||
```
|
||||
|
||||
## Compression (CLI)
|
||||
|
||||
```bash
|
||||
omniroute compression status # Current compression mode + savings stats
|
||||
omniroute compression set --mode rtk # Enable RTK compression
|
||||
omniroute compression set --mode stacked # Enable stacked (RTK + Caveman)
|
||||
omniroute compression set --mode off # Disable compression
|
||||
omniroute compression preview --mode rtk --text "..." # Preview savings for sample text
|
||||
```
|
||||
|
||||
## Health
|
||||
|
||||
```bash
|
||||
omniroute health # Detailed health: circuit breakers, cache, memory
|
||||
```
|
||||
|
||||
## Errors
|
||||
|
||||
- `providers test <id>` fails with 401 → API key stored for that provider is wrong; use `keys remove` + `keys add` to reset it
|
||||
- `oauth login` opens but doesn't complete → the OAuth token endpoint may be firewalled; use API key auth instead
|
||||
- `combo create` fails with `strategy unknown` → use one of: `priority`, `weighted`, `round-robin`, `fill-first`, `least-used`, `cost-optimized`, `auto`, `random`, `strict-random`, `p2c`, `reset-aware`, `lkgp`, `context-optimized`, `context-relay`
|
||||
104
skills/omniroute-cli/SKILL.md
Normal file
104
skills/omniroute-cli/SKILL.md
Normal file
@@ -0,0 +1,104 @@
|
||||
---
|
||||
name: omniroute-cli
|
||||
description: Entry point for the OmniRoute CLI (omniroute binary) — install, global flags, output formats, environment variables, and index of CLI capability skills. Use when the user wants to control OmniRoute from the terminal, automate workflows, or integrate with CI/CD.
|
||||
---
|
||||
|
||||
# OmniRoute — CLI (Entry Point)
|
||||
|
||||
The `omniroute` binary ships with the OmniRoute server. It is both the server launcher and a full management CLI with 250+ commands across 39 groups.
|
||||
|
||||
## Install
|
||||
|
||||
```bash
|
||||
npm install -g omniroute # npm registry
|
||||
# or: use the binary bundled with the desktop app
|
||||
```
|
||||
|
||||
Requires Node.js ≥20.20.2, ≥22.22.2, or ≥24.
|
||||
|
||||
Verify:
|
||||
|
||||
```bash
|
||||
omniroute --version # prints installed version
|
||||
omniroute --help # full command tree
|
||||
```
|
||||
|
||||
## Connection
|
||||
|
||||
Every CLI command that talks to the server reads two values:
|
||||
|
||||
| Source | Variable / Flag |
|
||||
| -------- | ------------------------------------ |
|
||||
| Base URL | `OMNIROUTE_BASE_URL` or `--base-url` |
|
||||
| API key | `OMNIROUTE_API_KEY` or `--api-key` |
|
||||
|
||||
Default base URL: `http://localhost:20128`
|
||||
|
||||
```bash
|
||||
export OMNIROUTE_BASE_URL="http://localhost:20128"
|
||||
export OMNIROUTE_API_KEY="sk-..." # from Dashboard → API Manager
|
||||
```
|
||||
|
||||
For a remote server:
|
||||
|
||||
```bash
|
||||
export OMNIROUTE_BASE_URL="https://your-server.com"
|
||||
```
|
||||
|
||||
## Global flags
|
||||
|
||||
| Flag | Description |
|
||||
| ------------------- | -------------------------------------------------------- |
|
||||
| `--base-url <url>` | Override server URL for this invocation |
|
||||
| `--api-key <key>` | Override API key for this invocation |
|
||||
| `--output <format>` | Output format: `table` (default), `json`, `jsonl`, `csv` |
|
||||
| `--json` | Shorthand for `--output json` |
|
||||
| `--non-interactive` | Disable prompts — for CI / shell scripts |
|
||||
| `--no-open` | Don't auto-open the browser on start |
|
||||
| `--port <n>` | Override default port 20128 |
|
||||
| `--help`, `-h` | Show help for the current command |
|
||||
| `--version`, `-v` | Print the installed version |
|
||||
|
||||
## Output formats
|
||||
|
||||
All listing commands support `--output`:
|
||||
|
||||
```bash
|
||||
omniroute combo list # human-readable table
|
||||
omniroute combo list --output json # JSON array
|
||||
omniroute combo list --output jsonl # one JSON object per line
|
||||
omniroute combo list --output csv # CSV with header row
|
||||
```
|
||||
|
||||
## Quick start: one-shot server + provider setup
|
||||
|
||||
```bash
|
||||
# 1. Start server
|
||||
omniroute
|
||||
|
||||
# 2. (First run) interactive setup wizard
|
||||
omniroute setup
|
||||
|
||||
# 3. Verify everything is healthy
|
||||
omniroute doctor
|
||||
```
|
||||
|
||||
## CLI capability skills
|
||||
|
||||
| Capability | Skill |
|
||||
| ------------------------------------ | ----------------------------------------------------------------------------------------------------- |
|
||||
| Server admin + backup | https://raw.githubusercontent.com/diegosouzapw/OmniRoute/main/skills/omniroute-cli-admin/SKILL.md |
|
||||
| Provider & key management | https://raw.githubusercontent.com/diegosouzapw/OmniRoute/main/skills/omniroute-cli-providers/SKILL.md |
|
||||
| Cloud agents (Codex / Devin / Jules) | https://raw.githubusercontent.com/diegosouzapw/OmniRoute/main/skills/omniroute-cli-cloud/SKILL.md |
|
||||
| Evals & benchmarking | https://raw.githubusercontent.com/diegosouzapw/OmniRoute/main/skills/omniroute-cli-eval/SKILL.md |
|
||||
|
||||
## API skills (REST)
|
||||
|
||||
For direct HTTP usage instead of the CLI, see the [OmniRoute entry-point skill](https://raw.githubusercontent.com/diegosouzapw/OmniRoute/main/skills/omniroute/SKILL.md).
|
||||
|
||||
## Errors
|
||||
|
||||
- `Connection refused` → server not running; run `omniroute` or `omniroute serve`
|
||||
- `401 Unauthorized` → wrong or missing API key
|
||||
- `command not found: omniroute` → not in PATH; check `npm root -g` or re-install
|
||||
- `doctor` reports SQLite incompatible → `npm rebuild better-sqlite3` in the app directory
|
||||
76
skills/omniroute/SKILL.md
Normal file
76
skills/omniroute/SKILL.md
Normal file
@@ -0,0 +1,76 @@
|
||||
---
|
||||
name: omniroute
|
||||
description: Entry point for OmniRoute — local/remote AI gateway with OpenAI-compatible REST for chat, image, TTS, STT, embeddings, web search, web fetch, MCP, A2A. Use when the user mentions OmniRoute, OMNIROUTE_URL, or wants AI without writing provider boilerplate. This skill covers setup + indexes capability skills; fetch the relevant capability SKILL.md from the URLs below when needed.
|
||||
---
|
||||
|
||||
# OmniRoute
|
||||
|
||||
Local/remote AI gateway exposing OpenAI-compatible REST. One key, 207+ providers,
|
||||
auto-fallback, RTK token saver, MCP server, A2A agents.
|
||||
|
||||
## Setup
|
||||
|
||||
```bash
|
||||
export OMNIROUTE_URL="http://localhost:20128" # or VPS / tunnel URL
|
||||
export OMNIROUTE_KEY="sk-..." # from Dashboard → API Keys
|
||||
```
|
||||
|
||||
All requests: `${OMNIROUTE_URL}/v1/...` with `Authorization: Bearer ${OMNIROUTE_KEY}`.
|
||||
|
||||
Verify: `curl $OMNIROUTE_URL/api/health` → `{"ok":true}`
|
||||
|
||||
## Discover models
|
||||
|
||||
```bash
|
||||
curl $OMNIROUTE_URL/v1/models # chat/LLM (default)
|
||||
curl $OMNIROUTE_URL/v1/models/image # image-gen
|
||||
curl $OMNIROUTE_URL/v1/models/tts # text-to-speech
|
||||
curl $OMNIROUTE_URL/v1/models/embedding # embeddings
|
||||
curl $OMNIROUTE_URL/v1/models/web # web search + fetch
|
||||
curl $OMNIROUTE_URL/v1/models/stt # speech-to-text
|
||||
```
|
||||
|
||||
Use `data[].id` as `model` field in requests. Combos appear with `owned_by:"combo"`.
|
||||
|
||||
## Capability skills
|
||||
|
||||
| Capability | Raw URL |
|
||||
| --------------------- | --------------------------------------------------------------------------------------------------- |
|
||||
| Chat / code-gen | https://raw.githubusercontent.com/diegosouzapw/OmniRoute/main/skills/omniroute-chat/SKILL.md |
|
||||
| Image generation | https://raw.githubusercontent.com/diegosouzapw/OmniRoute/main/skills/omniroute-image/SKILL.md |
|
||||
| Text-to-speech | https://raw.githubusercontent.com/diegosouzapw/OmniRoute/main/skills/omniroute-tts/SKILL.md |
|
||||
| Speech-to-text | https://raw.githubusercontent.com/diegosouzapw/OmniRoute/main/skills/omniroute-stt/SKILL.md |
|
||||
| Embeddings | https://raw.githubusercontent.com/diegosouzapw/OmniRoute/main/skills/omniroute-embeddings/SKILL.md |
|
||||
| Web search | https://raw.githubusercontent.com/diegosouzapw/OmniRoute/main/skills/omniroute-web-search/SKILL.md |
|
||||
| Web fetch | https://raw.githubusercontent.com/diegosouzapw/OmniRoute/main/skills/omniroute-web-fetch/SKILL.md |
|
||||
| MCP server (37 tools) | https://raw.githubusercontent.com/diegosouzapw/OmniRoute/main/skills/omniroute-mcp/SKILL.md |
|
||||
| A2A protocol | https://raw.githubusercontent.com/diegosouzapw/OmniRoute/main/skills/omniroute-a2a/SKILL.md |
|
||||
| Routing & combos | https://raw.githubusercontent.com/diegosouzapw/OmniRoute/main/skills/omniroute-routing/SKILL.md |
|
||||
| Token compression | https://raw.githubusercontent.com/diegosouzapw/OmniRoute/main/skills/omniroute-compression/SKILL.md |
|
||||
| Monitoring & health | https://raw.githubusercontent.com/diegosouzapw/OmniRoute/main/skills/omniroute-monitoring/SKILL.md |
|
||||
|
||||
## CLI skills (omniroute binary)
|
||||
|
||||
| Capability | Raw URL |
|
||||
| ---------------------- | ----------------------------------------------------------------------------------------------------- |
|
||||
| CLI entry point | https://raw.githubusercontent.com/diegosouzapw/OmniRoute/main/skills/omniroute-cli/SKILL.md |
|
||||
| CLI admin & lifecycle | https://raw.githubusercontent.com/diegosouzapw/OmniRoute/main/skills/omniroute-cli-admin/SKILL.md |
|
||||
| CLI providers & keys | https://raw.githubusercontent.com/diegosouzapw/OmniRoute/main/skills/omniroute-cli-providers/SKILL.md |
|
||||
| CLI cloud agents | https://raw.githubusercontent.com/diegosouzapw/OmniRoute/main/skills/omniroute-cli-cloud/SKILL.md |
|
||||
| CLI evals & benchmarks | https://raw.githubusercontent.com/diegosouzapw/OmniRoute/main/skills/omniroute-cli-eval/SKILL.md |
|
||||
|
||||
## Errors
|
||||
|
||||
- `401` → set/refresh `OMNIROUTE_KEY` (Dashboard → API Keys)
|
||||
- `400 Invalid model format` → check `model` exists in `/v1/models/<kind>`
|
||||
- `503 Provider circuit open` → upstream provider down; retry after `Retry-After` seconds
|
||||
- `429` → rate limited; honor `Retry-After`
|
||||
|
||||
## Differentiators vs OpenAI direct
|
||||
|
||||
- **Auto-fallback** combos (14 strategies): never stop coding even if a provider rate-limits
|
||||
- **RTK token saver**: tool_result compressed via 47 specialized filters (git-diff, test-jest, terraform-plan, docker-logs…) — 20-40% token reduction
|
||||
- **Caveman mode**: optional terse system prompt injection (LITE/FULL/ULTRA) — 15-25% completion reduction
|
||||
- **MCP + A2A** servers built-in (this is the only AI router that exposes both protocols)
|
||||
- **Memory** with FTS5 + Qdrant for persistent agent context
|
||||
- **Guardrails** for PII masking, prompt injection detection, vision policies
|
||||
251
src/app/(dashboard)/dashboard/agent-skills/page.tsx
Normal file
251
src/app/(dashboard)/dashboard/agent-skills/page.tsx
Normal file
@@ -0,0 +1,251 @@
|
||||
"use client";
|
||||
|
||||
import { useState } from "react";
|
||||
import {
|
||||
AGENT_SKILLS,
|
||||
AGENT_SKILLS_REPO_URL,
|
||||
getAgentSkillRawUrl,
|
||||
getAgentSkillBlobUrl,
|
||||
type AgentSkill,
|
||||
} from "@/shared/constants/agentSkills";
|
||||
|
||||
function CopyButton({ url }: { url: string }) {
|
||||
const [copied, setCopied] = useState(false);
|
||||
|
||||
const handleCopy = async () => {
|
||||
await navigator.clipboard.writeText(url);
|
||||
setCopied(true);
|
||||
setTimeout(() => setCopied(false), 2000);
|
||||
};
|
||||
|
||||
return (
|
||||
<button
|
||||
onClick={handleCopy}
|
||||
className="flex items-center gap-1 rounded px-2 py-1 text-xs font-medium transition-colors"
|
||||
style={{
|
||||
background: copied ? "var(--color-success-bg, #d1fae5)" : "var(--color-surface-2, #f3f4f6)",
|
||||
color: copied ? "var(--color-success, #065f46)" : "var(--color-text-2, #6b7280)",
|
||||
}}
|
||||
title="Copy raw URL to clipboard"
|
||||
>
|
||||
<span className="material-symbols-outlined" style={{ fontSize: 14 }}>
|
||||
{copied ? "check" : "content_copy"}
|
||||
</span>
|
||||
{copied ? "Copied!" : "Copy URL"}
|
||||
</button>
|
||||
);
|
||||
}
|
||||
|
||||
function SkillRow({ skill }: { skill: AgentSkill }) {
|
||||
const rawUrl = getAgentSkillRawUrl(skill.id);
|
||||
const blobUrl = getAgentSkillBlobUrl(skill.id);
|
||||
|
||||
return (
|
||||
<div
|
||||
className="flex items-start gap-3 rounded-lg border p-3 transition-colors hover:bg-[var(--color-surface-hover,#f9fafb)]"
|
||||
style={{ borderColor: "var(--color-border, #e5e7eb)" }}
|
||||
>
|
||||
<div
|
||||
className="flex h-9 w-9 shrink-0 items-center justify-center rounded-lg"
|
||||
style={{ background: "var(--color-surface-2, #f3f4f6)" }}
|
||||
>
|
||||
<span
|
||||
className="material-symbols-outlined"
|
||||
style={{ fontSize: 18, color: "var(--color-text-2, #6b7280)" }}
|
||||
>
|
||||
{skill.icon}
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<div className="min-w-0 flex-1">
|
||||
<div className="mb-0.5 flex flex-wrap items-center gap-1.5">
|
||||
<span className="text-sm font-semibold" style={{ color: "var(--color-text, #111827)" }}>
|
||||
{skill.name}
|
||||
</span>
|
||||
{skill.isEntry && (
|
||||
<span
|
||||
className="rounded-full px-1.5 py-0.5 text-[10px] font-bold uppercase tracking-wide"
|
||||
style={{
|
||||
background: "var(--color-primary-bg, #eff6ff)",
|
||||
color: "var(--color-primary, #2563eb)",
|
||||
}}
|
||||
>
|
||||
Start Here
|
||||
</span>
|
||||
)}
|
||||
{skill.isNew && (
|
||||
<span
|
||||
className="rounded-full px-1.5 py-0.5 text-[10px] font-bold uppercase tracking-wide"
|
||||
style={{
|
||||
background: "var(--color-warning-bg, #fef3c7)",
|
||||
color: "var(--color-warning, #92400e)",
|
||||
}}
|
||||
>
|
||||
New
|
||||
</span>
|
||||
)}
|
||||
{skill.endpoint && (
|
||||
<code
|
||||
className="rounded px-1.5 py-0.5 text-[10px]"
|
||||
style={{
|
||||
background: "var(--color-surface-2, #f3f4f6)",
|
||||
color: "var(--color-text-2, #6b7280)",
|
||||
fontFamily: "monospace",
|
||||
}}
|
||||
>
|
||||
{skill.endpoint}
|
||||
</code>
|
||||
)}
|
||||
</div>
|
||||
<p className="text-xs leading-relaxed" style={{ color: "var(--color-text-2, #6b7280)" }}>
|
||||
{skill.description}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div className="flex shrink-0 items-center gap-1">
|
||||
<a
|
||||
href={blobUrl}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="flex items-center gap-1 rounded px-2 py-1 text-xs font-medium transition-colors hover:bg-[var(--color-surface-2,#f3f4f6)]"
|
||||
style={{ color: "var(--color-text-3, #9ca3af)" }}
|
||||
title="View on GitHub"
|
||||
>
|
||||
<span className="material-symbols-outlined" style={{ fontSize: 14 }}>
|
||||
open_in_new
|
||||
</span>
|
||||
</a>
|
||||
<CopyButton url={rawUrl} />
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
function SkillSection({
|
||||
title,
|
||||
subtitle,
|
||||
icon,
|
||||
skills,
|
||||
}: {
|
||||
title: string;
|
||||
subtitle: string;
|
||||
icon: string;
|
||||
skills: AgentSkill[];
|
||||
}) {
|
||||
return (
|
||||
<section>
|
||||
<div className="mb-3 flex items-center gap-2">
|
||||
<span
|
||||
className="material-symbols-outlined"
|
||||
style={{ fontSize: 20, color: "var(--color-text-2, #6b7280)" }}
|
||||
>
|
||||
{icon}
|
||||
</span>
|
||||
<div>
|
||||
<h2 className="text-sm font-semibold" style={{ color: "var(--color-text, #111827)" }}>
|
||||
{title}
|
||||
</h2>
|
||||
<p className="text-xs" style={{ color: "var(--color-text-3, #9ca3af)" }}>
|
||||
{subtitle}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div className="flex flex-col gap-2">
|
||||
{skills.map((skill) => (
|
||||
<SkillRow key={skill.id} skill={skill} />
|
||||
))}
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
}
|
||||
|
||||
export default function AgentSkillsPage() {
|
||||
const apiSkills = AGENT_SKILLS.filter((s) => s.category === "api");
|
||||
const cliSkills = AGENT_SKILLS.filter((s) => s.category === "cli");
|
||||
|
||||
return (
|
||||
<div className="mx-auto max-w-3xl space-y-8 p-6">
|
||||
{/* Header */}
|
||||
<div>
|
||||
<h1 className="text-xl font-bold" style={{ color: "var(--color-text, #111827)" }}>
|
||||
AgentSkills
|
||||
</h1>
|
||||
<p className="mt-1 text-sm" style={{ color: "var(--color-text-2, #6b7280)" }}>
|
||||
SKILL.md manifests for AI agents — paste a URL into Claude, Cursor, Cline, or any agent to
|
||||
give it full knowledge of OmniRoute.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
{/* How to use */}
|
||||
<div
|
||||
className="rounded-lg border p-4"
|
||||
style={{
|
||||
borderColor: "var(--color-border, #e5e7eb)",
|
||||
background: "var(--color-surface-2, #f9fafb)",
|
||||
}}
|
||||
>
|
||||
<div className="mb-2 flex items-center gap-2">
|
||||
<span
|
||||
className="material-symbols-outlined"
|
||||
style={{ fontSize: 18, color: "var(--color-primary, #2563eb)" }}
|
||||
>
|
||||
info
|
||||
</span>
|
||||
<span className="text-sm font-semibold" style={{ color: "var(--color-text, #111827)" }}>
|
||||
How to use
|
||||
</span>
|
||||
</div>
|
||||
<ol className="space-y-1 text-xs" style={{ color: "var(--color-text-2, #6b7280)" }}>
|
||||
<li>
|
||||
1. Click <strong>Copy URL</strong> on the skill you want your agent to know about.
|
||||
</li>
|
||||
<li>
|
||||
2. In your AI agent (Claude, Cursor, Cline…), say:
|
||||
<br />
|
||||
<code
|
||||
className="mt-1 block rounded px-2 py-1 font-mono text-[11px]"
|
||||
style={{
|
||||
background: "var(--color-surface, #fff)",
|
||||
border: "1px solid var(--color-border, #e5e7eb)",
|
||||
}}
|
||||
>
|
||||
Use the skill at <pasted-url>
|
||||
</code>
|
||||
</li>
|
||||
<li>
|
||||
3. The agent fetches the SKILL.md and learns OmniRoute's API or CLI — no manual
|
||||
docs needed.
|
||||
</li>
|
||||
</ol>
|
||||
<a
|
||||
href={AGENT_SKILLS_REPO_URL}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="mt-3 inline-flex items-center gap-1 text-xs font-medium"
|
||||
style={{ color: "var(--color-primary, #2563eb)" }}
|
||||
>
|
||||
<span className="material-symbols-outlined" style={{ fontSize: 14 }}>
|
||||
open_in_new
|
||||
</span>
|
||||
Browse all skills on GitHub
|
||||
</a>
|
||||
</div>
|
||||
|
||||
{/* API Skills */}
|
||||
<SkillSection
|
||||
title="API Skills"
|
||||
subtitle={`${apiSkills.length} skills — control OmniRoute via REST / HTTP`}
|
||||
icon="api"
|
||||
skills={apiSkills}
|
||||
/>
|
||||
|
||||
{/* CLI Skills */}
|
||||
<SkillSection
|
||||
title="CLI Skills"
|
||||
subtitle={`${cliSkills.length} skills — control OmniRoute via the omniroute terminal binary`}
|
||||
icon="terminal"
|
||||
skills={cliSkills}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -672,6 +672,8 @@
|
||||
"cloudAgents": "Cloud Agents",
|
||||
"memory": "Memory",
|
||||
"skills": "Skills",
|
||||
"omniSkills": "OmniSkills",
|
||||
"agentSkills": "AgentSkills",
|
||||
"docs": "Docs",
|
||||
"issues": "Issues",
|
||||
"endpoints": "Endpoints",
|
||||
|
||||
201
src/shared/constants/agentSkills.ts
Normal file
201
src/shared/constants/agentSkills.ts
Normal file
@@ -0,0 +1,201 @@
|
||||
// Agent Skills metadata — single source of truth for /dashboard/agent-skills.
|
||||
// Each skill = 1 raw GitHub URL the user copies and pastes to any AI agent.
|
||||
|
||||
const REPO = "diegosouzapw/OmniRoute";
|
||||
const BRANCH = "main";
|
||||
const SKILL_PATH = "skills";
|
||||
|
||||
export const AGENT_SKILLS_REPO_URL = `https://github.com/${REPO}`;
|
||||
export const AGENT_SKILLS_RAW_BASE = `https://raw.githubusercontent.com/${REPO}/refs/heads/${BRANCH}/${SKILL_PATH}`;
|
||||
export const AGENT_SKILLS_BLOB_BASE = `https://github.com/${REPO}/blob/${BRANCH}/${SKILL_PATH}`;
|
||||
|
||||
export interface AgentSkill {
|
||||
id: string;
|
||||
name: string;
|
||||
description: string;
|
||||
endpoint: string | null;
|
||||
icon: string;
|
||||
category: "api" | "cli";
|
||||
isEntry?: boolean;
|
||||
isNew?: boolean;
|
||||
}
|
||||
|
||||
export const AGENT_SKILLS: AgentSkill[] = [
|
||||
// ── API Skills ──────────────────────────────────────────────────────────────
|
||||
{
|
||||
id: "omniroute",
|
||||
name: "OmniRoute (Entry)",
|
||||
description:
|
||||
"Setup + index of all capabilities. Start here — covers base URL, auth, model discovery, and links to every capability skill.",
|
||||
endpoint: null,
|
||||
icon: "hub",
|
||||
category: "api",
|
||||
isEntry: true,
|
||||
},
|
||||
{
|
||||
id: "omniroute-chat",
|
||||
name: "Chat",
|
||||
description: "Chat / code-gen via OpenAI or Anthropic format with streaming and reasoning.",
|
||||
endpoint: "/v1/chat/completions",
|
||||
icon: "chat",
|
||||
category: "api",
|
||||
},
|
||||
{
|
||||
id: "omniroute-image",
|
||||
name: "Image Generation",
|
||||
description: "Text-to-image via DALL-E, Imagen, FLUX, MiniMax, SDWebUI, and more.",
|
||||
endpoint: "/v1/images/generations",
|
||||
icon: "image",
|
||||
category: "api",
|
||||
},
|
||||
{
|
||||
id: "omniroute-tts",
|
||||
name: "Text-to-Speech",
|
||||
description: "OpenAI / ElevenLabs / Edge / Google / Deepgram voices.",
|
||||
endpoint: "/v1/audio/speech",
|
||||
icon: "record_voice_over",
|
||||
category: "api",
|
||||
},
|
||||
{
|
||||
id: "omniroute-stt",
|
||||
name: "Speech-to-Text",
|
||||
description:
|
||||
"Transcribe audio via OpenAI Whisper, Groq, Gemini, Deepgram, AssemblyAI, and more.",
|
||||
endpoint: "/v1/audio/transcriptions",
|
||||
icon: "mic",
|
||||
category: "api",
|
||||
},
|
||||
{
|
||||
id: "omniroute-embeddings",
|
||||
name: "Embeddings",
|
||||
description: "Vectors for RAG / semantic search via OpenAI, Gemini, Mistral, and more.",
|
||||
endpoint: "/v1/embeddings",
|
||||
icon: "scatter_plot",
|
||||
category: "api",
|
||||
},
|
||||
{
|
||||
id: "omniroute-web-search",
|
||||
name: "Web Search",
|
||||
description: "Tavily / Exa / Brave / Serper / SearXNG / Google PSE / You.com.",
|
||||
endpoint: "/v1/search",
|
||||
icon: "search",
|
||||
category: "api",
|
||||
},
|
||||
{
|
||||
id: "omniroute-web-fetch",
|
||||
name: "Web Fetch",
|
||||
description: "URL → markdown / text / HTML via Firecrawl, Jina, Tavily, Exa.",
|
||||
endpoint: "/v1/web/fetch",
|
||||
icon: "language",
|
||||
category: "api",
|
||||
},
|
||||
{
|
||||
id: "omniroute-mcp",
|
||||
name: "MCP Server",
|
||||
description:
|
||||
"37 tools over SSE/stdio/HTTP: routing, cache, compression, memory, skills, providers, audit.",
|
||||
endpoint: "/api/mcp/sse",
|
||||
icon: "electrical_services",
|
||||
category: "api",
|
||||
},
|
||||
{
|
||||
id: "omniroute-a2a",
|
||||
name: "A2A Protocol",
|
||||
description:
|
||||
"JSON-RPC 2.0 agent-to-agent server with 5 built-in skills: smart-routing, quota, discovery, cost, health.",
|
||||
endpoint: "/a2a",
|
||||
icon: "device_hub",
|
||||
category: "api",
|
||||
},
|
||||
{
|
||||
id: "omniroute-routing",
|
||||
name: "Routing & Combos",
|
||||
description:
|
||||
"Create and configure routing combos, 14 strategies, Auto-combo scoring, and fallback chains.",
|
||||
endpoint: "/api/combos",
|
||||
icon: "route",
|
||||
category: "api",
|
||||
isNew: true,
|
||||
},
|
||||
{
|
||||
id: "omniroute-compression",
|
||||
name: "Compression",
|
||||
description:
|
||||
"RTK (command output), Caveman (prose), stacked mode, and MCP accessibility-tree filter. Save 60–90% tokens.",
|
||||
endpoint: "/api/settings/compression",
|
||||
icon: "compress",
|
||||
category: "api",
|
||||
isNew: true,
|
||||
},
|
||||
{
|
||||
id: "omniroute-monitoring",
|
||||
name: "Monitoring & Health",
|
||||
description:
|
||||
"Health endpoints, circuit breakers, provider metrics (p50/p95/p99), budget guard, and MCP monitoring tools.",
|
||||
endpoint: "/api/monitoring/health",
|
||||
icon: "monitor_heart",
|
||||
category: "api",
|
||||
isNew: true,
|
||||
},
|
||||
|
||||
// ── CLI Skills ───────────────────────────────────────────────────────────────
|
||||
{
|
||||
id: "omniroute-cli",
|
||||
name: "CLI (Entry)",
|
||||
description:
|
||||
"Install, global flags (--output, --base-url, --api-key), environment variables, and index of all CLI capability skills.",
|
||||
endpoint: null,
|
||||
icon: "terminal",
|
||||
category: "cli",
|
||||
isEntry: true,
|
||||
isNew: true,
|
||||
},
|
||||
{
|
||||
id: "omniroute-cli-admin",
|
||||
name: "CLI Admin",
|
||||
description:
|
||||
"Server lifecycle (start/stop/restart), non-interactive setup, doctor diagnostics, backup/restore, autostart, and tunnels.",
|
||||
endpoint: null,
|
||||
icon: "manage_accounts",
|
||||
category: "cli",
|
||||
isNew: true,
|
||||
},
|
||||
{
|
||||
id: "omniroute-cli-providers",
|
||||
name: "CLI Providers & Keys",
|
||||
description:
|
||||
"Add/test/remove provider connections, manage API keys, rotate credentials, OAuth flows, list models, and manage combos.",
|
||||
endpoint: null,
|
||||
icon: "key",
|
||||
category: "cli",
|
||||
isNew: true,
|
||||
},
|
||||
{
|
||||
id: "omniroute-cli-cloud",
|
||||
name: "CLI Cloud Agents",
|
||||
description:
|
||||
"Control Codex, Devin, and Jules cloud agents — create tasks, track status, approve plans, send messages, and view sources.",
|
||||
endpoint: null,
|
||||
icon: "cloud_sync",
|
||||
category: "cli",
|
||||
isNew: true,
|
||||
},
|
||||
{
|
||||
id: "omniroute-cli-eval",
|
||||
name: "CLI Evals",
|
||||
description:
|
||||
"Create and run eval suites, watch live benchmark progress, view scorecards, compare models, and integrate with CI.",
|
||||
endpoint: null,
|
||||
icon: "science",
|
||||
category: "cli",
|
||||
isNew: true,
|
||||
},
|
||||
];
|
||||
|
||||
export function getAgentSkillRawUrl(id: string): string {
|
||||
return `${AGENT_SKILLS_RAW_BASE}/${id}/SKILL.md`;
|
||||
}
|
||||
|
||||
export function getAgentSkillBlobUrl(id: string): string {
|
||||
return `${AGENT_SKILLS_BLOB_BASE}/${id}/SKILL.md`;
|
||||
}
|
||||
@@ -17,6 +17,7 @@ export const HIDEABLE_SIDEBAR_ITEM_IDS = [
|
||||
"cloud-agents",
|
||||
"memory",
|
||||
"skills",
|
||||
"agent-skills",
|
||||
"translator",
|
||||
"playground",
|
||||
"media",
|
||||
@@ -72,7 +73,8 @@ const CLI_SIDEBAR_ITEMS: readonly SidebarItemDefinition[] = [
|
||||
{ id: "agents", href: "/dashboard/agents", i18nKey: "agents", icon: "smart_toy" },
|
||||
{ id: "cloud-agents", href: "/dashboard/cloud-agents", i18nKey: "cloudAgents", icon: "cloud" },
|
||||
{ id: "memory", href: "/dashboard/memory", i18nKey: "memory", icon: "psychology" },
|
||||
{ id: "skills", href: "/dashboard/skills", i18nKey: "skills", icon: "auto_fix_high" },
|
||||
{ id: "skills", href: "/dashboard/skills", i18nKey: "omniSkills", icon: "auto_fix_high" },
|
||||
{ id: "agent-skills", href: "/dashboard/agent-skills", i18nKey: "agentSkills", icon: "share" },
|
||||
];
|
||||
|
||||
const CONTEXT_SIDEBAR_ITEMS: readonly SidebarItemDefinition[] = [
|
||||
|
||||
Reference in New Issue
Block a user