From 474b1af1457f699a16120cf9bb98246f363d7816 Mon Sep 17 00:00:00 2001 From: Waleed Date: Fri, 6 Feb 2026 13:11:56 -0800 Subject: [PATCH] improvement(ui): improved skills UI, validation, and permissions (#3156) * improvement(ui): improved skills UI, validation, and permissions * stronger typing for Skill interface * added missing docs description * ack comment --- apps/docs/components/icons.tsx | 21 ++++++ apps/docs/content/docs/en/skills/index.mdx | 63 ++++++++++++++-- apps/docs/content/docs/en/tools/airweave.mdx | 15 ++++ apps/docs/public/static/skills/add-skill.png | Bin 0 -> 28530 bytes .../public/static/skills/manage-skills.png | Bin 0 -> 57505 bytes .../components/skill-input/skill-input.tsx | 61 +++++++++------ .../hooks/use-editor-subblock-layout.ts | 6 ++ .../workflow-block/workflow-block.tsx | 44 +++++++++++ .../skills/components/skill-modal.tsx | 70 ++++++++++++------ apps/sim/components/icons.tsx | 16 ++-- 10 files changed, 235 insertions(+), 61 deletions(-) create mode 100644 apps/docs/public/static/skills/add-skill.png create mode 100644 apps/docs/public/static/skills/manage-skills.png diff --git a/apps/docs/components/icons.tsx b/apps/docs/components/icons.tsx index f5d604d1d..d62410d7f 100644 --- a/apps/docs/components/icons.tsx +++ b/apps/docs/components/icons.tsx @@ -5462,3 +5462,24 @@ export function EnrichSoIcon(props: SVGProps) { ) } + +export function AgentSkillsIcon(props: SVGProps) { + return ( + + + + + ) +} diff --git a/apps/docs/content/docs/en/skills/index.mdx b/apps/docs/content/docs/en/skills/index.mdx index 1af685ceb..6f5a95d3f 100644 --- a/apps/docs/content/docs/en/skills/index.mdx +++ b/apps/docs/content/docs/en/skills/index.mdx @@ -18,7 +18,9 @@ This means you can attach many skills to an agent without bloating its context w ## Creating Skills -Go to **Settings** (gear icon) and select **Skills** under the Tools section. +Go to **Settings** and select **Skills** under the Tools section. + +![Manage Skills](/static/skills/manage-skills.png) Click **Add** to create a new skill with three fields: @@ -52,11 +54,22 @@ Use when the user asks you to write, optimize, or debug SQL queries. ... ``` +**Recommended structure:** +- **When to use** — Specific triggers and scenarios +- **Instructions** — Step-by-step guidance with numbered lists +- **Examples** — Input/output samples showing expected behavior +- **Common Patterns** — Reusable approaches for frequent tasks +- **Edge Cases** — Gotchas and special considerations + +Keep skills focused and under 500 lines. If a skill grows too large, split it into multiple specialized skills. + ## Adding Skills to an Agent Open any **Agent** block and find the **Skills** dropdown below the tools section. Select the skills you want the agent to have access to. -Selected skills appear as chips that you can click to edit or remove. +![Add Skill](/static/skills/add-skill.png) + +Selected skills appear as cards that you can click to edit or remove. ### What Happens at Runtime @@ -69,12 +82,50 @@ When the workflow runs: This works across all supported LLM providers — the `load_skill` tool uses standard tool-calling, so no provider-specific configuration is needed. -## Tips +## Common Use Cases -- **Keep descriptions actionable** — Instead of "Helps with SQL", write "Write optimized SQL queries for PostgreSQL, MySQL, and SQLite, including index recommendations and query plan analysis" +Skills are most valuable when agents need specialized knowledge or multi-step workflows: + +**Domain Expertise** +- `api-integration-expert` — Best practices for calling specific APIs (authentication, rate limiting, error handling) +- `data-transformation` — ETL patterns, data cleaning, and validation rules +- `code-reviewer` — Code review guidelines specific to your team's standards + +**Workflow Templates** +- `bug-investigation` — Step-by-step debugging methodology (reproduce → isolate → test → fix) +- `feature-implementation` — Development workflow from requirements to deployment +- `document-generator` — Templates and formatting rules for technical documentation + +**Company-Specific Knowledge** +- `our-architecture` — System architecture diagrams, service dependencies, and deployment processes +- `style-guide` — Brand guidelines, writing tone, UI/UX patterns +- `customer-onboarding` — Standard procedures and common customer questions + +**When to use skills vs. agent instructions:** +- Use **skills** for knowledge that applies across multiple workflows or changes frequently +- Use **agent instructions** for task-specific context that's unique to a single agent + +## Best Practices + +**Writing Effective Descriptions** +- **Be specific and keyword-rich** — Instead of "Helps with SQL", write "Write optimized SQL queries for PostgreSQL, MySQL, and SQLite, including index recommendations and query plan analysis" +- **Include activation triggers** — Mention specific words or phrases that should prompt the skill (e.g., "Use when the user mentions PDFs, forms, or document extraction") +- **Keep it under 200 words** — Agents scan descriptions quickly; make every word count + +**Skill Scope and Organization** - **One skill per domain** — A focused `sql-expert` skill works better than a broad `database-everything` skill -- **Use markdown structure** — Headers, lists, and code blocks help the agent parse and follow instructions -- **Test iteratively** — Run your workflow and check if the agent activates the skill when expected +- **Limit to 5-10 skills per agent** — More skills = more decision overhead; start small and add as needed +- **Split large skills** — If a skill exceeds 500 lines, break it into focused sub-skills + +**Content Structure** +- **Use markdown formatting** — Headers, lists, and code blocks help agents parse and follow instructions +- **Provide examples** — Show input/output pairs so agents understand expected behavior +- **Be explicit about edge cases** — Don't assume agents will infer special handling + +**Testing and Iteration** +- **Test activation** — Run your workflow and verify the agent loads the skill when expected +- **Check for false positives** — Make sure skills aren't activating when they shouldn't +- **Refine descriptions** — If a skill isn't loading when needed, add more keywords to the description ## Learn More diff --git a/apps/docs/content/docs/en/tools/airweave.mdx b/apps/docs/content/docs/en/tools/airweave.mdx index f5ce4994f..59764a4c0 100644 --- a/apps/docs/content/docs/en/tools/airweave.mdx +++ b/apps/docs/content/docs/en/tools/airweave.mdx @@ -10,6 +10,21 @@ import { BlockInfoCard } from "@/components/ui/block-info-card" color="#6366F1" /> +{/* MANUAL-CONTENT-START:intro */} +[Airweave](https://airweave.ai/) is an AI-powered semantic search platform that helps you discover and retrieve knowledge across all your synced data sources. Built for modern teams, Airweave enables fast, relevant search results using neural, hybrid, or keyword-based strategies tailored to your needs. + +With Airweave, you can: + +- **Search smarter**: Use natural language queries to uncover information stored across your connected tools and databases +- **Unify your data**: Seamlessly access content from sources like code, docs, chat, emails, cloud files, and more +- **Customize retrieval**: Select between hybrid (semantic + keyword), neural, or keyword search strategies for optimal results +- **Boost recall**: Expand search queries with AI to find more comprehensive answers +- **Rerank results using AI**: Prioritize the most relevant answers with powerful language models +- **Get instant answers**: Generate clear, AI-powered responses synthesized from your data + +In Sim, the Airweave integration empowers your agents to search, summarize, and extract insights from all your organization’s data via a single tool. Use Airweave to drive rich, contextual knowledge retrieval within your workflows—whether answering questions, generating summaries, or supporting dynamic decision-making. +{/* MANUAL-CONTENT-END */} + ## Usage Instructions Search across your synced data sources using Airweave. Supports semantic search with hybrid, neural, or keyword retrieval strategies. Optionally generate AI-powered answers from search results. diff --git a/apps/docs/public/static/skills/add-skill.png b/apps/docs/public/static/skills/add-skill.png new file mode 100644 index 0000000000000000000000000000000000000000..80428e88ae88183edbb73f53bc9136931b20ffb4 GIT binary patch literal 28530 zcmeFYbyQqU@HU8B&|txd;TGJPgaiTv3GVLhE|~-gNq`8!WeCCDU4jN5+&#eHHrQa_ z<$d!e^V|Jr&)GkA&+f-L!_3^d-CbQ>U0u&pb;DJZWC`%7@la4u2;`nWRYgHTgQK9J z=Hp-iS4!9UNKjDl6>X%YRpg|l8C6`JEN$#9P*9$Sf7Qa)R_mfj(NmSfA%6QR8k)#> z@8PRxVqKK=XT)DWV&FXN2!@!-Qj+V}y)}NO^_a}S09D66JFk%A-E0L1g?h9{iLusP zFiPzf`@Gn^(8<+FD&KXI+s+Ix3XdoTuMSr(CMbp9h@R$lbIQl07A6TyoMu!4Z&YtJLsN&&ih=M*~;awo~^?p5UO|CUB{Jez*6{DKpBRW!j4rB9xa{ zKJVAhc*zZKl@!uq;kZ=bS>?Kv;brCRw+E)4YSXt7p)w9*p!qPNBuIR;qQv1#BSg2n zm6UNWoXj-nZNT9{<~zm|q7qIx*o{{mkpy>g=e^F1m;BC3Y))w6!F4G^7|mi{^E&?8 zO600)WrYoUtr#2;^N=V)V+DWnn8(Vt8gG~}kXbS6!)tA96tdX2h)a#QuNnA?D(C5y zPcVtb@QWGgvwlV_6YZ7Udu%M+CPQrX-0l8-EdO`B4}P#QXiJsre;$Ym(`Hz*ExE_y z*t}NlZ@aZnKhFD0dX349?E=Kjuj^Sjkn~a_psbZ!qMN1)GV8q@ZVMHTSk;#ywX0>o-vG} zkywbre(NT!UN6$N|L%45j}pu?XP4ZgeN&x4_j*yK`g?lB6a|sk^F;Shh%nFuRa#;Q zGhf>?+H5+)LbWzhj2Tf}KjOAEyS$>J{WLOvKcrJw1?MXGIX;>6G8)3K9fER@8dk!l z#M_n=70GA@QO@{`PX9OwyX7%gz2-5yT-d$m7({pPpUFN&n+WC!)1OekyiQ>-Z{pSe z`4pe0`v=wJhsVmM#E(ASk;iA6S`4k`-ieTHPM5Oh62?BE?Oo23S|mwJc20Hv3VmEH z@=Wys1I3Cr6!qv0_QsbhhX7~0?DbIW1xXb;wq=ePV&SDiXL_z3Y%9+<98Qdm8X6O= z<<~JkguJYqqn2JgX1&jHMK-;7Utn8cHdI}`;;K?|Lwh)EqmO2TN>XY!apV1hh<`P6 zC5G7Brjrx7*5Xky5&MRUt$veS)i>YX>E}QEFp+Ixp^O7q7+kvYYb) z9VOK)ARs_0Xr(0*buS&;{~_&F_oVAW)-&{1Wnm%mKH!8_4Qw=jH=c!IE0hI2HKM#dvsE8@;hp=ZRtlC&iovWq~wW%~i zMokp=B#k;miygNll-lBjX}p5jg~^ngLr(eqxf=0{n)CL3FUSI^n!-*NjBwmvll%ZL zJX;`TBId;%#%&MgZBc5u+hTLd;cbVwcXrQ(1pT<%7xU0VPCi;`SjI< z!o5%U&j}wesFKNnx|zwp2!1^N82O3olc?P8Pik|u(pw^NNl#)vzyE3RYxYq70rjCkx4^Mo(r9(oeoCfvS=PRF4*x?35eLd`;ccdE@?@o|%=2M2*cp5UPK}U5 z7$C$HGc&(18L532Q7%(0Gd%pf>V_3!(!RjU#D_;^@!`#fTOS-b-^El=C@Vk&wDMFp zi^n_)3>`9$?`*Sdi*H*@)m04GNDbay*WScff9p=MZa*%PbNDL!5oeru=Es_kHE(

LHX*1){!n-fjC8%TPI`X|I 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 literal 0 HcmV?d00001 diff --git a/apps/docs/public/static/skills/manage-skills.png b/apps/docs/public/static/skills/manage-skills.png new file mode 100644 index 0000000000000000000000000000000000000000..67f7ccd2045518f056969038041507c94594c6eb GIT binary patch literal 57505 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

ijNx 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�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 literal 0 HcmV?d00001 diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/skill-input/skill-input.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/skill-input/skill-input.tsx index b61a96414..713cbf183 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/skill-input/skill-input.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/skill-input/skill-input.tsx @@ -130,39 +130,52 @@ export function SkillInput({ onOpenChange={setOpen} /> - {selectedSkills.length > 0 && ( -

- {selectedSkills.map((stored) => { - const fullSkill = workspaceSkills.find((s) => s.id === stored.skillId) - return ( + {selectedSkills.length > 0 && + selectedSkills.map((stored) => { + const fullSkill = workspaceSkills.find((s) => s.id === stored.skillId) + return ( +
{ if (fullSkill && !disabled && !isPreview) { setEditingSkill(fullSkill) } }} > - - {resolveSkillName(stored)} - {!disabled && !isPreview && ( - - )} + +
+ + {resolveSkillName(stored)} + +
+
+ {!disabled && !isPreview && ( + + )} +
- ) - })} - - )} + + ) + })} state.blocks?.[blockId]?.data, [blockId]) ) + const { config: permissionConfig } = usePermissionConfig() return useMemo(() => { // Guard against missing config or block selection @@ -100,6 +102,9 @@ export function useEditorSubblockLayout( const visibleSubBlocks = (config.subBlocks || []).filter((block) => { if (block.hidden) return false + // Hide skill-input subblock when skills are disabled via permissions + if (block.type === 'skill-input' && permissionConfig.disableSkills) return false + // Check required feature if specified - declarative feature gating if (!isSubBlockFeatureEnabled(block)) return false @@ -149,5 +154,6 @@ export function useEditorSubblockLayout( activeWorkflowId, isSnapshotView, blockDataFromStore, + permissionConfig.disableSkills, ]) } diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/workflow-block.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/workflow-block.tsx index 636fd559d..c0f89e2b3 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/workflow-block.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/workflow-block.tsx @@ -40,6 +40,7 @@ import { useCustomTools } from '@/hooks/queries/custom-tools' import { useMcpServers, useMcpToolsQuery } from '@/hooks/queries/mcp' import { useCredentialName } from '@/hooks/queries/oauth-credentials' import { useReactivateSchedule, useScheduleInfo } from '@/hooks/queries/schedules' +import { useSkills } from '@/hooks/queries/skills' import { useDeployChildWorkflow } from '@/hooks/queries/workflows' import { useSelectorDisplayName } from '@/hooks/use-selector-display-name' import { useVariablesStore } from '@/stores/panel' @@ -618,6 +619,48 @@ const SubBlockRow = memo(function SubBlockRow({ return `${toolNames[0]}, ${toolNames[1]} +${toolNames.length - 2}` }, [subBlock?.type, rawValue, customTools, workspaceId]) + /** + * Hydrates skill references to display names. + * Resolves skill IDs to their current names from the skills query. + */ + const { data: workspaceSkills = [] } = useSkills(workspaceId || '') + + const skillsDisplayValue = useMemo(() => { + if (subBlock?.type !== 'skill-input' || !Array.isArray(rawValue) || rawValue.length === 0) { + return null + } + + interface StoredSkill { + skillId: string + name?: string + } + + const skillNames = rawValue + .map((skill: StoredSkill) => { + if (!skill || typeof skill !== 'object') return null + + // Priority 1: Resolve skill name from the skills query (fresh data) + if (skill.skillId) { + const foundSkill = workspaceSkills.find((s) => s.id === skill.skillId) + if (foundSkill?.name) return foundSkill.name + } + + // Priority 2: Fall back to stored name (for deleted skills) + if (skill.name && typeof skill.name === 'string') return skill.name + + // Priority 3: Use skillId as last resort + if (skill.skillId) return skill.skillId + + return null + }) + .filter((name): name is string => !!name) + + if (skillNames.length === 0) return null + if (skillNames.length === 1) return skillNames[0] + if (skillNames.length === 2) return `${skillNames[0]}, ${skillNames[1]}` + return `${skillNames[0]}, ${skillNames[1]} +${skillNames.length - 2}` + }, [subBlock?.type, rawValue, workspaceSkills]) + const isPasswordField = subBlock?.password === true const maskedValue = isPasswordField && value && value !== '-' ? '•••' : null @@ -627,6 +670,7 @@ const SubBlockRow = memo(function SubBlockRow({ dropdownLabel || variablesDisplayValue || toolsDisplayValue || + skillsDisplayValue || knowledgeBaseDisplayName || workflowSelectionName || mcpServerDisplayName || diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/skills/components/skill-modal.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/skills/components/skill-modal.tsx index 36b7c9ddd..99a473fd2 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/skills/components/skill-modal.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/skills/components/skill-modal.tsx @@ -27,6 +27,13 @@ interface SkillModalProps { const KEBAB_CASE_REGEX = /^[a-z0-9]+(-[a-z0-9]+)*$/ +interface FieldErrors { + name?: string + description?: string + content?: string + general?: string +} + export function SkillModal({ open, onOpenChange, @@ -43,7 +50,7 @@ export function SkillModal({ const [name, setName] = useState('') const [description, setDescription] = useState('') const [content, setContent] = useState('') - const [formError, setFormError] = useState('') + const [errors, setErrors] = useState({}) const [saving, setSaving] = useState(false) useEffect(() => { @@ -57,7 +64,7 @@ export function SkillModal({ setDescription('') setContent('') } - setFormError('') + setErrors({}) } }, [open, initialValues]) @@ -71,24 +78,26 @@ export function SkillModal({ }, [name, description, content, initialValues]) const handleSave = async () => { + const newErrors: FieldErrors = {} + if (!name.trim()) { - setFormError('Name is required') - return - } - if (name.length > 64) { - setFormError('Name must be 64 characters or less') - return - } - if (!KEBAB_CASE_REGEX.test(name)) { - setFormError('Name must be kebab-case (e.g. my-skill)') - return + newErrors.name = 'Name is required' + } else if (name.length > 64) { + newErrors.name = 'Name must be 64 characters or less' + } else if (!KEBAB_CASE_REGEX.test(name)) { + newErrors.name = 'Name must be kebab-case (e.g. my-skill)' } + if (!description.trim()) { - setFormError('Description is required') - return + newErrors.description = 'Description is required' } + if (!content.trim()) { - setFormError('Content is required') + newErrors.content = 'Content is required' + } + + if (Object.keys(newErrors).length > 0) { + setErrors(newErrors) return } @@ -113,7 +122,7 @@ export function SkillModal({ error instanceof Error && error.message.includes('already exists') ? error.message : 'Failed to save skill. Please try again.' - setFormError(message) + setErrors({ general: message }) } finally { setSaving(false) } @@ -135,12 +144,17 @@ export function SkillModal({ value={name} onChange={(e) => { setName(e.target.value) - if (formError) setFormError('') + if (errors.name || errors.general) + setErrors((prev) => ({ ...prev, name: undefined, general: undefined })) }} /> - - Lowercase letters, numbers, and hyphens (e.g. my-skill) - + {errors.name ? ( +

{errors.name}

+ ) : ( + + Lowercase letters, numbers, and hyphens (e.g. my-skill) + + )}
@@ -153,10 +167,14 @@ export function SkillModal({ value={description} onChange={(e) => { setDescription(e.target.value) - if (formError) setFormError('') + if (errors.description || errors.general) + setErrors((prev) => ({ ...prev, description: undefined, general: undefined })) }} maxLength={1024} /> + {errors.description && ( +

{errors.description}

+ )}
@@ -169,13 +187,19 @@ export function SkillModal({ value={content} onChange={(e: ChangeEvent) => { setContent(e.target.value) - if (formError) setFormError('') + if (errors.content || errors.general) + setErrors((prev) => ({ ...prev, content: undefined, general: undefined })) }} className='min-h-[200px] resize-y font-mono text-[13px]' /> + {errors.content && ( +

{errors.content}

+ )}
- {formError && {formError}} + {errors.general && ( +

{errors.general}

+ )} diff --git a/apps/sim/components/icons.tsx b/apps/sim/components/icons.tsx index 969f5be13..d62410d7f 100644 --- a/apps/sim/components/icons.tsx +++ b/apps/sim/components/icons.tsx @@ -5468,18 +5468,18 @@ export function AgentSkillsIcon(props: SVGProps) { - + ) }