1#![feature(let_chains)]
2#![feature(trait_alias)]
3
4use std::{ops::Deref, path::Path, sync::Arc};
5
6use aok::Result;
7
8pub use crate::api::{Api, Baidu, EnumApi, OpenAi, Token, TokenModel};
9
10pub mod msg;
11pub use msg::Msg;
12
13pub mod response;
14pub use response::Response;
15pub mod api;
16
17pub mod role {
18 pub const ASSISTANT: &str = "assistant";
19 pub const USER: &str = "user";
20}
21
22#[derive(Clone, Debug)]
23pub struct Ai {
24 pub api: Arc<EnumApi>,
25 pub name: String,
26}
27
28impl Deref for Ai {
29 type Target = Arc<EnumApi>;
30
31 fn deref(&self) -> &Self::Target {
32 &self.api
33 }
34}
35
36pub fn file_name<P: AsRef<Path>>(path: P) -> String {
37 let path = path.as_ref();
38
39 if let Some(file_stem) = path.file_stem() {
40 if let Some(file_stem_str) = file_stem.to_str() {
41 return file_stem_str.to_string();
42 }
43 }
44
45 "unknown".to_string()
46}
47
48pub fn _load(
49 fp: impl AsRef<std::path::Path>,
50 load_api: impl Fn(&[u8]) -> Result<EnumApi>,
51) -> Result<Ai> {
52 let fp = fp.as_ref();
53 let yml = std::fs::read(fp)?;
54 Ok(Ai {
55 name: file_name(fp),
56 api: Arc::new(load_api(&yml)?),
57 })
58}
59
60pub fn baidu(fp: impl AsRef<std::path::Path>) -> Result<Ai> {
61 _load(fp, |yml| Ok(EnumApi::Baidu(Baidu::loads(yml)?)))
62}
63
64pub fn openai_token(fp: impl AsRef<std::path::Path>) -> Result<Ai> {
65 _load(fp, |yml| Ok(EnumApi::Token(Token::loads(yml)?)))
66}
67
68pub fn openai_token_model(fp: impl AsRef<std::path::Path>) -> Result<Ai> {
69 _load(fp, |yml| Ok(EnumApi::TokenModel(TokenModel::loads(yml)?)))
70}