af_agent_runtime/
types.rs1use 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}