#!/usr/bin/env bash set -euo pipefail ssh -o BatchMode=yes eventhub-ift bash -s <<'REMOTE' set -euo pipefail cd /opt/ai-router-stack set -a; source .env; set +a BASE="${PUBLIC_URL:-https://ai-router.ift.calentiq.com}" KEY="${ROUTER_API_KEY:-$LITELLM_MASTER_KEY}" PLAN=$(python3 - <<'PY' import json d=json.load(open("/tmp/agent-plan.json")) msg=(d.get("choices") or [{}])[0].get("message") or {} print(msg.get("content") or "") PY ) # Approve with tools like Zed agent python3 - <<'PY' > /tmp/agent-approve-req.json import json plan=open("/tmp/agent-plan.json").read() d=json.loads(plan) content=((d.get("choices") or [{}])[0].get("message") or {}).get("content") or "" tools=[{ "type":"function", "function":{ "name":"read_file", "description":"Read a file", "parameters":{"type":"object","properties":{"path":{"type":"string"}},"required":["path"]} } },{ "type":"function", "function":{ "name":"edit_file", "description":"Edit a file", "parameters":{"type":"object","properties":{ "path":{"type":"string"}, "edits":{"type":"array","items":{"type":"object","properties":{ "old_text":{"type":"string"},"new_text":{"type":"string"} }}} },"required":["path","edits"]} } }] body={ "model":"smart-router", "stream": False, "tools": tools, "tool_choice":"auto", "messages":[ {"role":"user","content":"observer.ift.calentiq.com не работает - Bad Gateway почини"}, {"role":"assistant","content":content}, {"role":"user","content":"ok"} ] } json.dump(body, open("/tmp/agent-approve-req.json","w"), ensure_ascii=False) print("req bytes", len(json.dumps(body))) PY echo "== approve+tools ==" curl -sS --max-time 180 "$BASE/v1/chat/completions" \ -H "Authorization: Bearer $KEY" \ -H "Content-Type: application/json" \ -H "X-AI-Orchestrate: force" \ -H "X-AI-Quality: balanced" \ -d @/tmp/agent-approve-req.json | tee /tmp/agent-exec1.json | python3 -c ' import json,sys d=json.load(sys.stdin) ch=(d.get("choices") or [{}])[0] msg=ch.get("message") or {} print("finish", ch.get("finish_reason")) print("content", (msg.get("content") or "")[:1200]) tcs=msg.get("tool_calls") or [] print("tool_calls", len(tcs)) for tc in tcs: fn=tc.get("function") or {} print(" TOOL", fn.get("name"), (fn.get("arguments") or "")[:300]) meta=d.get("x_router_meta") or {} print("meta phase", meta.get("agent_phase"), "force_edit", meta.get("executor_force_edit_after_read"), "model", meta.get("executor_model") or meta.get("selected_model")) ' echo "== router log since approve ==" docker service logs --since 3m --raw ai-router_router 2>&1 \ | grep -iE 'path_index|force edit|stop after|hierarchical_agent|executor result|kickstart|phase=' \ | tail -30 REMOTE