use serde::{Deserialize, Serialize};
#[derive(Debug, Clone)]
pub struct ClientConfig {
pub directory_url: String,
pub timeout_ms: u64,
pub region: Option<String>,
pub node_token: Option<String>,
}
impl Default for ClientConfig {
fn default() -> Self {
Self {
directory_url: "https://iicp.network/api".into(),
timeout_ms: 30_000,
region: None,
node_token: None,
}
}
}
#[derive(Debug, Default, Clone)]
pub struct DiscoverOptions {
pub region: Option<String>,
pub model: Option<String>,
pub min_reputation: Option<f64>,
pub limit: Option<u32>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct Node {
pub node_id: String,
pub endpoint: String,
pub score: f64,
pub available: bool,
pub region: String,
pub models: Option<Vec<String>>,
pub cip_policy: Option<CipPolicy>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct CipPolicy {
pub allow_remote_inference: bool,
}
#[derive(Debug, Clone, Deserialize)]
pub struct NodeList {
pub nodes: Vec<Node>,
pub count: u32,
}
#[derive(Debug, Clone, Serialize)]
pub struct TaskRequest {
pub task_id: String,
pub intent: String,
pub payload: serde_json::Value,
#[serde(skip_serializing_if = "Option::is_none")]
pub constraints: Option<TaskConstraints>,
#[serde(skip_serializing_if = "Option::is_none")]
pub auth: Option<TaskAuth>,
}
#[derive(Debug, Clone, Serialize)]
pub struct TaskConstraints {
#[serde(skip_serializing_if = "Option::is_none")]
pub timeout_ms: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_tokens: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub model: Option<String>,
}
#[derive(Debug, Clone, Serialize)]
pub struct TaskAuth {
pub token: String,
}
#[derive(Debug, Clone, Deserialize)]
pub struct TaskResponse {
pub task_id: String,
pub status: String,
pub result: Option<serde_json::Value>,
pub metrics: Option<TaskMetrics>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct TaskMetrics {
pub latency_ms: Option<f64>,
pub tokens_used: Option<u32>,
pub node_id: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ChatMessage {
pub role: String,
pub content: String,
}
#[derive(Debug, Default, Clone)]
pub struct ChatOptions {
pub model: Option<String>,
pub max_tokens: Option<u32>,
pub timeout_ms: Option<u64>,
pub temperature: Option<f64>,
}
#[derive(Debug, Clone, Deserialize, Default)]
pub struct ChatResponse {
pub choices: Vec<ChatChoice>,
pub usage: Option<ChatUsage>,
#[serde(default)]
pub task_id: String,
#[serde(default)]
pub node_id: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct ChatChoice {
pub message: ChatMessage,
pub finish_reason: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct ChatUsage {
pub total_tokens: Option<u32>,
pub prompt_tokens: Option<u32>,
pub completion_tokens: Option<u32>,
}