use std::env;
use crate::error::Result;
use crate::http::HttpClient;
use crate::resources::{
AgentIdentities, Authz, Chat, Compliance, Connections, Connectors, Consent, Goals, Grains,
Harness, Hooks, Imports, KnowledgeSources, Memories, Namespaces, Policy, Preferences,
Provenance, Scope, Sessions, System, Tools,
};
use crate::types::{RecallRequest, RecallResponse, RememberRequest, RememberResponse};
const DEFAULT_URL: &str = "https://app.areev.ai";
const DEFAULT_MEMORY: &str = "default";
pub struct Areev {
inner: HttpClient,
memory_id: String,
}
impl Areev {
pub fn from_env() -> Self {
let api_key = env::var("AREEV_API_KEY").ok();
let url = env::var("AREEV_URL").unwrap_or_else(|_| DEFAULT_URL.to_string());
let memory_id = env::var("AREEV_MEMORY_ID").unwrap_or_else(|_| DEFAULT_MEMORY.to_string());
Self::build(api_key.as_deref(), &url, &memory_id, 3)
}
pub fn new(api_key: Option<&str>, url: Option<&str>, memory_id: Option<&str>) -> Self {
Self::build(
api_key,
url.unwrap_or(DEFAULT_URL),
memory_id.unwrap_or(DEFAULT_MEMORY),
3,
)
}
pub fn with_max_retries(
api_key: Option<&str>,
url: Option<&str>,
memory_id: Option<&str>,
max_retries: usize,
) -> Self {
Self::build(
api_key,
url.unwrap_or(DEFAULT_URL),
memory_id.unwrap_or(DEFAULT_MEMORY),
max_retries,
)
}
fn build(api_key: Option<&str>, url: &str, memory_id: &str, max_retries: usize) -> Self {
let inner = HttpClient::new(url, memory_id, api_key).with_max_retries(max_retries);
Self {
inner,
memory_id: memory_id.to_string(),
}
}
pub fn http(&self) -> &HttpClient {
&self.inner
}
pub fn memories(&self) -> Memories<'_> {
Memories::new(&self.inner)
}
pub fn grains(&self) -> Grains<'_> {
Grains::new(&self.inner, self.memory_id.clone())
}
pub fn tools(&self) -> Tools<'_> {
Tools::new(&self.inner, self.memory_id.clone())
}
pub fn harness(&self) -> Harness<'_> {
Harness::new(&self.inner, self.memory_id.clone())
}
pub fn system(&self) -> System<'_> {
System::new(&self.inner, self.memory_id.clone())
}
pub fn connectors(&self) -> Connectors<'_> {
Connectors::new(&self.inner)
}
pub fn connections(&self) -> Connections<'_> {
Connections::new(&self.inner)
}
pub fn knowledge_sources(&self) -> KnowledgeSources<'_> {
KnowledgeSources::new(&self.inner, self.memory_id.clone())
}
pub fn chat(&self) -> Chat<'_> {
Chat::new(&self.inner, self.memory_id.clone())
}
pub fn compliance(&self) -> Compliance<'_> {
Compliance::new(&self.inner, self.memory_id.clone())
}
pub fn consent(&self) -> Consent<'_> {
Consent::new(&self.inner, self.memory_id.clone())
}
pub fn goals(&self) -> Goals<'_> {
Goals::new(&self.inner, self.memory_id.clone())
}
pub fn sessions(&self) -> Sessions<'_> {
Sessions::new(&self.inner, self.memory_id.clone())
}
pub fn hooks(&self) -> Hooks<'_> {
Hooks::new(&self.inner, self.memory_id.clone())
}
pub fn authz(&self) -> Authz<'_> {
Authz::new(&self.inner, self.memory_id.clone())
}
pub fn agent_identities(&self) -> AgentIdentities<'_> {
AgentIdentities::new(&self.inner, self.memory_id.clone())
}
pub fn policy(&self) -> Policy<'_> {
Policy::new(&self.inner, self.memory_id.clone())
}
pub fn provenance(&self) -> Provenance<'_> {
Provenance::new(&self.inner, self.memory_id.clone())
}
pub fn scope(&self) -> Scope<'_> {
Scope::new(&self.inner, self.memory_id.clone())
}
pub fn preferences(&self) -> Preferences<'_> {
Preferences::new(&self.inner)
}
pub fn imports(&self) -> Imports<'_> {
Imports::new(&self.inner, self.memory_id.clone())
}
pub fn namespaces(&self) -> Namespaces<'_> {
Namespaces::new(&self.inner, self.memory_id.clone())
}
pub async fn remember(&self, text: &str) -> Result<RememberResponse> {
let req = RememberRequest {
text: text.to_string(),
sync: Some(true),
..Default::default()
};
self.inner.remember(&req).await
}
pub async fn recall(&self, query: &str) -> Result<RecallResponse> {
let req = RecallRequest {
query: Some(query.to_string()),
limit: Some(10),
..Default::default()
};
self.inner.recall(&req).await
}
}