af_agent_runtime/
types.rs1use af_context::{InputId, InteractionId, RunId, SessionId};
2use std::time::Duration;
3use std::time::Instant;
4
5use af_agent_session::{ContentBlock, Event, SessionEvent};
6use af_llm::ChatMessage;
7use async_trait::async_trait;
8
9use crate::{CancellationToken, RuntimeError};
10
11#[derive(Debug, Clone)]
13pub struct RuntimeLimits {
14 pub max_steps: u32,
16 pub max_tool_calls: u32,
18 pub max_tokens: u64,
20 pub max_parallel_tools: usize,
22 pub provider_attempts: u32,
24 pub provider_deadline: Duration,
26}
27
28impl Default for RuntimeLimits {
29 fn default() -> Self {
30 Self {
31 max_steps: 8,
32 max_tool_calls: 24,
33 max_tokens: 64_000,
34 max_parallel_tools: 4,
35 provider_attempts: 3,
36 provider_deadline: Duration::from_secs(90),
37 }
38 }
39}
40
41#[derive(Debug, Clone)]
43pub struct TurnRequest {
44 pub context: af_context::RequestContext,
46 pub session_id: SessionId,
48 pub run_id: RunId,
50 pub input_id: InputId,
52 pub content: Vec<ContentBlock>,
54 pub history: Vec<SessionEvent>,
56}
57
58#[derive(Debug, Clone, PartialEq)]
60pub struct RuntimeOutcome {
61 pub status: String,
63 pub final_text: Option<String>,
65 pub prompt_tokens: u64,
67 pub completion_tokens: u64,
69 pub waiting_interaction_id: Option<InteractionId>,
71}
72
73#[async_trait]
75pub trait EventWriter: Send + Sync {
76 async fn append(&self, events: Vec<Event>) -> Result<Vec<SessionEvent>, RuntimeError>;
78 async fn load_after(&self, seq: u64) -> Result<Vec<SessionEvent>, RuntimeError>;
80}
81
82pub trait TokenMeter: Send + Sync {
84 fn count(&self, model: &str, messages: &[ChatMessage]) -> u64;
86}
87
88pub struct ApproximateTokenMeter;
90
91impl TokenMeter for ApproximateTokenMeter {
92 fn count(&self, _model: &str, messages: &[ChatMessage]) -> u64 {
93 messages
94 .iter()
95 .map(|message| {
96 message
97 .content
98 .as_deref()
99 .map_or(0, |content| content.chars().count().div_ceil(4) as u64)
100 })
101 .sum()
102 }
103}
104
105#[async_trait]
107pub trait Compactor: Send + Sync {
108 fn name(&self) -> &str {
110 "compactor"
111 }
112
113 async fn summarize(
115 &self,
116 model: &str,
117 messages: &[ChatMessage],
118 operation_id: &str,
119 cancellation: CancellationToken,
120 deadline: Instant,
121 ) -> Result<CompactionResult, RuntimeError>;
122}
123
124#[derive(Debug, Clone, PartialEq, Eq)]
126pub struct CompactionResult {
127 pub summary: String,
129 pub prompt_tokens: u64,
131 pub completion_tokens: u64,
133}