feat: 支持外部工具集快速复制并自动进入编辑状态
parent
b5d40e876b
commit
16051c1f7a
|
|
@ -5,7 +5,7 @@ alwaysApply: true
|
|||
## 核心规则
|
||||
|
||||
1. **提交每次修改** — 每次任务执行后默认提交修改代码到远程仓库,或者用户说“提交代码”,执行git commit 并且要把commit 信息展示出来。默认是全部本地修改都提交,包括不是本次修改的也提交, 不需要提问用户确认。commit 信息你需要总结本次修改内容,不能是代码。例如:“修复登录页面的错误提示”.最后一定要执行 git push 推送到远程仓库。默认直接提交当前分支,包括main分支。
|
||||
2. **方案性内容** - 当用户需求,如果是方案性内容,你首先要评估,有没有更好的方案,而不是执行。更好的方案,你可以搜索类似阿里、字节等大厂的方案来参考并给出建议。
|
||||
2. **方案性内容** - 当用户需求,如果是方案性内容,你首先要评估,有没有更好的方案,而不是执行。更好的方案,你可以搜索类似anthropic、openai、google、meta、阿里、字节等大厂的方案来参考并给出建议。优先参考anthropic、openai、google的方案。如果当前项目方案或者设计明确不合理,应该强烈建议修正方案。如果是复杂的修改,可以给出短期和中期修正方案。尽可能都是短期内直接修正,避免问题遗留。
|
||||
3. **代码修改** - 任何时候,当存在字段格式不对,变量名不对,表使用不对等,禁止做兼容修改,必须按唯一性修改。比如约定字段是string,正确:只能传string;错误:可以传int。 比如约定字段名是data,正确:只能传data;错误:可以传sourceData或者data。
|
||||
4. **语言** - 永远使用中文跟用户沟通,专有名词可以用英文。
|
||||
5. **文档** - 在用户没有明确要求先提供文档时,禁止创建文档。避免生产垃圾文件。用户明确要求提供文档时,才创建文档。
|
||||
|
|
|
|||
|
|
@ -21,6 +21,7 @@ interface CapabilitySettingsProps {
|
|||
onEditSkill: (skillId: string) => void;
|
||||
onDeleteSkill: (skillId: string) => Promise<void>;
|
||||
onCreateExternalTool: () => void;
|
||||
onCopyExternalTool: (pluginId: string) => void;
|
||||
onEditExternalTool: (pluginId: string) => void;
|
||||
onDeleteExternalTool: (pluginId: string) => Promise<void>;
|
||||
markDirty: () => void;
|
||||
|
|
@ -42,6 +43,7 @@ export default function CapabilitySettings({
|
|||
onEditSkill,
|
||||
onDeleteSkill,
|
||||
onCreateExternalTool,
|
||||
onCopyExternalTool,
|
||||
onEditExternalTool,
|
||||
onDeleteExternalTool,
|
||||
markDirty,
|
||||
|
|
@ -78,6 +80,7 @@ export default function CapabilitySettings({
|
|||
onEditSkill={onEditSkill}
|
||||
onDeleteSkill={onDeleteSkill}
|
||||
onCreateExternalTool={onCreateExternalTool}
|
||||
onCopyExternalTool={onCopyExternalTool}
|
||||
onEditExternalTool={onEditExternalTool}
|
||||
onDeleteExternalTool={onDeleteExternalTool}
|
||||
/>
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
import { ApiOutlined, DatabaseOutlined, DeleteOutlined, EditOutlined, PlusOutlined, ToolOutlined } from '@ant-design/icons';
|
||||
import { ApiOutlined, CopyOutlined, DatabaseOutlined, DeleteOutlined, EditOutlined, PlusOutlined, ToolOutlined } from '@ant-design/icons';
|
||||
import { Button, Card, Collapse, Input, List, Popconfirm, Space, Tag } from 'antd';
|
||||
import { Agent } from '../../../../api';
|
||||
import { STATUS_TAG } from '../../constants';
|
||||
|
|
@ -11,6 +11,7 @@ interface KnowledgeSettingsPanelProps {
|
|||
onEditSkill: (skillId: string) => void;
|
||||
onDeleteSkill: (skillId: string) => Promise<void>;
|
||||
onCreateExternalTool: () => void;
|
||||
onCopyExternalTool: (pluginId: string) => void;
|
||||
onEditExternalTool: (pluginId: string) => void;
|
||||
onDeleteExternalTool: (pluginId: string) => Promise<void>;
|
||||
}
|
||||
|
|
@ -23,6 +24,7 @@ export default function KnowledgeSettingsPanel({
|
|||
onEditSkill,
|
||||
onDeleteSkill,
|
||||
onCreateExternalTool,
|
||||
onCopyExternalTool,
|
||||
onEditExternalTool,
|
||||
onDeleteExternalTool,
|
||||
}: KnowledgeSettingsPanelProps) {
|
||||
|
|
@ -193,6 +195,9 @@ export default function KnowledgeSettingsPanel({
|
|||
}
|
||||
extra={
|
||||
<Space>
|
||||
<Button type="text" size="small" icon={<CopyOutlined />} onClick={() => onCopyExternalTool(plugin.id)}>
|
||||
复制
|
||||
</Button>
|
||||
<Button type="text" size="small" icon={<EditOutlined />} onClick={() => onEditExternalTool(plugin.id)}>
|
||||
编辑
|
||||
</Button>
|
||||
|
|
|
|||
|
|
@ -245,6 +245,43 @@ export function useAgentEditor({ id, isNew, form, message, navigate }: UseAgentE
|
|||
}
|
||||
};
|
||||
|
||||
const handleCopyPlugin = async (pluginId: string) => {
|
||||
if (!id || !agent) return;
|
||||
const plugin = agent.plugins?.find((p) => p.id === pluginId);
|
||||
if (!plugin) return;
|
||||
|
||||
try {
|
||||
const copyPayload = {
|
||||
name: `${plugin.name}-copy`,
|
||||
description: plugin.description,
|
||||
baseUrl: plugin.baseUrl,
|
||||
authType: plugin.authType,
|
||||
authConfig: plugin.authConfig,
|
||||
apis: plugin.apis.map((api) => ({
|
||||
name: `${api.name}-copy`,
|
||||
description: api.description,
|
||||
method: api.method,
|
||||
path: api.path,
|
||||
headers: api.headers,
|
||||
parametersSchema: api.parametersSchema,
|
||||
})),
|
||||
};
|
||||
const newPlugin = await AgentAPI.bindPlugin(id, copyPayload as any);
|
||||
setAgent((prev) => {
|
||||
if (!prev) return prev;
|
||||
return {
|
||||
...prev,
|
||||
plugins: [...(prev.plugins || []), newPlugin],
|
||||
};
|
||||
});
|
||||
message.success('外部工具复制成功');
|
||||
return newPlugin;
|
||||
} catch (e: any) {
|
||||
message.error('外部工具复制失败:' + (e?.message ?? e));
|
||||
throw e;
|
||||
}
|
||||
};
|
||||
|
||||
const beforeUploadKnowledge = async (file: any) => {
|
||||
if (!id) {
|
||||
message.warning('请先保存智能体基础信息后再上传');
|
||||
|
|
@ -352,6 +389,7 @@ export function useAgentEditor({ id, isNew, form, message, navigate }: UseAgentE
|
|||
handleDeleteKnowledge,
|
||||
handleDeleteSkill,
|
||||
handleDeletePlugin,
|
||||
handleCopyPlugin,
|
||||
liveAgent,
|
||||
currentName,
|
||||
markDirty,
|
||||
|
|
|
|||
|
|
@ -57,6 +57,7 @@ export default function AgentEditor() {
|
|||
handleDeleteKnowledge,
|
||||
handleDeleteSkill,
|
||||
handleDeletePlugin,
|
||||
handleCopyPlugin,
|
||||
liveAgent,
|
||||
currentName,
|
||||
markDirty,
|
||||
|
|
@ -103,6 +104,17 @@ export default function AgentEditor() {
|
|||
setEditingPluginId(null);
|
||||
setExternalToolEditorOpen(true);
|
||||
}}
|
||||
onCopyExternalTool={async (pluginId) => {
|
||||
try {
|
||||
const newPlugin = await handleCopyPlugin(pluginId);
|
||||
if (newPlugin) {
|
||||
setEditingPluginId(newPlugin.id);
|
||||
setExternalToolEditorOpen(true);
|
||||
}
|
||||
} catch (e) {
|
||||
// error handled in hook
|
||||
}
|
||||
}}
|
||||
onEditExternalTool={(pluginId) => {
|
||||
setEditingPluginId(pluginId);
|
||||
setExternalToolEditorOpen(true);
|
||||
|
|
|
|||
Loading…
Reference in New Issue