|
|
|
|
@@ -1,6 +1,53 @@
|
|
|
|
|
"""Sovereign orchestration — Huey replaces 3,843 lines of homebrew."""
|
|
|
|
|
|
|
|
|
|
from huey import SqliteHuey, crontab
|
|
|
|
|
import json
|
|
|
|
|
import os
|
|
|
|
|
from datetime import datetime, timezone
|
|
|
|
|
from pathlib import Path
|
|
|
|
|
|
|
|
|
|
from huey import SqliteHuey, signals
|
|
|
|
|
|
|
|
|
|
huey = SqliteHuey(filename=str(Path.home() / ".hermes" / "orchestration.db"))
|
|
|
|
|
|
|
|
|
|
# === Token Tracking ===
|
|
|
|
|
TOKEN_LOG = Path.home() / ".hermes" / "token_usage.jsonl"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def log_token_usage(task_name, result):
|
|
|
|
|
"""Log token usage from a completed pipeline task.
|
|
|
|
|
|
|
|
|
|
Reads input_tokens/output_tokens from the agent result dict.
|
|
|
|
|
Auto-detects pipeline name from task context.
|
|
|
|
|
Appends to JSONL for downstream analysis.
|
|
|
|
|
"""
|
|
|
|
|
if not isinstance(result, dict):
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
input_tokens = result.get("input_tokens", 0)
|
|
|
|
|
output_tokens = result.get("output_tokens", 0)
|
|
|
|
|
|
|
|
|
|
if input_tokens == 0 and output_tokens == 0:
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
# Auto-detect pipeline name from task function name
|
|
|
|
|
pipeline = task_name.replace("_task", "").replace("_", "-")
|
|
|
|
|
|
|
|
|
|
entry = {
|
|
|
|
|
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
|
|
|
"pipeline": pipeline,
|
|
|
|
|
"input_tokens": input_tokens,
|
|
|
|
|
"output_tokens": output_tokens,
|
|
|
|
|
"total_tokens": input_tokens + output_tokens,
|
|
|
|
|
"task": task_name,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TOKEN_LOG.parent.mkdir(parents=True, exist_ok=True)
|
|
|
|
|
with open(TOKEN_LOG, "a") as f:
|
|
|
|
|
f.write(json.dumps(entry) + "\n")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@huey.signal(signals.SIGNAL_COMPLETE)
|
|
|
|
|
def on_task_complete(signal, task, task_value=None, **kwargs):
|
|
|
|
|
"""Huey hook: log token usage after each pipeline task completes."""
|
|
|
|
|
task_name = getattr(task, "name", "unknown")
|
|
|
|
|
log_token_usage(task_name, task_value)
|
|
|
|
|
|