use crate::chat::chat_single::SingleChat;
use crate::config::Config;
use crate::config::ModelCapability::{Think, ToolUse};
use crate::schema::json_schema::JsonSchema;
use crate::tests::format_test_block;
use rhine_schema_derive::{JsonSchema, tool_schema_derive};
use serde::Deserialize;
pub async fn test_chat() {
Config::add_api_source(
"pumpkin",
"https://api.pumpkinaigc.online/v1/chat/completions",
20,
);
Config::add_api_info(
"pumpkin-ds-r1",
"deepseek-r1",
Think,
"pumpkin",
"sk-cPdegaWl8YFcKZYs8a108b5f741844D9A1E0B90e724bBe23",
);
Config::add_api_info(
"pumpkin-gpt-4o",
"gpt-4o",
ToolUse,
"pumpkin",
"sk-cPdegaWl8YFcKZYs8a108b5f741844D9A1E0B90e724bBe23",
);
test_single_chat().await;
}
async fn test_single_chat() {
let mut chat = SingleChat::new_with_api_name("pumpkin-gpt-4o", "", true);
let resp_1 = chat.get_req_body("深度思考strawberry有几个r").await.unwrap();
let message_1 = chat.base.session.clone();
let answer_1 = chat.get_content_from_req_body(resp_1).await.unwrap();
format_test_block("chat_single_round", || {
format!("message: {:?}\nanswer: {}", message_1, answer_1)
});
let resp_2 = chat.get_req_body("你确定吗?").await.unwrap();
let message_2 = chat.base.session.clone();
let answer_2 = chat.get_content_from_req_body(resp_2).await.unwrap();
format_test_block("chat_single_round", || {
format!("message: {:?}\nanswer: {}", message_2, answer_2)
});
let resp_3 = chat.get_req_body_again([0].as_ref()).await.unwrap();
let message_3 = chat.base.session.clone();
let answer_3 = chat.get_content_from_req_body(resp_3).await.unwrap();
format_test_block("chat_single_round", || {
format!("message: {:?}\nanswer: {}", message_3, answer_3)
});
let resp_4 = chat
.get_req_body_with_new_question(
[].as_ref(),
"straw中有一个r, berry中有两个r, 深度思考strawberry有几个r?",
)
.await
.unwrap();
let message_4 = chat.base.session.clone();
let answer_4 = chat.get_content_from_req_body(resp_4).await.unwrap();
format_test_block("chat_single_round", || {
format!("message: {:?}\nanswer: {}", message_4, answer_4)
});
}
async fn test_single_chat_get_json() {
let mut chat = SingleChat::new_with_api_name("pumpkin-ds-r1", "", true);
let answer = chat
.get_json_answer::<StudentInfo>("编造一个学生信息")
.await
.unwrap();
format_test_block("structured_answer", || format!("StudentInfo: {:?}", answer));
}
async fn test_single_chat_get_tool() {
let mut chat = SingleChat::new_with_api_name("pumpkin-ds-r1", "", true);
chat.set_tools(vec![send_email_tool_schema()]);
let answer = chat
.get_tool_answer("随意编造信息发送一封邮件")
.await
.unwrap();
format_test_block("structured_answer", || {
format!(
"ToolUseResult:\n Answer: {}\nResponse: {:?}",
answer.0, answer.1
)
});
}
#[derive(Debug, Deserialize, JsonSchema)]
#[schema(name = "student_info", description = "用于记录学生信息", strict = true)]
pub struct StudentInfo {
#[schema(desc = "学生的姓名", required = true)]
name: String,
#[schema(desc = "学生的年龄", required = true)]
age: i32,
#[schema(
desc = "学生的年级",
enum = "freshman, sophomore, junior, senior",
required = true
)]
grade: Option<String>,
#[schema(desc = "是否参加考试")]
had_exam: bool,
}
#[derive(Deserialize, JsonSchema)]
#[schema(
name = "SendEmailParams",
description = "Parameters for sending email",
inner = true,
strict = true
)]
pub struct SendEmailParameters {
#[schema(desc = "The recipient email address.")]
pub to: String,
#[schema(desc = "Email subject line.")]
pub subject: String,
#[schema(desc = "Body of the email message.")]
pub body: String,
}
#[tool_schema_derive(
description = "Send an email to a given recipient with a subject and message.",
parameters = "SendEmailParameters",
module_path = crate::tests::chat,
strict = true
)]
pub fn send_email(params: SendEmailParameters) {
println!(
"To: {} Subject: {} Body: {}",
params.to, params.subject, params.body
);
}