Current collected state Current
Observed since 20 Oct, 22:04 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
agent-governor
Embedded multi-tenant Agent governance engine - cost attribution, declarative policies, and audit
轻量级 Agent 治理与执行中间件 —— 成本控制、审计追踪、模型路由、DAG 编排、可观测性。
# 核心功能
pip install agent-governor
# 全部可选功能(DAG + OTel + MCP + HTTP)
pip install agent-governor[all]
# 按需选择
pip install agent-governor[dag] # DAG 编排(networkx)
pip install agent-governor[telemetry] # OTel Tracing + Metrics
pip install agent-governor[mcp] # MCP 工具执行器
pip install agent-governor[redis] # Redis 状态后端
from agent_governor import Governor
governor = Governor(
budget_usd=10.0,
models=["gpt-4o", "qwen-plus"],
fallback_model="qwen-turbo",
)
response = await governor.execute(
messages=[{"role": "user", "content": "Hello!"}],
model="gpt-4o",
)
from agent_governor import Governor
from agent_governor.control import TaskGraph, SchemaGate
governor = Governor(budget_usd=5.0)
graph = TaskGraph("research_report")
graph.add_node("search", task=Task(name="web_search", metadata={"query": "..."}))
graph.add_node("analyze", task=Task(name="analyze"), depends_on=["search"])
graph.add_node("validate", task=Task(name="validate"), depends_on=["analyze"],
quality_gates=[SchemaGate(ReportModel)])
result = await governor.run_graph(graph)
governor = Governor(
budget_usd=10.0,
tracing_enabled=True,
otlp_endpoint="http://localhost:4317",
)
# 使用 async context manager 确保资源释放
async with governor:
result = await governor.execute(messages=[...], model="gpt-4o")
mcp.ClientSession.call_tool()agent-governor-report 命令行工具# 查看最近 7 天的成本报告
agent-governor-report --file audit.jsonl --last 7d --group-by model
# JSON 格式输出
agent-governor-report --file audit.jsonl --format json
src/agent_governor/
├── governor.py # 主入口
├── config.py # GovernorConfig 配置模型
├── models.py # Task / TaskResult 数据模型
├── protocols.py # Executor / QualityGate 协议定义
├── exceptions.py # 异常体系
├── control/ # 控制层:DAG、质量门、状态管理
├── data/ # 数据层:调度、熔断、并发、执行器
├── observability/ # 可观测层:Tracing、Metrics、审计、成本
└── cli/ # 命令行工具
# 创建环境
uv venv --python 3.12
uv pip install -e ".[dev]"
# 运行测试
pytest tests/ -q
# 静态检查
ruff check src/ tests/
mypy src/
# 本地构建文档站
uv pip install -e ".[docs]"
mkdocs serve
MIT
Download counts and popularity will appear here as the collector receives them.
| Package / target | Requirement | Relationship |
|---|---|---|
litellmEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | litellm<1.90,>=1.40 | runtime |
pydanticEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | pydantic<3,>=2.5 | runtime |
structlogEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | structlog>=24.1 | runtime |
networkxEnvironment{
"extras": "",
"marker": "extra == \"all\"",
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | networkx>=3.0; extra == "all" | runtime |
opentelemetry-apiEnvironment{
"extras": "",
"marker": "extra == \"all\"",
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | opentelemetry-api>=1.25; extra == "all" | runtime |
opentelemetry-exporter-otlpEnvironment{
"extras": "",
"marker": "extra == \"all\"",
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | opentelemetry-exporter-otlp>=1.25; extra == "all" | runtime |
opentelemetry-sdkEnvironment{
"extras": "",
"marker": "extra == \"all\"",
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | opentelemetry-sdk>=1.25; extra == "all" | runtime |
pyyamlEnvironment{
"extras": "",
"marker": "extra == \"all\"",
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | pyyaml>=6.0; extra == "all" | runtime |
redisEnvironment{
"extras": "hiredis",
"marker": "extra == \"all\"",
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | redis[hiredis]>=5.0; extra == "all" | runtime |
networkxEnvironment{
"extras": "",
"marker": "extra == \"dag\"",
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | networkx>=3.0; extra == "dag" | runtime |
mypyEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | mypy>=1.10; extra == "dev" | runtime |
pre-commitEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | pre-commit>=3.0; extra == "dev" | runtime |
pytest-asyncioEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | pytest-asyncio>=0.23; extra == "dev" | runtime |
pytest-covEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | pytest-cov>=5.0; extra == "dev" | runtime |
pytestEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | pytest>=8.0; extra == "dev" | runtime |
pyyamlEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | pyyaml>=6.0; extra == "dev" | runtime |
ruffEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | ruff>=0.4; extra == "dev" | runtime |
mkdocs-materialEnvironment{
"extras": "",
"marker": "extra == \"docs\"",
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | mkdocs-material>=9.5; extra == "docs" | runtime |
mkdocstringsEnvironment{
"extras": "python",
"marker": "extra == \"docs\"",
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | mkdocstrings[python]>=0.25; extra == "docs" | runtime |
httpxEnvironment{
"extras": "",
"marker": "extra == \"http\"",
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | httpx>=0.27; extra == "http" | runtime |
mcpEnvironment{
"extras": "",
"marker": "extra == \"mcp\"",
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | mcp>=1.0; extra == "mcp" | runtime |
pyyamlEnvironment{
"extras": "",
"marker": "extra == \"policy\"",
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | pyyaml>=6.0; extra == "policy" | runtime |
redisEnvironment{
"extras": "hiredis",
"marker": "extra == \"redis\"",
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | redis[hiredis]>=5.0; extra == "redis" | runtime |
opentelemetry-apiEnvironment{
"extras": "",
"marker": "extra == \"telemetry\"",
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | opentelemetry-api>=1.25; extra == "telemetry" | runtime |
opentelemetry-exporter-otlpEnvironment{
"extras": "",
"marker": "extra == \"telemetry\"",
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | opentelemetry-exporter-otlp>=1.25; extra == "telemetry" | runtime |
opentelemetry-sdkEnvironment{
"extras": "",
"marker": "extra == \"telemetry\"",
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | opentelemetry-sdk>=1.25; extra == "telemetry" | runtime |
bdist_wheel · 59.41 KB · Python py3
sdist · 263.71 KB · Python source
Shared repository data · GitHub
Observed since 20 Oct, 22:04 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package_version:e31efefdc3757ea13239f70d594445ed8a73c01de36e49ba7b8e15a293045f7e