diff --git a/agent/app/service/agents.go b/agent/app/service/agents.go
index 905a9a27f007..86fc60d58298 100644
--- a/agent/app/service/agents.go
+++ b/agent/app/service/agents.go
@@ -696,12 +696,7 @@ func (a AgentService) DeleteAccount(req dto.AgentAccountDeleteReq) error {
}
func (a AgentService) GetFeishuConfig(req dto.AgentFeishuConfigReq) (*dto.AgentFeishuConfig, error) {
- agent, install, err := a.loadAgentAndInstall(req.AgentID)
- if err != nil {
- return nil, err
- }
- _ = install
- conf, err := readOpenclawConfig(agent.ConfigPath)
+ _, _, conf, err := a.loadAgentConfig(req.AgentID)
if err != nil {
return nil, err
}
@@ -710,37 +705,25 @@ func (a AgentService) GetFeishuConfig(req dto.AgentFeishuConfigReq) (*dto.AgentF
}
func (a AgentService) UpdateFeishuConfig(req dto.AgentFeishuConfigUpdateReq) error {
- agent, _, err := a.loadAgentAndInstall(req.AgentID)
- if err != nil {
- return err
- }
- conf, err := readOpenclawConfig(agent.ConfigPath)
- if err != nil {
- return err
- }
- if req.DmPolicy == "" {
- req.DmPolicy = "pairing"
- }
- setFeishuConfig(conf, dto.AgentFeishuConfig{
- Enabled: req.Enabled,
- DmPolicy: req.DmPolicy,
- BotName: req.BotName,
- AppID: req.AppID,
- AppSecret: req.AppSecret,
+ return a.mutateAgentConfig(req.AgentID, func(_ *model.Agent, _ *model.AppInstall, conf map[string]interface{}) error {
+ dmPolicy := req.DmPolicy
+ if dmPolicy == "" {
+ dmPolicy = "pairing"
+ }
+ setFeishuConfig(conf, dto.AgentFeishuConfig{
+ Enabled: req.Enabled,
+ DmPolicy: dmPolicy,
+ BotName: req.BotName,
+ AppID: req.AppID,
+ AppSecret: req.AppSecret,
+ })
+ setFeishuPluginEnabled(conf, req.Enabled)
+ return nil
})
- setFeishuPluginEnabled(conf, req.Enabled)
- if err := writeOpenclawConfigRaw(agent.ConfigPath, conf); err != nil {
- return err
- }
- return nil
}
func (a AgentService) GetTelegramConfig(req dto.AgentTelegramConfigReq) (*dto.AgentTelegramConfig, error) {
- agent, _, err := a.loadAgentAndInstall(req.AgentID)
- if err != nil {
- return nil, err
- }
- conf, err := readOpenclawConfig(agent.ConfigPath)
+ _, _, conf, err := a.loadAgentConfig(req.AgentID)
if err != nil {
return nil, err
}
@@ -749,35 +732,23 @@ func (a AgentService) GetTelegramConfig(req dto.AgentTelegramConfigReq) (*dto.Ag
}
func (a AgentService) UpdateTelegramConfig(req dto.AgentTelegramConfigUpdateReq) error {
- agent, _, err := a.loadAgentAndInstall(req.AgentID)
- if err != nil {
- return err
- }
- conf, err := readOpenclawConfig(agent.ConfigPath)
- if err != nil {
- return err
- }
- if req.DmPolicy == "" {
- req.DmPolicy = "pairing"
- }
- setTelegramConfig(conf, dto.AgentTelegramConfig{
- Enabled: req.Enabled,
- DmPolicy: req.DmPolicy,
- BotToken: req.BotToken,
- Proxy: req.Proxy,
+ return a.mutateAgentConfig(req.AgentID, func(_ *model.Agent, _ *model.AppInstall, conf map[string]interface{}) error {
+ dmPolicy := req.DmPolicy
+ if dmPolicy == "" {
+ dmPolicy = "pairing"
+ }
+ setTelegramConfig(conf, dto.AgentTelegramConfig{
+ Enabled: req.Enabled,
+ DmPolicy: dmPolicy,
+ BotToken: req.BotToken,
+ Proxy: req.Proxy,
+ })
+ return nil
})
- if err := writeOpenclawConfigRaw(agent.ConfigPath, conf); err != nil {
- return err
- }
- return nil
}
func (a AgentService) GetDiscordConfig(req dto.AgentDiscordConfigReq) (*dto.AgentDiscordConfig, error) {
- agent, _, err := a.loadAgentAndInstall(req.AgentID)
- if err != nil {
- return nil, err
- }
- conf, err := readOpenclawConfig(agent.ConfigPath)
+ _, _, conf, err := a.loadAgentConfig(req.AgentID)
if err != nil {
return nil, err
}
@@ -786,39 +757,28 @@ func (a AgentService) GetDiscordConfig(req dto.AgentDiscordConfigReq) (*dto.Agen
}
func (a AgentService) UpdateDiscordConfig(req dto.AgentDiscordConfigUpdateReq) error {
- agent, _, err := a.loadAgentAndInstall(req.AgentID)
- if err != nil {
- return err
- }
- conf, err := readOpenclawConfig(agent.ConfigPath)
- if err != nil {
- return err
- }
- if req.DmPolicy == "" {
- req.DmPolicy = "pairing"
- }
- if req.GroupPolicy == "" {
- req.GroupPolicy = "open"
- }
- setDiscordConfig(conf, dto.AgentDiscordConfig{
- Enabled: req.Enabled,
- DmPolicy: req.DmPolicy,
- GroupPolicy: req.GroupPolicy,
- Token: req.Token,
- Proxy: req.Proxy,
+ return a.mutateAgentConfig(req.AgentID, func(_ *model.Agent, _ *model.AppInstall, conf map[string]interface{}) error {
+ dmPolicy := req.DmPolicy
+ if dmPolicy == "" {
+ dmPolicy = "pairing"
+ }
+ groupPolicy := req.GroupPolicy
+ if groupPolicy == "" {
+ groupPolicy = "open"
+ }
+ setDiscordConfig(conf, dto.AgentDiscordConfig{
+ Enabled: req.Enabled,
+ DmPolicy: dmPolicy,
+ GroupPolicy: groupPolicy,
+ Token: req.Token,
+ Proxy: req.Proxy,
+ })
+ return nil
})
- if err := writeOpenclawConfigRaw(agent.ConfigPath, conf); err != nil {
- return err
- }
- return nil
}
func (a AgentService) GetQQBotConfig(req dto.AgentQQBotConfigReq) (*dto.AgentQQBotConfig, error) {
- agent, install, err := a.loadAgentAndInstall(req.AgentID)
- if err != nil {
- return nil, err
- }
- conf, err := readOpenclawConfig(agent.ConfigPath)
+ _, install, conf, err := a.loadAgentConfig(req.AgentID)
if err != nil {
return nil, err
}
@@ -829,31 +789,18 @@ func (a AgentService) GetQQBotConfig(req dto.AgentQQBotConfigReq) (*dto.AgentQQB
}
func (a AgentService) UpdateQQBotConfig(req dto.AgentQQBotConfigUpdateReq) error {
- agent, _, err := a.loadAgentAndInstall(req.AgentID)
- if err != nil {
- return err
- }
- conf, err := readOpenclawConfig(agent.ConfigPath)
- if err != nil {
- return err
- }
- setQQBotConfig(conf, dto.AgentQQBotConfig{
- Enabled: req.Enabled,
- AppID: req.AppID,
- ClientSecret: req.ClientSecret,
+ return a.mutateAgentConfig(req.AgentID, func(_ *model.Agent, _ *model.AppInstall, conf map[string]interface{}) error {
+ setQQBotConfig(conf, dto.AgentQQBotConfig{
+ Enabled: req.Enabled,
+ AppID: req.AppID,
+ ClientSecret: req.ClientSecret,
+ })
+ return nil
})
- if err := writeOpenclawConfigRaw(agent.ConfigPath, conf); err != nil {
- return err
- }
- return nil
}
func (a AgentService) GetWecomConfig(req dto.AgentWecomConfigReq) (*dto.AgentWecomConfig, error) {
- agent, install, err := a.loadAgentAndInstall(req.AgentID)
- if err != nil {
- return nil, err
- }
- conf, err := readOpenclawConfig(agent.ConfigPath)
+ _, install, conf, err := a.loadAgentConfig(req.AgentID)
if err != nil {
return nil, err
}
@@ -864,24 +811,15 @@ func (a AgentService) GetWecomConfig(req dto.AgentWecomConfigReq) (*dto.AgentWec
}
func (a AgentService) UpdateWecomConfig(req dto.AgentWecomConfigUpdateReq) error {
- agent, _, err := a.loadAgentAndInstall(req.AgentID)
- if err != nil {
- return err
- }
- conf, err := readOpenclawConfig(agent.ConfigPath)
- if err != nil {
- return err
- }
- setWecomConfig(conf, dto.AgentWecomConfig{
- Enabled: req.Enabled,
- DmPolicy: req.DmPolicy,
- BotID: req.BotID,
- Secret: req.Secret,
+ return a.mutateAgentConfig(req.AgentID, func(_ *model.Agent, _ *model.AppInstall, conf map[string]interface{}) error {
+ setWecomConfig(conf, dto.AgentWecomConfig{
+ Enabled: req.Enabled,
+ DmPolicy: req.DmPolicy,
+ BotID: req.BotID,
+ Secret: req.Secret,
+ })
+ return nil
})
- if err := writeOpenclawConfigRaw(agent.ConfigPath, conf); err != nil {
- return err
- }
- return nil
}
func (a AgentService) InstallPlugin(req dto.AgentPluginInstallReq) error {
@@ -1033,6 +971,29 @@ func (a AgentService) loadAgentAndInstall(agentID uint) (*model.Agent, *model.Ap
return agent, &install, nil
}
+func (a AgentService) loadAgentConfig(agentID uint) (*model.Agent, *model.AppInstall, map[string]interface{}, error) {
+ agent, install, err := a.loadAgentAndInstall(agentID)
+ if err != nil {
+ return nil, nil, nil, err
+ }
+ conf, err := readOpenclawConfig(agent.ConfigPath)
+ if err != nil {
+ return nil, nil, nil, err
+ }
+ return agent, install, conf, nil
+}
+
+func (a AgentService) mutateAgentConfig(agentID uint, fn func(agent *model.Agent, install *model.AppInstall, conf map[string]interface{}) error) error {
+ agent, install, conf, err := a.loadAgentConfig(agentID)
+ if err != nil {
+ return err
+ }
+ if err := fn(agent, install, conf); err != nil {
+ return err
+ }
+ return writeOpenclawConfigRaw(agent.ConfigPath, conf)
+}
+
func readOpenclawConfig(configPath string) (map[string]interface{}, error) {
if strings.TrimSpace(configPath) == "" {
return nil, buserr.New("ErrRecordNotFound")
diff --git a/frontend/src/assets/images/ai-agent-copaw.svg b/frontend/src/assets/images/ai-agent-copaw.svg
new file mode 100644
index 000000000000..85f60e201ed3
--- /dev/null
+++ b/frontend/src/assets/images/ai-agent-copaw.svg
@@ -0,0 +1,6 @@
+
diff --git a/frontend/src/assets/images/ai-agent-openclaw.svg b/frontend/src/assets/images/ai-agent-openclaw.svg
new file mode 100644
index 000000000000..95c941eef7d3
--- /dev/null
+++ b/frontend/src/assets/images/ai-agent-openclaw.svg
@@ -0,0 +1,17 @@
+
diff --git a/frontend/src/views/ai/agents/agent/index.vue b/frontend/src/views/ai/agents/agent/index.vue
index 5ca85ff766e5..92b46988b4cb 100644
--- a/frontend/src/views/ai/agents/agent/index.vue
+++ b/frontend/src/views/ai/agents/agent/index.vue
@@ -21,17 +21,22 @@
prop="name"
min-width="120"
/>
-
+
- {{
- row.agentType === 'copaw'
- ? $t('aiTools.agents.copawType')
- : $t('aiTools.agents.openclawType')
- }}
+
+
![]()
+
+ {{
+ row.agentType === 'copaw'
+ ? $t('aiTools.agents.copawType')
+ : $t('aiTools.agents.openclawType')
+ }}
+
+
@@ -150,6 +155,8 @@ import DockerStatus from '@/views/container/docker-status/index.vue';
import { getAgentProviderDisplayName } from '@/utils/agent';
import { routerToFileWithPath } from '@/utils/router';
import NoApp from '@/views/app-store/apps/no-app/index.vue';
+import openclawIcon from '@/assets/images/ai-agent-openclaw.svg';
+import copawIcon from '@/assets/images/ai-agent-copaw.svg';
const items = ref([]);
const loading = ref(false);
@@ -372,4 +379,17 @@ onMounted(async () => {
align-items: center;
gap: 4px;
}
+
+.agent-type-cell {
+ display: inline-flex;
+ align-items: center;
+ gap: 6px;
+}
+
+.agent-type-icon {
+ width: 16px;
+ height: 16px;
+ flex: 0 0 16px;
+ object-fit: contain;
+}