feat(coder-labs/modules/codex): update default configuration to use model providers instead of profiles (#806)

## Description
- update default configuration to use model providers instead of
profiles

## Type of Change

- [ ] New module
- [ ] New template
- [ ] Bug fix
- [x] Feature/enhancement
- [ ] Documentation
- [ ] Other

## Module Information

<!-- Delete this section if not applicable -->

**Path:** `registry/coder-labs/modules/codex`  
**New version:** `v4.3.1`  
**Breaking change:** [ ] Yes [x] No

## Testing & Validation

- [x] Tests pass (`bun test`)
- [x] Code formatted (`bun fmt`)
- [x] Changes tested locally

## Related Issues

<!-- Link related issues or write "None" if not applicable -->
This commit is contained in:
35C4n0r 2026-03-18 11:39:59 +05:30 committed by GitHub
parent 6940774628
commit ce50e52fc5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 27 additions and 30 deletions

View File

@ -13,7 +13,7 @@ Run Codex CLI in your workspace to access OpenAI's models through the Codex inte
```tf ```tf
module "codex" { module "codex" {
source = "registry.coder.com/coder-labs/codex/coder" source = "registry.coder.com/coder-labs/codex/coder"
version = "4.3.0" version = "4.3.1"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id
openai_api_key = var.openai_api_key openai_api_key = var.openai_api_key
workdir = "/home/coder/project" workdir = "/home/coder/project"
@ -32,7 +32,7 @@ module "codex" {
module "codex" { module "codex" {
count = data.coder_workspace.me.start_count count = data.coder_workspace.me.start_count
source = "registry.coder.com/coder-labs/codex/coder" source = "registry.coder.com/coder-labs/codex/coder"
version = "4.3.0" version = "4.3.1"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id
openai_api_key = "..." openai_api_key = "..."
workdir = "/home/coder/project" workdir = "/home/coder/project"
@ -51,7 +51,7 @@ For tasks integration with AI Bridge, add `enable_aibridge = true` to the [Usage
```tf ```tf
module "codex" { module "codex" {
source = "registry.coder.com/coder-labs/codex/coder" source = "registry.coder.com/coder-labs/codex/coder"
version = "4.3.0" version = "4.3.1"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id
workdir = "/home/coder/project" workdir = "/home/coder/project"
enable_aibridge = true enable_aibridge = true
@ -60,21 +60,16 @@ module "codex" {
When `enable_aibridge = true`, the module: When `enable_aibridge = true`, the module:
- Configures Codex to use the AI Bridge profile with `base_url` pointing to `${data.coder_workspace.me.access_url}/api/v2/aibridge/openai/v1` and `env_key` pointing to the workspace owner's session token - Configures Codex to use the aibridge model_provider with `base_url` pointing to `${data.coder_workspace.me.access_url}/api/v2/aibridge/openai/v1` and `env_key` pointing to the workspace owner's session token
```toml ```toml
profile = "aibridge" # sets the default profile to aibridge model_provider = "aibridge"
[model_providers.aibridge] [model_providers.aibridge]
name = "AI Bridge" name = "AI Bridge"
base_url = "https://example.coder.com/api/v2/aibridge/openai/v1" base_url = "https://example.coder.com/api/v2/aibridge/openai/v1"
env_key = "CODER_AIBRIDGE_SESSION_TOKEN" env_key = "CODER_AIBRIDGE_SESSION_TOKEN"
wire_api = "responses" wire_api = "responses"
[profiles.aibridge]
model_provider = "aibridge"
model = "<model>" # as configured in the module input
model_reasoning_effort = "<model_reasoning_effort>" # as configured in the module input
``` ```
This allows Codex to route API requests through Coder's AI Bridge instead of directly to OpenAI's API. This allows Codex to route API requests through Coder's AI Bridge instead of directly to OpenAI's API.
@ -94,7 +89,7 @@ data "coder_task" "me" {}
module "codex" { module "codex" {
source = "registry.coder.com/coder-labs/codex/coder" source = "registry.coder.com/coder-labs/codex/coder"
version = "4.3.0" version = "4.3.1"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id
openai_api_key = "..." openai_api_key = "..."
ai_prompt = data.coder_task.me.prompt ai_prompt = data.coder_task.me.prompt
@ -114,7 +109,7 @@ By default, when `enable_boundary = true`, the module uses `coder boundary` subc
```tf ```tf
module "codex" { module "codex" {
source = "registry.coder.com/coder-labs/codex/coder" source = "registry.coder.com/coder-labs/codex/coder"
version = "4.3.0" version = "4.3.1"
agent_id = coder_agent.main.id agent_id = coder_agent.main.id
openai_api_key = var.openai_api_key openai_api_key = var.openai_api_key
workdir = "/home/coder/project" workdir = "/home/coder/project"
@ -132,7 +127,7 @@ This example shows additional configuration options for custom models, MCP serve
```tf ```tf
module "codex" { module "codex" {
source = "registry.coder.com/coder-labs/codex/coder" source = "registry.coder.com/coder-labs/codex/coder"
version = "4.3.0" version = "4.3.1"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id
openai_api_key = "..." openai_api_key = "..."
workdir = "/home/coder/project" workdir = "/home/coder/project"

View File

@ -468,10 +468,7 @@ describe("codex", async () => {
id, id,
"/home/coder/.codex/config.toml", "/home/coder/.codex/config.toml",
); );
expect(configToml).toContain( expect(configToml).toContain('model_provider = "aibridge"');
"[profiles.aibridge]\n" + 'model_provider = "aibridge"',
);
expect(configToml).toContain('profile = "aibridge"');
}); });
test("boundary-enabled", async () => { test("boundary-enabled", async () => {

View File

@ -84,10 +84,10 @@ variable "enable_aibridge" {
variable "model_reasoning_effort" { variable "model_reasoning_effort" {
type = string type = string
description = "The reasoning effort for the AI Bridge model. One of: none, low, medium, high. https://platform.openai.com/docs/guides/latest-model#lower-reasoning-effort" description = "The reasoning effort for the model. One of: none, low, medium, high. https://platform.openai.com/docs/guides/latest-model#lower-reasoning-effort"
default = "medium" default = ""
validation { validation {
condition = contains(["none", "low", "medium", "high"], var.model_reasoning_effort) condition = contains(["", "none", "minimal", "low", "medium", "high", "xhigh"], var.model_reasoning_effort)
error_message = "model_reasoning_effort must be one of: none, low, medium, high." error_message = "model_reasoning_effort must be one of: none, low, medium, high."
} }
} }
@ -137,7 +137,7 @@ variable "agentapi_version" {
variable "codex_model" { variable "codex_model" {
type = string type = string
description = "The model for Codex to use. Defaults to gpt-5.3-codex." description = "The model for Codex to use. Defaults to gpt-5.3-codex."
default = "gpt-5.3-codex" default = "gpt-5.4"
} }
variable "pre_install_script" { variable "pre_install_script" {
@ -225,7 +225,7 @@ locals {
install_script = file("${path.module}/scripts/install.sh") install_script = file("${path.module}/scripts/install.sh")
start_script = file("${path.module}/scripts/start.sh") start_script = file("${path.module}/scripts/start.sh")
module_dir_name = ".codex-module" module_dir_name = ".codex-module"
latest_codex_model = "gpt-5.3-codex" latest_codex_model = "gpt-5.4"
aibridge_config = <<-EOF aibridge_config = <<-EOF
[model_providers.aibridge] [model_providers.aibridge]
name = "AI Bridge" name = "AI Bridge"
@ -233,10 +233,6 @@ locals {
env_key = "CODER_AIBRIDGE_SESSION_TOKEN" env_key = "CODER_AIBRIDGE_SESSION_TOKEN"
wire_api = "responses" wire_api = "responses"
[profiles.aibridge]
model_provider = "aibridge"
model = "${var.codex_model}"
model_reasoning_effort = "${var.model_reasoning_effort}"
EOF EOF
} }
@ -302,6 +298,7 @@ module "agentapi" {
ARG_ADDITIONAL_MCP_SERVERS='${base64encode(var.additional_mcp_servers)}' \ ARG_ADDITIONAL_MCP_SERVERS='${base64encode(var.additional_mcp_servers)}' \
ARG_CODER_MCP_APP_STATUS_SLUG='${local.app_slug}' \ ARG_CODER_MCP_APP_STATUS_SLUG='${local.app_slug}' \
ARG_CODEX_START_DIRECTORY='${local.workdir}' \ ARG_CODEX_START_DIRECTORY='${local.workdir}' \
ARG_MODEL_REASONING_EFFORT='${var.model_reasoning_effort}' \
ARG_CODEX_INSTRUCTION_PROMPT='${base64encode(var.codex_system_prompt)}' \ ARG_CODEX_INSTRUCTION_PROMPT='${base64encode(var.codex_system_prompt)}' \
/tmp/install.sh /tmp/install.sh
EOT EOT

View File

@ -93,10 +93,14 @@ function install_codex() {
write_minimal_default_config() { write_minimal_default_config() {
local config_path="$1" local config_path="$1"
ARG_DEFAULT_PROFILE="" ARG_OPTIONAL_TOP_LEVEL_CONFIG=""
if [[ "${ARG_ENABLE_AIBRIDGE}" = "true" ]]; then if [[ "${ARG_ENABLE_AIBRIDGE}" = "true" ]]; then
ARG_DEFAULT_PROFILE='profile = "aibridge"' ARG_OPTIONAL_TOP_LEVEL_CONFIG='model_provider = "aibridge"'
fi
if [[ "${ARG_MODEL_REASONING_EFFORT}" != "" ]]; then
ARG_OPTIONAL_TOP_LEVEL_CONFIG+=$'\n'"model_reasoning_effort = \"${ARG_MODEL_REASONING_EFFORT}\""
fi fi
cat << EOF > "$config_path" cat << EOF > "$config_path"
@ -104,13 +108,17 @@ write_minimal_default_config() {
sandbox_mode = "workspace-write" sandbox_mode = "workspace-write"
approval_policy = "never" approval_policy = "never"
preferred_auth_method = "apikey" preferred_auth_method = "apikey"
${ARG_DEFAULT_PROFILE} ${ARG_OPTIONAL_TOP_LEVEL_CONFIG}
[sandbox_workspace_write] [sandbox_workspace_write]
network_access = true network_access = true
[notice.model_migrations] [notice.model_migrations]
"${ARG_CODEX_MODEL}" = "${ARG_LATEST_CODEX_MODEL}" "${ARG_CODEX_MODEL}" = "${ARG_LATEST_CODEX_MODEL}"
[projects."${ARG_CODEX_START_DIRECTORY}"]
trust_level = "trusted"
EOF EOF
} }

View File

@ -155,7 +155,7 @@ setup_workdir() {
build_codex_args() { build_codex_args() {
CODEX_ARGS=() CODEX_ARGS=()
if [[ -n "${ARG_CODEX_MODEL}" ]] && [[ "${ARG_ENABLE_AIBRIDGE}" != "true" ]]; then if [[ -n "${ARG_CODEX_MODEL}" ]]; then
CODEX_ARGS+=("--model" "${ARG_CODEX_MODEL}") CODEX_ARGS+=("--model" "${ARG_CODEX_MODEL}")
fi fi