Skip to content

Commit

Permalink
feedback: allow events coming from roleGen
Browse files Browse the repository at this point in the history
Accept the action and feeback events coming from the extension for the role generation.
  • Loading branch information
goneri committed Jan 23, 2025
1 parent 8f0a8da commit 55c1d14
Show file tree
Hide file tree
Showing 4 changed files with 59 additions and 27 deletions.
22 changes: 7 additions & 15 deletions ansible_ai_connect/ai/api/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -262,18 +262,6 @@ class IssueFeedback(serializers.Serializer):
)


class PlaybookGenerationFeedback(serializers.Serializer):
USER_ACTION_CHOICES = (("0", "ACCEPTED"), ("1", "REJECTED"), ("2", "IGNORED"))

action = serializers.ChoiceField(choices=USER_ACTION_CHOICES, required=True)
wizardId = serializers.UUIDField(
format="hex_verbose",
required=True,
label="Outline ID",
help_text="A UUID that identifies the UI session.",
)


class PlaybookGenerationAction(serializers.Serializer):
ACTIONS = (("0", "OPEN"), ("1", "CLOSE_CANCEL"), ("2", "TRANSITION"), ("3", "CLOSE_ACCEPT"))

Expand All @@ -296,7 +284,7 @@ class PlaybookGenerationAction(serializers.Serializer):
)


class PlaybookExplanationFeedback(serializers.Serializer):
class PlaybookExplanationAction(serializers.Serializer):
USER_ACTION_CHOICES = (("0", "ACCEPTED"), ("1", "REJECTED"), ("2", "IGNORED"))

action = serializers.ChoiceField(choices=USER_ACTION_CHOICES, required=True)
Expand All @@ -308,6 +296,10 @@ class PlaybookExplanationFeedback(serializers.Serializer):
)


class RoleGenerationAction(PlaybookGenerationAction):
pass


class ChatRequestSerializer(serializers.Serializer):
conversation_id = serializers.UUIDField(
format="hex_verbose",
Expand Down Expand Up @@ -394,9 +386,9 @@ class FeedbackRequestSerializer(Metadata):
issueFeedback = IssueFeedback(required=False)
metadata = Metadata(required=False)
model = serializers.CharField(required=False)
playbookExplanationFeedback = PlaybookExplanationFeedback(required=False)
playbookGenerationFeedback = PlaybookGenerationFeedback(required=False)
playbookExplanationFeedback = PlaybookExplanationAction(required=False)
playbookGenerationAction = PlaybookGenerationAction(required=False)
roleGenerationAction = RoleGenerationAction(required=False)
sentimentFeedback = SentimentFeedback(required=False)
suggestionQualityFeedback = SuggestionQualityFeedback(required=False)
chatFeedback = ChatFeedback(required=False)
Expand Down
6 changes: 6 additions & 0 deletions ansible_ai_connect/ai/api/telemetry/schema2.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ class AnalyticsTelemetryEvents(Enum):
RECOMMENDATION_ACTION = "Recommendation Action"
PRODUCT_FEEDBACK = "Product Feedback"
PLAYBOOK_GENERATION_ACTION = "Playbook Generation Action"
ROLE_GENERATION_ACTION = "Role Generation Action"
ONECLICK_TRIAL_STARTED = "OneClickTrial Started"


Expand Down Expand Up @@ -61,6 +62,11 @@ class AnalyticsPlaybookGenerationWizard:
)


@frozen
class AnalyticsRoleGenerationWizard(AnalyticsPlaybookGenerationWizard):
pass


@frozen
class AnalyticsRecommendationAction:
action: int = field(
Expand Down
24 changes: 14 additions & 10 deletions ansible_ai_connect/ai/api/tests/test_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@
import uuid
from http import HTTPStatus
from typing import Optional, Union
from unittest import skip
from unittest.mock import Mock, patch

from django.apps import apps
Expand Down Expand Up @@ -545,26 +544,31 @@ def test_feedback_explanation(self):
properties = segment_events[0]["properties"]
self.assertEqual(properties["action"], "1")

@skip("Schema2 event is not enabled yet")
def test_feedback_generation(self):
payload = {
"playbookGenerationAction": {
"action": 3,
"generationId": "2832e159-e0fe-4efc-9288-d60c96c88666",
"wizardId": "f3c5a9c4-9170-40b3-b46f-de387234410b",
"fromPage": 2,
"toPage": 3,
},
"action": 3,
"generationId": "2832e159-e0fe-4efc-9288-d60c96c88666",
"wizardId": "f3c5a9c4-9170-40b3-b46f-de387234410b",
"fromPage": 2,
"toPage": 3,
}
payload = {
"playbookGenerationAction": payload,
"roleGenerationAction": payload,
}
self.client.force_authenticate(user=self.user)
with self.assertLogs(logger="root", level="DEBUG") as log:
r = self.client.post(reverse("feedback"), payload, format="json")
self.assertEqual(r.status_code, HTTPStatus.OK)

segment_events = self.extractSegmentEventsFromLog(log)
self.assertTrue(len(segment_events) > 0)
self.assertTrue(len(segment_events) == 2)
properties = segment_events[0]["properties"]
self.assertEqual(properties["action"], 3)
self.assertEqual(segment_events[0]["event"], "playbookGenerationAction")
properties = segment_events[1]["properties"]
self.assertEqual(properties["action"], 3)
self.assertEqual(segment_events[1]["event"], "roleGenerationAction")

def test_feedback_chatbot(self):
payload = {
Expand Down
34 changes: 32 additions & 2 deletions ansible_ai_connect/ai/api/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@
AnalyticsPlaybookGenerationWizard,
AnalyticsProductFeedback,
AnalyticsRecommendationAction,
AnalyticsRoleGenerationWizard,
AnalyticsTelemetryEvents,
)
from ansible_ai_connect.ai.api.utils.segment import (
Expand Down Expand Up @@ -126,8 +127,9 @@
GenerationRoleResponseSerializer,
InlineSuggestionFeedback,
IssueFeedback,
PlaybookExplanationFeedback,
PlaybookExplanationAction,
PlaybookGenerationAction,
RoleGenerationAction,
SentimentFeedback,
SuggestionQualityFeedback,
)
Expand Down Expand Up @@ -336,12 +338,15 @@ def write_to_segment(
)
sentiment_feedback_data: SentimentFeedback = validated_data.get("sentimentFeedback")
issue_feedback_data: IssueFeedback = validated_data.get("issueFeedback")
playbook_explanation_feedback_data: PlaybookExplanationFeedback = validated_data.get(
playbook_explanation_feedback_data: PlaybookExplanationAction = validated_data.get(
"playbookExplanationFeedback"
)
playbook_generation_action_data: PlaybookGenerationAction = validated_data.get(
"playbookGenerationAction"
)
role_generation_action_data: RoleGenerationAction = validated_data.get(
"roleGenerationAction"
)
chatbot_feedback_data: ChatFeedback = validated_data.get("chatFeedback")

ansible_extension_version = validated_data.get("metadata", {}).get(
Expand Down Expand Up @@ -450,6 +455,31 @@ def write_to_segment(
user,
ansible_extension_version,
)
if role_generation_action_data:
action = int(role_generation_action_data.get("action"))
from_page = role_generation_action_data.get("fromPage", 0)
to_page = role_generation_action_data.get("toPage", 0)
wizard_id = str(role_generation_action_data.get("wizardId", ""))
event = {
"action": action,
"wizardId": wizard_id,
"fromPage": from_page,
"toPage": to_page,
"modelName": model_name,
}
send_segment_event(event, "roleGenerationAction", user)
if False and from_page > 1 and action in [1, 3]:
send_segment_analytics_event(
AnalyticsTelemetryEvents.ROLE_GENERATION_ACTION,
lambda: AnalyticsRoleGenerationWizard(
action=action,
model_name=model_name,
rh_user_org_id=org_id,
wizard_id=str(role_generation_action_data.get("wizardId", "")),
),
user,
ansible_extension_version,
)

if chatbot_feedback_data:
response_data = chatbot_feedback_data.get("response")
Expand Down

0 comments on commit 55c1d14

Please sign in to comment.