main.py (2002B)
1 import asyncio 2 import os 3 import signal 4 5 from aiokafka import AIOKafkaConsumer, AIOKafkaProducer 6 from openai import AsyncOpenAI 7 8 openAIClient = AsyncOpenAI() 9 10 kafkaAddress = os.environ.get("KAFKA_ADDRESS", "localhost:9092") 11 12 running = True 13 14 15 def signal_handler(signum, frame): 16 global running 17 print(f"Received signal {signum}, shutting down...") 18 running = False 19 20 21 async def summarizer(): 22 global running 23 24 signal.signal(signal.SIGTERM, signal_handler) 25 signal.signal(signal.SIGINT, signal_handler) 26 27 producer = None 28 consumer = None 29 30 try: 31 producer = AIOKafkaProducer(bootstrap_servers=kafkaAddress) 32 await producer.start() 33 34 consumer = AIOKafkaConsumer( 35 "summarization.input", bootstrap_servers=kafkaAddress 36 ) 37 await consumer.start() 38 39 while running: 40 try: 41 message = await asyncio.wait_for(consumer.getone(), timeout=1.0) 42 except asyncio.TimeoutError: 43 continue 44 45 text = message.value.decode() 46 47 try: 48 summarization = await openAIClient.chat.completions.create( 49 messages=[ 50 { 51 "role": "user", 52 "content": "summarize the following:\n" + text, 53 } 54 ], 55 model="gpt-4-turbo", 56 ) 57 summary = summarization.choices[0].message.content 58 except Exception as e: 59 print(f"Summarization failed: {e}") 60 summary = f"[ERROR: Summarization failed - {e}]" 61 62 await producer.send_and_wait( 63 "summarization.output", key=message.key, value=str.encode(summary) 64 ) 65 66 finally: 67 if consumer: 68 await consumer.stop() 69 if producer: 70 await producer.stop() 71 print("Summarizer shut down") 72 73 74 if __name__ == "__main__": 75 asyncio.run(summarizer())