@@ -11,7 +11,7 @@ pub use crate::protocol::chat::{Message, Model, PartialMessage, Role, Usage};
1111pub use chat_buffer:: { ChatBuffer , Exchange } ;
1212
1313use crate :: {
14- protocol:: chat:: { self , StreamResponse } ,
14+ protocol:: chat:: { self , ChatResponse , StreamOptions , StreamResponse } ,
1515 Client , Error ,
1616} ;
1717
@@ -37,7 +37,7 @@ pub struct Request {
3737 /// The maximum number of tokens allowed for the generated answer. By
3838 /// default, the number of tokens the model can return will be (4096 - prompt
3939 /// tokens).
40- pub max_tokens : Option < u32 > ,
40+ pub max_completion_tokens : Option < u32 > ,
4141 /// Number between -2.0 and 2.0. Positive values penalize new tokens based
4242 /// on whether they appear in the text so far, increasing the model's
4343 /// likelihood to talk about new topics.
@@ -51,7 +51,7 @@ impl From<Request> for chat::Request {
5151 temperature,
5252 top_p,
5353 n,
54- max_tokens ,
54+ max_completion_tokens ,
5555 presence_penalty,
5656 } = value;
5757 chat:: Request {
@@ -60,7 +60,7 @@ impl From<Request> for chat::Request {
6060 temperature,
6161 top_p,
6262 n,
63- max_tokens ,
63+ max_completion_tokens ,
6464 presence_penalty,
6565 ..Default :: default ( )
6666 }
@@ -71,7 +71,7 @@ impl Client {
7171 #[ tracing:: instrument( level = Level :: DEBUG , skip_all, err) ]
7272 pub async fn chat ( & self , request : Request ) -> Result < chat:: Completion , Error > {
7373 let request: chat:: Request = request. into ( ) ;
74- tracing:: trace !( ?request) ;
74+ tracing:: debug !( ?request) ;
7575 let response: chat:: ChatResponse = self
7676 . shared
7777 . request ( Method :: POST , "/v1/chat/completions" )
@@ -80,7 +80,7 @@ impl Client {
8080 . await ?
8181 . json ( )
8282 . await ?;
83- tracing:: trace !( ?response) ;
83+ tracing:: debug !( ?response) ;
8484 Ok ( response. 0 ?)
8585 }
8686
@@ -91,39 +91,68 @@ impl Client {
9191 ) -> Result < impl Stream < Item = Result < chat:: PartialCompletion , Error > > , Error > {
9292 let mut request: chat:: Request = request. into ( ) ;
9393 request. stream = Some ( true ) ;
94+ request. stream_options = Some ( StreamOptions {
95+ include_obfuscation : false ,
96+ include_usage : false ,
97+ } ) ;
9498
95- tracing:: trace !( ?request) ;
96- let stream = self
99+ tracing:: debug !( ?request) ;
100+ let response = self
97101 . shared
98102 . request ( Method :: POST , "/v1/chat/completions" )
99103 . body ( & request)
100104 . send ( )
101- . await ?
102- . bytes_stream ( )
103- . eventsource ( ) ;
104- Ok ( stream. map_while ( |event| match event {
105- Ok ( event) => {
106- if event. data == "[DONE]" {
107- None
108- } else {
109- let response = match serde_json:: from_str :: < StreamResponse > ( & event. data ) {
110- Ok ( response) => {
111- tracing:: trace!( ?response) ;
112- Ok :: < _ , Error > ( response. 0 )
113- }
114- Err ( err) => {
115- tracing:: error!( ?err, ?event. data) ;
116- Err ( err. into ( ) )
105+ . await ?;
106+ let status = response. status ( ) ;
107+
108+ if status. is_success ( ) {
109+ // HTTP success: Expect SSE response
110+ let stream = response. bytes_stream ( ) . eventsource ( ) ;
111+ Ok ( stream. map_while ( |event| {
112+ tracing:: trace!( ?event) ;
113+ match event {
114+ Ok ( event) => {
115+ if event. data == "[DONE]" {
116+ None
117+ } else {
118+ let response = match serde_json:: from_str :: < StreamResponse > ( & event. data )
119+ {
120+ Ok ( response) => {
121+ tracing:: debug!( ?response) ;
122+ Ok :: < _ , Error > ( response. 0 )
123+ }
124+ Err ( err) => {
125+ // Serde error
126+ tracing:: error!( ?err, ?event. data) ;
127+ Err ( err. into ( ) )
128+ }
129+ } ;
130+ Some ( response)
117131 }
118- } ;
119- Some ( response)
132+ }
133+ Err ( err) => {
134+ // SSE error
135+ tracing:: error!( ?err) ;
136+ Some ( Err ( err. into ( ) ) )
137+ }
138+ }
139+ } ) )
140+ } else {
141+ // HTTP error: Expect JSON response
142+ let response_err = response. error_for_status_ref ( ) . unwrap_err ( ) ;
143+ let chat_response = response. json :: < ChatResponse > ( ) . await ;
144+ match chat_response {
145+ Ok ( err) => {
146+ // OpenAI application error
147+ Err ( Error :: Protocol ( err. 0 . unwrap_err ( ) ) )
148+ }
149+ Err ( err) => {
150+ // Not application error, return HTTP error
151+ tracing:: error!( ?response_err, ?err, "unexpected stream response" ) ;
152+ Err ( response_err. into ( ) )
120153 }
121154 }
122- Err ( err) => {
123- tracing:: error!( ?err) ;
124- Some ( Err ( err. into ( ) ) )
125- }
126- } ) )
155+ }
127156 }
128157}
129158
0 commit comments