Skip to main content

af_agent_runtime/
types.rs

1use std::time::Duration;
2use std::time::Instant;
3
4use af_agent_session::{ContentBlock, Event, SessionEvent};
5use af_llm::ChatMessage;
6use async_trait::async_trait;
7
8use crate::{CancellationToken, RuntimeError};
9
10#[derive(Debug, Clone)]
11pub struct RuntimeLimits {
12    pub max_steps: u32,
13    pub max_tool_calls: u32,
14    pub max_tokens: u64,
15    pub max_parallel_tools: usize,
16    pub provider_attempts: u32,
17    pub provider_deadline: Duration,
18}
19
20impl Default for RuntimeLimits {
21    fn default() -> Self {
22        Self {
23            max_steps: 8,
24            max_tool_calls: 24,
25            max_tokens: 64_000,
26            max_parallel_tools: 4,
27            provider_attempts: 3,
28            provider_deadline: Duration::from_secs(90),
29        }
30    }
31}
32
33#[derive(Debug, Clone)]
34pub struct TurnRequest {
35    pub context: af_context::RequestContext,
36    pub session_id: String,
37    pub run_id: String,
38    pub input_id: String,
39    pub content: Vec<ContentBlock>,
40    pub history: Vec<SessionEvent>,
41}
42
43#[derive(Debug, Clone, PartialEq)]
44pub struct RuntimeOutcome {
45    pub status: String,
46    pub final_text: Option<String>,
47    pub prompt_tokens: u64,
48    pub completion_tokens: u64,
49    pub waiting_interaction_id: Option<String>,
50}
51
52#[async_trait]
53pub trait EventWriter: Send + Sync {
54    async fn append(&self, events: Vec<Event>) -> Result<Vec<SessionEvent>, RuntimeError>;
55    async fn load_after(&self, seq: u64) -> Result<Vec<SessionEvent>, RuntimeError>;
56}
57
58pub trait TokenMeter: Send + Sync {
59    fn count(&self, model: &str, messages: &[ChatMessage]) -> u64;
60}
61
62pub struct ApproximateTokenMeter;
63
64impl TokenMeter for ApproximateTokenMeter {
65    fn count(&self, _model: &str, messages: &[ChatMessage]) -> u64 {
66        messages
67            .iter()
68            .map(|message| {
69                message
70                    .content
71                    .as_deref()
72                    .map_or(0, |content| content.chars().count().div_ceil(4) as u64)
73            })
74            .sum()
75    }
76}
77
78#[async_trait]
79pub trait Compactor: Send + Sync {
80    fn name(&self) -> &str {
81        "compactor"
82    }
83
84    async fn summarize(
85        &self,
86        model: &str,
87        messages: &[ChatMessage],
88        operation_id: &str,
89        cancellation: CancellationToken,
90        deadline: Instant,
91    ) -> Result<CompactionResult, RuntimeError>;
92}
93
94#[derive(Debug, Clone, PartialEq, Eq)]
95pub struct CompactionResult {
96    pub summary: String,
97    pub prompt_tokens: u64,
98    pub completion_tokens: u64,
99}