70 lines
2.7 KiB
Rust
70 lines
2.7 KiB
Rust
use std::fs::File;
|
|
use std::io::BufReader;
|
|
use std::path::{Path, PathBuf};
|
|
|
|
use rig_core::client::CompletionClient;
|
|
use rig_core::completion::CompletionModel;
|
|
use rig_core::providers::chatgpt::{self, ChatGPTAuth};
|
|
|
|
fn codex_auth_path() -> PathBuf {
|
|
if let Some(codex_home) = std::env::var_os("CODEX_HOME") {
|
|
return PathBuf::from(codex_home).join("auth.json");
|
|
}
|
|
|
|
let home = std::env::var_os("HOME").expect("HOME must be set to locate ~/.codex/auth.json");
|
|
PathBuf::from(home).join(".codex").join("auth.json")
|
|
}
|
|
|
|
fn load_codex_auth(path: &Path) -> ChatGPTAuth {
|
|
let file = File::open(path)
|
|
.unwrap_or_else(|error| panic!("failed to open {}: {error}", path.display()));
|
|
let document: serde_json::Value = serde_json::from_reader(BufReader::new(file))
|
|
.unwrap_or_else(|error| panic!("failed to parse {}: {error}", path.display()));
|
|
let tokens = document
|
|
.get("tokens")
|
|
.unwrap_or_else(|| panic!("{} does not contain a tokens object", path.display()));
|
|
let access_token = tokens
|
|
.get("access_token")
|
|
.and_then(serde_json::Value::as_str)
|
|
.filter(|token| !token.is_empty())
|
|
.unwrap_or_else(|| panic!("{} does not contain an access token", path.display()));
|
|
let account_id = tokens
|
|
.get("account_id")
|
|
.and_then(serde_json::Value::as_str)
|
|
.filter(|account_id| !account_id.is_empty())
|
|
.map(str::to_string);
|
|
|
|
ChatGPTAuth::AccessToken {
|
|
access_token: access_token.to_string(),
|
|
account_id,
|
|
}
|
|
}
|
|
|
|
#[tokio::test(flavor = "current_thread")]
|
|
#[ignore = "makes a live ChatGPT request using local Codex credentials"]
|
|
async fn live_chatgpt_backend_via_rig_records_full_response() {
|
|
let auth_path = codex_auth_path();
|
|
let client = chatgpt::Client::builder()
|
|
.api_key(load_codex_auth(&auth_path))
|
|
.allow_device_flow(false)
|
|
.build()
|
|
.expect("Rig ChatGPT client should build");
|
|
let model_id =
|
|
std::env::var("GALAXY_CHATGPT_LIVE_MODEL").unwrap_or_else(|_| chatgpt::GPT_5_4.to_string());
|
|
let prompt = std::env::var("GALAXY_CHATGPT_LIVE_PROMPT").unwrap_or_else(|_| {
|
|
"Reply with exactly two short sentences explaining what a live backend smoke test verifies."
|
|
.to_string()
|
|
});
|
|
let model = client.completion_model(&model_id);
|
|
let request = model.completion_request(prompt).build();
|
|
|
|
let response = model
|
|
.completion(request)
|
|
.await
|
|
.expect("live ChatGPT completion should succeed");
|
|
let recorded = serde_json::to_string_pretty(&response)
|
|
.expect("the normalized Rig response should serialize");
|
|
|
|
println!("CHATGPT_LIVE_RESPONSE_BEGIN\n{recorded}\nCHATGPT_LIVE_RESPONSE_END");
|
|
}
|