mirror of
https://github.com/pchuan98/codex.git
synced 2026-07-01 00:31:56 +08:00
Collaboration modes were slightly invasive both into ThreadManager construction and ModelProvider
60 lines
2.2 KiB
Rust
60 lines
2.2 KiB
Rust
use codex_collaboration_mode_templates::DEFAULT as COLLABORATION_MODE_DEFAULT;
|
|
use codex_collaboration_mode_templates::PLAN as COLLABORATION_MODE_PLAN;
|
|
use codex_protocol::config_types::CollaborationModeMask;
|
|
use codex_protocol::config_types::ModeKind;
|
|
use codex_protocol::config_types::TUI_VISIBLE_COLLABORATION_MODES;
|
|
use codex_protocol::openai_models::ReasoningEffort;
|
|
use codex_utils_template::Template;
|
|
use std::sync::LazyLock;
|
|
|
|
const KNOWN_MODE_NAMES_TEMPLATE_KEY: &str = "KNOWN_MODE_NAMES";
|
|
static COLLABORATION_MODE_DEFAULT_TEMPLATE: LazyLock<Template> = LazyLock::new(|| {
|
|
Template::parse(COLLABORATION_MODE_DEFAULT)
|
|
.unwrap_or_else(|err| panic!("collaboration mode default template must parse: {err}"))
|
|
});
|
|
|
|
pub fn builtin_collaboration_mode_presets() -> Vec<CollaborationModeMask> {
|
|
vec![plan_preset(), default_preset()]
|
|
}
|
|
|
|
fn plan_preset() -> CollaborationModeMask {
|
|
CollaborationModeMask {
|
|
name: ModeKind::Plan.display_name().to_string(),
|
|
mode: Some(ModeKind::Plan),
|
|
model: None,
|
|
reasoning_effort: Some(Some(ReasoningEffort::Medium)),
|
|
developer_instructions: Some(Some(COLLABORATION_MODE_PLAN.to_string())),
|
|
}
|
|
}
|
|
|
|
fn default_preset() -> CollaborationModeMask {
|
|
CollaborationModeMask {
|
|
name: ModeKind::Default.display_name().to_string(),
|
|
mode: Some(ModeKind::Default),
|
|
model: None,
|
|
reasoning_effort: None,
|
|
developer_instructions: Some(Some(default_mode_instructions())),
|
|
}
|
|
}
|
|
|
|
fn default_mode_instructions() -> String {
|
|
let known_mode_names = format_mode_names(&TUI_VISIBLE_COLLABORATION_MODES);
|
|
COLLABORATION_MODE_DEFAULT_TEMPLATE
|
|
.render([(KNOWN_MODE_NAMES_TEMPLATE_KEY, known_mode_names.as_str())])
|
|
.unwrap_or_else(|err| panic!("collaboration mode default template must render: {err}"))
|
|
}
|
|
|
|
fn format_mode_names(modes: &[ModeKind]) -> String {
|
|
let mode_names: Vec<&str> = modes.iter().map(|mode| mode.display_name()).collect();
|
|
match mode_names.as_slice() {
|
|
[] => "none".to_string(),
|
|
[mode_name] => (*mode_name).to_string(),
|
|
[first, second] => format!("{first} and {second}"),
|
|
[..] => mode_names.join(", "),
|
|
}
|
|
}
|
|
|
|
#[cfg(test)]
|
|
#[path = "collaboration_mode_presets_tests.rs"]
|
|
mod tests;
|