README.md

rumilo

Rumilo is a CLI that dispatches specialized research subagents. It supports two modes:

  • web for web research (search + fetch, stored in a sandboxed workspace)
  • repo for git repository exploration (clone to workspace, git-aware tools)

Requirements

  • Bun
  • Git (for repo mode)
  • Kagi session token
  • Tabstack API key

Configuration

Rumilo reads configuration from $XDG_CONFIG_HOME/rumilo/config.toml.

Example:

[defaults]
model = "anthropic:claude-sonnet-4-20250514"
cleanup = true

[web]
model = "anthropic:claude-sonnet-4-20250514"

[repo]
model = "anthropic:claude-sonnet-4-20250514"

Custom Models

You can define custom OpenAI-compatible endpoints like Ollama, vLLM, or self-hosted models in the [custom_models] section:

[custom_models.ollama]
provider = "ollama"
api = "openai-completions"
base_url = "http://localhost:11434/v1"
api_key = "ollama"
id = "ollama/llama3"
name = "Llama 3 (Ollama)"
reasoning = false
input = ["text"]
cost = { input = 0, output = 0 }
context_window = 128000
max_tokens = 4096

Use custom models with the custom: prefix:

rumilo web "query" --model custom:ollama
rumilo repo -u <uri> "query" --model custom:ollama

Custom Model Fields

  • provider: Provider identifier (e.g., "ollama", "custom")
  • api: API type - typically "openai-completions"
  • base_url: API endpoint URL
  • api_key: API key (see value resolution below)
  • id: Unique model identifier
  • name: Human-readable display name
  • reasoning: Whether the model supports thinking/reasoning
  • input: Input modalities - ["text"] or ["text", "image"]
  • cost: Cost per million tokens (can use 0 for local models)
  • context_window: Maximum context size in tokens
  • max_tokens: Maximum output tokens
  • headers: Optional custom HTTP headers (values support same resolution as api_key)

Value Resolution

The api_key and headers fields support three formats, following pi-coding-agent conventions:

  • Environment variable name: bare name is checked as env var, then used as literal
    api_key = "MY_API_KEY"   # resolves process.env.MY_API_KEY, or literal "MY_API_KEY"
    
  • Env var reference: explicit $VAR or ${VAR}
    api_key = "$MY_API_KEY"  # always resolves from env
    
  • Shell command: !command executes and uses stdout
    api_key = "!security find-generic-password -ws 'my-api'"
    

Compatibility Flags (Optional)

Some OpenAI-compatible endpoints have quirks. Use the compat section to override:

[custom_models.mistral]
provider = "mistral"
api = "openai-completions"
base_url = "https://api.mistral.ai/v1"
# ... other fields ...

[custom_models.mistral.compat]
max_tokens_field = "max_tokens"
requires_tool_result_name = true
requires_thinking_as_text = true
requires_mistral_tool_ids = true

See pi-ai documentation for all compat flags.

Credentials

Set credentials either via config or environment:

  • KAGI_SESSION_TOKEN: Kagi session token
  • TABSTACK_API_KEY: Tabstack API key

Usage

rumilo web "how does X work"
rumilo web -u https://example.com/docs "explain the auth flow"
rumilo repo -u https://github.com/org/repo "how is caching implemented"