Skip to content

Commit c51c813

Browse files
feat: add direct lambda invocation support
1 parent 7729d57 commit c51c813

File tree

1 file changed

+42
-0
lines changed

1 file changed

+42
-0
lines changed

packages/slackBotFunction/app/handler.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
2. Processes async operations when invoked by itself to avoid timeouts
77
"""
88

9+
from datetime import datetime
910
from slack_bolt.adapter.aws_lambda import SlackRequestHandler
1011
from 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

Comments
 (0)