pub mod anthropic;
pub mod llamacpp;
pub mod meshllm;
pub mod openai_compat;
pub mod vllm;
use serde_json::Value;
use crate::service_lifecycle::BackendCancellationRegistry;
use openai_compat::OpenAiCompatOptions;
pub const BACKEND_TYPES: &[&str] = &["openai_compat", "vllm", "llamacpp", "meshllm", "anthropic"];
pub async fn invoke_backend(
backend_type: &str,
opts: &OpenAiCompatOptions,
intent: &str,
payload: &Value,
) -> Result<Value, String> {
match backend_type {
"openai_compat" => Ok(openai_compat::invoke(opts, intent, payload).await),
"vllm" => Ok(vllm::invoke(opts, intent, payload).await),
"llamacpp" => Ok(llamacpp::invoke(opts, intent, payload).await),
"meshllm" => Ok(meshllm::invoke(opts, intent, payload).await),
"anthropic" => Ok(anthropic::invoke(opts, intent, payload).await),
other => Err(format!(
"unknown backend_type {other:?}; choose one of {BACKEND_TYPES:?}"
)),
}
}
pub async fn invoke_backend_with_cancellation(
task_id: &str,
registry: &BackendCancellationRegistry,
backend_type: &str,
opts: &OpenAiCompatOptions,
intent: &str,
payload: &Value,
) -> Result<Value, String> {
let backend_type_owned = backend_type.to_owned();
let opts_owned = opts.clone();
let intent_owned = intent.to_owned();
let payload_owned = payload.clone();
let handle = tokio::spawn(async move {
invoke_backend(
&backend_type_owned,
&opts_owned,
&intent_owned,
&payload_owned,
)
.await
});
let abort = handle.abort_handle();
registry.register(task_id, move || {
abort.abort();
true
});
let result = match handle.await {
Ok(result) => result,
Err(error) if error.is_cancelled() => {
registry
.report(task_id, "transport_aborted")
.expect("known cancellation evidence");
Ok(serde_json::json!({
"error_code": 499,
"error_message": "backend request cancelled"
}))
}
Err(error) => Err(format!("backend task join error: {error}")),
};
registry.complete(task_id);
result
}