voice-ass6/llm-service/main.py
2025-07-16 20:32:55 +05:00

66 lines
1.7 KiB
Python

import asyncio
import json
import toml
from loguru import logger
import nats
from providers import get_provider
# Загрузка конфигурации
config = toml.load("config.toml")
NATS_URL = config["nats"]["url"]
TOPIC_IN = config["nats"]["topic_in"]
TOPIC_OUT = config["nats"]["topic_out"]
provider = get_provider(
config["llm"]["provider"],
api_key=config["llm"]["api_key"],
model=config["llm"]["model"],
system_prompt=config["llm"].get("system_prompt", "")
)
async def message_handler(msg):
logger.info(f"Received message on {msg.subject}: {msg.data}")
try:
data = json.loads(msg.data.decode())
user_id = data.get("user_id")
text = data.get("text")
if not text:
logger.warning("Empty text field in message")
return
response = await provider.chat([{"role": "user", "content": text}])
reply = {
"user_id": user_id,
"response": response
}
await msg.respond(json.dumps(reply).encode())
logger.success(f"Ответ отправлен в {TOPIC_OUT} для {user_id}")
except Exception as e:
logger.exception("Error handling message")
async def main():
logger.info("Connecting to NATS...")
nc = await nats.connect(servers=[NATS_URL])
await nc.subscribe(TOPIC_IN, cb=message_handler)
await nc.flush()
logger.info(f"Subscribed to {TOPIC_IN}")
# Просто держим процесс активным
try:
logger.info("LLM service is running. Waiting for messages...")
await asyncio.Event().wait()
except KeyboardInterrupt:
logger.info("Shutting down LLM service...")
finally:
await nc.drain()
if __name__ == "__main__":
asyncio.run(main())