Note
The class diagram below omits the DefaultIdGenerator
class, which is used by the DefaultHook
class to generate unique IDs for events.
classDiagram
class AbstractAgent {
-str name
+assist(Session, Query, ResponseHandler)
}
class DefaultServer {
-AbstractAgent _agent
-Flask _app
+run(debug)
+assist_endpoint()
-__stream_agent_output(request_json)
}
class DefaultSession {
-SessionObject _session_object
+processor_id
+activity_id
+request_id
+get_interactions()
}
class DefaultHook {
-Queue _queue
-IdGenerator _id_generator
-float _timeout_secs
+emit(Event)
}
class DefaultResponseHandler {
-Identity _source
-Hook _hook
-Cuid _cuid_generator
-dict[str, StreamEventEmitter] _streams
-bool _is_complete
+respond(event_name, response)
+emit_json(event_name, data)
+emit_text_block(event_name, content)
+create_text_stream(event_name)
+emit_error(error_message, error_code, details)
+complete()
+is_complete()
-__emit_event(event)
}
class DefaultTextStream {
-Identity _event_source
-str _event_name
-str _stream_id
-Hook _hook
-bool _is_complete
+emit_chunk(chunk)
+complete()
+id()
+is_complete()
}
AbstractAgent --> DefaultServer : passed into
DefaultServer --> DefaultSession : creates
DefaultServer --> DefaultHook : creates
DefaultServer --> DefaultResponseHandler : creates
DefaultServer --> AbstractAgent : calls assist()
DefaultResponseHandler --> DefaultHook : uses
DefaultResponseHandler --> DefaultTextStream : creates
DefaultTextStream --> DefaultHook : uses
sequenceDiagram
Client->>DefaultServer: HTTP Request
DefaultServer->>AstractAgent: Creates DefaultSession, DefaultHook, DefaultResponseHandler, calls AbstractAgent.assist()
AstractAgent->>DefaultHook: Generates response, emits events with hook
DefaultHook->>DefaultServer: Adds id, metadata, etc. to emitted events and then adds to response queue
DefaultServer->>Client: Pulls events from response queue, serves to client via SSE
sequenceDiagram
AbstractAgent->>DefaultResponseHandler: Creates response event, calls one of DefaultResponseHandler's emit methods
DefaultResponseHandler->>DefaultHook: Uses DefaultHook to emit event
DefaultHook->>Queue: Adds event to queue
Queue->>DefaultServer: Pulls event from queue
DefaultServer->>Client: Serves event via SSE
- Abstract class for all agents (defined in the interface module)
- Core features:
assist()
: Abstract method for agent execution
- Implements
ResponseHandler
protocol - Core features:
- Event source tracking
- Stream management
- Event emission via hook
- Key methods:
respond()
: Sends complete responsesemit_json()
: Sends JSON eventsemit_text_block()
: Sends text blockscreate_text_stream()
: Creates text streamsemit_error()
: Sends error eventscomplete()
: Marks response as complete
- Implements
StreamEventEmitter
protocol - Core features:
- Stream source tracking
- Completion state tracking
- Chunk emission
- Key methods:
emit_chunk()
: Sends text chunkscomplete()
: Marks stream as complete
- Implements
Hook
protocol using aQueue
- Features:
- Event ID generation
- Timeout management
- Queue management
- Key methods:
emit()
: Adds event to queue
- Flask-based SSE server
- Core features:
- Exposes
assist
HTTP endpoint - Processes requests
- Streams agent output
- Exposes
- Key methods:
assist_endpoint()
:assist
HTTP endpointstream_agent_output()
: Calls agent'sassist()
method and yields the output as well-formed SSE events
- Implements
Session
protocol
- ULID-based identifier generator
- Core features:
- Monotonic ID generation
- Thread-safe operation
- Timestamp-based offsets
- Key methods:
get_next_id()
: Generates a new ULID