OMP-native provider extension for the Kiro API. Models and capabilities are discovered live from Kiro's ListAvailableModels endpoint, including Claude adaptive thinking and GPT reasoning controls when advertised by each model's schema.
Self-contained: it bundles its own runtime dependencies and has no dependency on @earendil-works/* packages or OMP TUI internals.
- OMP ≥ 17.0.9 (tested against 17.1.4)
- Kiro CLI (recommended for credential reuse) — install guide
omp plugin install github:ajdiyassin/omp-extension-kiroThe extension is self-contained: dist/index.js is committed and has no runtime dependencies beyond Node builtins.
omp --list-models 2>&1 | Select-String -Pattern "kiro|Failed to load extension"omp plugin install github:ajdiyassin/omp-extension-kiro
omp plugin uninstall omp-provider-kiroInstallation enables the plugin automatically. Toggle it manually with:
omp plugin enable omp-provider-kiro
omp plugin disable omp-provider-kirobun install
bun run build
omp plugin install .If Kiro CLI is installed and logged in, the extension reuses its valid local bearer for discovery and streaming; no separate /login is required.
kiro-cli whoami
ompSet KIRO_API_KEY to use paid-tier API-key authentication. API keys do not require a profile ARN and default to us-east-1; override routing with KIRO_API_REGION when needed.
$env:KIRO_API_KEY = "<your-key>"
omp/login kiro
Prompt: Paste IAM Identity Center URL, or blank for Builder ID
- Blank → AWS Builder ID device-code flow
- URL → IAM Identity Center with auto-region detection
- Google/GitHub → delegated to Kiro CLI social login
Use /model and select the kiro provider. Kiro's auto model is normally the default entry:
/model kiro/auto
The extension does not maintain a model allowlist. It asks Kiro for the models available to the current credential/profile and preserves the returned IDs exactly. Examples from the sanitized Kiro CLI 2.13.1 fixture include:
kiro/claude-sonnet-5
kiro/claude-opus-4.8
kiro/gpt-5.6-sol
kiro/deepseek-3.2
kiro/auto
This is important for IDs such as gpt-5.6-sol: numeric dots are not rewritten. A small explicit alias map remains only for selectors emitted by older extension releases, such as claude-opus-4-8 → claude-opus-4.8.
OMP owns the discovery lifecycle:
- 15-second extension discovery timeout
- 24-hour SQLite model cache
- Background startup refresh
- Provider refresh from
/model - Cached-catalog retention when a refresh fails
A first discovery requires KIRO_API_KEY, a valid Kiro CLI session, or credentials saved by /login kiro.
Reasoning controls are derived from each live additionalModelRequestFieldsSchema, not from model IDs. Schema-less models receive no configurable reasoning fields; this does not claim that they cannot reason internally.
For models advertising Anthropic adaptive thinking, requests use:
{
"thinking": { "type": "adaptive", "display": "summarized" },
"output_config": { "effort": "high" },
"max_tokens": 128000
}Supported effort tiers and defaults come from Kiro's live schema. The 2.13.1 fixture reports:
| Model | Efforts | Kiro default | Combined max_tokens cap |
|---|---|---|---|
| Claude Sonnet 5 | low, medium, high, xhigh, max | high | 128,000 |
| Claude Opus 4.8 | low, medium, high, xhigh, max | high | 128,000 |
| Claude Opus 4.7 | low, medium, high, xhigh, max | xhigh | 128,000 |
| Claude Opus 4.6 | low, medium, high, max | high | 64,000 |
| Claude Sonnet 4.6 | low, medium, high, max | high | 64,000 |
OMP minimal maps to the lowest advertised Claude tier. If OMP requests an unsupported intermediate tier, it clamps upward to the next supported tier (xhigh → max on a four-tier model).
max_tokens is one hard ceiling for internal thinking plus visible text/tool-call output. It is not a separate thinking budget. For Sonnet 5, Kiro's generic catalog simultaneously reports tokenLimits.maxOutputTokens: 64000 while its model-specific adaptive schema accepts max_tokens through 128,000. The extension uses the schema maximum as the combined adaptive request cap; it does not promise 128K of visible text.
Models advertising Kiro's GPT reasoning schema use:
{
"reasoning": {
"mode": "standard",
"effort": "high"
}
}OMP minimal maps to GPT none; other advertised levels are preserved. Kiro's separate pro mode is not exposed yet because OMP's thinking selector has no second mode control.
| Variable | Default | Behavior |
|---|---|---|
KIRO_ADAPTIVE_THINKING |
enabled | 0/false disables Claude adaptive fields; GPT reasoning is unaffected |
KIRO_ADAPTIVE_FIELDS |
full |
Claude only: full or effort-only |
KIRO_ADAPTIVE_PAYLOAD_SHAPE |
top-level-wrapper |
top-level-wrapper, top-level-direct, user-input-message, or user-input-context |
The Kiro runtime accepts windows, macos, or linux for envState.operatingSystem; the extension maps Node's win32 value to windows.
When Kiro reports stream metrics, the extension maps real input, output, cache-read, cache-creation, and reasoning-token counts into OMP's native usage metadata. OMP uses the measured full-call duration and time to first model output to render TTFT and tokens/second. Missing input/output metrics retain the existing context-percentage/tokenizer fallbacks; cache hits are never estimated, so the cache indicator appears only for provider-reported cache reads.
The extension follows the current Kiro management/runtime API used by the captured Kiro CLI 2.13.1 behavior:
- Streaming:
https://runtime.{region}.kiro.dev/—GenerateAssistantResponse - Models/profile:
https://management.{region}.kiro.dev/—ListAvailableModels,ListAvailableProfiles
{region} is derived from the validated OAuth profile or API-key configuration. us-east-1 and eu-central-1 are bootstrap regions when profile discovery has no routing hint; they are not an allowlist, so a valid future profile region passes through unchanged. OAuth profile identifiers remain in memory and are never written to the model fixture. The legacy q.{region}.amazonaws.com endpoint is not used for requests.
Kiro requires tool-use IDs to match ^[a-zA-Z0-9_-]+$. When resuming sessions from providers that emit other characters, the extension rewrites IDs to deterministic call_<hash> values only while serializing the outgoing request. Tool-call/result pairing is preserved and stored OMP sessions are not modified. Set KIRO_DEBUG=1 to inspect normalization diagnostics.
The extension checks both locations:
%LOCALAPPDATA%\Kiro-Cli\data.sqlite3(newer installations)%APPDATA%\kiro-cli\data.sqlite3(older installations)
No symlinks or junctions are required.
- OMP-native discovery —
fetchDynamicModelsplus OMP's SQLite cache and/modelrefresh. - Fail-closed management parsing — unknown response fields/schema families reject a refresh rather than publishing a partial catalog.
- Canonical thinking metadata — Kiro schemas are converted to OMP
thinkingmetadata so controls survive cache/restart. - Self-contained bundle —
dist/index.jsbundles runtime dependencies; onlynode:*imports remain external. - Type-only OMP imports — OMP packages are development dependencies.
- No TUI dependency — login uses OMP's built-in prompt mechanism.
bun install
bun run check
bun run test
bun run buildCapture a new identity-free fixture only when intentionally updating discovery research:
bun run probe:modelsThe probe never writes request headers, bearer/refresh tokens, profile identifiers, account identifiers, emails, ARNs, or machine paths.
kiro-cli whoamiIf the provider has no models on first install, authenticate and refresh the Kiro provider from /model. A failed refresh should leave OMP's previous cached catalog available.
omp plugin uninstall omp-provider-kiro
Remove-Item "$env:USERPROFILE\.omp\plugins\node_modules\omp-provider-kiro" -Recurse -Force -ErrorAction SilentlyContinue
omp plugin install .If you previously used the pi-provider-kiro plugin, remove it so the two do not both register a Kiro provider:
omp plugin uninstall pi-provider-kiro
Remove-Item "$env:USERPROFILE\.omp\plugins\node_modules\pi-provider-kiro" -Recurse -Force -ErrorAction SilentlyContinueMIT.
Portions of this project originate from mikeyobrien/pi-provider-kiro, also MIT licensed. This repository is now standalone and does not track that project.