4b6817381b
CI (OpenClaw E2E) / openclaw test (push) Has been cancelled
CI / coverage-report (push) Has been cancelled
CI / test-kubernetes (push) Has been cancelled
CI / should-run-thorough (push) Has been cancelled
CI / test-thorough (cloudwatch-demo) (push) Has been cancelled
CI / test-thorough (flink-ecs) (push) Has been cancelled
CI / test-thorough (upstream-lambda) (push) Has been cancelled
CI / test-thorough (prefect-ecs-fargate) (push) Has been cancelled
Release / build-binaries (zip, opensre.exe, onefile, windows-latest, windows-x64) (push) Has been cancelled
Benchmark image — build + push to ECR (any adapter) / build + push (push) Has been cancelled
CI / quality (ubuntu-latest) (push) Has been cancelled
CI / test (tools-runtime) (push) Has been cancelled
CI / test (e2e-general) (push) Has been cancelled
CI / test (cli-runtime) (push) Has been cancelled
CI / test (e2e-provider-and-openclaw) (push) Has been cancelled
CI / test (integrations-and-misc) (push) Has been cancelled
Release / verify (push) Has been cancelled
Release / build-python-dist (push) Has been cancelled
Release / build-binaries (tar.gz, opensre, onedir, macos-15-intel, darwin-x64) (push) Has been cancelled
Release / build-binaries (tar.gz, opensre, onedir, macos-latest, darwin-arm64) (push) Has been cancelled
Release / build-binaries (tar.gz, opensre, onedir, ubuntu-22.04, linux-x64) (push) Has been cancelled
Release / publish-release (push) Has been cancelled
Release / publish-main-release (push) Has been cancelled
Interactive Shell Live (PR + post-merge) / turn-checks (no-LLM) (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
Interactive Shell Live (PR + post-merge) / turn-live shard ${{ matrix.shard_index }} (push) Has been cancelled
Release / prepare (push) Has been cancelled
Release / build-binaries (tar.gz, opensre, onedir, ubuntu-22.04-arm, linux-arm64) (push) Has been cancelled
Synthetic Deterministic Tests / Synthetic offline (deterministic) (push) Has been cancelled
59 lines
1.7 KiB
Python
59 lines
1.7 KiB
Python
"""Canonical provider IDs and discovery-name to provider-ID mapping.
|
|
|
|
The provider-ID set is the shared contract every layer of the agents
|
|
stack agrees on: discovery classifies commands into these names,
|
|
the token source and meter registries key off the same names, and
|
|
``provider_for`` resolves an ``AgentRecord`` to one of them. Keeping
|
|
the constants and the small name-resolution helper here lets all of
|
|
those consumers depend on a single thin module instead of pulling in
|
|
the heavier discovery (``ps``, process dedupe, Cursor terminal
|
|
metadata) just to read a frozenset.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
KNOWN_PROVIDERS: frozenset[str] = frozenset(
|
|
{
|
|
"claude-code",
|
|
"codex",
|
|
"cursor",
|
|
"aider",
|
|
"gemini-cli",
|
|
"antigravity-cli",
|
|
"opencode",
|
|
"kimi",
|
|
"copilot",
|
|
}
|
|
)
|
|
|
|
# ``cursor-claude-code`` is the Anthropic extension wrapping the real
|
|
# ``claude`` binary with ``--output-format stream-json``; same NDJSON,
|
|
# same meter. The other cursor flavors emit plain text.
|
|
_CURSOR_FAMILY_TO_PROVIDER: dict[str, str] = {
|
|
"cursor-claude-code": "claude-code",
|
|
"cursor-agent-exec": "cursor",
|
|
"cursor-agent": "cursor",
|
|
}
|
|
|
|
|
|
def provider_from_classified_name(name: str) -> str | None:
|
|
"""Derive a canonical provider id from a discovery-style name."""
|
|
base = _strip_pid_suffix(name)
|
|
if base in _CURSOR_FAMILY_TO_PROVIDER:
|
|
return _CURSOR_FAMILY_TO_PROVIDER[base]
|
|
if base in KNOWN_PROVIDERS:
|
|
return base
|
|
return None
|
|
|
|
|
|
def _strip_pid_suffix(name: str) -> str:
|
|
if "-" not in name:
|
|
return name
|
|
base, _, tail = name.rpartition("-")
|
|
if tail.isdigit():
|
|
return base
|
|
return name
|
|
|
|
|
|
__all__ = ["KNOWN_PROVIDERS", "provider_from_classified_name"]
|