feat: clean up temporary Lingma sessions
This commit is contained in:
@@ -34,6 +34,9 @@ go run .\cmd\lingma-ipc-proxy --port 8095 --session-mode auto
|
|||||||
- `--mode`
|
- `--mode`
|
||||||
- `--shell-type`
|
- `--shell-type`
|
||||||
- `--session-mode`
|
- `--session-mode`
|
||||||
|
- `reuse`: keep using the sticky Lingma session
|
||||||
|
- `fresh`: create a temporary session for the request and delete it after completion
|
||||||
|
- `auto`: single-turn requests reuse; requests with system/history use a temporary fresh session and delete it after completion
|
||||||
- `--timeout`
|
- `--timeout`
|
||||||
|
|
||||||
## Environment
|
## Environment
|
||||||
|
|||||||
@@ -192,7 +192,7 @@ func (s *Service) generateLocked(
|
|||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
req ChatRequest,
|
req ChatRequest,
|
||||||
onDelta func(string),
|
onDelta func(string),
|
||||||
) (*ChatResult, error) {
|
) (result *ChatResult, err error) {
|
||||||
requestCtx, cancel := context.WithTimeout(ctx, s.cfg.Timeout)
|
requestCtx, cancel := context.WithTimeout(ctx, s.cfg.Timeout)
|
||||||
defer cancel()
|
defer cancel()
|
||||||
|
|
||||||
@@ -214,6 +214,14 @@ func (s *Service) generateLocked(
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
defer func() {
|
||||||
|
if effectiveMode == SessionModeReuse || strings.TrimSpace(sessionID) == "" {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
cleanupCtx, cleanupCancel := context.WithTimeout(context.Background(), 10*time.Second)
|
||||||
|
defer cleanupCancel()
|
||||||
|
_ = s.deleteSessionLocked(cleanupCtx, ipcClient, sessionID)
|
||||||
|
}()
|
||||||
|
|
||||||
requestID := lingmaipc.CreateRequestID("serve")
|
requestID := lingmaipc.CreateRequestID("serve")
|
||||||
meta := lingmaipc.CreateMeta(lingmaipc.MetaOptions{
|
meta := lingmaipc.CreateMeta(lingmaipc.MetaOptions{
|
||||||
@@ -261,7 +269,8 @@ func (s *Service) generateLocked(
|
|||||||
return nil, fmt.Errorf("Lingma IPC response remained incomplete before timeout. Partial reply: %s", truncate(runResult.AssistantText, 120))
|
return nil, fmt.Errorf("Lingma IPC response remained incomplete before timeout. Partial reply: %s", truncate(runResult.AssistantText, 120))
|
||||||
}
|
}
|
||||||
|
|
||||||
return s.buildChatResult(req, sessionID, requestID, prompt, runResult, effectiveMode), nil
|
result = s.buildChatResult(req, sessionID, requestID, prompt, runResult, effectiveMode)
|
||||||
|
return result, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Service) buildChatResult(
|
func (s *Service) buildChatResult(
|
||||||
@@ -437,6 +446,23 @@ func (s *Service) runPromptLocked(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *Service) deleteSessionLocked(ctx context.Context, client *lingmaipc.Client, sessionID string) error {
|
||||||
|
sessionID = strings.TrimSpace(sessionID)
|
||||||
|
if sessionID == "" {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := client.Request(ctx, "chat/deleteSessionById", map[string]any{
|
||||||
|
"sessionId": sessionID,
|
||||||
|
}, nil); err == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return client.Request(ctx, "chat/deleteSessionById", map[string]any{
|
||||||
|
"id": sessionID,
|
||||||
|
}, nil)
|
||||||
|
}
|
||||||
|
|
||||||
func resolveSessionMode(req ChatRequest, configured SessionMode) SessionMode {
|
func resolveSessionMode(req ChatRequest, configured SessionMode) SessionMode {
|
||||||
if configured != SessionModeAuto {
|
if configured != SessionModeAuto {
|
||||||
return configured
|
return configured
|
||||||
|
|||||||
Reference in New Issue
Block a user