Runner

Die Ausfรผhrungs-Runtime von adk-runner, die die Agent-Ausfรผhrung orchestriert.

รœbersicht

Der Runner verwaltet den kompletten Lebenszyklus der Agent-Ausfรผhrung:

  • Sitzungsverwaltung (Sitzungen erstellen/abrufen)
  • Memory-Injektion (relevante Memories suchen und injizieren)
  • Artefakt-Verwaltung (bereichsbezogener Artefakt-Zugriff)
  • Event-Streaming (Ereignisse verarbeiten und weiterleiten)
  • Agent-Transfers (Multi-Agent-รœbergaben handhaben)

Installation

[dependencies]
adk-runner = "0.2.0"

RunnerConfig

Konfigurieren Sie den Runner mit den benรถtigten Services:

use adk_runner::{Runner, RunnerConfig};
use adk_session::InMemorySessionService;
use adk_artifact::InMemoryArtifactService;
use std::sync::Arc;

let config = RunnerConfig {
    app_name: "my_app".to_string(),
    agent: Arc::new(my_agent),
    session_service: Arc::new(InMemorySessionService::new()),
    artifact_service: Some(Arc::new(InMemoryArtifactService::new())),
    memory_service: None,
    run_config: None,
};

let runner = Runner::new(config)?;

Konfigurationsfelder

FeldTypErforderlichBeschreibung
app_nameStringJaAnwendungsbezeichner
agentArc<dyn Agent>JaAusfรผhrender Root-Agent
session_serviceArc<dyn SessionService>JaSpeicher-Backend fรผr Sitzungen
artifact_serviceOption<Arc<dyn ArtifactService>>NeinArtefakt-Speicher
memory_serviceOption<Arc<dyn Memory>>NeinLangzeitgedรคchtnis
run_configOption<RunConfig>NeinAusfรผhrungsoptionen

Agents ausfรผhren

Fรผhren Sie einen Agent mit Benutzereingabe aus:

use adk_core::Content;
use futures::StreamExt;

let user_content = Content::new("user").with_text("Hello!");

let mut stream = runner.run(
    "user-123".to_string(),
    "session-456".to_string(),
    user_content,
).await?;

while let Some(event) = stream.next().await {
    match event {
        Ok(e) => {
            if let Some(content) = e.content() {
                for part in &content.parts {
                    if let Some(text) = part.text() {
                        print!("{}", text);
                    }
                }
            }
        }
        Err(e) => eprintln!("Error: {}", e),
    }
}

Ausfรผhrungsablauf

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                     Runner.run()                            โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                              โ”‚
                              โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                  1. Abruf der Session                       โ”‚
โ”‚                                                             โ”‚
โ”‚   SessionService.get(app_name, user_id, session_id)        โ”‚
โ”‚   โ†’ Erstellt neue Session, falls nicht vorhanden            โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                              โ”‚
                              โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                  2. Agenten-Auswahl                         โ”‚
โ”‚                                                             โ”‚
โ”‚   รœberprรผft den Session-Status auf aktiven Agent            โ”‚
โ”‚   โ†’ Verwendet Root-Agent oder รผbertragenen Agent            โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                              โ”‚
                              โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                3. Kontext-Erstellung                        โ”‚
โ”‚                                                             โ”‚
โ”‚   InvocationContext mit:                                    โ”‚
โ”‚   - Session (verรคnderbar)                                   โ”‚
โ”‚   - Artefakte (auf Session beschrรคnkt)                      โ”‚
โ”‚   - Speicher (falls konfiguriert)                           โ”‚
โ”‚   - Run config                                              โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                              โ”‚
                              โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                  4. Agenten-Ausfรผhrung                      โ”‚
โ”‚                                                             โ”‚
โ”‚   agent.run(ctx) โ†’ EventStream                             โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                              โ”‚
                              โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                 5. Ereignisverarbeitung                     โ”‚
โ”‚                                                             โ”‚
โ”‚   Fรผr jedes Ereignis:                                       โ”‚
โ”‚   - Aktualisiert den Session-Status                         โ”‚
โ”‚   - Behandelt Transfers                                     โ”‚
โ”‚   - Leitet an den Aufrufer weiter                           โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                              โ”‚
                              โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                  6. Session speichern                       โ”‚
โ”‚                                                             โ”‚
โ”‚   SessionService.append_event(session, events)             โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

InvocationContext

Der Kontext, der Agents wรคhrend der Ausfรผhrung bereitgestellt wird:

pub trait InvocationContext: CallbackContext {
    /// Der auszufรผhrende Agent
    fn agent(&self) -> Arc<dyn Agent>;
    
    /// Memory-Dienst (falls konfiguriert)
    fn memory(&self) -> Option<Arc<dyn Memory>>;
    
    /// Aktuelle Session
    fn session(&self) -> &dyn Session;
    
    /// Ausfรผhrungskonfiguration
    fn run_config(&self) -> &RunConfig;
    
    /// Signalisiert das Ende der Invocation
    fn end_invocation(&self);
    
    /// Prรผft, ob die Invocation beendet wurde
    fn ended(&self) -> bool;
}

RunConfig

Ausfรผhrungsoptionen:

pub struct RunConfig {
    /// Streaming-Modus fรผr Antworten
    pub streaming_mode: StreamingMode,
}

pub enum StreamingMode {
    /// Kein Streaming, gibt vollstรคndige Antwort zurรผck
    None,
    /// Server-Sent Events (Standard)
    SSE,
    /// Bidirektionales Streaming (Echtzeit)
    Bidi,
}

Hinweis: Zusรคtzliche Felder wie max_turns und include_history sind fรผr zukรผnftige Verรถffentlichungen geplant.

Agent Transfers

Der Runner handhabt Multi-Agent-Transfers automatisch:

// In an agent's tool or callback
if should_transfer {
    // Set transfer in event actions
    ctx.set_actions(EventActions {
        transfer_to_agent: Some("specialist_agent".to_string()),
        ..Default::default()
    });
}

Der Runner wird:

  1. Erkennt die Transferanfrage im Event
  2. Findet den Ziel-Agent in sub_agents
  3. Aktualisiert den session-Zustand mit dem neuen aktiven agent
  4. Setzt die Ausfรผhrung mit dem neuen agent fort

Integration mit Launcher

Der Launcher verwendet den Runner intern:

// Launcher creates Runner with default services
Launcher::new(agent)
    .app_name("my_app")
    .run()
    .await?;

// Equivalent to:
let runner = Runner::new(RunnerConfig {
    app_name: "my_app".to_string(),
    agent,
    session_service: Arc::new(InMemorySessionService::new()),
    artifact_service: Some(Arc::new(FileArtifactService::new("./artifacts")?)),
    memory_service: None,
    run_config: None,
})?;

Custom Runner Usage

Fรผr fortgeschrittene Szenarien verwenden Sie den Runner direkt:

use adk_runner::{Runner, RunnerConfig};
use adk_session::DatabaseSessionService;
use adk_artifact::S3ArtifactService;
use adk_memory::QdrantMemoryService;

// Produktionskonfiguration
let config = RunnerConfig {
    app_name: "production_app".to_string(),
    agent: my_agent,
    session_service: Arc::new(DatabaseSessionService::new(db_pool)),
    artifact_service: Some(Arc::new(S3ArtifactService::new(s3_client))),
    memory_service: Some(Arc::new(QdrantMemoryService::new(qdrant_client))),
    run_config: None,  // Verwendet Standard-SSE-Streaming
};

let runner = Runner::new(config)?;

// Verwendung im HTTP-Handler
async fn chat_handler(runner: &Runner, request: ChatRequest) -> Response {
    let stream = runner.run(
        request.user_id,
        request.session_id,
        request.content,
    ).await?;
    
    // Streamt Events an den Client
    Response::sse(stream)
}

Zurรผck: โ† Core Types | Weiter: Launcher โ†’