feat(agents): automatic model fallback when Ollama Cloud is exhausted
ci / lint (pull_request) Successful in 13s
ci / lint (pull_request) Successful in 13s
Keep ollama-cloud/* as primary. Each agent may declare fallback in agents.json (xai-oc/grok-*). On quota/auth/provider failure, run-agent switches once to the fallback and continues retries. - agents.json: fallback fields for pm/junior/senior/qa/intern - route.sh: emit fallback to GITHUB_OUTPUT - agent.yml: pass FALLBACK env into run-agent - install-opencode.sh: register primary+fallback models in provider maps - run-agent.sh: failover on quota/credit/429/capacity-class errors
This commit is contained in:
@@ -186,6 +186,16 @@ rc=1
|
||||
# instance-wide. 20 min is far above any legitimate attempt. timeout SIGTERMs, then SIGKILLs 30s
|
||||
# later. rc=124 (timed out) is NOT retried — a hung backend stays hung; fail fast, free the runner.
|
||||
AGENT_TIMEOUT="${AGENT_TIMEOUT:-1200}"
|
||||
# Provider failover: when primary model dies on quota/auth/provider errors, switch once to
|
||||
# FALLBACK (from agents.json) and continue the retry loop. Transient rate-limits still back off
|
||||
# on the current model first.
|
||||
FALLBACK_MODEL="${FALLBACK:-}"
|
||||
fallback_used=0
|
||||
is_failover_error() {
|
||||
# Ollama Cloud exhausted / provider hard-fail — switch to fallback rather than thrash.
|
||||
grep -qiE 'overloaded|429|529|rate.?limit|timeout|ETIMEDOUT|ECONNRESET|EAI_AGAIN|quota|credit|balance|usage.?limit|limit.?exceed|402|403|401|insufficient|out of credits|payment.?required|model_not_found|not found|Unavailable|capacity|ENOTFOUND|ECONNREFUSED' \
|
||||
/tmp/events.jsonl /tmp/agent_err.log 2>/dev/null
|
||||
}
|
||||
for attempt in 1 2 3; do
|
||||
echo "opencode attempt $attempt/3 for @$NAME ($MODEL, timeout ${AGENT_TIMEOUT}s)"
|
||||
rc=0
|
||||
@@ -196,6 +206,14 @@ for attempt in 1 2 3; do
|
||||
echo "--- stderr (trace) ---"; cat /tmp/agent_err.log
|
||||
[ $rc -eq 0 ] && break
|
||||
if [ $rc -eq 124 ]; then echo "attempt timed out after ${AGENT_TIMEOUT}s — backend hung, not retrying"; break; fi
|
||||
if [ $fallback_used -eq 0 ] && [ -n "$FALLBACK_MODEL" ] && [ "$FALLBACK_MODEL" != "$MODEL" ] && is_failover_error; then
|
||||
echo "primary model failed — failing over to fallback: $FALLBACK_MODEL"
|
||||
MODEL="$FALLBACK_MODEL"
|
||||
fallback_used=1
|
||||
# short pause then use next attempt slot on the fallback provider
|
||||
sleep 2
|
||||
continue
|
||||
fi
|
||||
if grep -qiE 'overloaded|429|529|rate.?limit|timeout|ETIMEDOUT|ECONNRESET|EAI_AGAIN' /tmp/events.jsonl /tmp/agent_err.log; then
|
||||
echo "transient error — backing off $((attempt*20))s"; sleep $((attempt * 20)); continue
|
||||
fi
|
||||
|
||||
Reference in New Issue
Block a user