invoance 0.2.0

Official Rust SDK for the Invoance compliance API
Documentation
//! End-to-end quick start. Run with:
//!
//! ```bash
//! INVOANCE_API_KEY=inv_live_... cargo run --example quickstart
//! ```

use invoance::models::{IngestAttestationParams, IngestEventParams};
use invoance::InvoanceClient;
use serde_json::json;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    // Reads INVOANCE_API_KEY (and optional INVOANCE_BASE_URL) from the env.
    let client = InvoanceClient::new()?;

    // Confirm the key works before doing anything else.
    let check = client.validate().await;
    if !check.valid {
        eprintln!("Invoance config invalid: {:?}", check.reason);
        return Ok(());
    }
    println!("connected to {}", check.base_url);

    // Ingest a compliance event.
    let event = client
        .events()
        .ingest(IngestEventParams {
            event_type: "policy.approval".into(),
            payload: json!({ "policy_id": "pol_001", "decision": "approved" })
                .as_object()
                .unwrap()
                .clone(),
            ..Default::default()
        })
        .await?;
    println!("event_id = {}", event.event_id);

    // Ingest an AI attestation.
    let att = client
        .attestations()
        .ingest(IngestAttestationParams {
            r#type: "output".into(),
            input: "Summarize this contract".into(),
            output: "The contract states...".into(),
            model_provider: "openai".into(),
            model_name: "gpt-4o".into(),
            model_version: "2025-01-01".into(),
            subject: json!({ "user_id": "u_42", "session_id": "sess_4f9a" })
                .as_object()
                .cloned(),
            ..Default::default()
        })
        .await?;
    println!("attestation_id = {}", att.attestation_id);

    Ok(())
}