Skip to content

Commit d06779f

Browse files
committed
feat(slack): handle slash commands and background draft generation
1 parent b67d75b commit d06779f

2 files changed

Lines changed: 29 additions & 10 deletions

File tree

backend/api/routes/feedback.py

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,3 @@
1-
"""
2-
File: backend/api/routes/feedback.py
3-
Task: 5.1.3 & 5.3.1 - Slack Webhooks (Refactored to use Lexicon)
4-
"""
5-
61
import json
72

83
import structlog
@@ -26,7 +21,7 @@ async def slack_slash_command(request: Request):
2621
command = form_data.get("command")
2722
text = str(form_data.get("text", "")).strip()
2823
user_id = form_data.get("user_id")
29-
# channel_id = form_data.get("channel_id")
24+
channel_id = form_data.get("channel_id")
3025

3126
if command != "/draft":
3227
return {"response_type": "ephemeral", "text": SLACK_UI["cmd_unknown"]}
@@ -52,7 +47,9 @@ async def slack_slash_command(request: Request):
5247
)
5348

5449
# Відправляємо задачу в Taskiq
55-
await generate_draft_task.kiq(topic=topic, platform=platform) # type: ignore[call-overload]
50+
await generate_draft_task.kiq(
51+
topic=topic, platform=platform, user_id=user_id, channel_id=channel_id
52+
) # type: ignore[call-overload]
5653

5754
# Повертаємо миттєву відповідь для Slack
5855
return {

backend/workers/tasks/generate_draft.py

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
from backend.services.content_generator import ContentGenerator, JudgeFailedError
77
from backend.workers.broker import broker
8+
from backend.workers.callbacks import notify_slack_on_complete, notify_slack_on_failure
89
from backend.workers.dependencies import get_content_generator
910

1011
logger = structlog.get_logger()
@@ -17,6 +18,8 @@ async def generate_draft_task(
1718
platform: str,
1819
generator: Annotated[ContentGenerator, TaskiqDepends(get_content_generator)],
1920
source_url: str | None = None,
21+
user_id: str | None = None,
22+
channel_id: str | None = None,
2023
) -> str:
2124
"""
2225
Фонова задача для генерації медичного контенту.
@@ -27,6 +30,8 @@ async def generate_draft_task(
2730
topic=topic,
2831
platform=platform,
2932
source_url=source_url,
33+
user_id=user_id,
34+
channel_id=channel_id,
3035
)
3136

3237
try:
@@ -36,18 +41,30 @@ async def generate_draft_task(
3641
logger.info(
3742
"background_task_success", task="generate_medical_draft", topic=topic
3843
)
44+
45+
# ДОДАНО: Відправка готового результату у Slack
46+
if user_id and channel_id:
47+
await notify_slack_on_complete(
48+
user_id=user_id, channel_id=channel_id, draft=result, topic=topic
49+
)
50+
3951
return result
4052

4153
except JudgeFailedError as e:
42-
# Специфічна обробка помилки валідації LLM
4354
logger.error(
4455
"background_task_judge_failed",
4556
task="generate_medical_draft",
4657
topic=e.topic,
4758
attempts=e.attempts,
4859
)
49-
# Навіть якщо суддя відхилив, ми можемо кинути помилку або зберегти "чорновий" драфт.
50-
# Зараз кидаємо виняток, щоб Taskiq зафіксував статус Failure.
60+
# ДОДАНО: Відправка повідомлення про провал валідації у Slack
61+
if user_id and channel_id:
62+
await notify_slack_on_failure(
63+
user_id=user_id,
64+
channel_id=channel_id,
65+
error_msg=f"Модель не пройшла валідацію після {e.attempts} спроб.\n\nОстанній драфт:\n{e.draft}",
66+
topic=topic,
67+
)
5168
raise
5269

5370
except Exception as e:
@@ -58,4 +75,9 @@ async def generate_draft_task(
5875
error=str(e),
5976
error_type=type(e).__name__,
6077
)
78+
# ДОДАНО: Відправка критичної помилки у Slack
79+
if user_id and channel_id:
80+
await notify_slack_on_failure(
81+
user_id=user_id, channel_id=channel_id, error_msg=str(e), topic=topic
82+
)
6183
raise

0 commit comments

Comments
 (0)