1c9a7c0b05
Co-authored-by: Michael Neale <michael.neale@gmail.com> Co-authored-by: Wendy Tang <wendytang@squareup.com> Co-authored-by: Jarrod Sibbison <72240382+jsibbison-square@users.noreply.github.com> Co-authored-by: Alex Hancock <alex.hancock@example.com> Co-authored-by: Alex Hancock <alexhancock@block.xyz> Co-authored-by: Lifei Zhou <lifei@squareup.com> Co-authored-by: Wes <141185334+wesrblock@users.noreply.github.com> Co-authored-by: Max Novich <maksymstepanenko1990@gmail.com> Co-authored-by: Zaki Ali <zaki@squareup.com> Co-authored-by: Salman Mohammed <smohammed@squareup.com> Co-authored-by: Kalvin C <kalvinnchau@users.noreply.github.com> Co-authored-by: Alec Thomas <alec@swapoff.org> Co-authored-by: lily-de <119957291+lily-de@users.noreply.github.com> Co-authored-by: kalvinnchau <kalvin@block.xyz> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: Rizel Scarlett <rizel@squareup.com> Co-authored-by: bwrage <bwrage@squareup.com> Co-authored-by: Kalvin Chau <kalvin@squareup.com> Co-authored-by: Alice Hau <110418948+ahau-square@users.noreply.github.com> Co-authored-by: Alistair Gray <ajgray@stripe.com> Co-authored-by: Nahiyan Khan <nahiyan.khan@gmail.com> Co-authored-by: Alex Hancock <alexhancock@squareup.com> Co-authored-by: Nahiyan Khan <nahiyan@squareup.com> Co-authored-by: marcelle <1852848+laanak08@users.noreply.github.com> Co-authored-by: Yingjie He <yingjiehe@block.xyz> Co-authored-by: Yingjie He <yingjiehe@squareup.com> Co-authored-by: Lily Delalande <ldelalande@block.xyz> Co-authored-by: Adewale Abati <acekyd01@gmail.com> Co-authored-by: Ebony Louis <ebony774@gmail.com> Co-authored-by: Angie Jones <jones.angie@gmail.com> Co-authored-by: Ebony Louis <55366651+EbonyLouis@users.noreply.github.com>
94 lines
2.9 KiB
Rust
94 lines
2.9 KiB
Rust
use goose::providers::base::ProviderUsage;
|
|
|
|
#[derive(Debug, serde::Serialize, serde::Deserialize)]
|
|
struct SessionLog {
|
|
session_file: String,
|
|
usage: Vec<ProviderUsage>,
|
|
}
|
|
|
|
pub fn log_usage(session_file: String, usage: Vec<ProviderUsage>) {
|
|
let log = SessionLog {
|
|
session_file,
|
|
usage,
|
|
};
|
|
|
|
// Ensure log directory exists
|
|
if let Some(home_dir) = dirs::home_dir() {
|
|
let log_dir = home_dir.join(".config").join("goose").join("logs");
|
|
if let Err(e) = std::fs::create_dir_all(&log_dir) {
|
|
eprintln!("Failed to create log directory: {}", e);
|
|
return;
|
|
}
|
|
|
|
let log_file = log_dir.join("goose.log");
|
|
let serialized = match serde_json::to_string(&log) {
|
|
Ok(s) => s,
|
|
Err(e) => {
|
|
eprintln!("Failed to serialize usage log: {}", e);
|
|
return;
|
|
}
|
|
};
|
|
|
|
// Append to log file
|
|
if let Err(e) = std::fs::OpenOptions::new()
|
|
.create(true)
|
|
.append(true)
|
|
.open(log_file)
|
|
.and_then(|mut file| {
|
|
std::io::Write::write_all(&mut file, serialized.as_bytes())?;
|
|
std::io::Write::write_all(&mut file, b"\n")?;
|
|
Ok(())
|
|
})
|
|
{
|
|
eprintln!("Failed to write to usage log file: {}", e);
|
|
}
|
|
} else {
|
|
eprintln!("Failed to write to usage log file: Failed to determine home directory");
|
|
}
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use goose::providers::base::{ProviderUsage, Usage};
|
|
|
|
use crate::{
|
|
log_usage::{log_usage, SessionLog},
|
|
test_helpers::run_with_tmp_dir,
|
|
};
|
|
|
|
#[test]
|
|
fn test_session_logging() {
|
|
run_with_tmp_dir(|| {
|
|
let home_dir = dirs::home_dir().unwrap();
|
|
let log_file = home_dir
|
|
.join(".config")
|
|
.join("goose")
|
|
.join("logs")
|
|
.join("goose.log");
|
|
|
|
log_usage(
|
|
"path.txt".to_string(),
|
|
vec![ProviderUsage::new(
|
|
"model".to_string(),
|
|
Usage::new(Some(10), Some(20), Some(30)),
|
|
)],
|
|
);
|
|
|
|
// Check if log file exists and contains the expected content
|
|
assert!(log_file.exists(), "Log file should exist");
|
|
|
|
let log_content = std::fs::read_to_string(&log_file).unwrap();
|
|
let log: SessionLog = serde_json::from_str(&log_content).unwrap();
|
|
|
|
assert!(log.session_file.contains("path.txt"));
|
|
assert_eq!(log.usage[0].usage.input_tokens, Some(10));
|
|
assert_eq!(log.usage[0].usage.output_tokens, Some(20));
|
|
assert_eq!(log.usage[0].usage.total_tokens, Some(30));
|
|
assert_eq!(log.usage[0].model, "model");
|
|
|
|
// Remove the log file after test
|
|
std::fs::remove_file(&log_file).ok();
|
|
})
|
|
}
|
|
}
|