fix(t126): 萃取引擎/金鑰改每帳號一份——多帳號不再互相覆蓋
leo:「2 個 CF 帳號一個填 gemma4 一個填 Mistral,daemon 會用誰的?別人也加就會有一樣的疑問」 實證:金鑰只有機器層一份 ⇒ 後連的覆蓋前一個。 修:AccountConfig 加 Extractor/GeminiAPIKey/LLMModel;帳號層優先、空值繼承機器層; 既有 config 遷移(頂層金鑰複製到各帳號,冪等);連線只寫該帳號不覆蓋機器層; 托盤帳號標題顯示「· Gemini」/「· Claude」(一眼看出誰用誰)。 三模組 go test 全綠(總管親跑)。(實作=子 CC;驗證+commit=總管)
This commit is contained in:
@@ -36,6 +36,7 @@ import (
|
||||
|
||||
// AccountConfig 單一帳號的連線設定(t104 多帳號同時看守)。
|
||||
// 每個帳號代表一個 Arcrun 知識庫實例;Extractor/Manifest 等機器層級設定住在 DirectConfig 頂層。
|
||||
// t126:Extractor/GeminiAPIKey/LLMModel 支援帳號層覆蓋——帳號有值時優先,空值繼承機器層。
|
||||
type AccountConfig struct {
|
||||
InstanceName string `json:"instance_name,omitempty"`
|
||||
Email string `json:"email,omitempty"`
|
||||
@@ -44,6 +45,10 @@ type AccountConfig struct {
|
||||
APIKey string `json:"api_key,omitempty"`
|
||||
WatchFolders []string `json:"watch_folders,omitempty"` // 此帳號看守的資料夾(多根)
|
||||
Libraries map[string]string `json:"libraries,omitempty"` // 資料夾→庫對映(t52)
|
||||
// t126:每帳號獨立的萃取設定(空值繼承 DirectConfig 頂層)
|
||||
Extractor string `json:"extractor,omitempty"`
|
||||
GeminiAPIKey string `json:"gemini_api_key,omitempty"`
|
||||
LLMModel string `json:"llm_model,omitempty"`
|
||||
}
|
||||
|
||||
// DirectConfig 是 direct 模式的設定檔(JSON)。設定只走檔案/環境,不落 code。
|
||||
@@ -175,6 +180,20 @@ func LoadDirectConfig(path string) (*DirectConfig, error) {
|
||||
}}
|
||||
}
|
||||
|
||||
// t126 遷移:把頂層金鑰複製到每個沒有金鑰的帳號(複製非搬移,頂層保留當預設;冪等)。
|
||||
// 帳號已有自己的值(非空)→ 不覆蓋,讓帳號層設定永遠優先。
|
||||
for i := range c.Accounts {
|
||||
if strings.TrimSpace(c.Accounts[i].Extractor) == "" && strings.TrimSpace(c.Extractor) != "" {
|
||||
c.Accounts[i].Extractor = c.Extractor
|
||||
}
|
||||
if strings.TrimSpace(c.Accounts[i].GeminiAPIKey) == "" && strings.TrimSpace(c.GeminiAPIKey) != "" {
|
||||
c.Accounts[i].GeminiAPIKey = c.GeminiAPIKey
|
||||
}
|
||||
if strings.TrimSpace(c.Accounts[i].LLMModel) == "" && strings.TrimSpace(c.LLMModel) != "" {
|
||||
c.Accounts[i].LLMModel = c.LLMModel
|
||||
}
|
||||
}
|
||||
|
||||
// 驗證
|
||||
var missing []string
|
||||
if c.Manifest == "" {
|
||||
@@ -359,6 +378,7 @@ type DirectResult struct {
|
||||
|
||||
// makeAccountSubConfig 從帳號設定建出單帳號用的 DirectConfig,繼承機器層級欄位(t104)。
|
||||
// 用於 RunDirectOnce 逐帳號掃描,每帳號得到獨立的 CypherURL/Namespace/WatchFolders 等。
|
||||
// t126:帳號層 Extractor/GeminiAPIKey/LLMModel 有值時優先覆蓋機器層(空字串不算「有值」)。
|
||||
func (c *DirectConfig) makeAccountSubConfig(acc AccountConfig) *DirectConfig {
|
||||
sub := *c // 複製機器層級欄位
|
||||
sub.Accounts = nil
|
||||
@@ -376,6 +396,16 @@ func (c *DirectConfig) makeAccountSubConfig(acc AccountConfig) *DirectConfig {
|
||||
if sub.Library == "" {
|
||||
sub.Library = "kb"
|
||||
}
|
||||
// t126:帳號層有值時優先(空字串繼承機器層,已由 sub := *c 複製)
|
||||
if strings.TrimSpace(acc.Extractor) != "" {
|
||||
sub.Extractor = acc.Extractor
|
||||
}
|
||||
if strings.TrimSpace(acc.GeminiAPIKey) != "" {
|
||||
sub.GeminiAPIKey = acc.GeminiAPIKey
|
||||
}
|
||||
if strings.TrimSpace(acc.LLMModel) != "" {
|
||||
sub.LLMModel = acc.LLMModel
|
||||
}
|
||||
return &sub
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user