use agio::{
Config,
persistence::MemoryStore,
server::AgentManager,
};
use axum::{
routing::{get, post, delete},
Router, Json, extract::{State, Path},
};
use serde::{Deserialize, Serialize};
use std::sync::Arc;
use std::net::SocketAddr;
#[derive(Deserialize)]
struct MessageRequest {
message: String,
}
#[derive(Serialize)]
struct MessageResponse {
response: String,
}
#[derive(Serialize)]
struct AgentResponse {
id: String,
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let api_key = std::env::var("OPENAI_API_KEY")
.expect("OPENAI_API_KEY environment variable must be set");
let store = Arc::new(MemoryStore::new());
let config = Config::new()
.with_api_key(api_key)
.with_model("gpt-4o");
let agent_manager = Arc::new(AgentManager::new(config, store, 100));
let app = Router::new()
.route("/agents", post(create_agent))
.route("/agents/{id}/messages", post(handle_message))
.route("/agents/{id}", get(get_agent))
.route("/agents/{id}", delete(delete_agent))
.route("/agents", get(list_agents))
.with_state(agent_manager);
let addr = SocketAddr::from(([127, 0, 0, 1], 3000));
println!("Starting server on http://{}", addr);
axum::serve(
tokio::net::TcpListener::bind(addr).await?,
app
)
.await?;
Ok(())
}
async fn create_agent(
State(manager): State<Arc<AgentManager>>,
) -> Result<Json<AgentResponse>, String> {
manager.create_agent().await
.map(|id| Json(AgentResponse { id }))
.map_err(|e| e.to_string())
}
async fn handle_message(
State(manager): State<Arc<AgentManager>>,
Path(id): Path<String>,
Json(request): Json<MessageRequest>,
) -> Result<Json<MessageResponse>, String> {
manager.run_message(&id, &request.message).await
.map(|response| Json(MessageResponse { response }))
.map_err(|e| e.to_string())
}
async fn get_agent(
State(manager): State<Arc<AgentManager>>,
Path(id): Path<String>,
) -> Result<String, String> {
manager.get_agent(&id).await
.map(|_| format!("Agent {} exists", id))
.map_err(|e| e.to_string())
}
async fn delete_agent(
State(manager): State<Arc<AgentManager>>,
Path(id): Path<String>,
) -> Result<String, String> {
manager.delete_agent(&id).await
.map(|_| format!("Agent {} deleted", id))
.map_err(|e| e.to_string())
}
async fn list_agents(
State(manager): State<Arc<AgentManager>>,
) -> Result<Json<Vec<agio::persistence::ConversationMetadata>>, String> {
manager.list_conversations(100, 0).await
.map(Json)
.map_err(|e| e.to_string())
}