use std::{pin::Pin, str};
use serde::{Deserialize, Serialize};
use serde_json::Value;
use tokio_stream::Stream;
use crate::{error::DashScopeError, operation::common::Usage};
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct Message {
#[serde(rename = "content")]
pub content: String,
#[serde(rename = "role")]
pub role: String,
#[serde(rename = "reasoning_content")]
pub reasoning_content: Option<String>,
pub function_call: Option<Value>,
#[serde(rename = "tool_calls")]
pub tool_calls: Option<Vec<ToolCall>>,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct ToolCall {
#[serde(rename = "id")]
pub id: String,
#[serde(rename = "type")]
pub type_: String,
#[serde(rename = "index")]
pub index: i32,
#[serde(rename = "function")]
pub function: Function,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct Function {
pub name: String,
pub arguments: Option<String>,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct Choices {
#[serde(rename = "finish_reason")]
pub finish_reason: Option<String>,
#[serde(rename = "message")]
pub message: Message,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct Output {
#[serde(rename = "choices")]
pub choices: Option<Vec<Choices>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub text: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub finish_reason: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub search_info: Option<SearchInfo>,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct SearchInfo {
#[serde(rename = "search_results")]
pub search_results: Vec<SearchResult>,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct SearchResult {
pub site_name: String,
pub icon: Option<String>,
pub index: i32,
pub title: Option<String>,
pub url: String,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct GenerationOutput {
#[serde(rename = "output")]
pub output: Output,
#[serde(rename = "request_id")]
pub request_id: Option<String>,
#[serde(rename = "usage")]
pub usage: Option<Usage>,
}
pub type GenerationOutputStream =
Pin<Box<dyn Stream<Item = Result<GenerationOutput, DashScopeError>> + Send>>;