From 729da271797c66f386621c5022d0870439ab85a6 Mon Sep 17 00:00:00 2001 From: Haitao Pan Date: Mon, 20 Apr 2026 14:10:10 +0800 Subject: [PATCH] Make public RPC contract probe provider-agnostic --- .../verify-public-rpc-contract.sh | 68 ++++++++++++++++--- 1 file changed, 59 insertions(+), 9 deletions(-) diff --git a/scripts/github-actions/verify-public-rpc-contract.sh b/scripts/github-actions/verify-public-rpc-contract.sh index 7bf26b8..a265104 100755 --- a/scripts/github-actions/verify-public-rpc-contract.sh +++ b/scripts/github-actions/verify-public-rpc-contract.sh @@ -74,6 +74,29 @@ capabilities_json="$( -H "Authorization: Bearer ${AUTH_TOKEN}" )" +mapfile -t provider_ids < <( + RESPONSE_JSON="${capabilities_json}" python3 - <<'PY' +import json +import os + +payload = json.loads(os.environ["RESPONSE_JSON"]) +result = payload.get("result") +if not isinstance(result, dict): + raise SystemExit("bridge capabilities response missing result payload") + +provider_catalog = result.get("providerCatalog") +if not isinstance(provider_catalog, list): + raise SystemExit("providerCatalog is missing or invalid") + +for item in provider_catalog: + if isinstance(item, dict) and item.get("providerId"): + print(item["providerId"]) + +if not any(isinstance(item, dict) and item.get("providerId") for item in provider_catalog): + raise SystemExit("providerCatalog did not include any provider ids") +PY +) + RESPONSE_JSON="${capabilities_json}" python3 - <<'PY' import json import os @@ -125,13 +148,23 @@ if gateway.get("targets") != ["gateway"]: raise SystemExit(f"expected gateway targets ['gateway'], got {gateway!r}") PY -session_start_json="$( - json_rpc_with_retry \ - '{"jsonrpc":"2.0","id":"task-1","method":"session.start","params":{"sessionId":"public-contract-smoke","threadId":"public-contract-smoke","taskPrompt":"Reply with exactly pong","workingDirectory":"/tmp","routing":{"routingMode":"explicit","explicitExecutionTarget":"singleAgent","explicitProviderId":"opencode"}}}' \ - -H "Authorization: Bearer ${AUTH_TOKEN}" -)" +session_start_success=0 +session_start_error="" +matched_provider_id="" -RESPONSE_JSON="${session_start_json}" python3 - <<'PY' +for provider_id in "${provider_ids[@]}"; do + session_start_json="$( + json_rpc_with_retry \ + "{\"jsonrpc\":\"2.0\",\"id\":\"task-1\",\"method\":\"session.start\",\"params\":{\"sessionId\":\"public-contract-smoke\",\"threadId\":\"public-contract-smoke\",\"taskPrompt\":\"Reply with exactly pong\",\"workingDirectory\":\"/tmp\",\"routing\":{\"routingMode\":\"explicit\",\"explicitExecutionTarget\":\"singleAgent\",\"explicitProviderId\":\"${provider_id}\"}}}" \ + -H "Authorization: Bearer ${AUTH_TOKEN}" 2>/tmp/xworkmate-bridge-public-contract-session-start.err || true + )" + + if [[ -z "${session_start_json}" ]]; then + session_start_error="$(cat /tmp/xworkmate-bridge-public-contract-session-start.err)" + continue + fi + + if RESPONSE_JSON="${session_start_json}" SELECTED_PROVIDER_ID="${provider_id}" python3 - <<'PY' import json import os @@ -146,12 +179,29 @@ if not isinstance(result, dict): if result.get("success") is not True: raise SystemExit(f"session.start did not succeed: {result!r}") -if result.get("provider") != "opencode": - raise SystemExit(f"expected provider 'opencode', got {result!r}") +provider = str(result.get("provider", "")).strip() +if provider != os.environ["SELECTED_PROVIDER_ID"]: + raise SystemExit(f"expected provider {os.environ['SELECTED_PROVIDER_ID']!r}, got {result!r}") output = str(result.get("output", "")).strip().lower() if output != "pong": raise SystemExit(f"expected output 'pong', got {result!r}") PY + then + session_start_success=1 + matched_provider_id="${provider_id}" + break + fi -printf 'public bridge RPC contract verified via %s\n' "${resolved_base_url}" + session_start_error="$(cat /tmp/xworkmate-bridge-public-contract-session-start.err)" +done + +if [[ "${session_start_success}" -ne 1 ]]; then + echo "session.start failed for all providers in providerCatalog" >&2 + if [[ -n "${session_start_error}" ]]; then + echo "${session_start_error}" >&2 + fi + exit 1 +fi + +printf 'public bridge RPC contract verified via %s using provider %s\n' "${resolved_base_url}" "${matched_provider_id}"