mirror of
https://github.com/openai/codex.git
synced 2026-11-10 21:00:47 +00:00
Add file-backed personality support and listing
This commit is contained in:
@@ -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(
|
||||
|
||||
@@ -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!(
|
||||
|
||||
Reference in New Issue
Block a user