Add file-backed personality support and listing

This commit is contained in:
Eric Traut
2026-03-31 17:06:45 -06:00
parent ae057e0bb9
commit 8e00fec700
61 changed files with 1741 additions and 366 deletions
+74 -20
View File
@@ -2,10 +2,10 @@ use codex_utils_absolute_path::AbsolutePathBuf;
use schemars::JsonSchema;
use serde::Deserialize;
use serde::Serialize;
use std::fmt;
use std::num::NonZeroU64;
use std::time::Duration;
use strum_macros::Display;
use strum_macros::EnumIter;
use ts_rs::TS;
use crate::openai_models::ReasoningEffort;
@@ -98,26 +98,80 @@ pub enum WindowsSandboxLevel {
}
#[derive(
Debug,
Serialize,
Deserialize,
Clone,
Copy,
PartialEq,
Eq,
Display,
JsonSchema,
TS,
PartialOrd,
Ord,
EnumIter,
Debug, Serialize, Deserialize, Clone, PartialEq, Eq, JsonSchema, TS, PartialOrd, Ord, Hash,
)]
#[serde(rename_all = "lowercase")]
#[strum(serialize_all = "lowercase")]
pub enum Personality {
None,
Friendly,
Pragmatic,
#[serde(transparent)]
#[ts(type = "string")]
pub struct Personality(String);
impl Personality {
pub const NONE: &str = "none";
pub const FRIENDLY: &str = "friendly";
pub const PRAGMATIC: &str = "pragmatic";
pub fn new(value: impl Into<String>) -> Self {
Self(value.into())
}
pub fn as_str(&self) -> &str {
self.0.as_str()
}
pub fn is_builtin(&self) -> bool {
self.is_none() || self.is_friendly() || self.is_pragmatic()
}
pub fn is_none(&self) -> bool {
self.as_str() == Self::NONE
}
pub fn is_friendly(&self) -> bool {
self.as_str() == Self::FRIENDLY
}
pub fn is_pragmatic(&self) -> bool {
self.as_str() == Self::PRAGMATIC
}
pub fn builtin_names() -> [&'static str; 3] {
[Self::NONE, Self::FRIENDLY, Self::PRAGMATIC]
}
pub fn none() -> Self {
Self::new(Self::NONE)
}
pub fn friendly() -> Self {
Self::new(Self::FRIENDLY)
}
pub fn pragmatic() -> Self {
Self::new(Self::PRAGMATIC)
}
}
impl From<&str> for Personality {
fn from(value: &str) -> Self {
Self::new(value)
}
}
impl From<String> for Personality {
fn from(value: String) -> Self {
Self::new(value)
}
}
impl From<Personality> for String {
fn from(value: Personality) -> Self {
value.0
}
}
impl fmt::Display for Personality {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str(self.as_str())
}
}
#[derive(
+25 -21
View File
@@ -382,10 +382,14 @@ impl ModelInstructionsVariables {
pub fn get_personality_message(&self, personality: Option<Personality>) -> Option<String> {
if let Some(personality) = personality {
match personality {
Personality::None => Some(String::new()),
Personality::Friendly => self.personality_friendly.clone(),
Personality::Pragmatic => self.personality_pragmatic.clone(),
if personality.is_none() {
Some(String::new())
} else if personality.is_friendly() {
self.personality_friendly.clone()
} else if personality.is_pragmatic() {
self.personality_pragmatic.clone()
} else {
None
}
} else {
self.personality_default.clone()
@@ -579,7 +583,7 @@ mod tests {
instructions_variables: Some(personality_variables()),
}));
let instructions = model.get_model_instructions(Some(Personality::Friendly));
let instructions = model.get_model_instructions(Some(Personality::friendly()));
assert_eq!(instructions, "Hello friendly");
}
@@ -595,15 +599,15 @@ mod tests {
}),
}));
assert_eq!(
model.get_model_instructions(Some(Personality::Friendly)),
model.get_model_instructions(Some(Personality::friendly())),
"Hello\nfriendly"
);
assert_eq!(
model.get_model_instructions(Some(Personality::Pragmatic)),
model.get_model_instructions(Some(Personality::pragmatic())),
"Hello\n"
);
assert_eq!(
model.get_model_instructions(Some(Personality::None)),
model.get_model_instructions(Some(Personality::none())),
"Hello\n"
);
assert_eq!(
@@ -620,15 +624,15 @@ mod tests {
}),
}));
assert_eq!(
model_no_personality.get_model_instructions(Some(Personality::Friendly)),
model_no_personality.get_model_instructions(Some(Personality::friendly())),
"Hello\n"
);
assert_eq!(
model_no_personality.get_model_instructions(Some(Personality::Pragmatic)),
model_no_personality.get_model_instructions(Some(Personality::pragmatic())),
"Hello\n"
);
assert_eq!(
model_no_personality.get_model_instructions(Some(Personality::None)),
model_no_personality.get_model_instructions(Some(Personality::none())),
"Hello\n"
);
assert_eq!(
@@ -648,7 +652,7 @@ mod tests {
}),
}));
let instructions = model.get_model_instructions(Some(Personality::Friendly));
let instructions = model.get_model_instructions(Some(Personality::friendly()));
assert_eq!(instructions, "base");
}
@@ -666,15 +670,15 @@ mod tests {
fn get_personality_message() {
let personality_variables = personality_variables();
assert_eq!(
personality_variables.get_personality_message(Some(Personality::Friendly)),
personality_variables.get_personality_message(Some(Personality::friendly())),
Some("friendly".to_string())
);
assert_eq!(
personality_variables.get_personality_message(Some(Personality::Pragmatic)),
personality_variables.get_personality_message(Some(Personality::pragmatic())),
Some("pragmatic".to_string())
);
assert_eq!(
personality_variables.get_personality_message(Some(Personality::None)),
personality_variables.get_personality_message(Some(Personality::none())),
Some(String::new())
);
assert_eq!(
@@ -688,15 +692,15 @@ mod tests {
personality_pragmatic: None,
};
assert_eq!(
personality_variables.get_personality_message(Some(Personality::Friendly)),
personality_variables.get_personality_message(Some(Personality::friendly())),
None
);
assert_eq!(
personality_variables.get_personality_message(Some(Personality::Pragmatic)),
personality_variables.get_personality_message(Some(Personality::pragmatic())),
None
);
assert_eq!(
personality_variables.get_personality_message(Some(Personality::None)),
personality_variables.get_personality_message(Some(Personality::none())),
Some(String::new())
);
assert_eq!(
@@ -710,15 +714,15 @@ mod tests {
personality_pragmatic: Some("pragmatic".to_string()),
};
assert_eq!(
personality_variables.get_personality_message(Some(Personality::Friendly)),
personality_variables.get_personality_message(Some(Personality::friendly())),
Some("friendly".to_string())
);
assert_eq!(
personality_variables.get_personality_message(Some(Personality::Pragmatic)),
personality_variables.get_personality_message(Some(Personality::pragmatic())),
Some("pragmatic".to_string())
);
assert_eq!(
personality_variables.get_personality_message(Some(Personality::None)),
personality_variables.get_personality_message(Some(Personality::none())),
Some(String::new())
);
assert_eq!(