Skip to content

Commit b2618ed

Browse files
authored
Merge pull request #42 from hunjixin/refrator/add_do_request_in_builder
feat: add do_request in requstbuilder
2 parents d66c2d6 + bead67c commit b2618ed

14 files changed

Lines changed: 543 additions & 522 deletions

File tree

README.md

Lines changed: 62 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@ The DeepSeek API SDK supports both asynchronous and synchronous usage patterns i
4141
```rust
4242
use anyhow::Result;
4343
use clap::Parser;
44-
use deepseek_api::{Client, request::MessageRequest, response::ModelType};
44+
use deepseek_api::response::ModelType;
45+
use deepseek_api::{ClientBuilder, CompletionsRequestBuilder, RequestBuilder};
4546
use std::io::{stdin, stdout, Write};
4647
use std::vec;
4748

@@ -55,7 +56,7 @@ struct Args {
5556
#[tokio::main]
5657
async fn main() -> Result<()> {
5758
let args = Args::parse();
58-
let client = Client::new(&args.api_key);
59+
let client = ClientBuilder::new(args.api_key.clone()).build()?;
5960
loop {
6061
let mut buffer = String::new();
6162

@@ -82,13 +83,17 @@ async fn main() -> Result<()> {
8283
println!("models {:?}", models);
8384
}
8485
word => {
85-
let mut completions = client.chat();
86-
let builder = completions.chat_builder(vec![]).append_user_message(word);
87-
let resp = completions.create(builder).await?.must_response();
86+
let completions = client.chat();
87+
let resp = CompletionsRequestBuilder::new(vec![])
88+
.use_model(ModelType::DeepSeekChat)
89+
.append_user_message(word)
90+
.do_request(&completions)
91+
.await?
92+
.must_response();
8893

8994
let mut resp_words = vec![];
9095
for msg in resp.choices.iter() {
91-
history.push(MessageRequest::Assistant(msg.message.as_ref().expect("message exit").clone()));
96+
history.push(msg.message.as_ref().expect("message exit").clone());
9297
resp_words.push(msg.message.as_ref().expect("message").content.clone());
9398
}
9499

@@ -100,7 +105,6 @@ async fn main() -> Result<()> {
100105
}
101106
Ok(())
102107
}
103-
104108
```
105109

106110
### Synchronous Example (Requires Feature Flag)
@@ -112,8 +116,8 @@ deepseek-api = { version = "xx", default-features = false, features = ["is_sync"
112116
```rs
113117
use anyhow::Result;
114118
use clap::Parser;
115-
use deepseek_api::Client;
116119
use deepseek_api::{request::MessageRequest, response::ModelType};
120+
use deepseek_api::{ClientBuilder, CompletionsRequestBuilder, RequestBuilder};
117121
use std::vec;
118122

119123
#[derive(Parser, Debug)]
@@ -125,29 +129,32 @@ struct Args {
125129

126130
fn main() -> Result<()> {
127131
let args = Args::parse();
128-
let client = Client::new(&args.api_key);
132+
133+
let client = ClientBuilder::new(args.api_key.clone())
134+
.timeout(300)
135+
.build()?;
129136
let mut history = vec![];
130137

131-
let mut completions = client.chat();
132-
let builder = completions
133-
.chat_builder(vec![])
134-
.use_model(ModelType::DeepSeekChat)
135-
.append_user_message("hello");
136-
let resp = completions.create(builder)?.must_response();
138+
let completions = client.chat();
139+
let resp = CompletionsRequestBuilder::new(vec![])
140+
.use_model(ModelType::DeepSeekReasoner)
141+
.append_user_message("hello world")
142+
.do_request(&completions)?
143+
.must_response();
137144

138145
let mut resp_words = vec![];
139146
for msg in resp.choices.iter() {
140-
history.push(MessageRequest::Assistant(msg.message.as_ref().expect("message exit").clone()));
147+
history.push(MessageRequest::Assistant(
148+
msg.message.as_ref().expect("message exit").clone(),
149+
));
141150
resp_words.push(msg.message.as_ref().expect("message").content.clone());
142151
}
143-
144152
for msg in resp_words.iter() {
145153
msg.split("\n").for_each(|x| println!("{}", x));
146154
}
147155

148156
Ok(())
149157
}
150-
151158
```
152159

153160
### Function Calling
@@ -157,12 +164,14 @@ Use the function calling interface to define and invoke tools via the API.
157164
```rust
158165
use anyhow::Result;
159166
use clap::Parser;
160-
use deepseek_api::request::{Function, ToolMessageRequest, ToolObject, ToolType, UserMessageRequest};
161-
use deepseek_api::response::FinishReason;
162-
use deepseek_api::Client;
163167
use deepseek_api::request::MessageRequest;
164-
use std::vec;
168+
use deepseek_api::request::{
169+
Function, ToolMessageRequest, ToolObject, ToolType, UserMessageRequest,
170+
};
171+
use deepseek_api::response::FinishReason;
172+
use deepseek_api::{ClientBuilder, CompletionsRequestBuilder, RequestBuilder};
165173
use schemars::schema::SchemaObject;
174+
use std::vec;
166175

167176
#[derive(Parser, Debug)]
168177
#[command(version, about, long_about = None)]
@@ -179,8 +188,9 @@ struct Args {
179188
#[tokio::main]
180189
async fn main() -> Result<()> {
181190
let args = Args::parse();
182-
let client = Client::new(&args.api_key);
183-
let parameters: SchemaObject = serde_json::from_str(r#"{
191+
let client = ClientBuilder::new(args.api_key.clone()).build()?;
192+
let parameters: SchemaObject = serde_json::from_str(
193+
r#"{
184194
"type": "object",
185195
"properties": {
186196
"location": {
@@ -194,29 +204,32 @@ async fn main() -> Result<()> {
194204
}
195205
},
196206
"required": ["location"]
197-
}"#)?;
207+
}"#,
208+
)?;
198209

199-
let tool_object = ToolObject{
210+
let tool_object = ToolObject {
200211
tool_type: ToolType::Function,
201-
function: Function{
212+
function: Function {
202213
name: "get_weather".to_string(),
203-
description: "Get weather of an location, the user shoud supply a location first".to_string(),
204-
parameters
214+
description: "Get weather of an location, the user shoud supply a location first"
215+
.to_string(),
216+
parameters,
205217
},
206218
};
207-
208-
let mut messages = vec![
209-
MessageRequest::User(UserMessageRequest::new(
210-
"How's the weather in Hangzhou?"
211-
))
212-
];
213-
let mut completetion = client.chat();
214-
let req = client.chat().chat_builder(messages.clone()).tools(vec![tool_object.clone()]);
215-
let resp = completetion.create(req).await?.must_response();
219+
220+
let mut messages = vec![MessageRequest::User(UserMessageRequest::new(
221+
"How's the weather in Hangzhou?",
222+
))];
223+
let completetion = client.chat();
224+
let resp = CompletionsRequestBuilder::new(messages.clone())
225+
.tools(vec![tool_object.clone()])
226+
.do_request(&completetion)
227+
.await?
228+
.must_response();
216229
let mut id = String::new();
217230
if resp.choices[0].finish_reason == FinishReason::ToolCalls {
218231
if let Some(msg) = &resp.choices[0].message {
219-
if let Some(tool) = &msg.tool_calls {
232+
if let Some(tool) = &msg.tool_calls {
220233
id = tool[0].id.clone();
221234
println!("Function id: {}", id);
222235
println!("Function name: {}", tool[0].function.name);
@@ -226,10 +239,16 @@ async fn main() -> Result<()> {
226239
}
227240
}
228241

229-
messages.push( MessageRequest::Tool(ToolMessageRequest::new("24℃", &id )));
230-
let req = client.chat().chat_builder(messages.clone()).tools(vec![tool_object.clone()]);
231-
let resp = completetion.create(req).await?.must_response();
232-
println!("Reply with my function: {:?}", resp.choices[0].message.as_ref().unwrap().content);
242+
messages.push(MessageRequest::Tool(ToolMessageRequest::new("24℃", &id)));
243+
let resp = CompletionsRequestBuilder::new(messages.clone())
244+
.tools(vec![tool_object.clone()])
245+
.do_request(&completetion)
246+
.await?
247+
.must_response();
248+
println!(
249+
"Reply with my function: {:?}",
250+
resp.choices[0].message.as_ref().unwrap().content
251+
);
233252
Ok(())
234253
}
235254
```

deepseek-api/src/async_impl/completions.rs

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,5 @@
11
use super::json_stream::JsonStream;
2-
use crate::{
3-
request::{
4-
CompletionsRequestBuilder, FMICompletionsRequestBuilder, MessageRequest, RequestBuilder,
5-
},
6-
response::ChatResponse,
7-
};
2+
use crate::{response::ChatResponse, RequestBuilder};
83
use anyhow::Result;
94
use reqwest::Client as ReqwestClient;
105

@@ -15,20 +10,12 @@ pub struct ChatCompletions {
1510
}
1611

1712
impl ChatCompletions {
18-
pub fn chat_builder(&self, messages: Vec<MessageRequest>) -> CompletionsRequestBuilder {
19-
CompletionsRequestBuilder::new(messages)
20-
}
21-
22-
pub fn fim_builder(&self, prompt: &str, suffix: &str) -> FMICompletionsRequestBuilder {
23-
FMICompletionsRequestBuilder::new(prompt, suffix)
24-
}
25-
2613
pub async fn create<Builder>(
27-
&mut self,
14+
&self,
2815
request_builder: Builder,
2916
) -> Result<ChatResponse<Builder::Response, Builder::Item>>
3017
where
31-
Builder: RequestBuilder + Send,
18+
Builder: RequestBuilder + Send + Sized,
3219
{
3320
let host = if request_builder.is_beta() {
3421
self.host.to_owned() + "/beta/completions"

deepseek-api/src/lib.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,22 @@
1+
mod client_builder;
12
mod error;
23
pub mod request;
4+
mod request_builder;
35
pub mod response;
4-
6+
pub use client_builder::*;
57
pub use error::*;
8+
pub use request_builder::*;
9+
610
cfg_if::cfg_if! {
711
if #[cfg(feature = "is_sync")] {
812
mod sync_impl;
9-
mod builder;
1013

11-
pub use builder::*;
1214
pub use sync_impl::json_stream;
1315
pub use sync_impl::client::*;
1416
pub use sync_impl::completions;
1517
} else {
1618
mod async_impl;
17-
mod builder;
1819

19-
pub use builder::*;
2020
pub use async_impl::json_stream;
2121
pub use async_impl::client::*;
2222
pub use async_impl::completions;

0 commit comments

Comments
 (0)