aiapi/
lib.rs

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}