73 lines
2.2 KiB
Python
73 lines
2.2 KiB
Python
"""Minimal message bus for gateway-style host integration."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import asyncio
|
|
from dataclasses import dataclass, field
|
|
from datetime import datetime, timezone
|
|
from typing import Any
|
|
from uuid import uuid4
|
|
|
|
|
|
@dataclass(slots=True)
|
|
class InboundMessage:
|
|
"""A minimal inbound message accepted by the gateway bridge."""
|
|
|
|
channel: str
|
|
content: str
|
|
session_id: str | None = None
|
|
user_id: str | None = None
|
|
title: str | None = None
|
|
execution_context: str | None = None
|
|
model: str | None = None
|
|
provider_name: str | None = None
|
|
embedding_model: str | None = None
|
|
message_id: str = field(default_factory=lambda: str(uuid4()))
|
|
metadata: dict[str, Any] = field(default_factory=dict)
|
|
timestamp: datetime = field(default_factory=lambda: datetime.now(timezone.utc))
|
|
|
|
|
|
@dataclass(slots=True)
|
|
class OutboundMessage:
|
|
"""A minimal outbound message produced by the gateway bridge."""
|
|
|
|
channel: str
|
|
content: str
|
|
session_id: str | None
|
|
finish_reason: str
|
|
message_id: str = field(default_factory=lambda: str(uuid4()))
|
|
run_id: str | None = None
|
|
provider_name: str | None = None
|
|
model: str | None = None
|
|
usage: dict[str, Any] = field(default_factory=dict)
|
|
metadata: dict[str, Any] = field(default_factory=dict)
|
|
timestamp: datetime = field(default_factory=lambda: datetime.now(timezone.utc))
|
|
|
|
|
|
class MessageBus:
|
|
"""Minimal async message bus with inbound/outbound queues."""
|
|
|
|
def __init__(self) -> None:
|
|
self.inbound: asyncio.Queue[InboundMessage] = asyncio.Queue()
|
|
self.outbound: asyncio.Queue[OutboundMessage] = asyncio.Queue()
|
|
|
|
async def publish_inbound(self, message: InboundMessage) -> None:
|
|
await self.inbound.put(message)
|
|
|
|
async def consume_inbound(self) -> InboundMessage:
|
|
return await self.inbound.get()
|
|
|
|
async def publish_outbound(self, message: OutboundMessage) -> None:
|
|
await self.outbound.put(message)
|
|
|
|
async def consume_outbound(self) -> OutboundMessage:
|
|
return await self.outbound.get()
|
|
|
|
@property
|
|
def inbound_size(self) -> int:
|
|
return self.inbound.qsize()
|
|
|
|
@property
|
|
def outbound_size(self) -> int:
|
|
return self.outbound.qsize()
|