feat: support file-aware model switch and update tech docs

This commit is contained in:
2026-03-09 17:38:13 +08:00
parent 52b8dbb835
commit bd41f48971
4 changed files with 245 additions and 137 deletions

View File

@@ -46,9 +46,11 @@ type FeishuConfig struct {
}
type LLMConfig struct {
BaseURL string
APIKey string
Model string
BaseURL string
APIKey string
Model string
FileModel string
FilePromptMode string
}
type SecurityConfig struct {
@@ -94,9 +96,11 @@ func Load() (Config, error) {
EventPath: defaultIfEmpty(os.Getenv("FEISHU_EVENT_PATH"), "/feishu/events"),
},
LLM: LLMConfig{
BaseURL: strings.TrimRight(defaultIfEmpty(os.Getenv("LLM_BASE_URL"), "https://api.openai.com/v1"), "/"),
APIKey: strings.TrimSpace(os.Getenv("LLM_API_KEY")),
Model: defaultIfEmpty(os.Getenv("LLM_MODEL"), "gpt-4o-mini"),
BaseURL: strings.TrimRight(defaultIfEmpty(os.Getenv("LLM_BASE_URL"), "https://api.openai.com/v1"), "/"),
APIKey: strings.TrimSpace(os.Getenv("LLM_API_KEY")),
Model: defaultIfEmpty(os.Getenv("LLM_MODEL"), "gpt-4o-mini"),
FileModel: defaultIfEmpty(os.Getenv("LLM_FILE_MODEL"), defaultIfEmpty(os.Getenv("LLM_MODEL"), "gpt-4o-mini")),
FilePromptMode: normalizeFilePromptMode(defaultIfEmpty(os.Getenv("LLM_FILE_PROMPT_MODE"), "user_content_file_parts")),
},
SQLitePath: defaultIfEmpty(os.Getenv("SQLITE_PATH"), filepath.Join(defaultDataDir, "laodingbot.db")),
WebSearch: WebSearchConfig{
@@ -155,6 +159,9 @@ func Load() (Config, error) {
if cfg.LLM.APIKey == "" {
return Config{}, fmt.Errorf("LLM_API_KEY is required")
}
if cfg.LLM.FilePromptMode != "user_content_file_parts" && cfg.LLM.FilePromptMode != "system_fileid_uri" {
return Config{}, fmt.Errorf("LLM_FILE_PROMPT_MODE must be one of: user_content_file_parts, system_fileid_uri")
}
cfg.SoulPath = resolvePathInWorkspace(cfg.SoulPath, agentWorkspaceDir)
cfg.SkillsDir = resolvePathInWorkspace(cfg.SkillsDir, agentWorkspaceDir)
@@ -391,3 +398,14 @@ func splitCSV(raw string) []string {
}
return out
}
func normalizeFilePromptMode(v string) string {
v = strings.ToLower(strings.TrimSpace(v))
if v == "" {
return "user_content_file_parts"
}
if v == "system_fileid" || v == "system_fileid_url" || v == "system_fileid_uri" {
return "system_fileid_uri"
}
return v
}