From f7283f58b12159fa55cdb4f6ff32de660e2238a6 Mon Sep 17 00:00:00 2001 From: Jicheng Lu <103353@smsassist.com> Date: Wed, 19 Feb 2025 17:26:06 -0600 Subject: [PATCH 1/2] refine agent templates --- src/lib/common/InPlaceEdit.svelte | 2 +- src/lib/common/nav-bar/NavItem.svelte | 2 +- src/lib/helpers/types/agentTypes.js | 1 + src/lib/scss/custom/pages/_agent.scss | 6 + src/routes/page/agent/[agentId]/+page.svelte | 76 +++++-- .../agent-components/agent-function.svelte | 5 +- ...prompt.svelte => agent-instruction.svelte} | 51 ++--- .../agent-knowledge-base.svelte | 2 +- .../agent-components/agent-llm-config.svelte | 2 +- .../agent-components/agent-overview.svelte | 62 ++++-- .../agent-components/agent-rule.svelte | 2 +- .../agent-components/agent-template.svelte | 185 ++++++++++++++++++ .../agent-components/agent-utility.svelte | 2 +- .../page/agent/[agentId]/agent-tabs.svelte | 6 +- 14 files changed, 333 insertions(+), 71 deletions(-) rename src/routes/page/agent/[agentId]/agent-components/{agent-prompt.svelte => agent-instruction.svelte} (80%) create mode 100644 src/routes/page/agent/[agentId]/agent-components/agent-template.svelte diff --git a/src/lib/common/InPlaceEdit.svelte b/src/lib/common/InPlaceEdit.svelte index 9ce32362..cadc2c47 100644 --- a/src/lib/common/InPlaceEdit.svelte +++ b/src/lib/common/InPlaceEdit.svelte @@ -68,7 +68,7 @@ {:else} -
edit()}> +
edit()}> {#if !!value?.trim()} {value} {:else} diff --git a/src/lib/common/nav-bar/NavItem.svelte b/src/lib/common/nav-bar/NavItem.svelte index 0c6ffd42..30fe35a3 100644 --- a/src/lib/common/nav-bar/NavItem.svelte +++ b/src/lib/common/nav-bar/NavItem.svelte @@ -118,7 +118,7 @@ on:input={handleTabInput} /> {:else} -
+
{navBtnText}
{/if} diff --git a/src/lib/helpers/types/agentTypes.js b/src/lib/helpers/types/agentTypes.js index e3b3e0b3..96d74084 100644 --- a/src/lib/helpers/types/agentTypes.js +++ b/src/lib/helpers/types/agentTypes.js @@ -5,6 +5,7 @@ /** * @typedef {Object} AgentTemplate + * @property {string?} [uid] * @property {string} name * @property {string} content */ diff --git a/src/lib/scss/custom/pages/_agent.scss b/src/lib/scss/custom/pages/_agent.scss index f6a862c6..a7f4df42 100644 --- a/src/lib/scss/custom/pages/_agent.scss +++ b/src/lib/scss/custom/pages/_agent.scss @@ -102,6 +102,12 @@ background-color: white; padding: 20px; } + + .agent-prompt-body { + overflow-y: auto; + scrollbar-width: none; + margin-bottom: 0px !important; + } } } } diff --git a/src/routes/page/agent/[agentId]/+page.svelte b/src/routes/page/agent/[agentId]/+page.svelte index ba4435b3..953e3b61 100644 --- a/src/routes/page/agent/[agentId]/+page.svelte +++ b/src/routes/page/agent/[agentId]/+page.svelte @@ -7,7 +7,7 @@ import Breadcrumb from '$lib/common/Breadcrumb.svelte'; import HeadTitle from '$lib/common/HeadTitle.svelte'; import LoadingToComplete from '$lib/common/LoadingToComplete.svelte'; - import AgentPrompt from './agent-components/agent-prompt.svelte'; + import AgentInstruction from './agent-components/agent-instruction.svelte'; import AgentOverview from './agent-components/agent-overview.svelte'; import AgentFunction from './agent-components/agent-function.svelte'; import AgentTabs from './agent-tabs.svelte'; @@ -19,13 +19,16 @@ import { goto } from '$app/navigation'; import { AgentExtensions } from '$lib/helpers/utils/agent'; import LocalStorageManager from '$lib/helpers/utils/storage-manager'; + import AgentTemplate from './agent-components/agent-template.svelte'; /** @type {import('$agentTypes').AgentModel} */ let agent; /** @type {any} */ let agentFunctionCmp = null; /** @type {any} */ - let agentPromptCmp = null; + let agentInstructionCmp = null; + /** @type {any} */ + let agentTemplateCmp = null; /** @type {any} */ let agentTabsCmp = null; /** @type {import('$agentTypes').AgentModel} */ @@ -90,7 +93,8 @@ function handleAgentUpdate() { fetchJsonContent(); - fetchPrompts(); + fetchInstructions(); + fetchTemplates(); fetchTabData(); agent = { @@ -114,7 +118,8 @@ isLoading = false; isComplete = true; deleteAgentDraft(); - refreshChannelPrompts(); + refreshInstructions(); + refreshTemplates(); setTimeout(() => { isComplete = false; }, duration); @@ -132,43 +137,66 @@ functions: textContent?.functions?.length > 0 ? textContent.functions : (jsonContent?.functions?.length > 0 ? jsonContent?.functions : []), responses: textContent?.responses?.length > 0 ? textContent.responses : - (jsonContent?.responses?.length > 0 ? jsonContent?.responses : []), - templates: textContent?.templates?.length > 0 ? textContent.templates : - (jsonContent?.templates?.length > 0 ? jsonContent?.templates : []), + (jsonContent?.responses?.length > 0 ? jsonContent?.responses : []) } } + // Functions, responses function fetchJsonContent() { const data = formatJsonContent(); agent.functions = data.functions; agent.responses = data.responses; - agent.templates = data.templates; } - function formatOriginalPrompts() { - const obj = agentPromptCmp?.fetchOriginalChannelPrompts(); + // Insturctions + function formatOriginalInstructions() { + const obj = agentInstructionCmp?.fetchOriginalInstructions(); return { instruction: obj.systemPrompt, channel_instructions: obj.channelPrompts || [] } } - function fetchPrompts() { - const obj = agentPromptCmp?.fetchChannelPrompts(); + function fetchInstructions() { + const obj = agentInstructionCmp?.fetchInstructions(); agent.instruction = obj.systemPrompt; agent.channel_instructions = obj.channelPrompts || []; } + function refreshInstructions() { + agentInstructionCmp?.refreshInstructions(); + } + + // Templates + function formatOriginalTemplates() { + const obj = agentTemplateCmp?.fetchOriginalTemplates(); + return { + templates: obj.templates || [] + } + } + + function fetchTemplates() { + const obj = agentTemplateCmp?.fetchTemplates(); + agent.templates = obj.templates || []; + } + + function refreshTemplates() { + agentTemplateCmp?.refreshTemplates(); + } + + + // Tab data function formatOriginalTabData() { - const data = agentTabsCmp?.fetchOriginalData(); + const data = agentTabsCmp?.fetchOriginalTabData(); return data ? { utilities: data.utilities || [], knowledge_bases: data.knwoledgebases || [], rules: data.rules || [] } : null; } + function fetchTabData() { - const data = agentTabsCmp?.fetchData(); + const data = agentTabsCmp?.fetchTabData(); if (data) { agent.utilities = data.utilities || []; agent.knowledge_bases = data.knwoledgebases || []; @@ -176,9 +204,6 @@ } } - function refreshChannelPrompts() { - agentPromptCmp?.refreshChannelPrompts(); - } function deleteCurrentAgent() { Swal.fire({ @@ -207,7 +232,8 @@ const data = { ...agent, ...formatJsonContent(), - ...formatOriginalPrompts(), + ...formatOriginalInstructions(), + ...formatOriginalTemplates(), ...formatOriginalTabData(), }; saveAgentDraft(data); @@ -218,7 +244,8 @@ agentDraft = null; deleteAgentDraft(); setTimeout(() => { - refreshChannelPrompts(); + refreshInstructions(); + refreshTemplates(); agentFunctionCmp?.reinit(); agentTabsCmp?.reinit(); }); @@ -253,8 +280,15 @@
- +
+
+ diff --git a/src/routes/page/agent/[agentId]/agent-components/agent-function.svelte b/src/routes/page/agent/[agentId]/agent-components/agent-function.svelte index 5536c527..c219b46c 100644 --- a/src/routes/page/agent/[agentId]/agent-components/agent-function.svelte +++ b/src/routes/page/agent/[agentId]/agent-components/agent-function.svelte @@ -6,7 +6,7 @@ export let agent; /** @type {() => void} */ - export let handleAgentChange; + export let handleAgentChange = () => {}; export const fetchContent = () => { return content; @@ -27,8 +27,7 @@ content = { json: { functions: agent.functions, - responses: agent.responses, - templates: agent.templates + responses: agent.responses } }; } diff --git a/src/routes/page/agent/[agentId]/agent-components/agent-prompt.svelte b/src/routes/page/agent/[agentId]/agent-components/agent-instruction.svelte similarity index 80% rename from src/routes/page/agent/[agentId]/agent-components/agent-prompt.svelte rename to src/routes/page/agent/[agentId]/agent-components/agent-instruction.svelte index 17e56174..522b4498 100644 --- a/src/routes/page/agent/[agentId]/agent-components/agent-prompt.svelte +++ b/src/routes/page/agent/[agentId]/agent-components/agent-instruction.svelte @@ -13,20 +13,20 @@ export let agent; /** @type {() => void} */ - export let handleAgentChange; + export let handleAgentChange = () => {}; - export const fetchOriginalChannelPrompts = () => { + export const fetchOriginalInstructions = () => { return { - systemPrompt: local_instructions?.[0]?.instruction || '', - channelPrompts: local_instructions?.slice(1)?.map(x => ({ + systemPrompt: inner_instructions?.[0]?.instruction || '', + channelPrompts: inner_instructions?.slice(1)?.map(x => ({ channel: x.channel, instruction: x.instruction })) || [] }; }; - export const fetchChannelPrompts = () => { - const candidates = local_instructions?.filter((x, idx) => idx > 0 && !!x.channel?.trim())?.map(x => { + export const fetchInstructions = () => { + const candidates = inner_instructions?.filter((x, idx) => idx > 0 && !!x.channel?.trim())?.map(x => { return { channel: x.channel.trim().toLowerCase(), instruction: x.instruction }; }); @@ -39,12 +39,13 @@ } return { - systemPrompt: local_instructions[0].instruction, + systemPrompt: inner_instructions[0].instruction, channelPrompts: prompts }; } - export const refreshChannelPrompts = () => init(); + export const refreshInstructions = () => init(); + /** @type {import('$agentTypes').ChannelInstruction} */ const defaultInstruction = { @@ -53,7 +54,7 @@ }; /** @type {import('$agentTypes').ChannelInstruction[]} */ - let local_instructions = []; + let inner_instructions = []; /** @type {import('$agentTypes').ChannelInstruction} */ let selected_instruction = { ...defaultInstruction }; @@ -63,7 +64,7 @@ }); function init() { - local_instructions = [ + inner_instructions = [ { uid: uuidv4(), channel: defaultChannel, @@ -76,7 +77,7 @@ })) || [] ]; - selected_instruction = local_instructions[0]; + selected_instruction = inner_instructions[0]; } /** @param {string | undefined} uid */ @@ -85,7 +86,7 @@ return; } - selected_instruction = local_instructions.find(x => x.uid === uid) || { ...defaultInstruction }; + selected_instruction = inner_instructions.find(x => x.uid === uid) || { ...defaultInstruction }; } /** @param {any} e */ @@ -96,21 +97,23 @@ } function addChannel() { - local_instructions = [ - ...local_instructions, + inner_instructions = [ + ...inner_instructions, { uid: uuidv4(), channel: '', instruction: '' } ]; + + selected_instruction = inner_instructions[inner_instructions.length-1]; } /** @param {string | undefined} uid */ function deleteChannel(uid) { - local_instructions = local_instructions.filter(x => x.uid !== uid); + inner_instructions = inner_instructions.filter(x => x.uid !== uid); if (selected_instruction.uid === uid) { - selected_instruction = local_instructions[0]; + selected_instruction = inner_instructions[0]; } } @@ -124,7 +127,7 @@
- +
{'Description:'} @@ -141,10 +144,10 @@ /> - +
- {#if local_instructions.length > 1} + {#if inner_instructions.length > 1} {'Instructions:'} {:else} {'System instruction:'} @@ -164,15 +167,15 @@
- {#if local_instructions.length > 1} + {#if inner_instructions.length > 1} - {#each local_instructions as inst, idx (idx) } + {#each inner_instructions as inst, idx (idx) } 0} allowDelete={idx > 0} maxEditLength={20} - editPlaceholder={'Type a channel name here...'} + editPlaceholder={'Type a channel here...'} onClick={() => selectChannel(inst.uid)} onDelete={() => { deleteChannel(inst.uid); handleAgentChange(); }} onInput={handleAgentChange} @@ -195,7 +198,7 @@ class="form-control" style="scrollbar-width: thin; resize: none;" value={selected_instruction.instruction} - rows={24} + rows={20} on:input={(e) => { changePrompt(e); handleAgentChange(); }} placeholder="Enter your instruction" /> diff --git a/src/routes/page/agent/[agentId]/agent-components/agent-knowledge-base.svelte b/src/routes/page/agent/[agentId]/agent-components/agent-knowledge-base.svelte index 837cabb3..3087ccaa 100644 --- a/src/routes/page/agent/[agentId]/agent-components/agent-knowledge-base.svelte +++ b/src/routes/page/agent/[agentId]/agent-components/agent-knowledge-base.svelte @@ -10,7 +10,7 @@ export let agent; /** @type {() => void} */ - export let handleAgentChange; + export let handleAgentChange = () => {}; export const fetchKnowledgeBases = () => { const candidates = innerKnowledgeBases?.filter(x => !!x.name)?.map(x => { diff --git a/src/routes/page/agent/[agentId]/agent-components/agent-llm-config.svelte b/src/routes/page/agent/[agentId]/agent-components/agent-llm-config.svelte index 8a40d67d..a688cbe2 100644 --- a/src/routes/page/agent/[agentId]/agent-components/agent-llm-config.svelte +++ b/src/routes/page/agent/[agentId]/agent-components/agent-llm-config.svelte @@ -13,7 +13,7 @@ let models = []; /** @type {() => void} */ - export let handleAgentChange; + export let handleAgentChange = () => {}; const recursiveDepthLowerLimit = 1; const recursiveDepthUpperLimit = 10; diff --git a/src/routes/page/agent/[agentId]/agent-components/agent-overview.svelte b/src/routes/page/agent/[agentId]/agent-components/agent-overview.svelte index 3cee375e..7b4b679e 100644 --- a/src/routes/page/agent/[agentId]/agent-components/agent-overview.svelte +++ b/src/routes/page/agent/[agentId]/agent-components/agent-overview.svelte @@ -20,7 +20,7 @@ export let labels = []; /** @type {() => void} */ - export let handleAgentChange; + export let handleAgentChange = () => {}; /** @type {boolean} */ export let resetable = false; @@ -129,9 +129,13 @@ - Visibility + +
+ Visibility +
+ -
+
- +
- Routable + +
+ Routable +
+ -
+
- Profiles + +
+ Profiles +
+
{#each profiles as profile, index} @@ -198,7 +212,11 @@ - Labels + +
+ Labels +
+
{#each labels as label, index} @@ -237,9 +255,13 @@ - Status + +
+ Status +
+ -
+
- Max message count + +
+ Max message count +
+ -
+
- Created Date - {utcToLocal(agent.created_datetime)} + +
+ Created Date +
+ + +
+ {utcToLocal(agent.created_datetime)} +
+ diff --git a/src/routes/page/agent/[agentId]/agent-components/agent-rule.svelte b/src/routes/page/agent/[agentId]/agent-components/agent-rule.svelte index f1e9d779..efe8f59b 100644 --- a/src/routes/page/agent/[agentId]/agent-components/agent-rule.svelte +++ b/src/routes/page/agent/[agentId]/agent-components/agent-rule.svelte @@ -10,7 +10,7 @@ export let agent; /** @type {() => void} */ - export let handleAgentChange; + export let handleAgentChange = () => {}; export const fetchRules = () => { const candidates = innerRules?.filter(x => !!x.trigger_name)?.map(x => { diff --git a/src/routes/page/agent/[agentId]/agent-components/agent-template.svelte b/src/routes/page/agent/[agentId]/agent-components/agent-template.svelte new file mode 100644 index 00000000..66067bee --- /dev/null +++ b/src/routes/page/agent/[agentId]/agent-components/agent-template.svelte @@ -0,0 +1,185 @@ + + + + + +
+
+
{'Templates'}
+
+
+
+ + +
+
+ {'Prompts:'} +
+ + +
{ addTemplate(); handleAgentChange(); }} + > + +
+
+ + {#if inner_templates.length > 0} + + {#each inner_templates as template, idx (idx) } + selectTemplate(template.uid)} + onDelete={() => { deleteTemplate(template.uid); handleAgentChange(); }} + onInput={() => handleAgentChange()} + /> + {/each} + + { changePrompt(e); handleAgentChange(); }} + placeholder="Enter your template" + /> + {/if} +
+
+
\ No newline at end of file diff --git a/src/routes/page/agent/[agentId]/agent-components/agent-utility.svelte b/src/routes/page/agent/[agentId]/agent-components/agent-utility.svelte index abf65151..3a8afd7f 100644 --- a/src/routes/page/agent/[agentId]/agent-components/agent-utility.svelte +++ b/src/routes/page/agent/[agentId]/agent-components/agent-utility.svelte @@ -11,7 +11,7 @@ export let agent; /** @type {() => void} */ - export let handleAgentChange; + export let handleAgentChange = () => {}; export const fetchUtilities = () => { const candidates = innerUtilities?.filter(x => !!x.name)?.map(x => { diff --git a/src/routes/page/agent/[agentId]/agent-tabs.svelte b/src/routes/page/agent/[agentId]/agent-tabs.svelte index 93062b99..63482114 100644 --- a/src/routes/page/agent/[agentId]/agent-tabs.svelte +++ b/src/routes/page/agent/[agentId]/agent-tabs.svelte @@ -13,9 +13,9 @@ export let agent; /** @type {() => void} */ - export let handleAgentChange; + export let handleAgentChange = () => {}; - export const fetchData = () => { + export const fetchTabData = () => { const utilities = agentUtilityCmp?.fetchUtilities(); const knwoledgebases = agentKnowledgeBaseCmp?.fetchKnowledgeBases(); const rules = agentEventRuleCmp?.fetchRules(); @@ -27,7 +27,7 @@ }; }; - export const fetchOriginalData = () => { + export const fetchOriginalTabData = () => { const utilities = agentUtilityCmp?.fetchOriginalUtilities(); const knwoledgebases = agentKnowledgeBaseCmp?.fetchOriginalKnowledgeBases(); const rules = agentEventRuleCmp?.fetchOriginalRules(); From cfaa8748aaa8c031010f51060e3419890829bf91 Mon Sep 17 00:00:00 2001 From: Jicheng Lu <103353@smsassist.com> Date: Wed, 19 Feb 2025 17:37:11 -0600 Subject: [PATCH 2/2] rename --- src/routes/page/agent/[agentId]/+page.svelte | 8 +++---- .../agent-components/agent-function.svelte | 2 +- .../agent-components/agent-instruction.svelte | 8 +++---- .../agent-knowledge-base.svelte | 12 +++++----- .../agent-components/agent-llm-config.svelte | 22 ++++++++++--------- .../agent-components/agent-rule.svelte | 14 ++++++------ .../agent-components/agent-template.svelte | 2 +- .../agent-components/agent-utility.svelte | 18 +++++++-------- .../page/agent/[agentId]/agent-tabs.svelte | 10 ++++----- 9 files changed, 49 insertions(+), 47 deletions(-) diff --git a/src/routes/page/agent/[agentId]/+page.svelte b/src/routes/page/agent/[agentId]/+page.svelte index 953e3b61..0e1837e6 100644 --- a/src/routes/page/agent/[agentId]/+page.svelte +++ b/src/routes/page/agent/[agentId]/+page.svelte @@ -164,7 +164,7 @@ } function refreshInstructions() { - agentInstructionCmp?.refreshInstructions(); + agentInstructionCmp?.refresh(); } // Templates @@ -181,7 +181,7 @@ } function refreshTemplates() { - agentTemplateCmp?.refreshTemplates(); + agentTemplateCmp?.refresh(); } @@ -246,8 +246,8 @@ setTimeout(() => { refreshInstructions(); refreshTemplates(); - agentFunctionCmp?.reinit(); - agentTabsCmp?.reinit(); + agentFunctionCmp?.refresh(); + agentTabsCmp?.refresh(); }); } diff --git a/src/routes/page/agent/[agentId]/agent-components/agent-function.svelte b/src/routes/page/agent/[agentId]/agent-components/agent-function.svelte index c219b46c..b54e59be 100644 --- a/src/routes/page/agent/[agentId]/agent-components/agent-function.svelte +++ b/src/routes/page/agent/[agentId]/agent-components/agent-function.svelte @@ -12,7 +12,7 @@ return content; } - export const reinit = () => init(); + export const refresh = () => init(); /** @type {import('svelte-jsoneditor').Content} */ let content = { diff --git a/src/routes/page/agent/[agentId]/agent-components/agent-instruction.svelte b/src/routes/page/agent/[agentId]/agent-components/agent-instruction.svelte index 522b4498..1530513b 100644 --- a/src/routes/page/agent/[agentId]/agent-components/agent-instruction.svelte +++ b/src/routes/page/agent/[agentId]/agent-components/agent-instruction.svelte @@ -1,11 +1,11 @@