mirror of
https://github.com/openai/codex.git
synced 2026-11-08 20:40:33 +00:00
## Why The memories extension now owns the read-path developer instructions it injects at thread start. Keeping that prompt builder and template in `codex-memories-read` left the extension depending on a helper crate for extension-specific prompt assembly, and kept async template/truncation dependencies in the read crate after the remaining read surface no longer needed them. ## What changed - Moved `prompts.rs`, its tests, and `templates/memories/read_path.md` from `memories/read` into `ext/memories`. - Wired `MemoryExtension` to call the local prompt builder and added the moved templates to `ext/memories/BUILD.bazel` compile data. - Removed the now-unused prompt export and prompt-related dependencies from `codex-memories-read`. ## Testing - Not run locally.
56 lines
1.8 KiB
Rust
56 lines
1.8 KiB
Rust
use crate::MEMORY_TOOL_DEVELOPER_INSTRUCTIONS_SUMMARY_TOKEN_LIMIT;
|
|
use codex_utils_absolute_path::AbsolutePathBuf;
|
|
use codex_utils_output_truncation::TruncationPolicy;
|
|
use codex_utils_output_truncation::truncate_text;
|
|
use codex_utils_template::Template;
|
|
use std::sync::LazyLock;
|
|
use tokio::fs;
|
|
|
|
static MEMORY_TOOL_DEVELOPER_INSTRUCTIONS_TEMPLATE: LazyLock<Template> = LazyLock::new(|| {
|
|
parse_embedded_template(
|
|
include_str!("../templates/memories/read_path.md"),
|
|
"memories/read_path.md",
|
|
)
|
|
});
|
|
|
|
fn parse_embedded_template(source: &'static str, template_name: &str) -> Template {
|
|
match Template::parse(source) {
|
|
Ok(template) => template,
|
|
Err(err) => panic!("embedded template {template_name} is invalid: {err}"),
|
|
}
|
|
}
|
|
|
|
/// Build the memory read-path prompt that is added to developer instructions.
|
|
///
|
|
/// Large `memory_summary.md` files are truncated at
|
|
/// [MEMORY_TOOL_DEVELOPER_INSTRUCTIONS_SUMMARY_TOKEN_LIMIT].
|
|
pub(crate) async fn build_memory_tool_developer_instructions(
|
|
codex_home: &AbsolutePathBuf,
|
|
) -> Option<String> {
|
|
let base_path = codex_home.join("memories");
|
|
let memory_summary_path = base_path.join("memory_summary.md");
|
|
let memory_summary = fs::read_to_string(&memory_summary_path)
|
|
.await
|
|
.ok()?
|
|
.trim()
|
|
.to_string();
|
|
let memory_summary = truncate_text(
|
|
&memory_summary,
|
|
TruncationPolicy::Tokens(MEMORY_TOOL_DEVELOPER_INSTRUCTIONS_SUMMARY_TOKEN_LIMIT),
|
|
);
|
|
if memory_summary.is_empty() {
|
|
return None;
|
|
}
|
|
let base_path = base_path.display().to_string();
|
|
MEMORY_TOOL_DEVELOPER_INSTRUCTIONS_TEMPLATE
|
|
.render([
|
|
("base_path", base_path.as_str()),
|
|
("memory_summary", memory_summary.as_str()),
|
|
])
|
|
.ok()
|
|
}
|
|
|
|
#[cfg(test)]
|
|
#[path = "prompts_tests.rs"]
|
|
mod tests;
|