Skip to content

Commit b2e04ee

Browse files
authored
feedback: allow events coming from roleGen (#1502)
Accept the action and feeback events coming from the extension for the role generation.
1 parent ef52c47 commit b2e04ee

File tree

5 files changed

+109
-30
lines changed

5 files changed

+109
-30
lines changed

ansible_ai_connect/ai/api/serializers.py

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,7 @@ class IssueFeedback(serializers.Serializer):
262262
)
263263

264264

265+
# TODO: we don't use this class, we can remove it
265266
class PlaybookGenerationFeedback(serializers.Serializer):
266267
USER_ACTION_CHOICES = (("0", "ACCEPTED"), ("1", "REJECTED"), ("2", "IGNORED"))
267268

@@ -274,10 +275,21 @@ class PlaybookGenerationFeedback(serializers.Serializer):
274275
)
275276

276277

277-
class PlaybookGenerationAction(serializers.Serializer):
278-
ACTIONS = (("0", "OPEN"), ("1", "CLOSE_CANCEL"), ("2", "TRANSITION"), ("3", "CLOSE_ACCEPT"))
278+
class GenerationActionEnum(serializers.ChoiceField):
279+
def __init__(self):
280+
super().__init__(
281+
choices=(
282+
("0", "OPEN"),
283+
("1", "CLOSE_CANCEL"),
284+
("2", "TRANSITION"),
285+
("3", "CLOSE_ACCEPT"),
286+
),
287+
required=True,
288+
)
289+
279290

280-
action = serializers.ChoiceField(choices=ACTIONS, required=True)
291+
class PlaybookGenerationAction(serializers.Serializer):
292+
action = GenerationActionEnum()
281293
wizardId = serializers.UUIDField(
282294
format="hex_verbose",
283295
required=True,
@@ -297,9 +309,7 @@ class PlaybookGenerationAction(serializers.Serializer):
297309

298310

299311
class PlaybookExplanationFeedback(serializers.Serializer):
300-
USER_ACTION_CHOICES = (("0", "ACCEPTED"), ("1", "REJECTED"), ("2", "IGNORED"))
301-
302-
action = serializers.ChoiceField(choices=USER_ACTION_CHOICES, required=True)
312+
action = GenerationActionEnum()
303313
explanationId = serializers.UUIDField(
304314
format="hex_verbose",
305315
required=True,
@@ -308,6 +318,10 @@ class PlaybookExplanationFeedback(serializers.Serializer):
308318
)
309319

310320

321+
class RoleGenerationAction(PlaybookGenerationAction):
322+
pass
323+
324+
311325
class ChatRequestSerializer(serializers.Serializer):
312326
conversation_id = serializers.UUIDField(
313327
format="hex_verbose",
@@ -395,8 +409,10 @@ class FeedbackRequestSerializer(Metadata):
395409
metadata = Metadata(required=False)
396410
model = serializers.CharField(required=False)
397411
playbookExplanationFeedback = PlaybookExplanationFeedback(required=False)
412+
# NOTE: we can remove the following line, we don't use the event
398413
playbookGenerationFeedback = PlaybookGenerationFeedback(required=False)
399414
playbookGenerationAction = PlaybookGenerationAction(required=False)
415+
roleGenerationAction = RoleGenerationAction(required=False)
400416
sentimentFeedback = SentimentFeedback(required=False)
401417
suggestionQualityFeedback = SuggestionQualityFeedback(required=False)
402418
chatFeedback = ChatFeedback(required=False)

ansible_ai_connect/ai/api/telemetry/schema2.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ class AnalyticsTelemetryEvents(Enum):
2424
RECOMMENDATION_ACTION = "Recommendation Action"
2525
PRODUCT_FEEDBACK = "Product Feedback"
2626
PLAYBOOK_GENERATION_ACTION = "Playbook Generation Action"
27+
ROLE_GENERATION_ACTION = "Role Generation Action"
2728
ONECLICK_TRIAL_STARTED = "OneClickTrial Started"
2829

2930

@@ -61,6 +62,11 @@ class AnalyticsPlaybookGenerationWizard:
6162
)
6263

6364

65+
@frozen
66+
class AnalyticsRoleGenerationWizard(AnalyticsPlaybookGenerationWizard):
67+
pass
68+
69+
6470
@frozen
6571
class AnalyticsRecommendationAction:
6672
action: int = field(

ansible_ai_connect/ai/api/tests/test_feedback_view.py

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
import platform
1818
import uuid
1919
from http import HTTPStatus
20-
from unittest import skip
2120
from unittest.mock import Mock, patch
2221

2322
from django.apps import apps
@@ -382,26 +381,31 @@ def test_feedback_explanation(self):
382381
properties = segment_events[0]["properties"]
383382
self.assertEqual(properties["action"], "1")
384383

385-
@skip("Schema2 event is not enabled yet")
386384
def test_feedback_generation(self):
385+
action = {
386+
"action": 3,
387+
"generationId": "2832e159-e0fe-4efc-9288-d60c96c88666",
388+
"wizardId": "f3c5a9c4-9170-40b3-b46f-de387234410b",
389+
"fromPage": 2,
390+
"toPage": 3,
391+
}
387392
payload = {
388-
"playbookGenerationAction": {
389-
"action": 3,
390-
"generationId": "2832e159-e0fe-4efc-9288-d60c96c88666",
391-
"wizardId": "f3c5a9c4-9170-40b3-b46f-de387234410b",
392-
"fromPage": 2,
393-
"toPage": 3,
394-
},
393+
"playbookGenerationAction": action,
394+
"roleGenerationAction": action,
395395
}
396396
self.client.force_authenticate(user=self.user)
397397
with self.assertLogs(logger="root", level="DEBUG") as log:
398398
r = self.client.post(self.api_version_reverse("feedback"), payload, format="json")
399399
self.assertEqual(r.status_code, HTTPStatus.OK)
400400

401401
segment_events = self.extractSegmentEventsFromLog(log)
402-
self.assertTrue(len(segment_events) > 0)
402+
self.assertTrue(len(segment_events) == 2)
403403
properties = segment_events[0]["properties"]
404404
self.assertEqual(properties["action"], 3)
405+
self.assertEqual(segment_events[0]["event"], "playbookGenerationAction")
406+
properties = segment_events[1]["properties"]
407+
self.assertEqual(properties["action"], 3)
408+
self.assertEqual(segment_events[1]["event"], "roleGenerationAction")
405409

406410
def test_feedback_chatbot(self):
407411
payload = {

ansible_ai_connect/ai/api/views.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@
8686
AnalyticsPlaybookGenerationWizard,
8787
AnalyticsProductFeedback,
8888
AnalyticsRecommendationAction,
89+
AnalyticsRoleGenerationWizard,
8990
AnalyticsTelemetryEvents,
9091
)
9192
from ansible_ai_connect.ai.api.utils.segment import (
@@ -128,6 +129,7 @@
128129
IssueFeedback,
129130
PlaybookExplanationFeedback,
130131
PlaybookGenerationAction,
132+
RoleGenerationAction,
131133
SentimentFeedback,
132134
SuggestionQualityFeedback,
133135
)
@@ -342,6 +344,9 @@ def write_to_segment(
342344
playbook_generation_action_data: PlaybookGenerationAction = validated_data.get(
343345
"playbookGenerationAction"
344346
)
347+
role_generation_action_data: RoleGenerationAction = validated_data.get(
348+
"roleGenerationAction"
349+
)
345350
chatbot_feedback_data: ChatFeedback = validated_data.get("chatFeedback")
346351

347352
ansible_extension_version = validated_data.get("metadata", {}).get(
@@ -450,6 +455,31 @@ def write_to_segment(
450455
user,
451456
ansible_extension_version,
452457
)
458+
if role_generation_action_data:
459+
action = int(role_generation_action_data.get("action"))
460+
from_page = role_generation_action_data.get("fromPage", 0)
461+
to_page = role_generation_action_data.get("toPage", 0)
462+
wizard_id = str(role_generation_action_data.get("wizardId", ""))
463+
event = {
464+
"action": action,
465+
"wizardId": wizard_id,
466+
"fromPage": from_page,
467+
"toPage": to_page,
468+
"modelName": model_name,
469+
}
470+
send_segment_event(event, "roleGenerationAction", user)
471+
if False and from_page > 1 and action in [1, 3]:
472+
send_segment_analytics_event(
473+
AnalyticsTelemetryEvents.ROLE_GENERATION_ACTION,
474+
lambda: AnalyticsRoleGenerationWizard(
475+
action=action,
476+
model_name=model_name,
477+
rh_user_org_id=org_id,
478+
wizard_id=str(role_generation_action_data.get("wizardId", "")),
479+
),
480+
user,
481+
ansible_extension_version,
482+
)
453483

454484
if chatbot_feedback_data:
455485
response_data = chatbot_feedback_data.get("response")

tools/openapi-schema/ansible-ai-connect-service.yaml

Lines changed: 37 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -682,6 +682,18 @@ components:
682682
* `0` - ACCEPTED
683683
* `1` - REJECTED
684684
* `2` - IGNORED
685+
Action693Enum:
686+
enum:
687+
- '0'
688+
- '1'
689+
- '2'
690+
- '3'
691+
type: string
692+
description: |-
693+
* `0` - OPEN
694+
* `1` - CLOSE_CANCEL
695+
* `2` - TRANSITION
696+
* `3` - CLOSE_ACCEPT
685697
ChatFeedback:
686698
type: object
687699
properties:
@@ -939,6 +951,8 @@ components:
939951
$ref: '#/components/schemas/PlaybookGenerationFeedback'
940952
playbookGenerationAction:
941953
$ref: '#/components/schemas/PlaybookGenerationAction'
954+
roleGenerationAction:
955+
$ref: '#/components/schemas/RoleGenerationAction'
942956
sentimentFeedback:
943957
$ref: '#/components/schemas/SentimentFeedback'
944958
suggestionQualityFeedback:
@@ -1205,7 +1219,7 @@ components:
12051219
type: object
12061220
properties:
12071221
action:
1208-
$ref: '#/components/schemas/Action4c6Enum'
1222+
$ref: '#/components/schemas/Action693Enum'
12091223
explanationId:
12101224
type: string
12111225
format: uuid
@@ -1218,7 +1232,7 @@ components:
12181232
type: object
12191233
properties:
12201234
action:
1221-
$ref: '#/components/schemas/PlaybookGenerationActionActionEnum'
1235+
$ref: '#/components/schemas/Action693Enum'
12221236
wizardId:
12231237
type: string
12241238
format: uuid
@@ -1235,18 +1249,6 @@ components:
12351249
required:
12361250
- action
12371251
- wizardId
1238-
PlaybookGenerationActionActionEnum:
1239-
enum:
1240-
- '0'
1241-
- '1'
1242-
- '2'
1243-
- '3'
1244-
type: string
1245-
description: |-
1246-
* `0` - OPEN
1247-
* `1` - CLOSE_CANCEL
1248-
* `2` - TRANSITION
1249-
* `3` - CLOSE_ACCEPT
12501252
PlaybookGenerationFeedback:
12511253
type: object
12521254
properties:
@@ -1270,6 +1272,27 @@ components:
12701272
required:
12711273
- docs_url
12721274
- title
1275+
RoleGenerationAction:
1276+
type: object
1277+
properties:
1278+
action:
1279+
$ref: '#/components/schemas/Action693Enum'
1280+
wizardId:
1281+
type: string
1282+
format: uuid
1283+
title: wizard ID
1284+
description: A UUID that identifies the UI session.
1285+
fromPage:
1286+
type: integer
1287+
title: page of origin
1288+
description: A number that indicate the page of origin
1289+
toPage:
1290+
type: integer
1291+
title: destination page
1292+
description: A number that indicate the destination page
1293+
required:
1294+
- action
1295+
- wizardId
12731296
SentimentEnum:
12741297
enum:
12751298
- '0'

0 commit comments

Comments
 (0)