use nemo_flow::api::llm::LlmRequest;
use crate::acg::capability::BackendCapabilities;
use crate::acg::prompt_ir::PromptIR;
use crate::acg::request_surfaces::RequestSurfaceApplier;
use crate::acg::translation::{HintPlan, HintTranslation, HintTranslator};
use crate::acg::types::{AgentIdentity, OptimizationIntentBundle, TranslationReport};
#[derive(Debug)]
pub struct PluginInput<'a> {
pub original_request: &'a LlmRequest,
pub rewritten_request: &'a LlmRequest,
pub prompt_ir: &'a PromptIR,
pub intent_bundle: &'a OptimizationIntentBundle,
pub agent_identity: &'a AgentIdentity,
}
#[derive(Debug)]
pub struct PluginOutput {
pub translated_request: LlmRequest,
pub translation_report: TranslationReport,
}
pub(crate) trait HintPlanApplier {
fn apply_hint_plan(
&self,
request: &LlmRequest,
prompt_ir: &PromptIR,
hint_plan: &HintPlan,
) -> crate::acg::error::Result<LlmRequest>;
}
impl<T> RequestSurfaceApplier for T
where
T: HintPlanApplier + Send + Sync + ?Sized,
{
fn apply(
&self,
request: &LlmRequest,
prompt_ir: &PromptIR,
plan: &HintPlan,
) -> crate::acg::Result<LlmRequest> {
self.apply_hint_plan(request, prompt_ir, plan)
}
}
pub(crate) fn translate_with_hint_plan<T, A>(
translator: &T,
applier: &A,
input: &PluginInput<'_>,
) -> crate::acg::error::Result<PluginOutput>
where
T: HintTranslator,
A: HintPlanApplier + Send + Sync,
{
let HintTranslation {
hint_plan,
translation_report,
} = translator.translate(input)?;
let translated_request = RequestSurfaceApplier::apply(
applier,
input.rewritten_request,
input.prompt_ir,
&hint_plan,
)?;
Ok(PluginOutput {
translated_request,
translation_report,
})
}
pub trait ProviderPlugin: Send + Sync {
fn plugin_id(&self) -> &str;
fn plugin_name(&self) -> &str;
fn translate(&self, input: &PluginInput<'_>) -> crate::acg::error::Result<PluginOutput>;
fn capabilities(&self) -> BackendCapabilities;
}
#[cfg(test)]
#[path = "../../tests/unit/acg/plugin_tests.rs"]
mod tests;