Files
GoLoom/internal/config/application.go

76 lines
1.7 KiB
Go

package config
import (
"fmt"
"os"
"time"
"gopkg.in/yaml.v3"
)
// Application 应用配置顶层结构
type Application struct {
App AppSection `yaml:"app"`
Server ServerSection `yaml:"server"`
Agent AgentSection `yaml:"agent"`
LLM LLMSection `yaml:"llm"`
}
// AppSection 应用基础信息
type AppSection struct {
Name string `yaml:"name"`
Env string `yaml:"env"`
}
// ServerSection 服务器配置
type ServerSection struct {
Addr string `yaml:"addr"`
}
// AgentSection Agent 配置路径列表
type AgentSection struct {
ConfigPaths []string `yaml:"config-paths"`
}
// LLMSection LLM 相关配置
type LLMSection struct {
RequestTimeout string `yaml:"request-timeout"`
}
const defaultLLMRequestTimeout = 5 * time.Minute
// RequestTimeoutDuration 解析 LLM 请求超时时间
func (s LLMSection) RequestTimeoutDuration() (time.Duration, error) {
if s.RequestTimeout == "" {
return defaultLLMRequestTimeout, nil
}
d, err := time.ParseDuration(s.RequestTimeout)
if err != nil {
return 0, fmt.Errorf("invalid llm.request-timeout %q: %w", s.RequestTimeout, err)
}
if d <= 0 {
return 0, fmt.Errorf("llm.request-timeout must be positive, got %q", s.RequestTimeout)
}
return d, nil
}
// LoadApplication 从指定路径加载应用配置
func LoadApplication(path string) (Application, error) {
data, err := os.ReadFile(path)
if err != nil {
return Application{}, fmt.Errorf("read application config %s: %w", path, err)
}
var app Application
if err := yaml.Unmarshal(data, &app); err != nil {
return Application{}, fmt.Errorf("parse application config: %w", err)
}
// 设置默认值
if app.Server.Addr == "" {
app.Server.Addr = ":8091"
}
if app.App.Env == "" {
app.App.Env = "local"
}
return app, nil
}