79 lines
2.5 KiB
Python
79 lines
2.5 KiB
Python
#!/usr/bin/env python3
|
|
"""校验中台 Skill 注册表与设备端 Skill 类 public method 对齐"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import inspect
|
|
import json
|
|
import sys
|
|
import time
|
|
from pathlib import Path
|
|
|
|
ROOT = Path(__file__).resolve().parents[1]
|
|
sys.path.insert(0, str(ROOT / "app"))
|
|
sys.path.insert(0, str(ROOT / "agent"))
|
|
|
|
from services.brain_skill_registry import DEVICE_EXECUTABLE_SCRIPTS, SKILL_REGISTRY, flatten_actions # noqa: E402
|
|
|
|
SKIP_METHODS = frozenset({
|
|
"execute_compound_task", "send_message_with_vision", "send_message_with_search",
|
|
"get_current_screen_info",
|
|
})
|
|
|
|
|
|
def _public_methods(cls) -> set[str]:
|
|
return {
|
|
n for n, m in inspect.getmembers(cls, predicate=inspect.isfunction)
|
|
if not n.startswith("_") and n not in SKIP_METHODS
|
|
}
|
|
|
|
|
|
def main() -> int:
|
|
from skills import get_skill # noqa: WPS433
|
|
|
|
missing_on_device: list[str] = []
|
|
extra_on_device: list[str] = []
|
|
ok = 0
|
|
|
|
for script in sorted(DEVICE_EXECUTABLE_SCRIPTS):
|
|
registry_actions = set(flatten_actions(script))
|
|
try:
|
|
cls = get_skill(script)
|
|
except ImportError as e:
|
|
print(f"❌ {script}: 无法加载 Skill 类: {e}")
|
|
return 1
|
|
device_actions = _public_methods(cls)
|
|
for action in sorted(registry_actions):
|
|
if action not in device_actions:
|
|
missing_on_device.append(f"{script}.{action}")
|
|
else:
|
|
ok += 1
|
|
for action in sorted(device_actions - registry_actions):
|
|
extra_on_device.append(f"{script}.{action}")
|
|
|
|
report = {
|
|
"timestamp": time.strftime("%Y-%m-%dT%H:%M:%S"),
|
|
"registry_actions_checked": ok,
|
|
"missing_on_device": missing_on_device,
|
|
"extra_on_device_not_in_registry": extra_on_device,
|
|
"complete": len(missing_on_device) == 0,
|
|
}
|
|
out = ROOT / "tmp" / f"skill_registry_audit_{int(time.time())}.json"
|
|
out.parent.mkdir(parents=True, exist_ok=True)
|
|
out.write_text(json.dumps(report, ensure_ascii=False, indent=2), encoding="utf-8")
|
|
|
|
print(f"registry 校验 action 数: {ok}")
|
|
print(f"设备缺失: {len(missing_on_device)}")
|
|
print(f"注册表未收录(设备有): {len(extra_on_device)}")
|
|
if missing_on_device:
|
|
print("缺失示例:", missing_on_device[:10])
|
|
if extra_on_device:
|
|
print("未收录示例:", extra_on_device[:10])
|
|
print("完整对齐:", "✅" if report["complete"] else "❌")
|
|
print("报告:", out)
|
|
return 0 if report["complete"] else 1
|
|
|
|
|
|
if __name__ == "__main__":
|
|
raise SystemExit(main())
|