Skip to content

Commit

Permalink
Merge pull request #383 from refly-ai/fix/edit-doc-issues-v2
Browse files Browse the repository at this point in the history
refactor(ai-selector): update skill handling and improve invoke actio…
  • Loading branch information
pftom authored Jan 17, 2025
2 parents 4c244b9 + 429937a commit 5c09ec7
Show file tree
Hide file tree
Showing 5 changed files with 66 additions and 12 deletions.
51 changes: 47 additions & 4 deletions packages/ai-workspace-common/src/components/canvas/nodes/skill.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { NodeProps, Position, useReactFlow } from '@xyflow/react';
import { CanvasNode, CanvasNodeData, SkillNodeMeta } from './shared/types';
import { Node } from '@xyflow/react';
import { Button } from 'antd';
import { Form, FormInstance } from '@arco-design/web-react';
import { CustomHandle } from './shared/custom-handle';
import { useState, useCallback, useEffect, useMemo, memo, useRef } from 'react';

Expand All @@ -22,6 +23,7 @@ import { nodeActionEmitter } from '@refly-packages/ai-workspace-common/events/no
import { createNodeEventName } from '@refly-packages/ai-workspace-common/events/nodeActions';
import { useDeleteNode } from '@refly-packages/ai-workspace-common/hooks/canvas/use-delete-node';
import { ContextManager } from '@refly-packages/ai-workspace-common/components/canvas/launchpad/context-manager';
import { ConfigManager } from '@refly-packages/ai-workspace-common/components/canvas/launchpad/config-manager';
import { IContextItem } from '@refly-packages/ai-workspace-common/stores/context-panel';
import { usePatchNodeData } from '@refly-packages/ai-workspace-common/hooks/canvas/use-patch-node-data';
import { useEdgeStyles } from '@refly-packages/ai-workspace-common/components/canvas/constants';
Expand Down Expand Up @@ -87,6 +89,8 @@ export const SkillNode = memo(
const { getNode, getNodes, getEdges, addEdges, deleteElements } = useReactFlow();
const { addNode } = useAddNode();
const { deleteNode } = useDeleteNode();
const [form] = Form.useForm();
const [formErrors, setFormErrors] = useState<Record<string, string>>({});

// Add ref for ChatInput component
const chatInputRef = useRef<HTMLDivElement>(null);
Expand Down Expand Up @@ -212,10 +216,29 @@ export const SkillNode = memo(
}, [skillSelectedModel, modelInfo, setModelInfo]);

const setSelectedSkill = useCallback(
(skill: Skill | null) => {
patchNodeData(id, { metadata: { selectedSkill: skill } });
(newSelectedSkill: Skill | null) => {
const selectedSkill = newSelectedSkill;

// Reset form when skill changes
if (selectedSkill?.configSchema?.items?.length) {
const defaultConfig = {};
selectedSkill.configSchema.items.forEach((item) => {
if (item.defaultValue !== undefined) {
defaultConfig[item.key] = {
value: item.defaultValue,
label: item.labelDict?.['en'] ?? item.key,
displayValue: String(item.defaultValue),
};
}
});
form.setFieldValue('tplConfig', defaultConfig);
} else {
form.setFieldValue('tplConfig', undefined);
}

patchNodeData(id, { metadata: { selectedSkill } });
},
[id, updateNodeData],
[id, form, patchNodeData],
);

const { handleMouseEnter: onHoverStart, handleMouseLeave: onHoverEnd } = useNodeHoverEffect(id);
Expand All @@ -235,6 +258,8 @@ export const SkillNode = memo(
const data = node?.data as CanvasNodeData<SkillNodeMeta>;
const { query = '', contextItems = [] } = data?.metadata ?? {};

const tplConfig = form.getFieldValue('tplConfig');

deleteElements({ nodes: [node] });

setTimeout(() => {
Expand All @@ -243,6 +268,7 @@ export const SkillNode = memo(
{
resultId,
...data?.metadata,
tplConfig,
},
{
entityId: canvasId,
Expand All @@ -265,7 +291,7 @@ export const SkillNode = memo(
convertContextItemsToNodeFilters(contextItems),
);
});
}, [id, getNode, deleteElements, invokeAction, canvasId, addNode]);
}, [id, getNode, deleteElements, invokeAction, canvasId, addNode, form]);

const handleDelete = useCallback(() => {
const currentNode = getNode(id);
Expand Down Expand Up @@ -345,6 +371,23 @@ export const SkillNode = memo(
}}
/>

{selectedSkill?.configSchema?.items?.length > 0 && (
<ConfigManager
key={selectedSkill?.name}
form={form}
formErrors={formErrors}
setFormErrors={setFormErrors}
schema={selectedSkill?.configSchema}
tplConfig={selectedSkill?.tplConfig}
fieldPrefix="tplConfig"
configScope="runtime"
resetConfig={() => {
const defaultConfig = selectedSkill?.tplConfig ?? {};
form.setFieldValue('tplConfig', defaultConfig);
}}
/>
)}

<ChatActions
query={localQuery}
model={modelInfo}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import { AddBaseMarkContext } from '@refly-packages/ai-workspace-common/componen
import { Markdown } from '@refly-packages/ai-workspace-common/components/markdown';
import { useInvokeAction } from '@refly-packages/ai-workspace-common/hooks/canvas/use-invoke-action';
import { useTranslation } from 'react-i18next';
import { ActionResult, ActionStatus, ConfigScope, InvokeSkillRequest } from '@refly/openapi-schema';
import { ActionResult, ActionStatus, ConfigScope, InvokeSkillRequest, Skill } from '@refly/openapi-schema';
import { useChatStore, useChatStoreShallow } from '@refly-packages/ai-workspace-common/stores/chat';
import { genActionResultID, getClientOrigin } from '@refly-packages/utils/index';
import { useUserStore } from '@refly-packages/ai-workspace-common/stores/user';
Expand Down Expand Up @@ -94,7 +94,6 @@ export const AISelector = memo(({ onOpenChange, handleBubbleClose, inPlaceEditTy
const [resultStatus, setResultStatus] = useState<ActionStatus>('waiting');
const { docId } = useDocumentContext();
const { invokeAction } = useInvokeAction();
const skill = useFindSkill('editDoc');

const { selectedModel, setSelectedModel } = useChatStoreShallow((state) => ({
selectedModel: state.selectedModel,
Expand Down Expand Up @@ -158,14 +157,26 @@ export const AISelector = memo(({ onOpenChange, handleBubbleClose, inPlaceEditTy
contextItems[hasCurrentDoc].isCurrentContext = true;
}

const currentSkill: Skill = {
name: 'editDoc',
icon: {
type: 'emoji',
value: '🖊️',
},
description: 'Edit document',
configSchema: {
items: [],
},
};

setIsLoading(true);
invokeAction(
{
query: inputValue,
resultId,
modelInfo: selectedModel,
contextItems,
selectedSkill: skill,
selectedSkill: currentSkill,
tplConfig: {
canvasEditConfig: {
value: canvasEditConfig as { [key: string]: unknown },
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -284,7 +284,7 @@ export const useInvokeAction = () => {
payload.resultId ||= genActionResultID();
payload.selectedSkill ||= { name: 'commonQnA' };

const { query, modelInfo, contextItems, selectedSkill, resultId, version = 0 } = payload;
const { query, modelInfo, contextItems, selectedSkill, resultId, version = 0, tplConfig = {} } = payload;
const { context, resultHistory } = convertContextItemsToInvokeParams(
contextItems,
(item) =>
Expand All @@ -309,6 +309,7 @@ export const useInvokeAction = () => {
context,
resultHistory,
skillName: selectedSkill?.name,
tplConfig,
};

onUpdateResult(resultId, {
Expand All @@ -322,7 +323,7 @@ export const useInvokeAction = () => {
targetType: target?.entityType,
context,
history: resultHistory,
tplConfig: {},
tplConfig,
status: 'waiting',
steps: [],
errors: [],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,6 @@ export const SearchList = (props: SearchListProps) => {
};

const handleItemClick = (item: ContextItem) => {
console.log('skill', item.title);
if (mode === 'single') {
handleConfirm?.([item]);
setOpen(false);
Expand Down
4 changes: 2 additions & 2 deletions packages/skill-template/src/skills/edit-doc.ts
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,7 @@ export class EditDoc extends BaseSkill {
callEditDoc = async (state: GraphState, config: SkillRunnableConfig): Promise<Partial<GraphState>> => {
const { currentSkill, documents, tplConfig } = config.configurable;

const currentDoc = documents?.find((doc) => doc?.metadata?.isCurrentContext);
const currentDoc = documents?.find((doc) => doc?.metadata?.isCurrentContext || doc?.isCurrent);
const canvasEditConfig = tplConfig?.canvasEditConfig?.value as CanvasEditConfig;

if (!currentDoc?.document) {
Expand All @@ -188,7 +188,7 @@ export class EditDoc extends BaseSkill {
// Filter out documents with isCurrent before proceeding
if (config?.configurable?.documents) {
config.configurable.documents =
config.configurable.documents.filter((doc) => !doc?.metadata?.isCurrentContext) || [];
config.configurable.documents.filter((doc) => !(doc?.metadata?.isCurrentContext || doc?.isCurrent)) || [];
}

// Get selected range and edit type from metadata
Expand Down

0 comments on commit 5c09ec7

Please sign in to comment.