use async_trait::async_trait;
#[derive(Debug)]
pub struct ImageInput {
pub base64: String,
pub mime: String,
}
pub struct CompletionRequest<'a> {
pub json_schema: &'a str,
pub text: &'a str,
pub image: Option<ImageInput>,
}
pub struct CompletionResponse {
pub entities: Vec<serde_json::Value>,
}
#[async_trait]
pub trait CompletionProvider: Send + Sync {
async fn complete(&self, req: CompletionRequest<'_>) -> anyhow::Result<CompletionResponse>;
}
#[cfg(test)]
mod tests {
use super::*;
use serde_json::json;
struct MockProvider;
#[async_trait]
impl CompletionProvider for MockProvider {
async fn complete(
&self,
_req: CompletionRequest<'_>,
) -> anyhow::Result<CompletionResponse> {
Ok(CompletionResponse {
entities: vec![
json!({"name": "a", "_confidence": 0.9}),
json!({"name": "b", "_confidence": 0.8}),
],
})
}
}
#[tokio::test]
async fn mock_provider_returns_two_entities() {
let provider = MockProvider;
let req = CompletionRequest {
json_schema: r#"{"type":"object"}"#,
text: "hello",
image: None,
};
let resp = provider.complete(req).await.unwrap();
assert_eq!(resp.entities.len(), 2);
}
}