mirror of
https://github.com/pchuan98/codex.git
synced 2026-07-01 00:31:56 +08:00
extract models manager and related ownership from core (#16508)
## Summary - split `models-manager` out of `core` and add `ModelsManagerConfig` plus `Config::to_models_manager_config()` so model metadata paths stop depending on `core::Config` - move login-owned/auth-owned code out of `core` into `codex-login`, move model provider config into `codex-model-provider-info`, move API bridge mapping into `codex-api`, move protocol-owned types/impls into `codex-protocol`, and move response debug helpers into a dedicated `response-debug-context` crate - move feedback tag emission into `codex-feedback`, relocate tests to the crates that now own the code, and keep broad temporary re-exports so this PR avoids a giant import-only rewrite ## Major moves and decisions - created `codex-models-manager` as the owner for model cache/catalog/config/model info logic, including the new `ModelsManagerConfig` struct - created `codex-model-provider-info` as the owner for provider config parsing/defaults and kept temporary `codex-login`/`codex-core` re-exports for old import paths - moved `api_bridge` error mapping + `CoreAuthProvider` into `codex-api`, while `codex-login::api_bridge` temporarily re-exports those symbols and keeps the `auth_provider_from_auth` wrapper - moved `auth_env_telemetry` and `provider_auth` ownership to `codex-login` - moved `CodexErr` ownership to `codex-protocol::error`, plus `StreamOutput`, `bytes_to_string_smart`, and network policy helpers to protocol-owned modules - created `codex-response-debug-context` for `extract_response_debug_context`, `telemetry_transport_error_message`, and related response-debug plumbing instead of leaving that behavior in `core` - moved `FeedbackRequestTags`, `emit_feedback_request_tags`, and `emit_feedback_request_tags_with_auth_env` to `codex-feedback` - deferred removal of temporary re-exports and the mechanical import rewrites to a stacked follow-up PR so this PR stays reviewable ## Test moves - moved auth refresh coverage from `core/tests/suite/auth_refresh.rs` to `login/tests/suite/auth_refresh.rs` - moved text encoding coverage from `core/tests/suite/text_encoding_fix.rs` to `protocol/src/exec_output_tests.rs` - moved model info override coverage from `core/tests/suite/model_info_overrides.rs` to `models-manager/src/model_info_overrides_tests.rs` --------- Co-authored-by: Codex <noreply@openai.com>
This commit is contained in:
@@ -11,6 +11,7 @@ use std::time::Duration;
|
||||
|
||||
use anyhow::Result;
|
||||
use anyhow::anyhow;
|
||||
use codex_login::AuthEnvTelemetry;
|
||||
use codex_protocol::ThreadId;
|
||||
use codex_protocol::protocol::SessionSource;
|
||||
use feedback_diagnostics::FEEDBACK_DIAGNOSTICS_ATTACHMENT_FILENAME;
|
||||
@@ -32,6 +33,128 @@ const UPLOAD_TIMEOUT_SECS: u64 = 10;
|
||||
const FEEDBACK_TAGS_TARGET: &str = "feedback_tags";
|
||||
const MAX_FEEDBACK_TAGS: usize = 64;
|
||||
|
||||
/// Structured request/auth fields that should be attached to feedback uploads.
|
||||
pub struct FeedbackRequestTags<'a> {
|
||||
pub endpoint: &'a str,
|
||||
pub auth_header_attached: bool,
|
||||
pub auth_header_name: Option<&'a str>,
|
||||
pub auth_mode: Option<&'a str>,
|
||||
pub auth_retry_after_unauthorized: Option<bool>,
|
||||
pub auth_recovery_mode: Option<&'a str>,
|
||||
pub auth_recovery_phase: Option<&'a str>,
|
||||
pub auth_connection_reused: Option<bool>,
|
||||
pub auth_request_id: Option<&'a str>,
|
||||
pub auth_cf_ray: Option<&'a str>,
|
||||
pub auth_error: Option<&'a str>,
|
||||
pub auth_error_code: Option<&'a str>,
|
||||
pub auth_recovery_followup_success: Option<bool>,
|
||||
pub auth_recovery_followup_status: Option<u16>,
|
||||
}
|
||||
|
||||
struct FeedbackRequestSnapshot<'a> {
|
||||
endpoint: &'a str,
|
||||
auth_header_attached: bool,
|
||||
auth_header_name: &'a str,
|
||||
auth_mode: &'a str,
|
||||
auth_retry_after_unauthorized: String,
|
||||
auth_recovery_mode: &'a str,
|
||||
auth_recovery_phase: &'a str,
|
||||
auth_connection_reused: String,
|
||||
auth_request_id: &'a str,
|
||||
auth_cf_ray: &'a str,
|
||||
auth_error: &'a str,
|
||||
auth_error_code: &'a str,
|
||||
auth_recovery_followup_success: String,
|
||||
auth_recovery_followup_status: String,
|
||||
}
|
||||
|
||||
impl<'a> FeedbackRequestSnapshot<'a> {
|
||||
fn from_tags(tags: &'a FeedbackRequestTags<'a>) -> Self {
|
||||
Self {
|
||||
endpoint: tags.endpoint,
|
||||
auth_header_attached: tags.auth_header_attached,
|
||||
auth_header_name: tags.auth_header_name.unwrap_or(""),
|
||||
auth_mode: tags.auth_mode.unwrap_or(""),
|
||||
auth_retry_after_unauthorized: tags
|
||||
.auth_retry_after_unauthorized
|
||||
.map_or_else(String::new, |value| value.to_string()),
|
||||
auth_recovery_mode: tags.auth_recovery_mode.unwrap_or(""),
|
||||
auth_recovery_phase: tags.auth_recovery_phase.unwrap_or(""),
|
||||
auth_connection_reused: tags
|
||||
.auth_connection_reused
|
||||
.map_or_else(String::new, |value| value.to_string()),
|
||||
auth_request_id: tags.auth_request_id.unwrap_or(""),
|
||||
auth_cf_ray: tags.auth_cf_ray.unwrap_or(""),
|
||||
auth_error: tags.auth_error.unwrap_or(""),
|
||||
auth_error_code: tags.auth_error_code.unwrap_or(""),
|
||||
auth_recovery_followup_success: tags
|
||||
.auth_recovery_followup_success
|
||||
.map_or_else(String::new, |value| value.to_string()),
|
||||
auth_recovery_followup_status: tags
|
||||
.auth_recovery_followup_status
|
||||
.map_or_else(String::new, |value| value.to_string()),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn emit_feedback_request_tags(tags: &FeedbackRequestTags<'_>) {
|
||||
let snapshot = FeedbackRequestSnapshot::from_tags(tags);
|
||||
tracing::info!(
|
||||
target: FEEDBACK_TAGS_TARGET,
|
||||
endpoint = tracing::field::debug(snapshot.endpoint),
|
||||
auth_header_attached = tracing::field::debug(snapshot.auth_header_attached),
|
||||
auth_header_name = tracing::field::debug(snapshot.auth_header_name),
|
||||
auth_mode = tracing::field::debug(snapshot.auth_mode),
|
||||
auth_retry_after_unauthorized = tracing::field::debug(&snapshot.auth_retry_after_unauthorized),
|
||||
auth_recovery_mode = tracing::field::debug(snapshot.auth_recovery_mode),
|
||||
auth_recovery_phase = tracing::field::debug(snapshot.auth_recovery_phase),
|
||||
auth_connection_reused = tracing::field::debug(&snapshot.auth_connection_reused),
|
||||
auth_request_id = tracing::field::debug(snapshot.auth_request_id),
|
||||
auth_cf_ray = tracing::field::debug(snapshot.auth_cf_ray),
|
||||
auth_error = tracing::field::debug(snapshot.auth_error),
|
||||
auth_error_code = tracing::field::debug(snapshot.auth_error_code),
|
||||
auth_recovery_followup_success = tracing::field::debug(&snapshot.auth_recovery_followup_success),
|
||||
auth_recovery_followup_status = tracing::field::debug(&snapshot.auth_recovery_followup_status),
|
||||
);
|
||||
}
|
||||
|
||||
pub fn emit_feedback_request_tags_with_auth_env(
|
||||
tags: &FeedbackRequestTags<'_>,
|
||||
auth_env: &AuthEnvTelemetry,
|
||||
) {
|
||||
let snapshot = FeedbackRequestSnapshot::from_tags(tags);
|
||||
tracing::info!(
|
||||
target: FEEDBACK_TAGS_TARGET,
|
||||
endpoint = tracing::field::debug(snapshot.endpoint),
|
||||
auth_header_attached = tracing::field::debug(snapshot.auth_header_attached),
|
||||
auth_header_name = tracing::field::debug(snapshot.auth_header_name),
|
||||
auth_mode = tracing::field::debug(snapshot.auth_mode),
|
||||
auth_retry_after_unauthorized = tracing::field::debug(&snapshot.auth_retry_after_unauthorized),
|
||||
auth_recovery_mode = tracing::field::debug(snapshot.auth_recovery_mode),
|
||||
auth_recovery_phase = tracing::field::debug(snapshot.auth_recovery_phase),
|
||||
auth_connection_reused = tracing::field::debug(&snapshot.auth_connection_reused),
|
||||
auth_request_id = tracing::field::debug(snapshot.auth_request_id),
|
||||
auth_cf_ray = tracing::field::debug(snapshot.auth_cf_ray),
|
||||
auth_error = tracing::field::debug(snapshot.auth_error),
|
||||
auth_error_code = tracing::field::debug(snapshot.auth_error_code),
|
||||
auth_recovery_followup_success = tracing::field::debug(&snapshot.auth_recovery_followup_success),
|
||||
auth_recovery_followup_status = tracing::field::debug(&snapshot.auth_recovery_followup_status),
|
||||
auth_env_openai_api_key_present = tracing::field::debug(auth_env.openai_api_key_env_present),
|
||||
auth_env_codex_api_key_present = tracing::field::debug(auth_env.codex_api_key_env_present),
|
||||
auth_env_codex_api_key_enabled = tracing::field::debug(auth_env.codex_api_key_env_enabled),
|
||||
// Custom provider `env_key` is arbitrary config text, so emit only a safe bucket.
|
||||
auth_env_provider_key_name = tracing::field::debug(
|
||||
auth_env.provider_env_key_name.as_deref().unwrap_or("")
|
||||
),
|
||||
auth_env_provider_key_present = tracing::field::debug(
|
||||
&auth_env.provider_env_key_present.map_or_else(String::new, |value| value.to_string())
|
||||
),
|
||||
auth_env_refresh_token_url_override_present = tracing::field::debug(
|
||||
auth_env.refresh_token_url_override_present
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct CodexFeedback {
|
||||
inner: Arc<FeedbackInner>,
|
||||
|
||||
Reference in New Issue
Block a user