tiny-agent 0.2.0

一个小而完整的 Rust LLM Agent 运行时:可中断、可恢复、可观测、可插拔的 agent loop / A small but complete LLM agent runtime in Rust — an interruptible, resumable, observable, pluggable agent loop.
Documentation
use super::AgentRunTime;
use crate::{
    error::StorageError,
    shared::{ContentBlock, Message, Role, ToolCall},
};

impl AgentRunTime {
    /// 向 transcript 追加一条 `tool_result` 消息。
    pub(super) async fn append_tool_result(
        &self,
        session_id: &str,
        block: ContentBlock,
    ) -> Result<(), StorageError> {
        self.transcript_storage
            .append_message(
                session_id,
                Message {
                    role: Role::Tool,
                    blocks: vec![block],
                },
            )
            .await
    }

    /// 为一组尚未被回应的调用各补一条 `is_error: true` 的占位结果。
    /// 这是维持"每个 tool_use 必有 tool_result"不变量的统一收尾工具。
    pub(super) async fn answer_unanswered(
        &self,
        session_id: &str,
        calls: &[ToolCall],
        reason: &str,
    ) -> Result<(), StorageError> {
        if calls.is_empty() {
            return Ok(());
        }
        let messages = calls
            .iter()
            .map(|call| Message {
                role: Role::Tool,
                blocks: vec![ContentBlock::ToolResult {
                    tool_use_id: call.call_id.clone(),
                    content: vec![ContentBlock::Text {
                        text: reason.to_string(),
                    }],
                    is_error: true,
                }],
            })
            .collect();
        self.transcript_storage
            .append_messages(session_id, messages)
            .await
    }
}