1+ import asyncio
12import os
3+ import uuid
24from concurrent import futures
35
46import grpc
57from grpc_reflection .v1alpha import reflection
68
9+ from app .application .generation import GenerationService
10+ from app .application .routing import RoutingService
11+ from app .core .di import get_dependency
712from app .core .interceptors import LoggingInterceptor
8- from app .generated .v1 .executor import service_pb2_grpc , generation_pb2 , routing_pb2 , service_pb2 , common_pb2
9-
1013from app .core .logger import logger
14+ from app .domain .data import TextData , OptionData
15+ from app .domain .generation import GenerationOptions , GenerationRequest
16+ from app .domain .routing import RoutingRequest
17+ from app .generated .v1 .executor import service_pb2_grpc , generation_pb2 , routing_pb2 , service_pb2 , common_pb2
1118
1219
13- # Service implementation
1420class ExecutorService (service_pb2_grpc .ExecutorServiceServicer ):
15- def Generate (self , request : generation_pb2 .GenerationRequest ,
16- context : grpc .ServicerContext ) -> generation_pb2 .GenerationResponse :
17- text = request .input .text
18- use_memory = request .options .use_memory
19- response_schema = request .options .response_json_schema
20-
21- # Your generation logic here
22- generated_text = f"Generated response for: { text } " # Placeholder
23-
24- return generation_pb2 .GenerationResponse (
25- generated_output = common_pb2 .TextData (text = generated_text )
21+ def __init__ (self ):
22+ self .generation_service = get_dependency (GenerationService )
23+ self .routing_service = get_dependency (RoutingService )
24+
25+ def Generate (
26+ self ,
27+ request : generation_pb2 .GenerationRequest ,
28+ context : grpc .ServicerContext ) -> generation_pb2 .GenerationResponse :
29+ request = GenerationRequest (
30+ input = TextData (text = request .input .text ),
31+ options = GenerationOptions (
32+ use_memory = request .options .use_memory ,
33+ response_json_schema = request .options .response_json_schema
34+ ),
35+ context_id = uuid .UUID (request .context_id )
2636 )
2737
28- def Route (self , request : routing_pb2 .RoutingRequest ,
29- context : grpc .ServicerContext ) -> routing_pb2 .RoutingResponse :
30- text = request .input .text
31- options = [opt .option for opt in request .options ]
32-
33- # Your routing logic here
34- selected = options [0 ] if options else ""
35- is_fallback = False
36-
37- return routing_pb2 .RoutingResponse (
38- selected_option = common_pb2 .OptionData (option = selected ),
39- is_fallback = is_fallback
38+ try :
39+ result = asyncio .run (self .generation_service .generate (request ))
40+ logger .info (f"Generated output: { result .generated_output .text } " )
41+ return generation_pb2 .GenerationResponse (
42+ generated_output = common_pb2 .TextData (text = result .generated_output .text )
43+ )
44+ except Exception as e :
45+ return generation_pb2 .GenerationResponse (
46+ error = str (e )
47+ )
48+
49+ def Route (
50+ self ,
51+ request : routing_pb2 .RoutingRequest ,
52+ context : grpc .ServicerContext ) -> routing_pb2 .RoutingResponse :
53+ request = RoutingRequest (
54+ input = TextData (text = request .input .text ),
55+ options = [OptionData (option = opt .option ) for opt in request .options ]
4056 )
4157
42-
43- def serve ():
44- server = grpc .server (
45- futures .ThreadPoolExecutor (max_workers = 10 ),
58+ try :
59+ result = asyncio .run (self .routing_service .route (request ))
60+ logger .info (f"Selected option: { result .selected_option .option } " )
61+ return routing_pb2 .RoutingResponse (
62+ selected_option = common_pb2 .OptionData (option = result .selected_option .option ),
63+ is_fallback = result .is_fallback
64+ )
65+ except Exception as e :
66+ return routing_pb2 .RoutingResponse (
67+ error = str (e )
68+ )
69+
70+
71+ async def serve ():
72+ server = grpc .aio .server (
4673 interceptors = [LoggingInterceptor ()]
4774 )
4875
@@ -63,9 +90,9 @@ def serve():
6390 # Start the server
6491 server .add_insecure_port ('[::]:50051' )
6592 logger .info ("Starting Chatbot Builder Executor gRPC server on port 50051 with reflection enabled" )
66- server .start ()
67- server .wait_for_termination ()
93+ await server .start ()
94+ await server .wait_for_termination ()
6895
6996
7097if __name__ == '__main__' :
71- serve ()
98+ asyncio . run ( serve () )
0 commit comments