Skip to main content

Message bus integration for HAI

Project description

H Message Bus

A message bus integration for HAI applications based on NATS.io

Overview

H Message Bus provides a robust, asynchronous messaging infrastructure built on NATS.io for HAI applications. It enables seamless communication between components through a publish-subscribe pattern, supporting both fire-and-forget messaging and request-response patterns.

Features

  • Asynchronous Communication: Built for modern, non-blocking I/O operations
  • Flexible Message Routing: Publish and subscribe to specific topics
  • High Reliability: Automatic reconnection handling and configurable timeouts
  • Simple API: Focus on core messaging functionality with minimal dependencies

Installation

pip install h_message_bus

Requirements

  • Python 3.10+
  • NATS.io server (can be run via Docker)

Topics

H Message Bus includes predefined topics following the convention: hai.[source].[destination].[action]

Available topics:

Topic Constant Topic String Description
Topic.AI_SEND_TG_CHAT_MESSAGE hai.ai.tg.chat.send AI sending message to Telegram chat
Topic.AI_VECTORS_SAVE hai.ai.vectors.save AI saving data to vector database
Topic.AI_VECTORS_QUERY hai.ai.vectors.query AI querying vector database
Topic.TG_SEND_AI_CHAT_MESSAGE hai.tg.ai.chat.send Telegram sending message to AI

You can use these predefined topics or create your own topic strings.

Quick Start

Start a NATS Server

The easiest way to get started is with Docker:

docker-compose up -d

Create a Publisher

import asyncio
import uuid
from h_message_bus import NatsConfig, NatsPublisherAdapter, HaiMessage, Topic

async def main():
    # Configure NATS connection
    config = NatsConfig(server="nats://localhost:4222")
    
    # Create publisher adapter
    publisher = NatsPublisherAdapter(config)
    
    # Connect to NATS
    await publisher.connect()
    
    # Create and publish a message using a predefined topic
    message = HaiMessage(
        message_id=str(uuid.uuid4()),
        sender="service-a",
        topic=Topic.TG_SEND_AI_CHAT_MESSAGE,
        payload={"text": "Hello AI, this is a message from Telegram", "chat_id": 12345}
    )
    
    # Publish message
    await publisher.publish(message)
    
    # Clean up
    await publisher.close()

if __name__ == "__main__":
    asyncio.run(main())

Create a Subscriber

import asyncio
from h_message_bus import NatsConfig, NatsSubscriberAdapter, HaiMessage, Topic

async def message_handler(message: HaiMessage):
    print(f"Received message: {message.message_id}")
    print(f"From: {message.sender}")
    print(f"Topic: {message.topic}")
    print(f"Payload: {message.payload}")

async def main():
    # Configure NATS connection
    config = NatsConfig(server="nats://localhost:4222")
    
    # Create subscriber
    subscriber = NatsSubscriberAdapter(config)
    
    # Connect to NATS
    await subscriber.connect()
    
    # Subscribe to a topic
    await subscriber.subscribe(Topic.TG_SEND_AI_CHAT_MESSAGE, message_handler)
    
    # Keep the application running
    try:
        print("Subscriber running. Press Ctrl+C to exit.")
        while True:
            await asyncio.sleep(1)
    except KeyboardInterrupt:
        # Clean up
        await subscriber.close()

if __name__ == "__main__":
    asyncio.run(main())

Advanced Usage

Request-Response Pattern

import asyncio
import uuid
from h_message_bus import NatsConfig, NatsPublisherAdapter, HaiMessage, Topic

async def main():
    config = NatsConfig(server="nats://localhost:4222")
    publisher = NatsPublisherAdapter(config)
    
    # Connect to NATS
    await publisher.connect()
    
    request_message = HaiMessage(
        message_id=str(uuid.uuid4()),
        sender="client-service",
        topic=Topic.AI_VECTORS_QUERY,
        payload={"query": "find similar documents", "limit": 10}
    )
    
    # Send request and wait for response (with timeout)
    response = await publisher.request(request_message, timeout=5.0)
    
    if response:
        print(f"Received response: {response.payload}")
    else:
        print("Request timed out")
    
    await publisher.close()

if __name__ == "__main__":
    asyncio.run(main())

Creating a Service with Request Handler

import asyncio
import uuid
from h_message_bus import NatsConfig, NatsSubscriberAdapter, NatsPublisherAdapter, HaiMessage, Topic

async def request_handler(request: HaiMessage):
    print(f"Received request: {request.message_id}")
    print(f"Payload: {request.payload}")
    
    # Process the request
    result = {"status": "success", "data": {"result": 42}}
    
    # Create a response message
    return HaiMessage(
        message_id=str(uuid.uuid4()),
        sender="service-b",
        topic=f"{request.topic}.response",
        payload=result,
        correlation_id=request.message_id
    )

async def main():
    # Configure NATS connection
    config = NatsConfig(server="nats://localhost:4222")
    
    # Create subscriber for handling requests
    subscriber = NatsSubscriberAdapter(config)
    publisher = NatsPublisherAdapter(config)
    
    # Connect to NATS
    await subscriber.connect()
    await publisher.connect()
    
    # Register request handler for vector database queries
    await subscriber.subscribe_with_response(Topic.AI_VECTORS_QUERY, request_handler, publisher)
    
    # Keep the application running
    try:
        print("Service running. Press Ctrl+C to exit.")
        while True:
            await asyncio.sleep(1)
    except KeyboardInterrupt:
        # Clean up
        await subscriber.close()
        await publisher.close()

if __name__ == "__main__":
    asyncio.run(main())

Configuration Options

The NatsConfig class allows you to customize your NATS connection:

Parameter Description Default
server NATS server address Required
max_reconnect_attempts Maximum reconnection attempts 10
reconnect_time_wait Time between reconnection attempts (seconds) 2
connection_timeout Connection timeout (seconds) 2
ping_interval Interval for ping frames (seconds) 20
max_outstanding_pings Maximum unanswered pings before disconnect 5
max_payload Maximum size of the payload in bytes 1048576 (1MB)

API Reference

Exported Classes

The following classes are exported directly from the package:

  • NatsConfig - Configuration for the NATS connection
  • HaiMessage - Message structure for HAI communication
  • NatsPublisherAdapter - Adapter for publishing messages
  • NatsSubscriberAdapter - Adapter for subscribing to messages
  • MessageProcessor - Processing incoming messages
  • NatsClientRepository - Low-level NATS client operations
  • Topic - Enumeration of predefined topic strings

HaiMessage Structure

The HaiMessage class is the core data structure used for all messaging:

class HaiMessage:
    message_id: str       # Unique identifier for the message
    sender: str           # Identifier of the sender
    topic: str            # The topic or channel for the message
    payload: dict         # Actual message data
    correlation_id: str = None  # Optional reference to a related message
    timestamp: float = None     # Optional message creation timestamp

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

License

This project is licensed under the MIT License - see the LICENSE file for details.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

h_message_bus-0.0.23.tar.gz (15.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

h_message_bus-0.0.23-py3-none-any.whl (25.4 kB view details)

Uploaded Python 3

File details

Details for the file h_message_bus-0.0.23.tar.gz.

File metadata

  • Download URL: h_message_bus-0.0.23.tar.gz
  • Upload date:
  • Size: 15.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.10.11

File hashes

Hashes for h_message_bus-0.0.23.tar.gz
Algorithm Hash digest
SHA256 456d36b5a5d5bfb366084a5c696e809e90dab226b53dc48baa5430c01c86b947
MD5 6dd45e527f3ec9d25a8f16c80c8b3551
BLAKE2b-256 2d0a66c7df4ca5d0b3b554be1b6d68c26aae422f47660f77185ad9c9be3cf922

See more details on using hashes here.

File details

Details for the file h_message_bus-0.0.23-py3-none-any.whl.

File metadata

  • Download URL: h_message_bus-0.0.23-py3-none-any.whl
  • Upload date:
  • Size: 25.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.10.11

File hashes

Hashes for h_message_bus-0.0.23-py3-none-any.whl
Algorithm Hash digest
SHA256 ed97c68c9fb9c4bbc7e657657a5c7b7f9e6e715cd31eb42700955eaa620bc74e
MD5 0701a4560a1864cd88a43c34add41433
BLAKE2b-256 d64fa922823cc6cd77583e09e9a04435b250030702af574300f21932d20bc693

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page