662. Processes async operations when invoked by itself to avoid timeouts
77"""
88
9+ from datetime import datetime
910from slack_bolt .adapter .aws_lambda import SlackRequestHandler
1011from aws_lambda_powertools .utilities .typing import LambdaContext
1112
@@ -33,6 +34,10 @@ def handler(event: dict, context: LambdaContext) -> dict:
3334 When subsequent actions or events are processed, this is looked up, and if it exists, then the pull request lambda
3435 is triggered with either pull_request_event or pull_request_action
3536 """
37+ # direct invocation bypasses slack infrastructure entirely
38+ if event .get ("invocation_type" ) == "direct" :
39+ return handle_direct_invocation (event , context )
40+
3641 app = get_app (logger = logger )
3742 # handle pull request processing requests
3843 if event .get ("pull_request_event" ):
@@ -55,3 +60,40 @@ def handler(event: dict, context: LambdaContext) -> dict:
5560 # handle Slack webhook requests
5661 slack_handler = SlackRequestHandler (app = app )
5762 return slack_handler .handle (event = event , context = context )
63+
64+
65+ def handle_direct_invocation (event : dict , context : LambdaContext ) -> dict :
66+ """direct lambda invocation for ai assistance - bypasses slack entirely"""
67+ try :
68+ query = event .get ("query" )
69+ session_id = event .get ("session_id" )
70+
71+ if not query or not query .strip ():
72+ return {
73+ "statusCode" : 400 ,
74+ "response" : {
75+ "error" : "Missing required field: query" ,
76+ "timestamp" : datetime .utcnow ().isoformat () + "Z" ,
77+ },
78+ }
79+
80+ # shared logic: same AI processing as slack handlers use
81+ from app .services .ai_processor import process_ai_query
82+
83+ ai_response = process_ai_query (query , session_id )
84+
85+ return {
86+ "statusCode" : 200 ,
87+ "response" : {
88+ "text" : ai_response ["text" ],
89+ "session_id" : ai_response ["session_id" ],
90+ "citations" : ai_response ["citations" ],
91+ "timestamp" : datetime .utcnow ().isoformat () + "Z" ,
92+ },
93+ }
94+ except Exception as e :
95+ logger .error (f"Error in direct invocation: { e } " )
96+ return {
97+ "statusCode" : 500 ,
98+ "response" : {"error" : "Internal server error" , "timestamp" : datetime .utcnow ().isoformat () + "Z" },
99+ }
0 commit comments