diff --git a/src/components/OutputsTable/NewScenarioButton.tsx b/src/components/OutputsTable/NewScenarioButton.tsx
index 68801cb..43827ed 100644
--- a/src/components/OutputsTable/NewScenarioButton.tsx
+++ b/src/components/OutputsTable/NewScenarioButton.tsx
@@ -18,7 +18,6 @@ export default function NewScenarioButton() {
return (
+ )}
+
+ {editing && (
+
+
+ You can use variables in your prompt text inside {`{{curly_braces}}`}.
+
+
+ setNewVariable(e.target.value)}
+ />
+
+
+
+
+ {variables.map((label, i) => (
+
+
+ {label}
+
+
+
+ ))}
+
+
+ )}
+
+ );
+}
diff --git a/src/server/api/routers/experiments.router.ts b/src/server/api/routers/experiments.router.ts
index c7e56aa..f618282 100644
--- a/src/server/api/routers/experiments.router.ts
+++ b/src/server/api/routers/experiments.router.ts
@@ -21,4 +21,32 @@ export const experimentsRouter = createTRPCRouter({
},
});
}),
+
+ setTemplateVariables: publicProcedure
+ .input(
+ z.object({
+ id: z.string(),
+ labels: z.array(z.string()),
+ })
+ )
+ .mutation(async ({ input }) => {
+ const existing = await prisma.templateVariable.findMany({
+ where: { experimentId: input.id },
+ });
+ const toDelete = existing.filter((e) => !input.labels.includes(e.label));
+
+ const toCreate = new Set(
+ input.labels.filter((l) => !existing.map((e) => e.label).includes(l))
+ ).values();
+
+ await prisma.$transaction([
+ prisma.templateVariable.deleteMany({
+ where: { id: { in: toDelete.map((e) => e.id) } },
+ }),
+ prisma.templateVariable.createMany({
+ data: [...toCreate].map((l) => ({ label: l, experimentId: input.id })),
+ }),
+ ]);
+ return null;
+ }),
});
diff --git a/src/utils/theme.ts b/src/utils/theme.ts
index 41671d0..083d3b3 100644
--- a/src/utils/theme.ts
+++ b/src/utils/theme.ts
@@ -8,6 +8,23 @@ const theme = extendTheme({
heading: systemFont,
body: systemFont,
},
+
+ components: {
+ Button: {
+ baseStyle: {
+ borderRadius: "sm",
+ },
+ },
+ Input: {
+ sizes: {
+ md: {
+ field: {
+ borderRadius: "sm",
+ },
+ },
+ },
+ },
+ },
});
export default theme;