route optimizer agent with dailygrubs ai assign
This commit is contained in:
@@ -171,6 +171,22 @@ class MessageBus:
|
||||
) -> str:
|
||||
return await self.send_to_agent(sender, "ALL", message_type, payload, correlation_id)
|
||||
|
||||
async def _deliver_to_agent(self, agent_id: str, message: AgentMessage):
|
||||
"""Hand a directed message to a locally-registered agent so it is
|
||||
actually consumed (via its ``deliver``). Only if no such agent exists in
|
||||
this process does it fall back to the pull queue — so a message is never
|
||||
silently lost, but is delivered live whenever the recipient is present."""
|
||||
agent = self._agents.get(agent_id)
|
||||
if agent is not None and hasattr(agent, "deliver"):
|
||||
try:
|
||||
await agent.deliver(message)
|
||||
return
|
||||
except Exception as e:
|
||||
logger.error(f"Delivery to {agent_id} failed: {e}")
|
||||
return
|
||||
async with self._lock:
|
||||
self._queues[agent_id].append(QueuedMessage(message))
|
||||
|
||||
async def get_messages(self, agent_id: str) -> List[AgentMessage]:
|
||||
async with self._lock:
|
||||
queued = self._queues.pop(agent_id, [])
|
||||
@@ -179,6 +195,26 @@ class MessageBus:
|
||||
async def peek_messages(self, agent_id: str) -> List[AgentMessage]:
|
||||
return [q.message for q in self._queues.get(agent_id, [])]
|
||||
|
||||
# ------------------------------------------------------------------ #
|
||||
# Telemetry #
|
||||
# ------------------------------------------------------------------ #
|
||||
|
||||
async def publish_telemetry(self, kind: str, payload: Dict[str, Any]):
|
||||
"""
|
||||
Fire-and-forget observability event on plain NATS (subject `telemetry.<kind>`).
|
||||
|
||||
Deliberately NOT JetStream: telemetry is ephemeral fan-out for dashboards
|
||||
and must never accumulate in the persistent `logistics` stream. No-op
|
||||
when NATS is not connected — telemetry must never affect agent behavior.
|
||||
"""
|
||||
if self._nc is None or not self._nc.is_connected:
|
||||
return
|
||||
try:
|
||||
body = {"kind": kind, "ts": datetime.now().isoformat(), **payload}
|
||||
await self._nc.publish(f"telemetry.{kind}", json.dumps(body).encode())
|
||||
except Exception as e:
|
||||
logger.debug(f"Telemetry publish failed [{kind}]: {e}")
|
||||
|
||||
# ------------------------------------------------------------------ #
|
||||
# Hooks #
|
||||
# ------------------------------------------------------------------ #
|
||||
@@ -266,8 +302,7 @@ class MessageBus:
|
||||
async def handler(msg):
|
||||
try:
|
||||
agent_msg = AgentMessage.from_json(msg.data.decode())
|
||||
async with self._lock:
|
||||
self._queues[agent_id].append(QueuedMessage(agent_msg))
|
||||
await self._deliver_to_agent(agent_id, agent_msg)
|
||||
except Exception as e:
|
||||
logger.error(f"NATS agent-sub decode error [{agent_id}]: {e}")
|
||||
finally:
|
||||
@@ -282,8 +317,7 @@ class MessageBus:
|
||||
async def _local_dispatch(self, message: AgentMessage):
|
||||
"""In-process dispatch used when NATS is not connected."""
|
||||
if message.recipient != "ALL":
|
||||
async with self._lock:
|
||||
self._queues[message.recipient].append(QueuedMessage(message))
|
||||
await self._deliver_to_agent(message.recipient, message)
|
||||
else:
|
||||
for callback in list(self._subscribers.get(message.message_type, [])):
|
||||
try:
|
||||
|
||||
Reference in New Issue
Block a user