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:
parent
6940774628
commit
ce50e52fc5
@ -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"
|
||||||
|
|||||||
@ -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 () => {
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user