File size: 2,841 Bytes
15d27ef fa5f350 b2c2f23 fa5f350 9f3b48c bf292d9 15d27ef b843648 2001be3 15d27ef fa5f350 2001be3 fa5f350 bf292d9 9f3b48c fa5f350 9f3b48c bf292d9 b843648 9f3b48c 15d27ef b843648 15d27ef b843648 9f3b48c b843648 9f3b48c b843648 fa5f350 b843648 fa5f350 b843648 bf292d9 b843648 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
# app.py
import asyncio, logging, gradio as gr
from config import settings
from rabbit_base import RabbitBase
from listener import RabbitListenerBase
from rabbit_repo import RabbitRepo
from oa_server import OpenAIServers
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)"
# publisher + servers
publisher = RabbitRepo(external_source="openai.mq.server")
# Force oa.* exchanges to DIRECT using the built-in resolver hook (no raw API added)
resolver = (lambda name: "direct" if name.startswith("oa.") else settings.RABBIT_EXCHANGE_TYPE)
base = RabbitBase(exchange_type_resolver=resolver)
servers = OpenAIServers(publisher)
# Existing handlers can stay; add our two:
handlers = {
"oaChatCreate": servers.handle_chat_create,
"oaImagesGenerate": servers.handle_images_generate,
}
# Declare listener queues using your proven pattern
DECLS = [
# Chat Completions
{"ExchangeName": "oa.chat.create", "FuncName": "oaChatCreate",
"MessageTimeout": 600_000, "RoutingKeys": [settings.RABBIT_ROUTING_KEY]},
# Images (generations)
{"ExchangeName": "oa.images.generate", "FuncName": "oaImagesGenerate",
"MessageTimeout": 600_000, "RoutingKeys": [settings.RABBIT_ROUTING_KEY]},
]
listener = RabbitListenerBase(base, instance_name=settings.RABBIT_INSTANCE_NAME, handlers=handlers)
async def _startup_init():
try:
await base.connect() # your TLS settings apply here
await listener.start(DECLS) # same listener pattern as before
return "OpenAI MQ servers: ready"
except Exception as e:
log.exception("Startup init failed")
return f"ERROR: {e}"
async def ping(): return "ok"
with gr.Blocks(title="OpenAI over RabbitMQ (proven API)", theme=gr.themes.Soft()) as demo:
gr.Markdown("## OpenAI-compatible over RabbitMQ — using existing Rabbit API (CloudEvent envelopes)")
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)
|