From c02e49bb4dd056aefb43cefceeb76e3b008d17a2 Mon Sep 17 00:00:00 2001 From: Auto Pipeline Date: Wed, 18 Mar 2026 09:56:56 +0000 Subject: [PATCH 1/2] feat(gooddata-sdk): [AUTO] add conversation response feedback endpoints Add get_conversation_responses and set_conversation_response_feedback methods to ComputeService to expose the new GET and PATCH conversation response endpoints from the gen-ai OpenAPI spec (GDAI-1448 / PR #21392). Co-Authored-By: Claude Sonnet 4.6 --- .../src/gooddata_sdk/compute/service.py | 49 +++++++++++++++ .../tests/compute/test_compute_service.py | 59 +++++++++++++++++++ 2 files changed, 108 insertions(+) diff --git a/packages/gooddata-sdk/src/gooddata_sdk/compute/service.py b/packages/gooddata-sdk/src/gooddata_sdk/compute/service.py index 6163798b9..5bce0834e 100644 --- a/packages/gooddata-sdk/src/gooddata_sdk/compute/service.py +++ b/packages/gooddata-sdk/src/gooddata_sdk/compute/service.py @@ -12,6 +12,9 @@ from gooddata_api_client.model.chat_history_result import ChatHistoryResult from gooddata_api_client.model.chat_request import ChatRequest from gooddata_api_client.model.chat_result import ChatResult +from gooddata_api_client.model.conversation_response_list_dto import ConversationResponseListDto +from gooddata_api_client.model.response_feedback_dto import ResponseFeedbackDto +from gooddata_api_client.model.response_feedback_request import ResponseFeedbackRequest from gooddata_api_client.model.saved_visualization import SavedVisualization from gooddata_api_client.model.search_request import SearchRequest from gooddata_api_client.model.search_result import SearchResult @@ -315,6 +318,52 @@ def search_ai( response = self._actions_api.ai_search(workspace_id, search_request, _check_return_type=False) return response + def get_conversation_responses( + self, + workspace_id: str, + conversation_id: str, + ) -> ConversationResponseListDto: + """ + Get responses for a specific conversation. + + Args: + workspace_id (str): workspace identifier + conversation_id (str): conversation identifier + Returns: + ConversationResponseListDto: List of conversation responses with optional feedback + """ + response = self._actions_api.get_conversation_responses( + workspace_id, conversation_id, _check_return_type=False + ) + return response + + def set_conversation_response_feedback( + self, + workspace_id: str, + conversation_id: str, + response_id: str, + feedback_type: str, + feedback_text: str | None = None, + ) -> None: + """ + Submit feedback for a specific conversation response. + + Args: + workspace_id (str): workspace identifier + conversation_id (str): conversation identifier + response_id (str): response identifier to provide feedback for + feedback_type (str): feedback type ("POSITIVE" or "NEGATIVE") + feedback_text (str | None): optional feedback text. Defaults to None. + """ + kwargs: dict[str, Any] = {} + if feedback_text is not None: + kwargs["text"] = feedback_text + feedback_dto = ResponseFeedbackDto(type=feedback_type, _check_type=False, **kwargs) + feedback_request = ResponseFeedbackRequest(feedback=feedback_dto, _check_type=False) + self._actions_api.patch_conversation_response( + workspace_id, conversation_id, response_id, feedback_request, _check_return_type=False + ) + def cancel_executions(self, executions: dict[str, dict[str, str]]) -> None: """ Try to cancel given executions using the cancel api endpoint. diff --git a/packages/gooddata-sdk/tests/compute/test_compute_service.py b/packages/gooddata-sdk/tests/compute/test_compute_service.py index f91dfa29a..499580133 100644 --- a/packages/gooddata-sdk/tests/compute/test_compute_service.py +++ b/packages/gooddata-sdk/tests/compute/test_compute_service.py @@ -219,6 +219,65 @@ def test_ai_chat_stream(test_config): sdk.compute.reset_ai_chat_history(test_workspace_id) +@gd_vcr.use_cassette(str(_fixtures_dir / "get_conversation_responses.yaml")) +def test_get_conversation_responses(test_config): + """Test get conversation responses.""" + sdk = GoodDataSdk.create(host_=test_config["host"], token_=test_config["token"]) + path = _current_dir / "load" / "ai" + test_workspace_id = test_config["workspace_test"] + + try: + _setup_test_workspace(sdk, test_workspace_id, path) + conversation_id = "test-conversation-id" + response = sdk.compute.get_conversation_responses(test_workspace_id, conversation_id) + assert response is not None + assert hasattr(response, "responses") + finally: + sdk.catalog_workspace.delete_workspace(test_workspace_id) + + +@gd_vcr.use_cassette(str(_fixtures_dir / "set_conversation_response_feedback.yaml")) +def test_set_conversation_response_feedback(test_config): + """Test set conversation response feedback.""" + sdk = GoodDataSdk.create(host_=test_config["host"], token_=test_config["token"]) + path = _current_dir / "load" / "ai" + test_workspace_id = test_config["workspace_test"] + + try: + _setup_test_workspace(sdk, test_workspace_id, path) + conversation_id = "test-conversation-id" + response_id = "test-response-id" + result = sdk.compute.set_conversation_response_feedback( + test_workspace_id, conversation_id, response_id, "POSITIVE" + ) + assert result is None + finally: + sdk.catalog_workspace.delete_workspace(test_workspace_id) + + +@gd_vcr.use_cassette(str(_fixtures_dir / "set_conversation_response_feedback_with_text.yaml")) +def test_set_conversation_response_feedback_with_text(test_config): + """Test set conversation response feedback with text.""" + sdk = GoodDataSdk.create(host_=test_config["host"], token_=test_config["token"]) + path = _current_dir / "load" / "ai" + test_workspace_id = test_config["workspace_test"] + + try: + _setup_test_workspace(sdk, test_workspace_id, path) + conversation_id = "test-conversation-id" + response_id = "test-response-id" + result = sdk.compute.set_conversation_response_feedback( + test_workspace_id, + conversation_id, + response_id, + "NEGATIVE", + feedback_text="The response was not helpful.", + ) + assert result is None + finally: + sdk.catalog_workspace.delete_workspace(test_workspace_id) + + @gd_vcr.use_cassette(str(_fixtures_dir / "build_exec_def_from_chat_result.yaml")) def test_build_exec_def_from_chat_result(test_config): """Test build execution definition from chat result.""" From 6b6ddf98e983135f91f527494c8b285202dc51f4 Mon Sep 17 00:00:00 2001 From: Auto Pipeline Date: Wed, 18 Mar 2026 09:57:27 +0000 Subject: [PATCH 2/2] chore: [AUTO] apply ruff formatting --- packages/gooddata-sdk/src/gooddata_sdk/compute/service.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/gooddata-sdk/src/gooddata_sdk/compute/service.py b/packages/gooddata-sdk/src/gooddata_sdk/compute/service.py index 5bce0834e..6d6c00d1b 100644 --- a/packages/gooddata-sdk/src/gooddata_sdk/compute/service.py +++ b/packages/gooddata-sdk/src/gooddata_sdk/compute/service.py @@ -332,9 +332,7 @@ def get_conversation_responses( Returns: ConversationResponseListDto: List of conversation responses with optional feedback """ - response = self._actions_api.get_conversation_responses( - workspace_id, conversation_id, _check_return_type=False - ) + response = self._actions_api.get_conversation_responses(workspace_id, conversation_id, _check_return_type=False) return response def set_conversation_response_feedback(