Browse Source

feat: action selector

Timothy J. Baek 9 months ago
parent
commit
b4cd084117

+ 60 - 0
src/lib/components/workspace/Models/ActionsSelector.svelte

@@ -0,0 +1,60 @@
+<script lang="ts">
+	import { getContext, onMount } from 'svelte';
+	import Checkbox from '$lib/components/common/Checkbox.svelte';
+	import Tooltip from '$lib/components/common/Tooltip.svelte';
+
+	const i18n = getContext('i18n');
+
+	export let actions = [];
+	export let selectedActionIds = [];
+
+	let _actions = {};
+
+	onMount(() => {
+		_actions = actions.reduce((acc, action) => {
+			acc[action.id] = {
+				...action,
+				selected: selectedActionIds.includes(action.id)
+			};
+
+			return acc;
+		}, {});
+	});
+</script>
+
+<div>
+	<div class="flex w-full justify-between mb-1">
+		<div class=" self-center text-sm font-semibold">{$i18n.t('Actions')}</div>
+	</div>
+
+	<div class=" text-xs dark:text-gray-500">
+		{$i18n.t('To select actions here, add them to the "Functions" workspace first.')}
+	</div>
+
+	<!-- TODO: Filer order matters -->
+	<div class="flex flex-col">
+		{#if actions.length > 0}
+			<div class=" flex items-center mt-2 flex-wrap">
+				{#each Object.keys(_actions) as action, actionIdx}
+					<div class=" flex items-center gap-2 mr-3">
+						<div class="self-center flex items-center">
+							<Checkbox
+								state={_actions[action].selected ? 'checked' : 'unchecked'}
+								on:change={(e) => {
+									_actions[action].selected = e.detail === 'checked';
+									selectedActionIds = Object.keys(_actions).filter((t) => _actions[t].selected);
+								}}
+							/>
+						</div>
+
+						<div class=" py-0.5 text-sm w-full capitalize font-medium">
+							<Tooltip content={_actions[action].meta.description}>
+								{_actions[action].name}
+							</Tooltip>
+						</div>
+					</div>
+				{/each}
+			</div>
+		{/if}
+	</div>
+</div>

+ 21 - 0
src/routes/(app)/workspace/models/create/+page.svelte

@@ -18,6 +18,7 @@
 	import { stringify } from 'postcss';
 	import { parseFile } from '$lib/utils/characters';
 	import FiltersSelector from '$lib/components/workspace/Models/FiltersSelector.svelte';
+	import ActionsSelector from '$lib/components/workspace/Models/ActionsSelector.svelte';
 
 	const i18n = getContext('i18n');
 
@@ -63,6 +64,7 @@
 	let toolIds = [];
 	let knowledge = [];
 	let filterIds = [];
+	let actionIds = [];
 
 	$: if (name) {
 		id = name
@@ -115,6 +117,14 @@
 			}
 		}
 
+		if (actionIds.length > 0) {
+			info.meta.actionIds = actionIds;
+		} else {
+			if (info.meta.actionIds) {
+				delete info.meta.actionIds;
+			}
+		}
+
 		info.params.stop = params.stop ? params.stop.split(',').filter((s) => s.trim()) : null;
 		Object.keys(info.params).forEach((key) => {
 			if (info.params[key] === '' || info.params[key] === null) {
@@ -187,6 +197,10 @@
 			filterIds = [...model?.info?.meta?.filterIds];
 		}
 
+		if (model?.info?.meta?.actionIds) {
+			actionIds = [...model?.info?.meta?.actionIds];
+		}
+
 		info = {
 			...info,
 			...model.info
@@ -625,6 +639,13 @@
 			/>
 		</div>
 
+		<div class="my-2">
+			<ActionsSelector
+				bind:selectedActionIds={actionIds}
+				actions={$functions.filter((func) => func.type === 'action')}
+			/>
+		</div>
+
 		<div class="my-1">
 			<div class="flex w-full justify-between mb-1">
 				<div class=" self-center text-sm font-semibold">{$i18n.t('Capabilities')}</div>

+ 21 - 0
src/routes/(app)/workspace/models/edit/+page.svelte

@@ -17,6 +17,7 @@
 	import Knowledge from '$lib/components/workspace/Models/Knowledge.svelte';
 	import ToolsSelector from '$lib/components/workspace/Models/ToolsSelector.svelte';
 	import FiltersSelector from '$lib/components/workspace/Models/FiltersSelector.svelte';
+	import ActionsSelector from '$lib/components/workspace/Models/ActionsSelector.svelte';
 
 	const i18n = getContext('i18n');
 
@@ -64,6 +65,7 @@
 	let knowledge = [];
 	let toolIds = [];
 	let filterIds = [];
+	let actionIds = [];
 
 	const updateHandler = async () => {
 		loading = true;
@@ -96,6 +98,14 @@
 			}
 		}
 
+		if (actionIds.length > 0) {
+			info.meta.actionIds = actionIds;
+		} else {
+			if (info.meta.actionIds) {
+				delete info.meta.actionIds;
+			}
+		}
+
 		info.params.stop = params.stop ? params.stop.split(',').filter((s) => s.trim()) : null;
 		Object.keys(info.params).forEach((key) => {
 			if (info.params[key] === '' || info.params[key] === null) {
@@ -161,6 +171,10 @@
 					filterIds = [...model?.info?.meta?.filterIds];
 				}
 
+				if (model?.info?.meta?.actionIds) {
+					actionIds = [...model?.info?.meta?.actionIds];
+				}
+
 				if (model?.owned_by === 'openai') {
 					capabilities.usage = false;
 				}
@@ -555,6 +569,13 @@
 				/>
 			</div>
 
+			<div class="my-2">
+				<ActionsSelector
+					bind:selectedActionIds={actionIds}
+					actions={$functions.filter((func) => func.type === 'action')}
+				/>
+			</div>
+
 			<div class="my-2">
 				<div class="flex w-full justify-between mb-1">
 					<div class=" self-center text-sm font-semibold">{$i18n.t('Capabilities')}</div>