use artificial::openai::OpenAiAdapterBuilder;
use artificial::prompt::chain::PromptChain;
use artificial::types::fragments::StaticFragment;
use artificial::{
ArtificialClient,
generic::{GenericMessage, GenericRole},
model::{Model, OpenAiModel},
provider::PromptExecutionProvider as _,
template::{IntoPrompt, PromptTemplate},
};
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
const BASE_SYSTEM_ROLE: &str = include_str!("data/role/base_system.md");
#[derive(Debug, Serialize, Deserialize, JsonSchema)]
#[serde(deny_unknown_fields)]
struct HelloResponse {
greeting: String,
}
struct HelloPrompt;
impl IntoPrompt for HelloPrompt {
type Message = GenericMessage;
fn into_prompt(self) -> Vec<Self::Message> {
PromptChain::new()
.with(StaticFragment::from(BASE_SYSTEM_ROLE))
.with(StaticFragment::new("Mayday Mayday!", GenericRole::User))
.build()
}
}
impl PromptTemplate for HelloPrompt {
type Output = HelloResponse;
const MODEL: Model = Model::OpenAi(OpenAiModel::Gpt4oMini);
}
#[tokio::main]
async fn main() -> anyhow::Result<()> {
let backend = OpenAiAdapterBuilder::new_from_env().build()?;
let client = ArtificialClient::new(backend);
let response = client.prompt_execute(HelloPrompt).await?;
println!("Response: {:?}", response.content);
if let Some(usage) = response.usage {
println!(
"Tokens – prompt: {}, completion: {}, total: {}",
usage.prompt_tokens, usage.completion_tokens, usage.total_tokens
);
}
Ok(())
}