use crate::acg::capability::{BackendCapabilities, CapabilityRegistry};
use crate::acg::plugin::{
HintPlanApplier, PluginInput, PluginOutput, ProviderPlugin, translate_with_hint_plan,
};
use crate::acg::prompt_ir::PromptIR;
use crate::acg::translation::openai::OpenAIHintTranslator;
use crate::acg::translation::{HintPlan, HintTranslation, HintTranslator};
pub struct OpenAICachePlugin;
impl OpenAICachePlugin {
#[cfg_attr(not(test), allow(dead_code))]
pub(crate) fn build_hint_translation(
&self,
input: &PluginInput<'_>,
) -> crate::acg::error::Result<HintTranslation> {
let translator = OpenAIHintTranslator;
translator.translate(input)
}
}
impl ProviderPlugin for OpenAICachePlugin {
fn plugin_id(&self) -> &str {
"openai"
}
fn plugin_name(&self) -> &str {
"OpenAI Cache Plugin"
}
fn translate(&self, input: &PluginInput<'_>) -> crate::acg::error::Result<PluginOutput> {
let translator = OpenAIHintTranslator;
translate_with_hint_plan(&translator, self, input)
}
fn capabilities(&self) -> BackendCapabilities {
CapabilityRegistry::with_defaults()
.get_backend("openai")
.cloned()
.unwrap_or_else(|| BackendCapabilities::none("openai"))
}
}
impl HintPlanApplier for OpenAICachePlugin {
fn apply_hint_plan(
&self,
request: &nemo_flow::api::llm::LlmRequest,
prompt_ir: &PromptIR,
hint_plan: &HintPlan,
) -> crate::acg::error::Result<nemo_flow::api::llm::LlmRequest> {
crate::acg::request_surfaces::apply_request_surface(
self.plugin_id(),
request,
prompt_ir,
hint_plan,
)
}
}
#[cfg(test)]
#[path = "../../tests/unit/acg/openai_plugin_tests.rs"]
mod tests;