1+ use crate :: event:: Event ;
2+ use regex:: Regex ;
3+ use std:: { thread, time} ;
4+
15use crate :: config:: ChatGPTConfig ;
2- use crate :: llm:: LLM ;
6+ use crate :: llm:: { LLMAnswer , LLM } ;
37use reqwest:: header:: HeaderMap ;
48use serde_json:: { json, Value } ;
59use std;
610use std:: collections:: HashMap ;
11+ use std:: io:: Read ;
12+ use std:: sync:: mpsc:: Sender ;
713
814#[ derive( Clone , Debug ) ]
915pub struct ChatGPT {
@@ -41,12 +47,13 @@ impl LLM for ChatGPT {
4147 fn ask (
4248 & self ,
4349 chat_messages : Vec < HashMap < String , String > > ,
44- ) -> Result < String , Box < dyn std:: error:: Error > > {
50+ sender : & Sender < Event > ,
51+ ) -> Result < ( ) , Box < dyn std:: error:: Error > > {
4552 let mut headers = HeaderMap :: new ( ) ;
46- headers. insert ( "Content-Type" , "application/json" . parse ( ) . unwrap ( ) ) ;
53+ headers. insert ( "Content-Type" , "application/json" . parse ( ) ? ) ;
4754 headers. insert (
4855 "Authorization" ,
49- format ! ( "Bearer {}" , self . openai_api_key) . parse ( ) . unwrap ( ) ,
56+ format ! ( "Bearer {}" , self . openai_api_key) . parse ( ) ? ,
5057 ) ;
5158
5259 let mut messages: Vec < HashMap < String , String > > = vec ! [
@@ -63,9 +70,12 @@ impl LLM for ChatGPT {
6370
6471 let body: Value = json ! ( {
6572 "model" : "gpt-3.5-turbo" ,
66- "messages" : messages
73+ "messages" : messages,
74+ "stream" : true ,
6775 } ) ;
6876
77+ let mut buffer = String :: new ( ) ;
78+
6979 let response = self
7080 . client
7181 . post ( & self . url )
@@ -74,17 +84,35 @@ impl LLM for ChatGPT {
7484 . send ( ) ?;
7585
7686 match response. error_for_status ( ) {
77- Ok ( res) => {
78- let response_body: Value = res. json ( ) ?;
79- let answer = response_body[ "choices" ] [ 0 ] [ "message" ] [ "content" ]
80- . as_str ( )
81- . unwrap ( )
82- . trim_matches ( '"' )
83- . to_string ( ) ;
84-
85- Ok ( answer)
87+ Ok ( mut res) => {
88+ let _answser = res. read_to_string ( & mut buffer) ?;
89+
90+ let re = Regex :: new ( r"data:\s(.*)" ) . unwrap ( ) ;
91+
92+ sender. send ( Event :: LLMEvent ( LLMAnswer :: StartAnswer ) ) ?;
93+
94+ for captures in re. captures_iter ( & buffer) {
95+ if let Some ( data_json) = captures. get ( 1 ) {
96+ if data_json. as_str ( ) == "[DONE]" {
97+ sender. send ( Event :: LLMEvent ( LLMAnswer :: EndAnswer ) ) . unwrap ( ) ;
98+ break ;
99+ }
100+ let x: Value = serde_json:: from_str ( data_json. as_str ( ) ) . unwrap ( ) ;
101+
102+ let msg = x[ "choices" ] [ 0 ] [ "delta" ] [ "content" ] . as_str ( ) . unwrap_or ( "\n " ) ;
103+
104+ if msg != "null" {
105+ sender
106+ . send ( Event :: LLMEvent ( LLMAnswer :: Answer ( msg. to_string ( ) ) ) )
107+ . unwrap ( ) ;
108+ }
109+ thread:: sleep ( time:: Duration :: from_millis ( 100 ) ) ;
110+ }
111+ }
86112 }
87- Err ( e) => Err ( Box :: new ( e) ) ,
113+ Err ( e) => return Err ( Box :: new ( e) ) ,
88114 }
115+
116+ Ok ( ( ) )
89117 }
90118}
0 commit comments