#![allow(dead_code)]
use open_agent::{AgentOptions, ContentBlock, Message};
use wiremock::matchers::{method, path};
use wiremock::{Mock, MockServer, ResponseTemplate};
pub async fn sse_server(body: impl Into<String>) -> MockServer {
let server = MockServer::start().await;
Mock::given(method("POST"))
.and(path("/v1/chat/completions"))
.respond_with(
ResponseTemplate::new(200)
.insert_header("content-type", "text/event-stream")
.set_body_string(body.into()),
)
.mount(&server)
.await;
server
}
pub fn options_for(server: &MockServer) -> AgentOptions {
AgentOptions::builder()
.model("m")
.base_url(format!("{}/v1", server.uri()))
.api_key("k")
.build()
.expect("minimal options build")
}
pub fn text_chunk(content: &str, finish: Option<&str>) -> String {
sse_frame(serde_json::json!({
"index": 0,
"delta": { "content": content },
"finish_reason": finish,
}))
}
pub fn tool_chunk(id: &str, name: &str, arguments: &str) -> String {
sse_frame(serde_json::json!({
"index": 0,
"delta": {
"tool_calls": [{
"index": 0,
"id": id,
"type": "function",
"function": { "name": name, "arguments": arguments },
}],
},
"finish_reason": serde_json::Value::Null,
}))
}
fn sse_frame(choice: serde_json::Value) -> String {
let chunk = serde_json::json!({
"id": "1",
"object": "chat.completion.chunk",
"created": 0,
"model": "m",
"choices": [choice],
});
format!("data: {chunk}\n\n")
}
pub const DONE: &str = "data: [DONE]\n\n";
pub fn text_of(blocks: &[ContentBlock]) -> String {
blocks
.iter()
.filter_map(|block| match block {
ContentBlock::Text(text) => Some(text.text.as_str()),
_ => None,
})
.collect()
}
pub fn message_text(message: &Message) -> String {
text_of(&message.content)
}