use opencode_rs::ClientBuilder;
use opencode_rs::types::event::Event;
use opencode_rs::types::message::{PromptPart, PromptRequest};
use opencode_rs::types::project::ModelRef;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
tracing_subscriber::fmt::init();
let client = ClientBuilder::new().build()?;
let session_id = "ses_3b94a59d7ffe4NqJsbEWC0mIeL";
println!("Using existing session: {}", session_id);
let mut subscription = client.subscribe_session(session_id).await?;
println!("Subscribed to events");
client
.messages()
.prompt(
session_id,
&PromptRequest {
parts: vec![PromptPart::Text {
text: "Write a haiku about Rust programming".into(),
synthetic: None,
ignored: None,
metadata: None,
}],
message_id: None,
model: Some(ModelRef {
provider_id: "kimi-for-coding".into(),
model_id: "kimi-k2-thinking".into(),
}),
agent: None,
no_reply: None,
system: None,
variant: None,
},
)
.await?;
println!("Prompt sent, streaming events...\n");
loop {
match subscription.recv().await {
Some(Event::SessionIdle { .. }) => {
println!("\n[Session completed]");
break;
}
Some(Event::SessionError { properties }) => {
eprintln!("\n[Session error: {:?}]", properties.error);
break;
}
Some(Event::MessagePartUpdated { properties }) => {
if let Some(delta) = &properties.delta {
print!("{}", delta);
}
}
Some(Event::ServerHeartbeat { .. }) => {
}
Some(event) => {
eprintln!("[Other event: {:?}]", event);
}
None => {
println!("[Stream closed]");
break;
}
}
}
println!("\nDone!");
Ok(())
}