Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
6de6955
ci(e2e): centralize Vitest inference env
jyaunches Jun 22, 2026
e8f0667
fix(e2e): scope hosted inference secrets
jyaunches Jun 22, 2026
6d651da
chore(e2e): apply static formatting
jyaunches Jun 22, 2026
dc3ac98
fix(e2e): make hosted export test behavioral
jyaunches Jun 22, 2026
a66faee
chore(e2e): apply shfmt to hosted export
jyaunches Jun 22, 2026
b442890
fix(e2e): constrain legacy API key alias
jyaunches Jun 22, 2026
40f3d80
Merge remote-tracking branch 'origin/main' into fix/vitest-shared-e2e…
jyaunches Jun 22, 2026
d00c6d9
fix(e2e): scope hosted inference opt-ins
jyaunches Jun 22, 2026
6dfa51c
test(e2e): avoid conditional guardrail
jyaunches Jun 22, 2026
46a98d7
Merge remote-tracking branch 'origin/main' into fix/vitest-shared-e2e…
jyaunches Jun 22, 2026
c4a1f84
fix(e2e): type workflow alias checks
jyaunches Jun 22, 2026
d3f9671
fix(e2e): prefer hosted legacy secret fallback
jyaunches Jun 22, 2026
48ae3b4
fix(e2e): pass hosted public fallback secret
jyaunches Jun 22, 2026
256530c
fix(e2e): preserve hosted API preference
jyaunches Jun 22, 2026
d059480
Merge remote-tracking branch 'origin/main' into fix/vitest-shared-e2e…
jyaunches Jun 22, 2026
3ca817a
fix(e2e): honor hosted fixture overrides
jyaunches Jun 22, 2026
99de2a9
fix(e2e): route hosted fixture fallback key
jyaunches Jun 22, 2026
4a1a48e
fix(e2e): keep hosted workflow model default
jyaunches Jun 22, 2026
ddf8a69
fix(e2e): prefer canonical hosted secret
jyaunches Jun 23, 2026
81fce78
fix(e2e): keep migration on default provider
jyaunches Jun 23, 2026
600ba9a
Merge remote-tracking branch 'origin/main' into fix/vitest-shared-e2e…
jyaunches Jun 23, 2026
10b37b7
fix(e2e): check sanitized Discord gateway capture
jyaunches Jun 23, 2026
6758b1d
Merge remote-tracking branch 'origin/main' into fix/vitest-shared-e2e…
jyaunches Jun 23, 2026
0efdb98
fix(e2e): preserve hosted export boundary
jyaunches Jun 23, 2026
80621b3
Merge remote-tracking branch 'origin/main' into fix/vitest-shared-e2e…
jyaunches Jun 23, 2026
082dd9d
Merge remote-tracking branch 'origin/main' into fix/vitest-shared-e2e…
jyaunches Jun 23, 2026
cb92a48
fix(e2e): keep spark install key separate
jyaunches Jun 23, 2026
31a8ec2
Merge remote-tracking branch 'origin/main' into fix/vitest-shared-e2e…
jyaunches Jun 23, 2026
99fab43
fix(e2e): refresh hosted inference env safeguards
cv Jun 23, 2026
91203ca
ci(e2e): consume shared hosted inference export
cv Jun 23, 2026
67b960e
ci(e2e): remove duplicated hosted run env
cv Jun 23, 2026
526a9de
test(e2e): split hosted workflow env coverage
cv Jun 23, 2026
25c91ef
Merge branch 'main' into fix/vitest-shared-e2e-secret-wiring
cv Jun 23, 2026
cba64b9
fix(e2e): freshen live install retries (#5606)
jyaunches Jun 23, 2026
20d5f04
merge: sync hosted inference branch with main
cv Jun 23, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 39 additions & 0 deletions .github/actions/export-e2e-hosted-inference/action.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0

name: Export E2E hosted inference environment
description: Canonicalize NemoClaw hosted inference secrets and export the shared E2E env contract.
inputs:
nvidia-inference-api-key:
description: Canonical repository-hosted NVIDIA inference credential.
required: false
default: ""
nvidia-api-key:
description: >-
Temporary compatibility alias for legacy E2E lanes that still read
NVIDIA_API_KEY directly. The source-owned inventories and removal
conditions live in tools/e2e-scenarios/hosted-inference-legacy-alias.mts.
required: false
default: ""
export-nvidia-api-key:
description: >-
Emit NVIDIA_API_KEY only for documented legacy consumers that still need
the compatibility alias. Defaults to false so hosted CI inference exports
only NVIDIA_INFERENCE_API_KEY and COMPATIBLE_API_KEY.
required: false
default: "false"
require-hosted-inference:
description: Fail when no nvapi-prefixed hosted inference credential is available.
required: false
default: "true"
runs:
using: composite
steps:
- name: Export hosted inference env
shell: bash
env:
INPUT_NVIDIA_INFERENCE_API_KEY: ${{ inputs.nvidia-inference-api-key }}
INPUT_NVIDIA_API_KEY: ${{ inputs.nvidia-api-key }}
INPUT_EXPORT_NVIDIA_API_KEY: ${{ inputs.export-nvidia-api-key }}
INPUT_REQUIRE_HOSTED_INFERENCE: ${{ inputs.require-hosted-inference }}
run: bash "${GITHUB_ACTION_PATH}/export.sh"
53 changes: 53 additions & 0 deletions .github/actions/export-e2e-hosted-inference/export.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
#!/usr/bin/env bash
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0

set -euo pipefail

canonical="${INPUT_NVIDIA_INFERENCE_API_KEY:-}"
public_alias="${INPUT_NVIDIA_API_KEY:-}"

# Keep the hosted E2E contract canonical: NVIDIA_INFERENCE_API_KEY is the
# hosted CI source secret and COMPATIBLE_API_KEY is the custom endpoint
# credential. NVIDIA_API_KEY is emitted only when the caller explicitly opts in
# for documented legacy consumers that still assert the older env name.
for value in "${canonical}" "${public_alias}"; do
if [[ "${value}" == *$'\n'* || "${value}" == *$'\r'* ]]; then
echo "::error::Hosted inference credentials must be single-line values." >&2
exit 1
fi
done

if [[ "${canonical}" != nvapi-* && "${public_alias}" == nvapi-* ]]; then
canonical="${public_alias}"
fi
if [[ "${public_alias}" != nvapi-* && "${canonical}" == nvapi-* ]]; then
public_alias="${canonical}"
fi

if [[ "${INPUT_REQUIRE_HOSTED_INFERENCE:-true}" == "true" ]]; then
if [[ -z "${canonical}" ]]; then
echo "::error::NVIDIA_INFERENCE_API_KEY secret is required for hosted CI inference." >&2
exit 1
fi
if [[ "${canonical}" != nvapi-* ]]; then
echo "::error::NVIDIA_INFERENCE_API_KEY must be nvapi-prefixed for hosted CI inference." >&2
exit 1
fi
fi

{
printf 'NEMOCLAW_E2E_USE_HOSTED_INFERENCE=1\n'
printf 'NEMOCLAW_PROVIDER=custom\n'
printf 'NEMOCLAW_ENDPOINT_URL=https://inference-api.nvidia.com/v1\n'
printf 'NEMOCLAW_MODEL=nvidia/nvidia/nemotron-3-super-v3\n'
printf 'NEMOCLAW_COMPAT_MODEL=nvidia/nvidia/nemotron-3-super-v3\n'
printf 'NEMOCLAW_PREFERRED_API=openai-completions\n'
if [[ -n "${canonical}" ]]; then
printf 'NVIDIA_INFERENCE_API_KEY=%s\n' "${canonical}"
printf 'COMPATIBLE_API_KEY=%s\n' "${canonical}"
fi
if [[ "${INPUT_EXPORT_NVIDIA_API_KEY:-false}" == "true" && -n "${public_alias}" ]]; then
printf 'NVIDIA_API_KEY=%s\n' "${public_alias}"
fi
} >>"${GITHUB_ENV}"
34 changes: 13 additions & 21 deletions .github/workflows/e2e-script.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,11 @@ on:
required: false
type: boolean
default: false
nvidia_api_key_alias:
description: Emit NVIDIA_API_KEY compatibility alias for documented legacy shell consumers.
required: false
type: boolean
default: false
brave_api_key:
description: Pass the BRAVE_API_KEY secret to the script.
required: false
Expand All @@ -80,6 +85,8 @@ on:
secrets:
NVIDIA_INFERENCE_API_KEY:
required: false
NVIDIA_API_KEY:
required: false
BRAVE_API_KEY:
required: false
DOCKERHUB_USERNAME:
Expand Down Expand Up @@ -143,6 +150,7 @@ jobs:
with:
ref: ${{ github.ref }}
sparse-checkout: |
.github/actions/export-e2e-hosted-inference
.github/actions/run-e2e-script
path: workflow-actions
persist-credentials: false
Expand Down Expand Up @@ -214,26 +222,11 @@ jobs:

- name: Export hosted CI inference environment
if: ${{ inputs.nvidia_api_key }}
env:
NVIDIA_INFERENCE_API_KEY: ${{ secrets.NVIDIA_INFERENCE_API_KEY }}
shell: bash
run: |
set -euo pipefail

if [ -z "${NVIDIA_INFERENCE_API_KEY:-}" ]; then
echo "::error::NVIDIA_INFERENCE_API_KEY secret is required for hosted CI inference; it is withheld for workflow_dispatch target_ref runs." >&2
exit 1
fi

{
printf 'NEMOCLAW_E2E_USE_HOSTED_INFERENCE=1\n'
printf 'NEMOCLAW_PROVIDER=custom\n'
printf 'NEMOCLAW_ENDPOINT_URL=https://inference-api.nvidia.com/v1\n'
printf 'NEMOCLAW_MODEL=nvidia/nvidia/nemotron-3-super-v3\n'
printf 'NEMOCLAW_COMPAT_MODEL=nvidia/nvidia/nemotron-3-super-v3\n'
printf 'NEMOCLAW_PREFERRED_API=openai-completions\n'
printf 'COMPATIBLE_API_KEY=%s\n' "${NVIDIA_INFERENCE_API_KEY}"
} >> "$GITHUB_ENV"
uses: ./workflow-actions/.github/actions/export-e2e-hosted-inference
with:
nvidia-inference-api-key: ${{ secrets.NVIDIA_INFERENCE_API_KEY }}
nvidia-api-key: ${{ secrets.NVIDIA_API_KEY }}
export-nvidia-api-key: ${{ inputs.nvidia_api_key_alias }}

- name: Run E2E script
uses: ./workflow-actions/.github/actions/run-e2e-script
Expand All @@ -248,7 +241,6 @@ jobs:
env:
BRAVE_API_KEY: ${{ inputs.brave_api_key && secrets.BRAVE_API_KEY || '' }}
GITHUB_TOKEN: ${{ inputs.github_token && github.token || '' }}
NVIDIA_INFERENCE_API_KEY: ${{ inputs.nvidia_api_key && secrets.NVIDIA_INFERENCE_API_KEY || '' }}
TELEGRAM_BOT_TOKEN_REAL: ${{ inputs.messaging_live_secrets && secrets.TELEGRAM_BOT_TOKEN_REAL || '' }}
TELEGRAM_CHAT_ID_E2E: ${{ inputs.messaging_live_secrets && secrets.TELEGRAM_CHAT_ID_E2E || '' }}
DISCORD_BOT_TOKEN_REAL: ${{ inputs.messaging_live_secrets && secrets.DISCORD_BOT_TOKEN_REAL || '' }}
Expand Down
Loading