eros-nft 0.2.0

Reference implementation of the eros-nft v1 spec: types, validators, sample loader, and CLI for Solana persona NFT cards.
Documentation
//! Wire types for `PersonaDraft` and `PersonaManifest`.

use serde::{Deserialize, Serialize};

#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct Creator {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub wallet_address: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub display_name: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct DialogueExample {
    pub user: String,
    pub persona: String,
}

#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum AvatarProvenance {
    SelfCreated,
    AiGenerated,
    Licensed,
}

#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct AvatarSource {
    pub uri: String,
    pub provenance: AvatarProvenance,
    pub provenance_attestation: String,
}

#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct AvatarRef {
    pub uri: String,
    pub sha256: String,
    pub provenance: AvatarProvenance,
}

#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum TipPersonality {
    GoldDigger,
    Tsundere,
    Zen,
    SlowWarm,
    Default,
}

#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Default)]
pub struct AffinityPriors {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub warmth: Option<f64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub trust: Option<f64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub intrigue: Option<f64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub intimacy: Option<f64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub patience: Option<f64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub tension: Option<f64>,
}

#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct Behavior {
    pub tip_personality: TipPersonality,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub affinity_priors: Option<AffinityPriors>,
}

#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct ComplianceCore {
    pub is_nsfw: bool,
    pub contains_real_person_likeness: bool,
    pub uses_third_party_ip: bool,
    pub real_person_disclaimer_acknowledged: bool,
    pub third_party_ip_disclaimer_acknowledged: bool,
    pub creator_acknowledgments: Vec<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct ComplianceRegional {
    pub region: String,
    pub pack_id: String,
    pub pack_version: String,
    pub fields: serde_json::Value,
}

#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct Compliance {
    pub core: ComplianceCore,
    pub regional: Vec<ComplianceRegional>,
}

#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
pub enum CipherAlg {
    #[serde(rename = "AES-256-GCM")]
    AesGcm256,
}

#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct PromptCiphertextRef {
    pub kms_key_ref: String,
    pub ciphertext_uri: String,
    pub ciphertext_sha256: String,
    pub alg: CipherAlg,
    pub aad: String,
}

#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct PersonaDraft {
    #[serde(rename = "$schema", skip_serializing_if = "Option::is_none")]
    pub schema: Option<String>,
    pub spec_version: String,
    pub creator: Creator,
    pub name: String,
    pub tagline: String,
    pub description: String,
    pub greeting: String,
    pub definition_dialogues: Vec<DialogueExample>,
    pub system_prompt: String,
    pub avatar_source: AvatarSource,
    pub behavior: Behavior,
    pub compliance: Compliance,
}

#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct PersonaManifest {
    #[serde(rename = "$schema", skip_serializing_if = "Option::is_none")]
    pub schema: Option<String>,
    pub spec_version: String,
    pub persona_id: String,
    pub minted_at: String,
    pub name: String,
    pub tagline: String,
    pub description: String,
    pub greeting: String,
    pub avatar: AvatarRef,
    pub prompt_ciphertext_ref: PromptCiphertextRef,
    pub behavior: Behavior,
    pub compliance: Compliance,
}