From 40ba4b89b54306ace2a68a33740445b7a829ea3a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 28 Dec 2025 21:32:16 +0000 Subject: [PATCH 1/7] Initial plan From 4f8e776508cc46ce799791093c9b1b41b94b2249 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 28 Dec 2025 21:35:04 +0000 Subject: [PATCH 2/7] Add request timeouts, fix missing ack(), remove unused variable, optimize thread history fetching Co-authored-by: Snowflake6413 <236707025+Snowflake6413@users.noreply.github.com> --- __pycache__/app.cpython-312.pyc | Bin 0 -> 8508 bytes app.py | 42 +++++++++++++++++--------------- 2 files changed, 23 insertions(+), 19 deletions(-) create mode 100644 __pycache__/app.cpython-312.pyc diff --git a/__pycache__/app.cpython-312.pyc b/__pycache__/app.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ad7e5d8a4f6e656f5377a5448ba713d29b90f6ee GIT binary patch literal 8508 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 Z%8_T+*&`e5u`+w?b9T7OQ1u}7e*=Gh0}22D literal 0 HcmV?d00001 diff --git a/app.py b/app.py index 8461157..c121a5d 100644 --- a/app.py +++ b/app.py @@ -61,7 +61,7 @@ def cat_img(ack, say, command): ack() user_id = command["user_id"] - response = requests.get("https://api.thecatapi.com/v1/images/search") + response = requests.get("https://api.thecatapi.com/v1/images/search", timeout=10) if response.status_code == 200: data = response.json() @@ -93,7 +93,7 @@ def cat_img(ack, say, command): @app.command("/help") def bot_help(ack, respond): - + ack() blocks=[{ @@ -145,7 +145,7 @@ def bot_help(ack, respond): def cat_fact(ack, say, command): ack() user_id = command["user_id"] - response = requests.get("https://catfact.ninja/fact") + response = requests.get("https://catfact.ninja/fact", timeout=10) if response.status_code == 200: data = response.json() @@ -253,7 +253,6 @@ def ai_mention(event, say, body, logger, client, respond): thread_ts = event.get("thread_ts", event["ts"]) channel_id = event["channel"] message_ts = event["ts"] - original_text=event['text'] try: client.reactions_add( @@ -273,26 +272,31 @@ def ai_mention(event, say, body, logger, client, respond): ) return - - memory = client.conversations_replies( - channel=channel_id, - ts=thread_ts, - limit = 10 - ) - - memory_data = memory['messages'] - conversation_context = [ {"role": "system", "content":"Act as a helpful cat assistant. Be cute, use cat puns/sounds/emojis, address user as 'Hooman', and describe actions in italics (*purrs*). maintain persona while being useful." } ] + + # Only fetch thread history if this is actually a thread (not the first message) + if thread_ts != message_ts: + memory = client.conversations_replies( + channel=channel_id, + ts=thread_ts, + limit = 10 + ) + + memory_data = memory['messages'] - for msg in memory_data: - text = msg.get("text") - if "bot_id" in msg: - conversation_context.append({"role": "assistant", "content": text}) - else: - conversation_context.append({"role": "user", "content": text}) + for msg in memory_data: + text = msg.get("text") + if text: # Only process messages with text + if "bot_id" in msg: + conversation_context.append({"role": "assistant", "content": text}) + else: + conversation_context.append({"role": "user", "content": text}) + else: + # First message in thread, just add the current user message + conversation_context.append({"role": "user", "content": user_msg}) response = chat_client.chat.completions.create( model=LLM_MODEL, From 23f0cfadbde0839a2ec2ceb86c17dbb2f7cd9eee Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 28 Dec 2025 21:35:39 +0000 Subject: [PATCH 3/7] Update .gitignore to exclude Python cache files Co-authored-by: Snowflake6413 <236707025+Snowflake6413@users.noreply.github.com> --- .gitignore | 5 ++++- __pycache__/app.cpython-312.pyc | Bin 8508 -> 0 bytes 2 files changed, 4 insertions(+), 1 deletion(-) delete mode 100644 __pycache__/app.cpython-312.pyc diff --git a/.gitignore b/.gitignore index 9702d2a..ce40317 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,5 @@ /.venv -.env \ No newline at end of file +.env +__pycache__/ +*.pyc +*.pyo \ No newline at end of file diff --git a/__pycache__/app.cpython-312.pyc b/__pycache__/app.cpython-312.pyc deleted file mode 100644 index ad7e5d8a4f6e656f5377a5448ba713d29b90f6ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8508 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 Z%8_T+*&`e5u`+w?b9T7OQ1u}7e*=Gh0}22D From 5b26bc3430df4623c5b624426113b37d7eca0d62 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 28 Dec 2025 21:36:54 +0000 Subject: [PATCH 4/7] Fix: Ensure current message is always included in conversation context Co-authored-by: Snowflake6413 <236707025+Snowflake6413@users.noreply.github.com> --- app.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/app.py b/app.py index c121a5d..348237b 100644 --- a/app.py +++ b/app.py @@ -286,14 +286,23 @@ def ai_mention(event, say, body, logger, client, respond): ) memory_data = memory['messages'] + current_msg_included = False for msg in memory_data: text = msg.get("text") if text: # Only process messages with text + # Check if this is the current message + if msg.get("ts") == message_ts: + current_msg_included = True + if "bot_id" in msg: conversation_context.append({"role": "assistant", "content": text}) else: conversation_context.append({"role": "user", "content": text}) + + # If current message wasn't in the thread history, add it + if not current_msg_included: + conversation_context.append({"role": "user", "content": user_msg}) else: # First message in thread, just add the current user message conversation_context.append({"role": "user", "content": user_msg}) From 786518afbdad612008ab0bf153fbee65e04b9a75 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 28 Dec 2025 23:46:27 +0000 Subject: [PATCH 5/7] Add exception handling for timeout and connection errors in /catimage and /catfact commands Co-authored-by: Snowflake6413 <236707025+Snowflake6413@users.noreply.github.com> --- app.py | 120 +++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 74 insertions(+), 46 deletions(-) diff --git a/app.py b/app.py index 348237b..6eddbed 100644 --- a/app.py +++ b/app.py @@ -61,33 +61,47 @@ def cat_img(ack, say, command): ack() user_id = command["user_id"] - response = requests.get("https://api.thecatapi.com/v1/images/search", timeout=10) - if response.status_code == 200: - data = response.json() - cat_url = data[0]['url'] - cat_id = data[0]['id'] + try: + response = requests.get("https://api.thecatapi.com/v1/images/search", timeout=10) + + if response.status_code == 200: + data = response.json() + cat_url = data[0]['url'] + cat_id = data[0]['id'] + say( + blocks=[ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": f"Here is your cute kitty, <@{user_id}>! :neocat_3c: (ID: {cat_id})" + } + }, + { + "type": "image", + "title": { + "type": "plain_text", + "text": "KITTY!!", + "emoji": True + }, + "image_url": cat_url, + "alt_text": "KITTTTY!!!" + } + ] + ) + else: + say( + text=f"Meow! :sadcat: I couldn't fetch a cat image right now (status {response.status_code}). Please try again later!" + ) + except requests.exceptions.Timeout: say( - blocks=[ - { - "type": "section", - "text": { - "type": "mrkdwn", - "text": f"Here is your cute kitty, <@{user_id}>! :neocat_3c: (ID: {cat_id})" - } - }, - { - "type": "image", - "title": { - "type": "plain_text", - "text": "KITTY!!", - "emoji": True - }, - "image_url": cat_url, - "alt_text": "KITTTTY!!!" - } - ] + text=f"Meow! :sadcat: The cat API is taking too long to respond. Please try again later!" + ) + except requests.exceptions.RequestException as e: + say( + text=f"Meow! :sadcat: I encountered an error while fetching a cat image. Please try again later!" ) @@ -145,30 +159,44 @@ def bot_help(ack, respond): def cat_fact(ack, say, command): ack() user_id = command["user_id"] - response = requests.get("https://catfact.ninja/fact", timeout=10) + + try: + response = requests.get("https://catfact.ninja/fact", timeout=10) - if response.status_code == 200: - data = response.json() - fact = data['fact'] + if response.status_code == 200: + data = response.json() + fact = data['fact'] - say( - blocks=[{ - "type": "section", - "text": { - "type": "mrkdwn", - "text": f"Here is your cat fact, <@{user_id}>! :neocat:", - } - }, - { - "type": "section", - "text": { - "type": "plain_text", - "text": fact, - "emoji": True - } - } - ] - ) + say( + blocks=[{ + "type": "section", + "text": { + "type": "mrkdwn", + "text": f"Here is your cat fact, <@{user_id}>! :neocat:", + } + }, + { + "type": "section", + "text": { + "type": "plain_text", + "text": fact, + "emoji": True + } + } + ] + ) + else: + say( + text=f"Meow! :sadcat: I couldn't fetch a cat fact right now (status {response.status_code}). Please try again later!" + ) + except requests.exceptions.Timeout: + say( + text=f"Meow! :sadcat: The cat fact API is taking too long to respond. Please try again later!" + ) + except requests.exceptions.RequestException as e: + say( + text=f"Meow! :sadcat: I encountered an error while fetching a cat fact. Please try again later!" + ) @app.command("/about") def get_info(ack, respond): From 47bc1c3ecc9dadc977b17ac9c942c675dc05fb3d Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 28 Dec 2025 23:47:20 +0000 Subject: [PATCH 6/7] Remove unused exception variable from error handlers Co-authored-by: Snowflake6413 <236707025+Snowflake6413@users.noreply.github.com> --- app.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app.py b/app.py index 6eddbed..68a340f 100644 --- a/app.py +++ b/app.py @@ -99,7 +99,7 @@ def cat_img(ack, say, command): say( text=f"Meow! :sadcat: The cat API is taking too long to respond. Please try again later!" ) - except requests.exceptions.RequestException as e: + except requests.exceptions.RequestException: say( text=f"Meow! :sadcat: I encountered an error while fetching a cat image. Please try again later!" ) @@ -193,7 +193,7 @@ def cat_fact(ack, say, command): say( text=f"Meow! :sadcat: The cat fact API is taking too long to respond. Please try again later!" ) - except requests.exceptions.RequestException as e: + except requests.exceptions.RequestException: say( text=f"Meow! :sadcat: I encountered an error while fetching a cat fact. Please try again later!" ) From 0b576270b049b9bf421cee15c144945d2ca7d91e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 28 Dec 2025 23:48:27 +0000 Subject: [PATCH 7/7] Remove unnecessary f-string prefixes from static error messages Co-authored-by: Snowflake6413 <236707025+Snowflake6413@users.noreply.github.com> --- app.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app.py b/app.py index 68a340f..c7d9e46 100644 --- a/app.py +++ b/app.py @@ -97,11 +97,11 @@ def cat_img(ack, say, command): ) except requests.exceptions.Timeout: say( - text=f"Meow! :sadcat: The cat API is taking too long to respond. Please try again later!" + text="Meow! :sadcat: The cat API is taking too long to respond. Please try again later!" ) except requests.exceptions.RequestException: say( - text=f"Meow! :sadcat: I encountered an error while fetching a cat image. Please try again later!" + text="Meow! :sadcat: I encountered an error while fetching a cat image. Please try again later!" ) @@ -191,11 +191,11 @@ def cat_fact(ack, say, command): ) except requests.exceptions.Timeout: say( - text=f"Meow! :sadcat: The cat fact API is taking too long to respond. Please try again later!" + text="Meow! :sadcat: The cat fact API is taking too long to respond. Please try again later!" ) except requests.exceptions.RequestException: say( - text=f"Meow! :sadcat: I encountered an error while fetching a cat fact. Please try again later!" + text="Meow! :sadcat: I encountered an error while fetching a cat fact. Please try again later!" ) @app.command("/about")