# app.py import asyncio, logging, gradio as gr from config import settings from rabbit_base import RabbitBase from openai_server import ChatCompletionsServer, ImagesServer logging.basicConfig(level=logging.INFO, format="%(asctime)s [%(levelname)s] %(name)s: %(message)s") log = logging.getLogger("app") try: import spaces @spaces.GPU(duration=60) def gpu_entrypoint() -> str: return "gpu: ready" except Exception: def gpu_entrypoint() -> str: return "gpu: not available (CPU only)" # Ensure oa.* exchanges are DIRECT; fall back to your global default otherwise. resolver = lambda name: ("direct" if name.startswith("oa.") else settings.RABBIT_EXCHANGE_TYPE) base = RabbitBase(exchange_type_resolver=resolver) chat_srv = ChatCompletionsServer(base, exchange_name="oa.chat.create", routing_key="default") img_srv = ImagesServer(base, exchange_name="oa.images.generate", routing_key="default") async def _startup_init(): try: # This connect() uses your TLS settings (verify disabled if amqps) await base.connect() await asyncio.gather(chat_srv.start(), img_srv.start()) return "OpenAI MQ servers: ready" except Exception as e: log.exception("Startup init failed") return f"ERROR: {e}" async def ping() -> str: return "ok" with gr.Blocks(title="OpenAI over RabbitMQ", theme=gr.themes.Soft()) as demo: gr.Markdown("## OpenAI-compatible server over RabbitMQ (using RabbitBase TLS settings)") with gr.Tabs(): with gr.Tab("Service"): btn = gr.Button("Ping"); out = gr.Textbox(label="Ping result") btn.click(ping, inputs=None, outputs=out) init_status = gr.Textbox(label="Startup status", interactive=False) demo.load(fn=_startup_init, inputs=None, outputs=init_status) with gr.Tab("@spaces.GPU Probe"): gpu_btn = gr.Button("GPU Ready Probe", variant="primary") gpu_out = gr.Textbox(label="GPU Probe Result", interactive=False) gpu_btn.click(gpu_entrypoint, inputs=None, outputs=gpu_out) if __name__ == "__main__": demo.launch(server_name="0.0.0.0", server_port=7860, show_error=True, debug=True)