Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 47 additions & 0 deletions packages/gooddata-sdk/src/gooddata_sdk/compute/service.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -315,6 +318,50 @@ 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.
Expand Down
59 changes: 59 additions & 0 deletions packages/gooddata-sdk/tests/compute/test_compute_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -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."""
Expand Down
Loading