Skip to content

Commit e8f0f4d

Browse files
feat: support session delete for hermes-agent
1 parent 074c0ab commit e8f0f4d

22 files changed

Lines changed: 164 additions & 40 deletions

File tree

agent/app/api/v2/agents.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,26 @@ func (b *BaseApi) RenameHermesChatSession(c *gin.Context) {
275275
helper.Success(c)
276276
}
277277

278+
// @Tags AI
279+
// @Summary Delete Hermes chat session
280+
// @Accept json
281+
// @Param request body dto.AgentHermesChatSessionDeleteReq true "request"
282+
// @Success 200
283+
// @Security ApiKeyAuth
284+
// @Security Timestamp
285+
// @Router /ai/agents/hermes/chat/sessions/delete [post]
286+
func (b *BaseApi) DeleteHermesChatSession(c *gin.Context) {
287+
var req dto.AgentHermesChatSessionDeleteReq
288+
if err := helper.CheckBindAndValidate(&req, c); err != nil {
289+
return
290+
}
291+
if err := agentService.DeleteHermesChatSession(req); err != nil {
292+
helper.BadRequest(c, err)
293+
return
294+
}
295+
helper.Success(c)
296+
}
297+
278298
// @Tags AI
279299
// @Summary Get Providers
280300
// @Success 200 {array} dto.ProviderInfo

agent/app/dto/agents.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,11 @@ type AgentHermesChatSessionRenameReq struct {
115115
Title string `json:"title" validate:"required"`
116116
}
117117

118+
type AgentHermesChatSessionDeleteReq struct {
119+
AgentID uint `json:"agentId" validate:"required"`
120+
ID string `json:"id" validate:"required"`
121+
}
122+
118123
type AgentOverview struct {
119124
Snapshot AgentOverviewSnapshot `json:"snapshot"`
120125
}

agent/app/service/agents.go

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ type IAgentService interface {
4141
UpdateModelConfig(req dto.AgentModelConfigUpdateReq) error
4242
GetHermesChatSessions(req dto.AgentIDReq) ([]dto.AgentHermesChatSessionItem, error)
4343
RenameHermesChatSession(req dto.AgentHermesChatSessionRenameReq) error
44+
DeleteHermesChatSession(req dto.AgentHermesChatSessionDeleteReq) error
4445
GetOverview(req dto.AgentOverviewReq) (*dto.AgentOverview, error)
4546
GetProviders() ([]dto.ProviderInfo, error)
4647
GetSecurityConfig(req dto.AgentIDReq) (*dto.AgentSecurityConfig, error)
@@ -456,7 +457,7 @@ func (a AgentService) GetModelConfig(req dto.AgentIDReq) (*dto.AgentModelConfig,
456457
if err != nil {
457458
return nil, err
458459
}
459-
model, err := resolveHermesConfiguredModelIDStrict(account, accountModels, cfg.Model.Default)
460+
model, err := resolveHermesConfiguredModelID(account, accountModels, cfg.Model.Default)
460461
if err != nil {
461462
return nil, err
462463
}
@@ -905,7 +906,13 @@ func (a AgentService) UpdateOtherConfig(req dto.AgentOtherConfigUpdateReq) error
905906
if err != nil {
906907
return err
907908
}
908-
return writeHermesConfig(path.Dir(agent.ConfigPath), account, agent.Model, strings.TrimSpace(req.UserTimezone))
909+
if err := writeHermesConfig(path.Dir(agent.ConfigPath), account, agent.Model, strings.TrimSpace(req.UserTimezone)); err != nil {
910+
return err
911+
}
912+
return NewIAppInstalledService().Operate(request.AppInstalledOperate{
913+
InstallId: install.ID,
914+
Operate: constant.Restart,
915+
})
909916
}
910917
if err := ensureContainerRunning(install.ContainerName); err != nil {
911918
return err
@@ -921,7 +928,10 @@ func (a AgentService) UpdateOtherConfig(req dto.AgentOtherConfigUpdateReq) error
921928
if err := writeOpenclawConfigRaw(agent.ConfigPath, conf); err != nil {
922929
return err
923930
}
924-
return setOpenclawNPMRegistry(install.ContainerName, req.NPMRegistry)
931+
if err := setOpenclawNPMRegistry(install.ContainerName, req.NPMRegistry); err != nil {
932+
return err
933+
}
934+
return nil
925935
}
926936

927937
func (a AgentService) GetConfigFile(req dto.AgentConfigFileReq) (*dto.AgentConfigFile, error) {

agent/app/service/agents_hermes.go

Lines changed: 5 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -54,17 +54,6 @@ func buildHermesDockerExecArgs(containerName string, hermesArgs ...string) []str
5454
return buildHermesDockerExecCommandArgs(containerName, "hermes", hermesArgs...)
5555
}
5656

57-
func buildHermesSkillUninstallArgs(containerName, skillName string) []string {
58-
return buildHermesDockerExecCommandArgs(
59-
containerName,
60-
"sh",
61-
"-lc",
62-
fmt.Sprintf(`printf 'y\n' | %s skills uninstall "$1"`, hermesExecutablePath),
63-
"sh",
64-
skillName,
65-
)
66-
}
67-
6857
func writeHermesConfig(confDir string, account *model.AgentAccount, modelName string, timezone string) error {
6958
if strings.TrimSpace(confDir) == "" {
7059
return fmt.Errorf("config dir is required")
@@ -382,29 +371,21 @@ func resolveHermesModel(sourceProvider, targetProvider, modelName string) string
382371
return target
383372
}
384373

385-
func resolveHermesConfiguredModelID(account *model.AgentAccount, accountModels []dto.AgentAccountModel, configuredModel string) string {
374+
func resolveHermesConfiguredModelID(account *model.AgentAccount, accountModels []dto.AgentAccountModel, configuredModel string) (string, error) {
386375
if account == nil {
387-
return ""
376+
return "", buserr.New("ErrAgentModelNotInAccount")
388377
}
389378
configuredModel = strings.TrimSpace(configuredModel)
390379
if configuredModel == "" {
391-
return ""
380+
return "", buserr.New("ErrAgentModelNotInAccount")
392381
}
393382
provider := resolveHermesProvider(account.Provider)
394383
for _, item := range accountModels {
395384
if resolveHermesModel(account.Provider, provider, item.ID) == configuredModel {
396-
return item.ID
385+
return item.ID, nil
397386
}
398387
}
399-
return ""
400-
}
401-
402-
func resolveHermesConfiguredModelIDStrict(account *model.AgentAccount, accountModels []dto.AgentAccountModel, configuredModel string) (string, error) {
403-
modelID := resolveHermesConfiguredModelID(account, accountModels, configuredModel)
404-
if modelID == "" {
405-
return "", buserr.New("ErrAgentModelNotInAccount")
406-
}
407-
return modelID, nil
388+
return "", buserr.New("ErrAgentModelNotInAccount")
408389
}
409390

410391
func resolveHermesEnvEntries(account *model.AgentAccount) []hermesEnvEntry {

agent/app/service/agents_hermes_chat.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,22 @@ func (a AgentService) RenameHermesChatSession(req dto.AgentHermesChatSessionRena
4343
return err
4444
}
4545

46+
func (a AgentService) DeleteHermesChatSession(req dto.AgentHermesChatSessionDeleteReq) error {
47+
agent, install, err := a.loadAgentAndInstall(req.AgentID)
48+
if err != nil {
49+
return err
50+
}
51+
if agent.AgentType != constant.AppHermesAgent {
52+
return fmt.Errorf("%s does not support", agent.AgentType)
53+
}
54+
55+
_, err = cmd.NewCommandMgr(cmd.WithTimeout(20*time.Second)).RunWithStdout(
56+
"docker",
57+
buildHermesDockerExecArgs(install.ContainerName, "sessions", "delete", req.ID, "--yes")...,
58+
)
59+
return err
60+
}
61+
4662
func listHermesChatSessionsFromStateDB(stateDBPath string) ([]dto.AgentHermesChatSessionItem, error) {
4763
if !files.NewFileOp().Stat(stateDBPath) {
4864
return []dto.AgentHermesChatSessionItem{}, nil

agent/app/service/agents_skills.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,14 @@ func (a AgentService) UninstallSkill(req dto.AgentSkillUninstallReq) error {
166166
}
167167
return cmd.NewCommandMgr(cmd.WithTimeout(5*time.Minute)).Run(
168168
"docker",
169-
buildHermesSkillUninstallArgs(install.ContainerName, req.Name)...,
169+
buildHermesDockerExecCommandArgs(
170+
install.ContainerName,
171+
"sh",
172+
"-lc",
173+
fmt.Sprintf(`printf 'y\n' | %s skills uninstall "$1"`, hermesExecutablePath),
174+
"sh",
175+
req.Name,
176+
)...,
170177
)
171178
}
172179

agent/router/ro_ai.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ func (a *AIToolsRouter) InitRouter(Router *gin.RouterGroup) {
5252
aiToolsRouter.POST("/agents/model/update", baseApi.UpdateAgentModelConfig)
5353
aiToolsRouter.POST("/agents/hermes/chat/sessions", baseApi.GetHermesChatSessions)
5454
aiToolsRouter.POST("/agents/hermes/chat/sessions/rename", baseApi.RenameHermesChatSession)
55+
aiToolsRouter.POST("/agents/hermes/chat/sessions/delete", baseApi.DeleteHermesChatSession)
5556
aiToolsRouter.POST("/agents/overview", baseApi.GetAgentOverview)
5657
aiToolsRouter.GET("/agents/providers", baseApi.GetAgentProviders)
5758
aiToolsRouter.POST("/agents/accounts", baseApi.CreateAgentAccount)

frontend/src/api/interface/ai.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,11 @@ export namespace AI {
343343
title: string;
344344
}
345345

346+
export interface AgentHermesChatSessionDeleteReq {
347+
agentId: number;
348+
id: string;
349+
}
350+
346351
export interface AgentOverviewReq {
347352
agentId: number;
348353
}

frontend/src/api/modules/ai.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,10 @@ export const renameAgentHermesChatSession = (req: AI.AgentHermesChatSessionRenam
142142
return http.post(`/ai/agents/hermes/chat/sessions/rename`, req);
143143
};
144144

145+
export const deleteAgentHermesChatSession = (req: AI.AgentHermesChatSessionDeleteReq) => {
146+
return http.post(`/ai/agents/hermes/chat/sessions/delete`, req);
147+
};
148+
145149
export const getAgentOverview = (req: AI.AgentOverviewReq) => {
146150
return http.post<AI.AgentOverview>(`/ai/agents/overview`, req, TimeoutEnum.T_5M);
147151
};

frontend/src/lang/modules/en.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -783,6 +783,8 @@ const message = {
783783
hermesChatEmptyHint: 'Select a session or click New Chat',
784784
hermesChatTitlePlaceholder: 'Enter session title',
785785
hermesChatRenameSuccess: 'Session title updated',
786+
hermesChatDeleteConfirm: 'Delete session {0}?',
787+
hermesChatDeleteSuccess: 'Session deleted',
786788
weixin: 'Weixin',
787789
wecom: 'WeCom',
788790
dingtalk: 'DingTalk',

0 commit comments

Comments
 (0)