use bitflags::bitflags;
use serde::{Deserialize, Serialize};
use crate::Json;
use crate::api::event::PendingMarkSpec;
use crate::codec::request::AnnotatedLlmRequest;
bitflags! {
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct LlmAttributes: u32 {
const STATEFUL = 0b01;
const STREAMING = 0b10;
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct LlmRequest {
pub headers: serde_json::Map<String, Json>,
pub content: Json,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct LlmRequestInterceptOutcome {
pub request: LlmRequest,
#[serde(default)]
pub annotated_request: Option<AnnotatedLlmRequest>,
#[serde(default)]
pub pending_marks: Vec<PendingMarkSpec>,
}
impl LlmRequestInterceptOutcome {
pub fn new(request: LlmRequest, annotated_request: Option<AnnotatedLlmRequest>) -> Self {
Self {
request,
annotated_request,
pending_marks: Vec::new(),
}
}
#[must_use]
pub fn with_pending_mark(mut self, mark: PendingMarkSpec) -> Self {
self.pending_marks.push(mark);
self
}
}
impl From<LlmRequest> for LlmRequestInterceptOutcome {
fn from(request: LlmRequest) -> Self {
Self::new(request, None)
}
}
impl From<(LlmRequest, AnnotatedLlmRequest)> for LlmRequestInterceptOutcome {
fn from((request, annotated_request): (LlmRequest, AnnotatedLlmRequest)) -> Self {
Self::new(request, Some(annotated_request))
}
}
impl From<(LlmRequest, Option<AnnotatedLlmRequest>)> for LlmRequestInterceptOutcome {
fn from((request, annotated_request): (LlmRequest, Option<AnnotatedLlmRequest>)) -> Self {
Self::new(request, annotated_request)
}
}