From 32e0affaf40bf830b864009f78eb111c1372b5dd Mon Sep 17 00:00:00 2001 From: Steph Herbers Date: Mon, 9 Sep 2024 14:05:31 -0400 Subject: [PATCH 01/17] add details button view to versions table with button to set the version to default version --- apps/experiments/tables.py | 3 +++ apps/experiments/urls.py | 1 + apps/experiments/views/__init__.py | 1 + apps/experiments/views/experiment.py | 12 ++++++++++++ .../experiment_version_details_button.html | 19 +++++++++++++++++++ 5 files changed, 36 insertions(+) create mode 100644 templates/experiments/components/experiment_version_details_button.html diff --git a/apps/experiments/tables.py b/apps/experiments/tables.py index 9761ad61b..25d203397 100644 --- a/apps/experiments/tables.py +++ b/apps/experiments/tables.py @@ -167,6 +167,9 @@ class ExperimentVersionsTable(tables.Table): {% endif %}""", verbose_name="Default Version", ) + details = columns.TemplateColumn( + template_name="experiments/components/experiment_version_details_button.html", + ) class Meta: model = Experiment diff --git a/apps/experiments/urls.py b/apps/experiments/urls.py index 0cb7309f9..5713821e4 100644 --- a/apps/experiments/urls.py +++ b/apps/experiments/urls.py @@ -44,6 +44,7 @@ path("e//", views.single_experiment_home, name="single_experiment_home"), path("e//sessions-table/", views.ExperimentSessionsTableView.as_view(), name="sessions-list"), path("e//versions/", views.ExperimentVersionsTableView.as_view(), name="versions-list"), + path("e//versions/set_default", views.set_default_experiment, name="set-default-experiment"), path("e//versions/create", views.CreateExperimentVersion.as_view(), name="create_version"), path("e//edit/", views.EditExperiment.as_view(), name="edit"), path("e//delete/", views.delete_experiment, name="delete"), diff --git a/apps/experiments/views/__init__.py b/apps/experiments/views/__init__.py index b0f8c28c5..80de58837 100644 --- a/apps/experiments/views/__init__.py +++ b/apps/experiments/views/__init__.py @@ -34,6 +34,7 @@ get_message_response, poll_messages, send_invitation, + set_default_experiment, single_experiment_home, start_authed_web_session, start_session_from_invite, diff --git a/apps/experiments/views/experiment.py b/apps/experiments/views/experiment.py index 56c3fc301..bbe6e5bbc 100644 --- a/apps/experiments/views/experiment.py +++ b/apps/experiments/views/experiment.py @@ -1158,3 +1158,15 @@ def download_file(request, team_slug: str, session_id: int, pk: int): return FileResponse(file, as_attachment=True, filename=resource.file.name) except FileNotFoundError: raise Http404() + + +@require_POST +@transaction.atomic +@login_and_team_required +def set_default_experiment(request, team_slug: str, pk: int): + experiment = get_object_or_404(Experiment, id=pk) + Experiment.objects.exclude(pk=experiment.pk).update(is_default_version=False) + experiment.is_default_version = True + experiment.save() + + return redirect("experiments:versions-list", team_slug=request.team.slug) diff --git a/templates/experiments/components/experiment_version_details_button.html b/templates/experiments/components/experiment_version_details_button.html new file mode 100644 index 000000000..5243b0bbe --- /dev/null +++ b/templates/experiments/components/experiment_version_details_button.html @@ -0,0 +1,19 @@ + + + + + From e2f410b4921a71b3769aaa3ba2fc8cf80d6c841e Mon Sep 17 00:00:00 2001 From: Steph Herbers Date: Mon, 9 Sep 2024 14:28:31 -0400 Subject: [PATCH 02/17] add content to version detial body and move defualt button to footer --- .../experiment_version_details_button.html | 60 ++++++++++++++++--- 1 file changed, 53 insertions(+), 7 deletions(-) diff --git a/templates/experiments/components/experiment_version_details_button.html b/templates/experiments/components/experiment_version_details_button.html index 5243b0bbe..d3159b337 100644 --- a/templates/experiments/components/experiment_version_details_button.html +++ b/templates/experiments/components/experiment_version_details_button.html @@ -5,14 +5,60 @@ From 223dfe28dc6678847edb345033fc93c68219e099 Mon Sep 17 00:00:00 2001 From: Steph Herbers Date: Mon, 9 Sep 2024 14:36:31 -0400 Subject: [PATCH 03/17] formatting of modal details --- .../experiment_version_details_button.html | 83 ++++++++----------- 1 file changed, 35 insertions(+), 48 deletions(-) diff --git a/templates/experiments/components/experiment_version_details_button.html b/templates/experiments/components/experiment_version_details_button.html index d3159b337..05a57ff4d 100644 --- a/templates/experiments/components/experiment_version_details_button.html +++ b/templates/experiments/components/experiment_version_details_button.html @@ -5,54 +5,41 @@ From 4dff3621c9a95490e200b620cea2f87b59bed9ad Mon Sep 17 00:00:00 2001 From: Chris Smit Date: Thu, 19 Sep 2024 10:42:31 +0200 Subject: [PATCH 14/17] Add a method on experiment that return version details to the template --- apps/experiments/models.py | 36 ++++++++++++++ .../experiment_version_details_content.html | 47 +++++-------------- 2 files changed, 48 insertions(+), 35 deletions(-) diff --git a/apps/experiments/models.py b/apps/experiments/models.py index 75bf4c29d..70685b91b 100644 --- a/apps/experiments/models.py +++ b/apps/experiments/models.py @@ -691,6 +691,42 @@ def is_public(self) -> bool: def is_participant_allowed(self, identifier: str): return identifier in self.participant_allowlist or self.team.members.filter(email=identifier).exists() + def version_details_for_display(self) -> list[dict]: + """ + Returns a list of dictionaries, each representing a specific detail of this the current experiment. + Each dictionary should have a `name` and `value` key. + """ + + def name_or_none(attr_name): + return getattr(self, attr_name) or "" + + def yes_no(condition): + return "Yes" if condition else "No" + + return [ + {"name": "Description", "value": self.description}, + {"name": "Version", "value": self.version_number}, + {"name": "Version Description", "value": self.version_description}, + {"name": "LLM Model", "value": self.llm}, + {"name": "LLM Provider", "value": self.llm_provider.name}, + {"name": "Assistant", "value": name_or_none("assistant")}, + {"name": "Pipeline", "value": name_or_none("pipeline")}, + {"name": "Temperature", "value": self.temperature}, + {"name": "Source Material", "value": name_or_none("source_material")}, + {"name": "Pre-Survey", "value": name_or_none("pre_survey")}, + {"name": "Post-Survey", "value": name_or_none("post_survey")}, + { + "name": "Safety Violation Notification Emails", + "value": ", ".join(self.safety_violation_notification_emails), + }, + {"name": "Max Token Limit", "value": self.max_token_limit}, + {"name": "Voice Response Behaviour", "value": self.get_voice_response_behaviour_display}, + {"name": "Trace Provider", "value": name_or_none("trace_provider")}, + {"name": "Consent Form", "value": name_or_none("consent_form")}, + {"name": "Conversational Consent Enabled", "value": yes_no(self.conversational_consent_enabled)}, + {"name": "Echo Transcript", "value": yes_no(self.echo_transcript)}, + ] + class ExperimentRouteType(models.TextChoices): PROCESSOR = "processor" diff --git a/templates/experiments/components/experiment_version_details_content.html b/templates/experiments/components/experiment_version_details_content.html index 6961affd8..9ae4a145c 100644 --- a/templates/experiments/components/experiment_version_details_content.html +++ b/templates/experiments/components/experiment_version_details_content.html @@ -1,49 +1,26 @@ + From a585408e1d250ad84136c5dc35e88629a76c6166 Mon Sep 17 00:00:00 2001 From: Chris Smit Date: Thu, 19 Sep 2024 12:55:18 +0200 Subject: [PATCH 15/17] Use a TypedDict for experiment details --- apps/experiments/models.py | 52 +++++++++++-------- .../experiment_version_details_content.html | 2 +- 2 files changed, 31 insertions(+), 23 deletions(-) diff --git a/apps/experiments/models.py b/apps/experiments/models.py index 70685b91b..247fefff0 100644 --- a/apps/experiments/models.py +++ b/apps/experiments/models.py @@ -2,6 +2,7 @@ import uuid from datetime import datetime from functools import cached_property +from typing import TypedDict from uuid import uuid4 import markdown @@ -29,6 +30,13 @@ log = logging.getLogger(__name__) +class ExperimentDetail(TypedDict): + """Represents a specific detail about an experiment. The label is the user friendly name""" + + label: str + value: str | int + + class PromptObjectManager(AuditingManager): pass @@ -691,7 +699,7 @@ def is_public(self) -> bool: def is_participant_allowed(self, identifier: str): return identifier in self.participant_allowlist or self.team.members.filter(email=identifier).exists() - def version_details_for_display(self) -> list[dict]: + def version_details_for_display(self) -> list[ExperimentDetail]: """ Returns a list of dictionaries, each representing a specific detail of this the current experiment. Each dictionary should have a `name` and `value` key. @@ -704,27 +712,27 @@ def yes_no(condition): return "Yes" if condition else "No" return [ - {"name": "Description", "value": self.description}, - {"name": "Version", "value": self.version_number}, - {"name": "Version Description", "value": self.version_description}, - {"name": "LLM Model", "value": self.llm}, - {"name": "LLM Provider", "value": self.llm_provider.name}, - {"name": "Assistant", "value": name_or_none("assistant")}, - {"name": "Pipeline", "value": name_or_none("pipeline")}, - {"name": "Temperature", "value": self.temperature}, - {"name": "Source Material", "value": name_or_none("source_material")}, - {"name": "Pre-Survey", "value": name_or_none("pre_survey")}, - {"name": "Post-Survey", "value": name_or_none("post_survey")}, - { - "name": "Safety Violation Notification Emails", - "value": ", ".join(self.safety_violation_notification_emails), - }, - {"name": "Max Token Limit", "value": self.max_token_limit}, - {"name": "Voice Response Behaviour", "value": self.get_voice_response_behaviour_display}, - {"name": "Trace Provider", "value": name_or_none("trace_provider")}, - {"name": "Consent Form", "value": name_or_none("consent_form")}, - {"name": "Conversational Consent Enabled", "value": yes_no(self.conversational_consent_enabled)}, - {"name": "Echo Transcript", "value": yes_no(self.echo_transcript)}, + ExperimentDetail(label="Description", value=self.description), + ExperimentDetail(label="Version", value=self.version_number), + ExperimentDetail(label="Version Description", value=self.version_description), + ExperimentDetail(label="LLM Model", value=self.llm), + ExperimentDetail(label="LLM Provider", value=self.llm_provider.name), + ExperimentDetail(label="Assistant", value=name_or_none("assistant")), + ExperimentDetail(label="Pipeline", value=name_or_none("pipeline")), + ExperimentDetail(label="Temperature", value=self.temperature), + ExperimentDetail(label="Source Material", value=name_or_none("source_material")), + ExperimentDetail(label="Pre-Survey", value=name_or_none("pre_survey")), + ExperimentDetail(label="Post-Survey", value=name_or_none("post_survey")), + ExperimentDetail( + label="Safety Violation Notification Emails", + value=", ".join(self.safety_violation_notification_emails), + ), + ExperimentDetail(label="Max Token Limit", value=self.max_token_limit), + ExperimentDetail(label="Voice Response Behaviour", value=self.get_voice_response_behaviour_display), + ExperimentDetail(label="Trace Provider", value=name_or_none("trace_provider")), + ExperimentDetail(label="Consent Form", value=name_or_none("consent_form")), + ExperimentDetail(label="Conversational Consent Enabled", value=yes_no(self.conversational_consent_enabled)), + ExperimentDetail(label="Echo Transcript", value=yes_no(self.echo_transcript)), ] diff --git a/templates/experiments/components/experiment_version_details_content.html b/templates/experiments/components/experiment_version_details_content.html index 9ae4a145c..8ee1e8287 100644 --- a/templates/experiments/components/experiment_version_details_content.html +++ b/templates/experiments/components/experiment_version_details_content.html @@ -8,7 +8,7 @@

Details for {{ experiment }}

{% for field in experiment.version_details_for_display %}
-
{{ field.name }}
+
{{ field.label }}
{{ field.value }}
{% endfor %} From 81e3ca797dd6a11f64f1979ee6385d74a32e7b84 Mon Sep 17 00:00:00 2001 From: Chris Smit Date: Thu, 19 Sep 2024 12:55:58 +0200 Subject: [PATCH 16/17] Remove .zed dir --- .gitignore | 3 --- .zed/settings.json | 14 -------------- 2 files changed, 17 deletions(-) delete mode 100644 .zed/settings.json diff --git a/.gitignore b/.gitignore index 3afbdf34d..ad8460782 100644 --- a/.gitignore +++ b/.gitignore @@ -27,6 +27,3 @@ static/css/ static/js/ .git-backup tmp_schema.yml - -# Editor config files -.zed/ \ No newline at end of file diff --git a/.zed/settings.json b/.zed/settings.json deleted file mode 100644 index b5a4b0f40..000000000 --- a/.zed/settings.json +++ /dev/null @@ -1,14 +0,0 @@ -// Folder-specific settings -// -// For a full list of overridable settings, and general information on folder-specific settings, -// see the documentation: https://zed.dev/docs/configuring-zed#folder-specific-settings -{ - "autosave": "on_focus_change", - "git_diff": true, - "hard_tabs": true, - "tabs": { - "close_position": "right", - "git_status": true - }, - "format_on_save": "off" -} From 11abeb5d3c12d9c1b925e5eb4c0943ce31da1d2c Mon Sep 17 00:00:00 2001 From: Chris Smit Date: Thu, 19 Sep 2024 13:15:32 +0200 Subject: [PATCH 17/17] Use the single existing modal when populating the version details --- .../experiment_version_details_button.html | 16 ++-------------- .../experiments/experiment_version_table.html | 19 +++++++++++-------- templates/table/single_table.html | 2 ++ 3 files changed, 15 insertions(+), 22 deletions(-) diff --git a/templates/experiments/components/experiment_version_details_button.html b/templates/experiments/components/experiment_version_details_button.html index 76e5c25ee..e4e2c93eb 100644 --- a/templates/experiments/components/experiment_version_details_button.html +++ b/templates/experiments/components/experiment_version_details_button.html @@ -1,19 +1,7 @@ - - - - - diff --git a/templates/experiments/experiment_version_table.html b/templates/experiments/experiment_version_table.html index a0b28c71c..146df1bdd 100644 --- a/templates/experiments/experiment_version_table.html +++ b/templates/experiments/experiment_version_table.html @@ -1,12 +1,15 @@ {% extends "table/single_table.html" %} -{% block content %} -
{% endblock %} diff --git a/templates/table/single_table.html b/templates/table/single_table.html index b1c8ced98..18b9fa1e5 100644 --- a/templates/table/single_table.html +++ b/templates/table/single_table.html @@ -1,6 +1,8 @@ {% load static %} {% load render_table from django_tables2 %} {% render_table table "table/tailwind_js_pagination.html" %} +{% block modal %} +{% endblock %}