Skip to content

0.3.5 to 0.4.0

Migration AG-UI : nouveau protocole de streaming¤

A partir de 0.4.0, le SDK adopte le protocole AG-UI pour le streaming des evenements agent. Les anciens mixins UserMessageMixin (callback_mixin) et ChatHistoryMixin sont deprecated et seront supprimes dans une version future.

Nouveaux composants¤

AgUiMixin¤

Mixin integre dans BaseMixin (donc disponible dans tous les TriggerHandler). Convertit les evenements agent DigitalKin en evenements AG-UI et les envoie via context.callbacks.

from digitalkin.mixins import AgUiMixin

class MyTrigger(TriggerHandler, AgUiMixin):
    async def handle(self, input_data, setup_data, context):
        for event in events:
            await self.send_message(context, event)

Evenements supportes : - Run lifecycle : RunStarted, RunCompleted, RunError - Text messages : TextMessageStart, TextMessageContent, TextMessageEnd - Reasoning : ReasoningStart, ReasoningMessageContent, ReasoningEnd - Tool calls : ToolCallStart, ToolCallArgs, ToolCallEnd, ToolCallResult

AgnoStreamAdapter (community)¤

Adaptateur pour convertir les evenements Agno en evenements DigitalKin. Gere automatiquement le cycle de vie (ouverture/fermeture des sequences text/reasoning).

from digitalkin.community.agno import AgnoStreamAdapter

adapter = AgnoStreamAdapter()

async for raw_event in agent.arun(message, stream=True, stream_events=True):
    for event in adapter.to_digitalkin_events(raw_event):
        await self.send_message(context, event)

# Fermer les sequences encore ouvertes en fin de stream
for event in adapter.flush():
    await self.send_message(context, event)

Modeles d'evenements (digitalkin.models.events)¤

Evenements framework-agnostic pour les runs agent :

Classe Description
RunStartedEvent Debut d'un run agent
RunContentEvent Contenu texte streame
RunCompletedEvent Fin d'un run
RunErrorEvent Erreur pendant le run
TextMessageStartedEvent Debut d'un message texte
TextMessageCompletedEvent Fin d'un message texte
ReasoningStartedEvent Debut d'une phase de raisonnement
ReasoningContentDeltaEvent Delta de contenu raisonnement
ReasoningStepEvent Etape de raisonnement
ReasoningCompletedEvent Fin de la phase de raisonnement
ToolCallStartedEvent Debut d'un appel outil
ToolCallCompletedEvent Fin d'un appel outil
ToolCallErrorEvent Erreur d'un appel outil

Modeles de sortie AG-UI (digitalkin.models.module.ag_ui)¤

40+ types de sortie AG-UI avec serialisation camelCase automatique et union discriminee via le champ protocol.

Architecture¤

Framework (Agno, ...)
    |
    v
AgnoStreamAdapter          -- convertit les events framework -> DigitalKin
    |
    v
DigitalKin Events          -- modeles framework-agnostic (agent_events.py)
    |
    v
AgUiMixin.send_message()   -- convertit DigitalKin events -> AG-UI protocol
    |
    v
context.callbacks           -- envoie vers le client via gRPC stream

Exemple complet (Agno)¤

from digitalkin.community.agno import AgnoStreamAdapter
from digitalkin.models.events import BaseAgentRunEvent
from digitalkin.modules.trigger_handler import TriggerHandler


@MyModule.register
class MessageTrigger(TriggerHandler):

    protocol = "agui_stream"
    input_format = AgUiStreamInput
    output_format = AgUiEventOutput

    async def handle(self, input_data, setup_data, context):
        message = extract_user_message(input_data)

        adapter = AgnoStreamAdapter()

        async def send_event(event: BaseAgentRunEvent) -> None:
            await self.send_message(context, event)

        async for raw_event in agent.arun(message, stream=True, stream_events=True):
            for event in adapter.to_digitalkin_events(raw_event):
                await send_event(event)

        for event in adapter.flush():
            await send_event(event)

Deprecations¤

Ancien Nouveau Notes
UserMessageMixin AgUiMixin Emettra un DeprecationWarning a l'heritage
ChatHistoryMixin AgUiMixin Emettra un DeprecationWarning a l'heritage
context.callbacks.send_message(output) directement self.send_message(context, event) via AgUiMixin Les events passent maintenant par le pipeline AG-UI

BaseMixin mis a jour¤

# Avant (0.3.5)
class BaseMixin(CostMixin, ChatHistoryMixin, FileHistoryMixin, LoggerMixin): ...

# Apres (0.4.0)
class BaseMixin(CostMixin, AgUiMixin, FileHistoryMixin, LoggerMixin): ...

AgUiMixin remplace ChatHistoryMixin dans la chaine d'heritage de BaseMixin. Tous les TriggerHandler ont donc acces a self.send_message(context, event) sans import supplementaire.