fix(opencode): serve передаёт OPENCODE_CONFIG — детерминированный выбор модели
This commit is contained in:
@@ -8,6 +8,7 @@ import (
|
||||
"net/http"
|
||||
"os"
|
||||
"os/exec"
|
||||
"path/filepath"
|
||||
"sync"
|
||||
"time"
|
||||
)
|
||||
@@ -31,6 +32,12 @@ type Server struct {
|
||||
Password string // basic auth (если непустой — сервер защищён)
|
||||
Dir string // каталог, в котором запускается serve (project сервера)
|
||||
|
||||
// ConfigPath — путь к глобальному конфигу opencode (opencode.jsonc).
|
||||
// Передаётся serve через env OPENCODE_CONFIG, чтобы гарантированно
|
||||
// подхватить модель/провайдеров независимо от резолва глобального пути.
|
||||
// Пусто — serve резолвит конфиг сам (см. defaults).
|
||||
ConfigPath string
|
||||
|
||||
// URL задаёт внешний сервер. Пусто — супервайзер владеет процессом.
|
||||
URL string
|
||||
PollInterval time.Duration // как часто проверять /global/health
|
||||
@@ -60,6 +67,20 @@ func (s *Server) defaults() {
|
||||
if s.Stdout == nil {
|
||||
s.Stdout = os.Stderr
|
||||
}
|
||||
if s.ConfigPath == "" {
|
||||
s.ConfigPath = defaultOpenCodeConfigPath()
|
||||
}
|
||||
}
|
||||
|
||||
// defaultOpenCodeConfigPath возвращает путь к глобальному конфигу opencode,
|
||||
// совпадающий с тем, что opencode загружает по умолчанию: ~/.config/opencode/
|
||||
// (в т.ч. на Windows — см. Global.Path.config в исходниках opencode).
|
||||
func defaultOpenCodeConfigPath() string {
|
||||
home, _ := os.UserHomeDir()
|
||||
if home == "" {
|
||||
home = "."
|
||||
}
|
||||
return filepath.Join(home, ".config", "opencode", "opencode.jsonc")
|
||||
}
|
||||
|
||||
// baseURL собирает полный адрес сервера (http://host:port).
|
||||
@@ -125,6 +146,12 @@ func (s *Server) serveCmd(ctx context.Context) *exec.Cmd {
|
||||
env := append(os.Environ(),
|
||||
"OPENCODE_DISABLE_AUTOUPDATE=1",
|
||||
"OPENCODE_DISABLE_MODELS_FETCH=1")
|
||||
// Гарантированно указываем глобальный конфиг opencode: serve обязан
|
||||
// подхватить модель/провайдеров из него (иначе возможен фоллбэк на
|
||||
// случайную модель из каталога).
|
||||
if s.ConfigPath != "" {
|
||||
env = append(env, "OPENCODE_CONFIG="+s.ConfigPath)
|
||||
}
|
||||
// Агенты (analyst/dev/...) opencode находит сам через project-каталог
|
||||
// .opencode (см. internal/agents).
|
||||
if s.DBPath != "" {
|
||||
|
||||
Reference in New Issue
Block a user