Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
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
Prev Previous commit
Next Next commit
Preserve empty Codex model fallback
Co-authored-by: gh-aw-bot <259018956+gh-aw-bot@users.noreply.github.com>
  • Loading branch information
Copilot and gh-aw-bot authored Oct 8, 2026
commit 12d73473db86a8e14161235564385cae7eb3b3d2
4 changes: 2 additions & 2 deletions .github/workflows/engine-conformance-codex.lock.yml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions .github/workflows/smoke-codex.lock.yml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions pkg/workflow/codex_engine.go
Original file line number Diff line number Diff line change
Expand Up @@ -487,13 +487,13 @@ func (e *CodexEngine) buildCodexExecutionEnv(workflowData *WorkflowData, firewal
applyEngineHarnessRetryEnv(env, workflowData)
if modelConfigured {
if containsExpression(workflowData.Model) {
env[constants.EnvVarModelFallback] = compilerenv.BuildModelOverrideExpressionWithoutFallback(modelEnvVar, compilerenv.DefaultModelCodex)
env[constants.EnvVarModelFallback] = compilerenv.BuildModelOverrideExpressionEmptyFallback(modelEnvVar, compilerenv.DefaultModelCodex)
}
model := codexModelID(workflowData.Model)
codexEngineLog.Printf("Setting %s env var for model: %s", modelEnvVar, model)
env[modelEnvVar] = model
} else {
env[modelEnvVar] = compilerenv.BuildModelOverrideExpressionWithoutFallback(modelEnvVar, compilerenv.DefaultModelCodex)
env[modelEnvVar] = compilerenv.BuildModelOverrideExpressionEmptyFallback(modelEnvVar, compilerenv.DefaultModelCodex)
}
applyEngineCwdEnv(env, workflowData)
applyEngineAndAgentEnv(env, workflowData, codexEngineLog)
Expand Down
2 changes: 1 addition & 1 deletion pkg/workflow/codex_engine_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -737,7 +737,7 @@ func TestCodexEngineExecutionPassesModelEnvVarIntoAWFStep(t *testing.T) {
}

stepContent := strings.Join([]string(steps[0]), "\n")
expectedEnvLine := tt.expectedModelEnv + ": ${{ vars." + tt.expectedModelEnv + " || vars.GH_AW_DEFAULT_MODEL_CODEX }}"
expectedEnvLine := tt.expectedModelEnv + ": ${{ vars." + tt.expectedModelEnv + " || vars.GH_AW_DEFAULT_MODEL_CODEX || '' }}"
if !strings.Contains(stepContent, expectedEnvLine) {
t.Errorf("Expected model env var to be included in AWF step env:\n%s", stepContent)
}
Expand Down
2 changes: 1 addition & 1 deletion pkg/workflow/compiler_yaml_step_lifecycle.go
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,7 @@ func (c *Compiler) generateCreateAwInfo(yaml *strings.Builder, data *WorkflowDat
} else if defaultModel != "" {
fmt.Fprintf(yaml, " GH_AW_INFO_MODEL: ${{ vars.%s || '%s' }}\n", modelEnvVar, defaultModel)
} else if defaultModelOverrideVar != "" {
fmt.Fprintf(yaml, " GH_AW_INFO_MODEL: %s\n", compilerenv.BuildModelOverrideExpressionWithoutFallback(modelEnvVar, defaultModelOverrideVar))
fmt.Fprintf(yaml, " GH_AW_INFO_MODEL: %s\n", compilerenv.BuildModelOverrideExpressionEmptyFallback(modelEnvVar, defaultModelOverrideVar))
} else {
fmt.Fprintf(yaml, " GH_AW_INFO_MODEL: ${{ vars.%s || '' }}\n", modelEnvVar)
}
Expand Down
6 changes: 3 additions & 3 deletions pkg/workflow/compilerenv/manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -324,10 +324,10 @@ func BuildModelOverrideExpression(primaryVar, enterpriseDefaultVar, builtinFallb
return fmt.Sprintf("${{ vars.%s || vars.%s || '%s' }}", primaryVar, enterpriseDefaultVar, escaped)
}

// BuildModelOverrideExpressionWithoutFallback leaves model selection to the runtime
// BuildModelOverrideExpressionEmptyFallback leaves model selection to the runtime
// when neither the phase nor enterprise model variable is configured.
func BuildModelOverrideExpressionWithoutFallback(primaryVar, enterpriseDefaultVar string) string {
return fmt.Sprintf("${{ vars.%s || vars.%s }}", primaryVar, enterpriseDefaultVar)
func BuildModelOverrideExpressionEmptyFallback(primaryVar, enterpriseDefaultVar string) string {
return fmt.Sprintf("${{ vars.%s || vars.%s || '' }}", primaryVar, enterpriseDefaultVar)
}

// ResolvePolicyModelsAllowed returns configured allowed model policy entries.
Expand Down
4 changes: 2 additions & 2 deletions pkg/workflow/compilerenv/manager_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -203,8 +203,8 @@ func TestBuildModelOverrideExpression(t *testing.T) {
)
assert.Equal(
t,
"${{ vars.GH_AW_MODEL_AGENT_CODEX || vars.GH_AW_DEFAULT_MODEL_CODEX }}",
BuildModelOverrideExpressionWithoutFallback("GH_AW_MODEL_AGENT_CODEX", "GH_AW_DEFAULT_MODEL_CODEX"),
"${{ vars.GH_AW_MODEL_AGENT_CODEX || vars.GH_AW_DEFAULT_MODEL_CODEX || '' }}",
BuildModelOverrideExpressionEmptyFallback("GH_AW_MODEL_AGENT_CODEX", "GH_AW_DEFAULT_MODEL_CODEX"),
)
}

Expand Down
4 changes: 2 additions & 2 deletions pkg/workflow/engine_fallback_models_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -203,7 +203,7 @@ func TestCodexHasNoImplicitFallbackModel(t *testing.T) {
}
env := NewCodexEngine().buildCodexExecutionEnv(data, false, true, phase.modelVar)
require.Equal(t, data.Model, env[phase.modelVar])
require.Equal(t, "${{ vars."+phase.modelVar+" || vars.GH_AW_DEFAULT_MODEL_CODEX }}", env[constants.EnvVarModelFallback])
require.Equal(t, "${{ vars."+phase.modelVar+" || vars.GH_AW_DEFAULT_MODEL_CODEX || '' }}", env[constants.EnvVarModelFallback])
}
require.Equal(t, "${{ vars.GH_AW_MODEL_EVALS_CODEX || vars.GH_AW_DEFAULT_MODEL_CODEX }}", buildEvalsModelFallbackExpression("codex"))
require.Equal(t, "${{ vars.GH_AW_MODEL_EVALS_CODEX || vars.GH_AW_DEFAULT_MODEL_CODEX || '' }}", buildEvalsModelFallbackExpression("codex"))
}
2 changes: 1 addition & 1 deletion pkg/workflow/evals_steps.go
Original file line number Diff line number Diff line change
Expand Up @@ -538,7 +538,7 @@ func buildEvalsModelFallbackExpression(engineID string) string {
case string(constants.ClaudeEngine):
return compilerenv.BuildModelOverrideExpression(constants.EnvVarModelEvalsClaude, compilerenv.DefaultModelClaude, constants.SonnetDefaultModel)
case string(constants.CodexEngine):
return compilerenv.BuildModelOverrideExpressionWithoutFallback(constants.EnvVarModelEvalsCodex, compilerenv.DefaultModelCodex)
return compilerenv.BuildModelOverrideExpression(constants.EnvVarModelEvalsCodex, compilerenv.DefaultModelCodex, constants.CodexDefaultModel)
default:
return ""
}
Expand Down
4 changes: 2 additions & 2 deletions pkg/workflow/testdata/TestWasmGolden_AllEngines/codex.golden
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ jobs:
env:
GH_AW_INFO_ENGINE_ID: "codex"
GH_AW_INFO_ENGINE_NAME: "Codex"
GH_AW_INFO_MODEL: ${{ vars.GH_AW_MODEL_AGENT_CODEX || vars.GH_AW_DEFAULT_MODEL_CODEX }}
GH_AW_INFO_MODEL: ${{ vars.GH_AW_MODEL_AGENT_CODEX || vars.GH_AW_DEFAULT_MODEL_CODEX || '' }}
GH_AW_INFO_VERSION: "CODEX_VERSION"
GH_AW_INFO_AGENT_VERSION: "CODEX_VERSION"
GH_AW_INFO_WORKFLOW_NAME: "engine-codex-test"
Expand Down Expand Up @@ -604,7 +604,7 @@ jobs:
GH_AW_MAX_AI_CREDITS: ${{ vars.GH_AW_DEFAULT_MAX_AI_CREDITS || '1000' }}
GH_AW_MAX_TURNS: ${{ vars.GH_AW_DEFAULT_MAX_TURNS || '' }}
GH_AW_MCP_CONFIG: ${{ runner.temp }}/gh-aw/mcp-config/config.toml
GH_AW_MODEL_DETECTION_CODEX: ${{ vars.GH_AW_MODEL_DETECTION_CODEX || vars.GH_AW_DEFAULT_MODEL_CODEX }}
GH_AW_MODEL_DETECTION_CODEX: ${{ vars.GH_AW_MODEL_DETECTION_CODEX || vars.GH_AW_DEFAULT_MODEL_CODEX || '' }}
GH_AW_PHASE: agent
GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt
GH_AW_VERSION: dev
Expand Down
Loading