From c88982c67e7e50eaa7c641ec22be352bbe3fd15b Mon Sep 17 00:00:00 2001
From: Vivian Tsai <80003560+vivtsai@users.noreply.github.com>
Date: Fri, 4 Oct 2024 07:41:09 -0700
Subject: [PATCH 1/4] Update mediator prompt configuration note in chat editor
---
frontend/src/components/stages/chat_editor.scss | 1 +
frontend/src/components/stages/chat_editor.ts | 10 ++++++++--
2 files changed, 9 insertions(+), 2 deletions(-)
diff --git a/frontend/src/components/stages/chat_editor.scss b/frontend/src/components/stages/chat_editor.scss
index e3b81a5d..283e133a 100644
--- a/frontend/src/components/stages/chat_editor.scss
+++ b/frontend/src/components/stages/chat_editor.scss
@@ -25,6 +25,7 @@
}
.description {
+ @include typescale.label-small;
color: var(--md-sys-color-outline);
font-style: italic;
}
diff --git a/frontend/src/components/stages/chat_editor.ts b/frontend/src/components/stages/chat_editor.ts
index 828a8c5b..ce39c95d 100644
--- a/frontend/src/components/stages/chat_editor.ts
+++ b/frontend/src/components/stages/chat_editor.ts
@@ -155,6 +155,13 @@ export class ChatEditor extends MobxLitElement {
chat history (last 10 messages) and sent to the model
(i.e., chat history + custom prompt => response)
+
+ If JSON parsing enabled: Make sure to
+ include appropriate instructions/examples in your prompt to
+ avoid parsing errors (if the specified message field is non-empty,
+ its contents will be turned into a chat message).
+ If disabled: non-empty responses will be turned into messages.
+
- Parse mediator response as JSON (tip: include appropriate
- instructions/examples in prompt so that valid JSON is returned)
+ Parse mediator response as JSON
${!config.isJSON ? nothing : html`
From 8bed5de5623a1df3dd23cbb70d7073489568cdba Mon Sep 17 00:00:00 2001
From: Vivian Tsai <80003560+vivtsai@users.noreply.github.com>
Date: Fri, 4 Oct 2024 08:47:39 -0700
Subject: [PATCH 2/4] Fix bug with mediator LLM call response parsing
---
functions/src/stages/chat.triggers.ts | 19 ++++++++++++++++---
1 file changed, 16 insertions(+), 3 deletions(-)
diff --git a/functions/src/stages/chat.triggers.ts b/functions/src/stages/chat.triggers.ts
index 2be02012..c7796865 100644
--- a/functions/src/stages/chat.triggers.ts
+++ b/functions/src/stages/chat.triggers.ts
@@ -66,9 +66,22 @@ export const createMediatorMessage = onDocumentCreated(
const response = await getGeminiAPIResponse(apiKeys.geminiKey, prompt);
// Add mediator message if non-empty
- const parsed = JSON.parse(response.text);
- const isJSON = mediator.responseConfig.isJSON;
- const message = isJSON ? (parsed[mediator.responseConfig.messageField] ?? '') : response.text;
+ let message = response.text;
+ let parsed = '';
+
+ if (mediator.responseConfig.isJSON) {
+ // Reset message to empty before trying to fill with JSON response
+ message = '';
+
+ try {
+ // TODO: Hack to get rid of markdown ticks surrounding {} ?
+ parsed = JSON.parse(response.text);
+ } catch {
+ // Response is already logged in console during Gemini API call
+ console.log('Could not parse JSON!');
+ }
+ message = parsed[mediator.responseConfig.messageField] ?? '';
+ }
if (message.trim() === '') break;
mediatorMessages.push({ mediator, parsed, message });
From a0f42e58749c2ae2af8fb80f2eba8acad338c967 Mon Sep 17 00:00:00 2001
From: Vivian Tsai <80003560+vivtsai@users.noreply.github.com>
Date: Fri, 4 Oct 2024 08:48:53 -0700
Subject: [PATCH 3/4] Allow experimenters to toggle mediator isJSON in
experimenter panel
---
.../experimenter/experimenter_panel.scss | 14 +++++++++++-
.../experimenter/experimenter_panel.ts | 22 +++++++++++++++++++
2 files changed, 35 insertions(+), 1 deletion(-)
diff --git a/frontend/src/components/experimenter/experimenter_panel.scss b/frontend/src/components/experimenter/experimenter_panel.scss
index 403212d9..ab23a080 100644
--- a/frontend/src/components/experimenter/experimenter_panel.scss
+++ b/frontend/src/components/experimenter/experimenter_panel.scss
@@ -92,5 +92,17 @@
.action-bar {
@include common.flex-row;
- justify-content: end;
+ @include typescale.label-small;
+ gap: common.$spacing-small;
+ justify-content: space-between;
+}
+
+.checkbox-wrapper {
+ @include common.flex-row-align-center;
+ gap: common.$spacing-small;
+ overflow-wrap: break-word;
+
+ md-checkbox {
+ flex-shrink: 0;
+ }
}
\ No newline at end of file
diff --git a/frontend/src/components/experimenter/experimenter_panel.ts b/frontend/src/components/experimenter/experimenter_panel.ts
index 067c0213..4326e4d6 100644
--- a/frontend/src/components/experimenter/experimenter_panel.ts
+++ b/frontend/src/components/experimenter/experimenter_panel.ts
@@ -5,6 +5,8 @@ import '../../pair-components/tooltip';
import "./experimenter_data_editor";
import './experimenter_manual_chat';
+import '@material/web/checkbox/checkbox.js';
+
import {MobxLitElement} from '@adobe/lit-mobx';
import {CSSResultGroup, html, nothing} from 'lit';
import {customElement, state} from 'lit/decorators.js';
@@ -182,6 +184,15 @@ export class Panel extends MobxLitElement {
stageId, {...mediator, prompt}, index
);
};
+ const updateJSON = () => {
+ const responseConfig = {
+ ...mediator.responseConfig,
+ isJSON: !mediator.responseConfig.isJSON,
+ };
+ this.mediatorEditor.updateMediator(
+ stageId, {...mediator, responseConfig}, index
+ );
+ };
return html`