From 3751e5c8bb86fb0f2c9c1d6bfc57b34a7615cda4 Mon Sep 17 00:00:00 2001 From: Itay Donanhirsh Date: Tue, 20 Aug 2024 20:47:07 -0700 Subject: [PATCH] work --- README.md | 1 + slack_support/README.md | 64 +++++++++++++++++++++++++++++ slack_support/autokitteh.yaml | 29 +++++++++++++ slack_support/demo.png | Bin 0 -> 69776 bytes slack_support/directory.py | 26 ++++++++++++ slack_support/gemini.py | 29 +++++++++++++ slack_support/main.py | 74 ++++++++++++++++++++++++++++++++++ 7 files changed, 223 insertions(+) create mode 100644 slack_support/README.md create mode 100644 slack_support/autokitteh.yaml create mode 100644 slack_support/demo.png create mode 100644 slack_support/directory.py create mode 100644 slack_support/gemini.py create mode 100644 slack_support/main.py diff --git a/README.md b/README.md index 703ffdb4..19c13291 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,7 @@ projects for: | ⭐ [Pull Request Review Reminder (Purrr)](./purrr/) | Streamline code reviews and cut down turnaround time to merge pull requests | GitHub ↔ Slack | | ⭐ [ReviewKitteh](./reviewkitteh/) | Monitor pull requests, and meow at random people | GitHub, Google Sheets, Slack | | 🐍 [Task chain](./task_chain/) | Run a sequence of tasks with fault tolerance | Slack | +| 🐍 [Slack Support](./slack_support/) | Categorize slack support requests using AI and make sure appropiate people handle them | Slack, Google Sheets, Gemini | > [!NOTE] > 🐍 = Python implementation, ⭐ = Starlark implementation. diff --git a/slack_support/README.md b/slack_support/README.md new file mode 100644 index 00000000..6bcd6eaf --- /dev/null +++ b/slack_support/README.md @@ -0,0 +1,64 @@ +# AI Driven Slack Support + +This automation uses a slack bot to receive requests for help as a bot mention. Once a request for help is received, the subject of the request is inferred using Google's Gemini AI. The appropiate person, per a predetemined table of expertize that reside in a Google Doc, is mention. The person can then `!take` the request, and later `!resolve` it. If no one picks up the request for a configurable duration, the automation will remind the person that a request is pending. + +For example, given this expertise table: + +``` + | A | B | C +---+---------+-----------+-------------- + 1 | Itay | U12345678 | cats,dogs + 2 | Haim | U87654321 | russian +``` + +This would happen: + +![demo](./demo.png) + +# Deploy + +Requirements: + +- Slack integration is set up. See https://docs.autokitteh.com/tutorials/new_connections/slack. +- Google integration is set up. See TODO. + +First apply the manifest: + +``` +$ ak manifest apply autokitteh.yaml +``` + +Then initialize the google and slack connections. This will authenticate them to the desired Slack workspace and Google account. + +``` +$ ak connection init slack_support/myslack +$ ak connection init slack_support/mygsheets +``` + +Now acquire a Gemini API key from google. Go to https://ai.google.dev/gemini-api/docs/api-key and follow the instructions. +Set the variable in autokitteh: + +``` +$ ak env set --env slack_support/default --secret GEMINI_API_KEY +``` + +Now create your Google Sheet containing the schedule, it shoud look like this: + +``` + | A | B | C +---+---------+-----------+-------------- + 1 | Gizmo | U12345678 | topic1,topic2 + 2 | George | U87654321 | topic3 +``` + +Set the sheet ID in the autokitteh environment: + +``` +$ ak env set --env slack_support/default DIRECTORY_GOOGLE_SHEET_ID +``` + +Now you are ready to roll. Deploy your project: + +``` +$ ak deploy --project slack_support --dir . +``` diff --git a/slack_support/autokitteh.yaml b/slack_support/autokitteh.yaml new file mode 100644 index 00000000..44aa09a8 --- /dev/null +++ b/slack_support/autokitteh.yaml @@ -0,0 +1,29 @@ +version: v1 + +project: + name: slack_support + vars: + - # Google Sheet ID for a sheet that contains a mapping between users and the + # the topics they can suport. + # Expected google sheet structure: + # | A | B | C + # --+---------+-----------+-------------- + # 1 | Gizmo | U12345678 | topic1,topic2 + # 2 | George | U87654321 | topic3 + name: DIRECTORY_GOOGLE_SHEET_ID + - # A gemini key must be acquired from https://aistudio.google.com/app/apikey. + name: GEMINI_API_KEY + - # Time in minutes to wait for the issue to be picked up before + # reminder. + name: HELP_REQUEST_TIMEOUT_MINUTES + value: "10" + connections: + - name: myslack + integration: slack + - name: mygsheets + integration: googlesheets + triggers: + - name: slack_app_mention + connection: myslack + event_type: app_mention + call: main.py:on_slack_mention diff --git a/slack_support/demo.png b/slack_support/demo.png new file mode 100644 index 0000000000000000000000000000000000000000..f259f21b5b3ebdebd82b341792705d1b4857ef2c GIT binary patch literal 69776 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%0DtU@VNDPZ^V+IuRRji6?Dh2$G-1L24uQNKN2 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 dict[str, list[Person]]: # topic -> list of people + vs = ( + gsheets.spreadsheets() + .values() + .get(spreadsheetId=DIRECTORY_GOOGLE_SHEET_ID, range="A1:C100") + .execute() + .get("values", []) + ) + + ppl = [Person(v[0], v[1], v[2].split(",")) for v in vs] + + topics = set([topic for person in ppl for topic in person.topics]) + + return {topic: [person for person in ppl if topic in person.topics] for topic in topics} diff --git a/slack_support/gemini.py b/slack_support/gemini.py new file mode 100644 index 00000000..6707f61d --- /dev/null +++ b/slack_support/gemini.py @@ -0,0 +1,29 @@ +import os +import json + +import google.generativeai as genai + +# How do i know if this is "picklable" or not? It has no return value? Do I need to run this every time? +# Is this running in an activity? +genai.configure(api_key=os.getenv("GEMINI_API_KEY")) + +# Make this run every time outside of an activity if it's in global scope? +model = genai.GenerativeModel( + "gemini-1.5-flash", + generation_config={"response_mime_type": "application/json"}, +) + + +def extract_topic(text: str, topics: set[str]) -> str: + prompt = f"""Topics: {', '.join(topics)} +Is the following text a request for help with one of these topics? +Example responses: +If a request for help and a topic from the list: {{"help": true, "topic": "cats" }} +If a request for help and topic is not from the list: {{"help": true, "topic": None }} +If not a request for help: {{"help": false}} + +Text to analyze: +{text}""" + + resp = json.loads(model.generate_content(prompt).text) + return resp.get("help"), resp.get("topic") diff --git a/slack_support/main.py b/slack_support/main.py new file mode 100644 index 00000000..68d59b84 --- /dev/null +++ b/slack_support/main.py @@ -0,0 +1,74 @@ +import os +from datetime import datetime + +import autokitteh +from autokitteh.slack import slack_client + +import gemini +import directory + +HELP_REQUEST_TIMEOUT_MINUTES = int(os.getenv("HELP_REQUEST_TIMEOUT_MINUTES")) + +slack_client = slack_client("myslack") + + +def on_slack_mention(event): + def send(text): + """Helper function to just post some text back in the same thread.""" + slack_client.chat_postMessage( + channel=event.data.channel, + thread_ts=event.data.ts, + text=text, + ) + + # prints are used for logging, and can be seen in the console output. + print(f"sent: '{text}'") + + topics_to_people = directory.load() + + help, topic = gemini.extract_topic(event.data.text, topics_to_people.keys()) + if not help: + return + + people = topics_to_people.get(topic) + if not people: + send(f"Sorry, I don't know who to ask about {topic}.") + return + + mentions = ", ".join(f"<@{p.slack_id}>" for p in people) + + send(f"""People who can help are: {mentions}. +Responders: please reply in this thread with `!take` or `!resolve`. +If not taken or resolved, I will remind you in {HELP_REQUEST_TIMEOUT_MINUTES}m. +""") + + # From this point on we are interested in any message that is added to the thread. + # Further below we'll consume the messages and act on them using `next_event`. + s = autokitteh.subscribe( + "myslack", + f'data.type == "message" && data.thread_ts == "{event.data.ts}" && data.text.startsWith("!")', + ) + + taken_by = None + start_time = datetime.now() + + while True: + msg = autokitteh.next_event(s, timeout=60) + + if not msg: # timeout + dt = datetime.now().total_seconds() - start_time.total_seconds() + print(f"timeout, dt={dt}") + + if not taken_by and dt >= HELP_REQUEST_TIMEOUT_MINUTES * 60: + send(f"Reminder: {mentions}, please respond.") + start_time = datetime.now() + continue + + cmd = msg.text.strip()[1:] + if cmd == "resolve": + send("Issue is now resolved.") + # this effectively ends the workflow. + return + if cmd == "take": + taken_by = msg.user + send(f"Thanks <@{msg.user}>, you've taken this issue.")