mirror of
https://wget.la/https://github.com/leookun/cursor-byok
synced 2026-08-18 03:57:06 +08:00
fix: 修复502导致的内存泄漏问题
This commit is contained in:
@@ -25,8 +25,8 @@ type artifactRecorder struct {
|
|||||||
type artifactSession struct {
|
type artifactSession struct {
|
||||||
conversationID string
|
conversationID string
|
||||||
turnSeq int64
|
turnSeq int64
|
||||||
requestPayload map[string]any
|
requestPrefix requestArtifactPrefix
|
||||||
summaryPayload map[string]any
|
hasRequestPrefix bool
|
||||||
}
|
}
|
||||||
|
|
||||||
type requestArtifactPrefix struct {
|
type requestArtifactPrefix struct {
|
||||||
@@ -57,14 +57,22 @@ func (recorder *artifactRecorder) RecordLLMRequest(requestID string, _ string, m
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
session.requestPayload = cloneStringAnyMap(payload)
|
prefix, hasPrefix, prefixErr := decodeRequestPrefixPayload(payload)
|
||||||
|
session.requestPrefix = requestArtifactPrefix{}
|
||||||
|
session.hasRequestPrefix = false
|
||||||
|
if prefixErr == nil && hasPrefix && prefix != nil {
|
||||||
|
session.requestPrefix = *prefix
|
||||||
|
session.hasRequestPrefix = true
|
||||||
|
}
|
||||||
recorder.mu.Lock()
|
recorder.mu.Lock()
|
||||||
recorder.sessions[artifactSessionKey(requestID, modelCallID)] = session
|
recorder.sessions[artifactSessionKey(requestID, modelCallID)] = session
|
||||||
recorder.mu.Unlock()
|
recorder.mu.Unlock()
|
||||||
if prefix, ok, err := decodeRequestPrefixPayload(session.requestPayload); err == nil && ok && prefix != nil {
|
if prefixErr == nil && hasPrefix && prefix != nil {
|
||||||
recorder.persistLatestRequestPrefix(session.conversationID, requestID, modelCallID, prefix)
|
recorder.persistLatestRequestPrefix(session.conversationID, requestID, modelCallID, prefix)
|
||||||
}
|
}
|
||||||
recorder.debug.LogProviderArtifact(context.Background(), requestID, session.conversationID, modelCallID, "llm_request", session.requestPayload)
|
// The payload is serialized synchronously for debug output and is deliberately
|
||||||
|
// not retained in sessions: it can contain the entire replayed conversation.
|
||||||
|
recorder.debug.LogProviderArtifact(context.Background(), requestID, session.conversationID, modelCallID, "llm_request", payload)
|
||||||
return "", nil
|
return "", nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -86,17 +94,16 @@ func (recorder *artifactRecorder) RecordLLMSummary(requestID string, _ string, m
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
session.summaryPayload = cloneStringAnyMap(payload)
|
if session.hasRequestPrefix {
|
||||||
|
if tokens := readInt64Value(payload["prompt_tokens_total"]); tokens > 0 {
|
||||||
|
session.requestPrefix.PromptTokensTotal = tokens
|
||||||
|
}
|
||||||
recorder.mu.Lock()
|
recorder.mu.Lock()
|
||||||
recorder.sessions[artifactSessionKey(requestID, modelCallID)] = session
|
recorder.sessions[artifactSessionKey(requestID, modelCallID)] = session
|
||||||
recorder.mu.Unlock()
|
recorder.mu.Unlock()
|
||||||
if prefix, ok, err := decodeRequestPrefixPayload(session.requestPayload); err == nil && ok && prefix != nil {
|
recorder.persistLatestRequestPrefix(session.conversationID, requestID, modelCallID, &session.requestPrefix)
|
||||||
if tokens := readInt64Value(session.summaryPayload["prompt_tokens_total"]); tokens > 0 {
|
|
||||||
prefix.PromptTokensTotal = tokens
|
|
||||||
}
|
}
|
||||||
recorder.persistLatestRequestPrefix(session.conversationID, requestID, modelCallID, prefix)
|
recorder.debug.LogProviderArtifact(context.Background(), requestID, session.conversationID, modelCallID, "llm_summary", payload)
|
||||||
}
|
|
||||||
recorder.debug.LogProviderArtifact(context.Background(), requestID, session.conversationID, modelCallID, "llm_summary", session.summaryPayload)
|
|
||||||
return "", nil
|
return "", nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -10,21 +10,6 @@ import (
|
|||||||
modeladapter "cursor/internal/backend/agent/model"
|
modeladapter "cursor/internal/backend/agent/model"
|
||||||
)
|
)
|
||||||
|
|
||||||
func cloneStringAnyMap(value map[string]any) map[string]any {
|
|
||||||
if len(value) == 0 {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
payload, err := json.Marshal(value)
|
|
||||||
if err != nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
var decoded map[string]any
|
|
||||||
if err := json.Unmarshal(payload, &decoded); err != nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return decoded
|
|
||||||
}
|
|
||||||
|
|
||||||
func parseRFC3339Time(value string) time.Time {
|
func parseRFC3339Time(value string) time.Time {
|
||||||
trimmed := strings.TrimSpace(value)
|
trimmed := strings.TrimSpace(value)
|
||||||
if trimmed == "" {
|
if trimmed == "" {
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ func (gateway *DefaultProviderGateway) StartStream(ctx context.Context, req Prov
|
|||||||
if ctx == nil {
|
if ctx == nil {
|
||||||
ctx = context.Background()
|
ctx = context.Background()
|
||||||
}
|
}
|
||||||
|
defer releaseArtifactSession(req.Observer, req.RequestID, req.ModelCallID)
|
||||||
requestKnobs := make(map[string]any, len(req.RequestKnobs)+2)
|
requestKnobs := make(map[string]any, len(req.RequestKnobs)+2)
|
||||||
for key, value := range req.RequestKnobs {
|
for key, value := range req.RequestKnobs {
|
||||||
requestKnobs[key] = value
|
requestKnobs[key] = value
|
||||||
@@ -60,3 +61,15 @@ func (gateway *DefaultProviderGateway) StartStream(ctx context.Context, req Prov
|
|||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type artifactSessionCleaner interface {
|
||||||
|
ClearActiveArtifacts(requestID string, modelCallID string)
|
||||||
|
}
|
||||||
|
|
||||||
|
func releaseArtifactSession(observer modeladapter.LLMArtifactObserver, requestID string, modelCallID string) {
|
||||||
|
cleaner, ok := observer.(artifactSessionCleaner)
|
||||||
|
if !ok {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
cleaner.ClearActiveArtifacts(requestID, modelCallID)
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user