Persistent Anthropic cost tracking to disk
Cost survives service restarts via /var/log/mc_anthropic_cost.json. Saves after every API call. POS receipt prints at each $1 milestone. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
+32
-1
@@ -2017,7 +2017,23 @@ def _llm_call(model: str, system: str, user: str, config: dict,
|
|||||||
# --- Anthropic API cost tracking ---
|
# --- Anthropic API cost tracking ---
|
||||||
|
|
||||||
_anthropic_cost_lock = threading.Lock()
|
_anthropic_cost_lock = threading.Lock()
|
||||||
_anthropic_total_cost = 0.0
|
_anthropic_cost_file = "/var/log/mc_anthropic_cost.json"
|
||||||
|
|
||||||
|
def _load_anthropic_cost():
|
||||||
|
try:
|
||||||
|
with open(_anthropic_cost_file) as f:
|
||||||
|
return json.load(f).get("total_cost", 0.0)
|
||||||
|
except:
|
||||||
|
return 0.0
|
||||||
|
|
||||||
|
_anthropic_total_cost = _load_anthropic_cost()
|
||||||
|
|
||||||
|
def _save_anthropic_cost():
|
||||||
|
try:
|
||||||
|
with open(_anthropic_cost_file, "w") as f:
|
||||||
|
json.dump({"total_cost": _anthropic_total_cost, "updated": time.strftime("%Y-%m-%dT%H:%M:%SZ")}, f)
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
def _get_anthropic_cost():
|
def _get_anthropic_cost():
|
||||||
with _anthropic_cost_lock:
|
with _anthropic_cost_lock:
|
||||||
@@ -2072,6 +2088,7 @@ def _anthropic_call(model: str, system: str, user: str, config: dict,
|
|||||||
with _anthropic_cost_lock:
|
with _anthropic_cost_lock:
|
||||||
prev_dollar = int(_anthropic_total_cost)
|
prev_dollar = int(_anthropic_total_cost)
|
||||||
_anthropic_total_cost += cost
|
_anthropic_total_cost += cost
|
||||||
|
_save_anthropic_cost()
|
||||||
curr_dollar = int(_anthropic_total_cost)
|
curr_dollar = int(_anthropic_total_cost)
|
||||||
if curr_dollar > prev_dollar:
|
if curr_dollar > prev_dollar:
|
||||||
log.info(f"Anthropic cost milestone: ${_anthropic_total_cost:.4f} / ${budget:.2f}")
|
log.info(f"Anthropic cost milestone: ${_anthropic_total_cost:.4f} / ${budget:.2f}")
|
||||||
@@ -3209,6 +3226,20 @@ def execute_response(response, context, config, praying_player=None):
|
|||||||
)
|
)
|
||||||
time.sleep(0.2)
|
time.sleep(0.2)
|
||||||
|
|
||||||
|
# Flash title on the praying player's screen
|
||||||
|
if praying_player and (commands or message):
|
||||||
|
try:
|
||||||
|
rcon(
|
||||||
|
f'title {praying_player} times 5 40 15',
|
||||||
|
config["rcon_host"], config["rcon_port"], config["rcon_password"]
|
||||||
|
)
|
||||||
|
rcon(
|
||||||
|
f'title {praying_player} title {{"text":"Your prayers have been answered!","color":"gold","bold":true}}',
|
||||||
|
config["rcon_host"], config["rcon_port"], config["rcon_password"]
|
||||||
|
)
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
fallback = praying_player or (context["online_players"][0] if context["online_players"] else "")
|
fallback = praying_player or (context["online_players"][0] if context["online_players"] else "")
|
||||||
max_cmds = config.get("max_commands_per_response", 6)
|
max_cmds = config.get("max_commands_per_response", 6)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user