use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct Content {
#[serde(skip_serializing_if = "Option::is_none")]
pub role: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub parts: Option<Vec<Part>>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct Part {
#[serde(skip_serializing_if = "Option::is_none")]
pub text: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub function_call: Option<FunctionCall>,
#[serde(skip_serializing_if = "Option::is_none")]
pub function_response: Option<FunctionResponse>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct FunctionCall {
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub args: Option<HashMap<String, serde_json::Value>>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct FunctionResponse {
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub response: Option<HashMap<String, serde_json::Value>>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct Tool {
#[serde(skip_serializing_if = "Option::is_none")]
pub function_declarations: Option<Vec<FunctionDeclaration>>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct FunctionDeclaration {
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub parameters: Option<Schema>,
#[serde(skip_serializing_if = "Option::is_none")]
pub response: Option<Schema>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct Schema {
#[serde(rename = "type", skip_serializing_if = "Option::is_none")]
pub schema_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub format: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub title: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub default: Option<serde_json::Value>,
#[serde(rename = "enum", skip_serializing_if = "Option::is_none")]
pub enum_values: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub required: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub property_ordering: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub items: Option<Box<Schema>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub properties: Option<HashMap<String, Schema>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub example: Option<serde_json::Value>,
}
pub enum Contents<'a> {
Text(&'a str),
Structured(&'a [Content]),
}
impl<'a> From<&'a str> for Contents<'a> {
fn from(s: &'a str) -> Self {
Contents::Text(s)
}
}
impl<'a> From<&'a [Content]> for Contents<'a> {
fn from(c: &'a [Content]) -> Self {
Contents::Structured(c)
}
}
impl<'a> From<&'a Vec<Content>> for Contents<'a> {
fn from(c: &'a Vec<Content>) -> Self {
Contents::Structured(c.as_slice())
}
}
#[derive(Debug, Clone)]
pub struct CountTokensResult {
pub total_tokens: usize,
}
impl std::fmt::Display for CountTokensResult {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "total_tokens={}", self.total_tokens)
}
}
#[derive(Debug, Clone)]
pub struct TokensInfo {
pub token_ids: Vec<u32>,
pub tokens: Vec<Vec<u8>>,
pub role: Option<String>,
}
#[derive(Debug, Clone)]
pub struct ComputeTokensResult {
pub tokens_info: Vec<TokensInfo>,
}
#[derive(Debug, Clone, Default)]
pub struct CountTokensConfig {
pub tools: Option<Vec<Tool>>,
pub system_instruction: Option<Content>,
pub response_schema: Option<Schema>,
}