vtcode 0.99.1

A Rust-based terminal coding agent with modular architecture supporting multiple LLM providers
use anyhow::Result;

#[cfg(feature = "anthropic-api")]
pub(super) async fn handle_anthropic_api_command(
    core_cfg: vtcode_core::config::types::AgentConfig,
    port: u16,
    host: String,
) -> Result<()> {
    use std::net::SocketAddr;
    use vtcode_core::llm::providers::anthropic::api::{AnthropicApiServerState, create_router};

    let provider = vtcode_core::llm::factory::create_provider_for_model(
        &core_cfg.model,
        core_cfg.api_key.clone(),
        None,
        core_cfg.model_behavior.clone(),
    )
    .map_err(|e| anyhow::anyhow!("Failed to create LLM provider: {}", e))?;

    let state =
        AnthropicApiServerState::new(std::sync::Arc::from(provider), core_cfg.model.clone());
    let app = create_router(state);

    let addr = format!("{}:{}", host, port)
        .parse::<SocketAddr>()
        .map_err(|e| anyhow::anyhow!("Invalid address {}:{}: {}", host, port, e))?;

    println!("Anthropic API server starting on http://{}", addr);
    println!("Compatible with Anthropic Messages API at /v1/messages");
    println!("Press Ctrl+C to stop the server");

    let listener = tokio::net::TcpListener::bind(addr)
        .await
        .map_err(|e| anyhow::anyhow!("Failed to bind to address {}: {}", addr, e))?;

    ::axum::serve(listener, app)
        .with_graceful_shutdown(vtcode_core::shutdown::shutdown_signal_logged("server"))
        .await
        .map_err(|e| anyhow::anyhow!("Server error: {}", e))?;

    Ok(())
}

#[cfg(not(feature = "anthropic-api"))]
pub(super) async fn handle_anthropic_api_command(
    _core_cfg: vtcode_core::config::types::AgentConfig,
    _port: u16,
    _host: String,
) -> Result<()> {
    Err(anyhow::anyhow!(
        "Anthropic API server is not enabled. Recompile with --features anthropic-api"
    ))
}