feat: add managed llm summaries and memory timeline
ci / verify (push) Canceled after 0s

This commit is contained in:
Codex Local
2026-08-30 10:51:32 +08:00
parent 47f8a164fa
commit 962dd1a063
22 changed files with 1417 additions and 86 deletions
+24 -11
View File
@@ -18,7 +18,8 @@ import (
)
type GenerationInput struct {
Content string
TenantID string
Content string
}
type GenerationResult struct {
@@ -89,13 +90,21 @@ func safePolicyToken(value string) string {
}
type ArkGenerator struct {
endpoint string
apiKey string
model string
client *http.Client
endpoint string
apiKey string
model string
provider string
temperature float64
maxTokens int
client *http.Client
}
func NewArkGenerator(baseURL, apiKey, model string, timeout time.Duration) (*ArkGenerator, error) {
return NewCompatibleGenerator("ark", baseURL, apiKey, model, 0.2, 1200, timeout)
}
func NewCompatibleGenerator(provider, baseURL, apiKey, model string, temperature float64, maxTokens int, timeout time.Duration) (*ArkGenerator, error) {
provider = strings.ToLower(strings.TrimSpace(provider))
baseURL = strings.TrimRight(strings.TrimSpace(baseURL), "/")
apiKey = strings.TrimSpace(apiKey)
model = strings.TrimSpace(model)
@@ -103,11 +112,15 @@ func NewArkGenerator(baseURL, apiKey, model string, timeout time.Duration) (*Ark
if err != nil || parsed.Host == "" || (parsed.Scheme != "http" && parsed.Scheme != "https") {
return nil, errors.New("Ark base URL must be an absolute HTTP(S) URL")
}
if apiKey == "" || model == "" || timeout <= 0 {
return nil, errors.New("Ark API key, content model and positive timeout are required")
if provider != "ark" && provider != "openai_compatible" {
return nil, errors.New("content model provider must be ark or openai_compatible")
}
if apiKey == "" || model == "" || timeout <= 0 || temperature < 0 || temperature > 2 || maxTokens < 256 || maxTokens > 8192 {
return nil, errors.New("content model credentials and valid generation parameters are required")
}
return &ArkGenerator{
endpoint: baseURL + "/chat/completions", apiKey: apiKey, model: model,
provider: provider, temperature: temperature, maxTokens: maxTokens,
client: &http.Client{Timeout: timeout},
}, nil
}
@@ -123,8 +136,8 @@ func (g *ArkGenerator) Generate(ctx context.Context, input GenerationInput) (Gen
{"role": "system", "content": "你是长者口述内容整理助手。只依据输入字幕生成可人工核对的候选,不补充未出现的事实,不把推断写成事实。必须返回JSON对象,字段为summary、keywords、open_topic、story_title、story_content、fact_content、confidence。summary概括本次内容,keywords是1至8个简短关键词字符串组成的数组,open_topic给出一个温和的后续话题,story和fact保留原意,confidence取0到1。"},
{"role": "user", "content": content},
},
"temperature": 0.2,
"max_tokens": 1200,
"temperature": g.temperature,
"max_tokens": g.maxTokens,
"response_format": map[string]string{"type": "json_object"},
}
encoded, err := json.Marshal(requestBody)
@@ -181,8 +194,8 @@ func (g *ArkGenerator) Generate(ctx context.Context, input GenerationInput) (Gen
if !validGeneratedContent(result) {
return GenerationResult{}, outbox.Retryable(errors.New("Ark structured content failed validation"))
}
result.ModelRef = "ark:" + g.model
result.PromptVersion = "story-ark-json-v1"
result.ModelRef = g.provider + ":" + g.model
result.PromptVersion = "story-" + g.provider + "-json-v2"
result.AllowStory = true
return result, nil
}