示例
带日志的基本用法
from toolregistry import ToolRegistry
# 创建注册表
registry = ToolRegistry()
# 注册工具
@registry.register
def greet(name: str) -> str:
"""按名称问候某人。"""
return f"你好,{name}!"
@registry.register
def calculate(a: int, b: int, op: str = "add") -> int:
"""执行计算。"""
if op == "add":
return a + b
elif op == "subtract":
return a - b
else:
raise ValueError(f"未知操作: {op}")
# 启用执行日志
registry.enable_logging(max_entries=1000)
# 启用管理面板
info = registry.enable_admin(port=8081)
print(f"管理面板: {info.url}")
# 保持脚本运行
import time
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
registry.disable_admin()
远程访问配置
from toolregistry import ToolRegistry
import os
registry = ToolRegistry()
# ... 注册工具 ...
# 从环境获取令牌或生成
token = os.environ.get("ADMIN_TOKEN")
# 启用远程访问
info = registry.enable_admin(
port=8081,
remote=True,
auth_token=token # None = 自动生成
)
print(f"管理面板: {info.url}")
if info.token:
print(f"令牌: {info.token}")
与 FastAPI 集成
from fastapi import FastAPI
from toolregistry import ToolRegistry
from contextlib import asynccontextmanager
registry = ToolRegistry()
# 注册工具
@registry.register
def my_tool(x: int) -> int:
return x * 2
@asynccontextmanager
async def lifespan(app: FastAPI):
# 启动时启用管理面板
info = registry.enable_admin(port=8082)
print(f"管理面板: {info.url}")
yield
# 关闭时禁用
registry.disable_admin()
app = FastAPI(lifespan=lifespan)
@app.post("/execute")
async def execute_tool(name: str, args: dict):
tool = registry.get_callable(name)
if tool:
return {"result": tool(**args)}
return {"error": "工具未找到"}
执行日志分析
from toolregistry import ToolRegistry
from toolregistry.admin import ExecutionStatus
registry = ToolRegistry()
log = registry.enable_logging()
# ... 执行工具 ...
# 分析执行模式
stats = log.get_stats()
print(f"总执行次数: {stats['total_entries']}")
print(f"成功率: {stats['by_status'].get('success', 0) / stats['total_entries'] * 100:.1f}%")
print(f"平均耗时: {stats['avg_duration_ms']:.2f}ms")
# 查找执行最多的工具
by_tool = stats['by_tool']
print("\n按工具统计执行次数:")
for tool_name, count in sorted(by_tool.items(), key=lambda x: -x[1]):
print(f" {tool_name}: {count}")
# 获取最近的错误
errors = log.get_entries(status=ExecutionStatus.ERROR, limit=5)
for entry in errors:
print(f"{entry.tool_name} 中的错误: {entry.error}")
停止管理面板
# 停止管理面板
registry.disable_admin()
# 检查是否运行中
info = registry.get_admin_info()
if info:
print(f"仍在运行: {info.url}")
else:
print("管理面板已停止")