fix(agents): wire XAI_API_KEY through reusable workflow reliably #122
@@ -4,6 +4,31 @@ name: agent
|
|||||||
# The gate + steps run in the caller's event context (github.event.* / github.repository are the caller's).
|
# The gate + steps run in the caller's event context (github.event.* / github.repository are the caller's).
|
||||||
on:
|
on:
|
||||||
workflow_call:
|
workflow_call:
|
||||||
|
# Explicit secret contract so callers can map secrets by name (more reliable than
|
||||||
|
# secrets: inherit alone on some Gitea versions / cross-owner reusable workflows).
|
||||||
|
secrets:
|
||||||
|
GITEA_TOKEN:
|
||||||
|
required: true
|
||||||
|
OLLAMA_URL:
|
||||||
|
required: false
|
||||||
|
OLLAMA_CLOUD_API_KEY:
|
||||||
|
required: false
|
||||||
|
XAI_API_KEY:
|
||||||
|
required: false
|
||||||
|
TOKEN_PM:
|
||||||
|
required: false
|
||||||
|
TOKEN_SENIOR:
|
||||||
|
required: false
|
||||||
|
TOKEN_JUNIOR:
|
||||||
|
required: false
|
||||||
|
TOKEN_LEAD:
|
||||||
|
required: false
|
||||||
|
TOKEN_QA:
|
||||||
|
required: false
|
||||||
|
TOKEN_OPS:
|
||||||
|
required: false
|
||||||
|
TOKEN_INTERN:
|
||||||
|
required: false
|
||||||
|
|
||||||
# Pinned opencode version — used to install it and to key the CI cache below.
|
# Pinned opencode version — used to install it and to key the CI cache below.
|
||||||
env:
|
env:
|
||||||
@@ -150,7 +175,9 @@ jobs:
|
|||||||
SCRIPTS: ${{ runner.temp }}/agents-scripts
|
SCRIPTS: ${{ runner.temp }}/agents-scripts
|
||||||
OLLAMA_URL: ${{ secrets.OLLAMA_URL }}
|
OLLAMA_URL: ${{ secrets.OLLAMA_URL }}
|
||||||
OLLAMA_CLOUD_API_KEY: ${{ secrets.OLLAMA_CLOUD_API_KEY }}
|
OLLAMA_CLOUD_API_KEY: ${{ secrets.OLLAMA_CLOUD_API_KEY }}
|
||||||
XAI_API_KEY: ${{ secrets.XAI_API_KEY }}
|
# Accept common alternate names — empty XAI_API_KEY has bitten us when the
|
||||||
|
# secret was stored under a slightly different key on the caller repo.
|
||||||
|
XAI_API_KEY: ${{ secrets.XAI_API_KEY || secrets.XAI_KEY || secrets.GROK_API_KEY || secrets.XAI_TOKEN }}
|
||||||
NAME: ${{ steps.prep.outputs.name }}
|
NAME: ${{ steps.prep.outputs.name }}
|
||||||
SKILLS: ${{ steps.prep.outputs.skills }} # JSON array of skills this agent may load
|
SKILLS: ${{ steps.prep.outputs.skills }} # JSON array of skills this agent may load
|
||||||
run: bash "$SCRIPTS/install-opencode.sh"
|
run: bash "$SCRIPTS/install-opencode.sh"
|
||||||
@@ -213,7 +240,7 @@ jobs:
|
|||||||
id: run
|
id: run
|
||||||
env:
|
env:
|
||||||
SCRIPTS: ${{ runner.temp }}/agents-scripts
|
SCRIPTS: ${{ runner.temp }}/agents-scripts
|
||||||
XAI_API_KEY: ${{ secrets.XAI_API_KEY }}
|
XAI_API_KEY: ${{ secrets.XAI_API_KEY || secrets.XAI_KEY || secrets.GROK_API_KEY || secrets.XAI_TOKEN }}
|
||||||
# SELF_TOKEN = the RUNNING agent's OWN token (TOKEN_PM for @pm, TOKEN_OPS for @ops, …).
|
# SELF_TOKEN = the RUNNING agent's OWN token (TOKEN_PM for @pm, TOKEN_OPS for @ops, …).
|
||||||
# Only this agent's token is placed in its process env, so no agent can act as another.
|
# Only this agent's token is placed in its process env, so no agent can act as another.
|
||||||
# Powers the gitea-api / gitea-admin skills — each agent calls Gitea as itself. Every
|
# Powers the gitea-api / gitea-admin skills — each agent calls Gitea as itself. Every
|
||||||
|
|||||||
@@ -12,4 +12,17 @@ on:
|
|||||||
jobs:
|
jobs:
|
||||||
agent:
|
agent:
|
||||||
uses: gitea/agents/.gitea/workflows/agent.yml@main
|
uses: gitea/agents/.gitea/workflows/agent.yml@main
|
||||||
secrets: inherit
|
# Explicit secret map (plus inherit) so XAI_API_KEY / OLLAMA_* always reach the reusable
|
||||||
|
# workflow. secrets: inherit alone has left XAI_API_KEY empty on some Gitea cross-owner calls.
|
||||||
|
secrets:
|
||||||
|
GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
|
||||||
|
OLLAMA_URL: ${{ secrets.OLLAMA_URL }}
|
||||||
|
OLLAMA_CLOUD_API_KEY: ${{ secrets.OLLAMA_CLOUD_API_KEY }}
|
||||||
|
XAI_API_KEY: ${{ secrets.XAI_API_KEY }}
|
||||||
|
TOKEN_PM: ${{ secrets.TOKEN_PM }}
|
||||||
|
TOKEN_SENIOR: ${{ secrets.TOKEN_SENIOR }}
|
||||||
|
TOKEN_JUNIOR: ${{ secrets.TOKEN_JUNIOR }}
|
||||||
|
TOKEN_LEAD: ${{ secrets.TOKEN_LEAD }}
|
||||||
|
TOKEN_QA: ${{ secrets.TOKEN_QA }}
|
||||||
|
TOKEN_OPS: ${{ secrets.TOKEN_OPS }}
|
||||||
|
TOKEN_INTERN: ${{ secrets.TOKEN_INTERN }}
|
||||||
|
|||||||
@@ -5,6 +5,14 @@
|
|||||||
# NAME SKILLS GITHUB_PATH HOME
|
# NAME SKILLS GITHUB_PATH HOME
|
||||||
set -eu
|
set -eu
|
||||||
|
|
||||||
|
# Non-secret diagnostics — prove which provider keys reached the runner (length only).
|
||||||
|
echo "provider key lengths: OLLAMA_URL=${#OLLAMA_URL} OLLAMA_CLOUD_API_KEY=${#OLLAMA_CLOUD_API_KEY} XAI_API_KEY=${#XAI_API_KEY}"
|
||||||
|
if [ -z "${XAI_API_KEY:-}" ]; then
|
||||||
|
echo "WARNING: XAI_API_KEY is empty in this job. xai-oc fallback will fail."
|
||||||
|
echo "Fix: set Actions secret XAI_API_KEY on the CALLER repo (e.g. ffaerber/homelab),"
|
||||||
|
echo "not only on gitea/agents. Name must be exact: XAI_API_KEY"
|
||||||
|
fi
|
||||||
|
|
||||||
# PIN the opencode version: an unpinned `latest` means a breaking release (CLI flags, or the
|
# PIN the opencode version: an unpinned `latest` means a breaking release (CLI flags, or the
|
||||||
# --format json event schema that build-activity-log.sh parses) breaks every agent in every repo
|
# --format json event schema that build-activity-log.sh parses) breaks every agent in every repo
|
||||||
# at once. Bump deliberately by changing this default (or set OPENCODE_VERSION in the step env).
|
# at once. Bump deliberately by changing this default (or set OPENCODE_VERSION in the step env).
|
||||||
|
|||||||
Reference in New Issue
Block a user