use api_xai::{ Client, XaiEnvironmentImpl, Secret, ChatCompletionRequest, Message, ClientApiAccessors };
use std::io::{ self, Write };
#[ tokio::main ]
async fn main() -> Result< (), Box< dyn core::error::Error > >
{
let secret = Secret::load_with_fallbacks( "XAI_API_KEY" )?;
let env = XaiEnvironmentImpl::new( secret )?;
let client = Client::build( env )?;
println!( "🚀 XAI Grok API - Interactive Chat" );
println!( "=================================" );
println!( "Type 'exit' or 'quit' to end the conversation.\n" );
let mut messages : Vec< Message > = Vec::new();
loop
{
print!( "You : " );
io::stdout().flush()?;
let mut input = String::new();
io::stdin().read_line( &mut input )?;
let input = input.trim();
if input.eq_ignore_ascii_case( "exit" ) || input.eq_ignore_ascii_case( "quit" )
{
println!( "\n👋 Goodbye!" );
break;
}
if input.is_empty()
{
continue;
}
messages.push( Message::user( input ) );
let request = ChatCompletionRequest::former()
.model( "grok-2-1212".to_string() )
.messages( messages.clone() )
.max_tokens( 500u32 )
.form();
print!( "🤖 Assistant : " );
io::stdout().flush()?;
match client.chat().create( request ).await
{
Ok( response ) =>
{
if let Some( choice ) = response.choices.first()
{
if let Some( ref content ) = choice.message.content
{
println!( "{content}\n" );
messages.push( choice.message.clone() );
println!( " [Tokens : {} prompt + {} completion = {} total]",
response.usage.prompt_tokens,
response.usage.completion_tokens,
response.usage.total_tokens
);
println!();
}
else
{
println!( "[No content in response]\n" );
}
}
else
{
println!( "[No choices in response]\n" );
}
}
Err( e ) =>
{
println!( "\n❌ Error : {e}\n" );
messages.pop();
}
}
}
Ok( () )
}