1+ use reqwest:: { header, Client } ;
2+ use serde_json:: json;
3+ use serde_json:: Value ;
4+ use std:: io;
5+ use std:: io:: Write ;
6+
7+ pub async fn run_chat_loop (
8+ client : & Client ,
9+ api_key : & str ,
10+ url : & str ,
11+ ) -> Result < ( ) , reqwest:: Error > {
12+ let mut conversation: String = String :: from ( "The following is a conversation with an AI Assistant:" ) ;
13+ loop {
14+ print ! ( "Human: " ) ;
15+ io:: stdout ( ) . flush ( ) . unwrap ( ) ;
16+
17+ let user_input: String = read_user_input ( ) ;
18+
19+ if user_input. to_lowercase ( ) == "exit" || user_input. to_lowercase ( ) == "quit" {
20+ break ;
21+ }
22+
23+ conversation. push_str ( "Human: " ) ;
24+ conversation. push_str ( & user_input) ;
25+ conversation. push_str ( "AI: " ) ;
26+
27+ let json: Value = json ! ( {
28+ "model" : "gpt-3.5-turbo-instruct" ,
29+ "prompt" : conversation,
30+ "max_tokens" : 150 ,
31+ "temperature" : 0.5 ,
32+ "top_p" : 1.0 ,
33+ "frequency_penalty" : 0.0 ,
34+ "presence_penalty" : 0.0 ,
35+ "stop" : [ "Human:" , "AI:" ]
36+ } ) ;
37+
38+ let body: Value = call_api ( client, api_key, url, json) . await ?;
39+ print ! ( "{}" , body) ;
40+ let ai_response: & str = get_ai_response ( & body) ;
41+
42+ print ! ( "AI: {}" , ai_response) ;
43+
44+ conversation. push_str ( ai_response) ;
45+ conversation. push_str ( "\n " ) ;
46+ }
47+ Ok ( ( ) )
48+ }
49+
50+ pub async fn call_api (
51+ client : & Client ,
52+ api_key : & str ,
53+ url : & str ,
54+ json : Value ,
55+ ) -> Result < Value , reqwest:: Error > {
56+ let response: reqwest:: Response = client
57+ . post ( url)
58+ . header ( header:: CONTENT_TYPE , "application/json" )
59+ . header ( header:: AUTHORIZATION , format ! ( "Bearer {}" , api_key) )
60+ . json ( & json)
61+ . send ( )
62+ . await ?;
63+
64+ let body: Value = response. json ( ) . await ?;
65+ Ok ( body)
66+ }
67+
68+ pub fn get_ai_response ( body : & Value ) -> & str {
69+ body[ "choices" ] [ 0 ] [ "text" ] . as_str ( ) . unwrap ( ) . trim ( )
70+ }
71+
72+ pub fn read_user_input ( ) -> String {
73+ let mut user_input: String = String :: new ( ) ;
74+ io:: stdin ( ) . read_line ( & mut user_input) . unwrap ( ) ;
75+ user_input. trim ( ) . to_string ( )
76+ }
0 commit comments