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`
@@ -199,6 +210,17 @@ export class Panel extends MobxLitElement { >
+
+ + +
+ Parse as JSON +
+
Date: Fri, 4 Oct 2024 08:49:30 -0700 Subject: [PATCH 4/4] Add TODO to clean up mediator editor map --- frontend/src/services/mediator.editor.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/src/services/mediator.editor.ts b/frontend/src/services/mediator.editor.ts index 60a40496..9555d90a 100644 --- a/frontend/src/services/mediator.editor.ts +++ b/frontend/src/services/mediator.editor.ts @@ -29,6 +29,7 @@ export class MediatorEditor extends Service { // Experiment ID @observable experimentId: string|null = null; // Stage ID to chat config + // TODO: Map from stage ID to MediatorConfig list? @observable configMap: Record = {}; setExperimentId(id: string) {