// Package handler 定义了给前端(Wails / JS)直接调用的底层接口。 // 此文件负责 Settings 模块暴露的三个接口操作。 package handler import ( "context" "AI-Expert-Sidebar/internal/service" ) // SettingsHandler 是配置模块的 Wails 绑定,前端通过 `window.go.main.App.SaveSettings` 等访问。 type SettingsHandler struct{ ctx context.Context } func NewSettingsHandler() *SettingsHandler { return &SettingsHandler{} } func (s *SettingsHandler) SetContext(ctx context.Context) { s.ctx = ctx } // GetSettings 返回目前所有的 AI 配置给前端以渲染 SettingsModal。 func (s *SettingsHandler) GetSettings() *service.SettingsDTO { return service.GetSettings() } // SaveSettings 接收前端传回来的设置 DTO。 // 返回一个字符串,如果为空("")表示成功,如果不为空说明发生了 error 并将文本传回供前端报错。 func (s *SettingsHandler) SaveSettings(dto service.SettingsDTO) string { if err := service.SaveSettings(dto); err != nil { return err.Error() } return "" } // GetProviders 返回软件内置支持的一个预设选项列表。 // // 为什么要把这个配置硬编码在 Go 后端而不是前端 React 里? // 因为这样保证了如果后期要追加新的知名模型提供商(如 Kimi、Moonshot), // 只需要在此修改 Go 代码,且能跟 ResolveAIConfig 逻辑完全同步绑定,而不必在前后端各改一遍。 func (s *SettingsHandler) GetProviders() []ProviderPreset { return []ProviderPreset{ {ID: "deepseek", Label: "DeepSeek", BaseURL: "https://api.deepseek.com/chat/completions", DefaultModel: "deepseek-chat"}, {ID: "openai", Label: "OpenAI", BaseURL: "https://api.openai.com/v1/chat/completions", DefaultModel: "gpt-4o"}, {ID: "grok", Label: "Grok (xAI)", BaseURL: "https://api.x.ai/v1/chat/completions", DefaultModel: "grok-3"}, {ID: "custom", Label: "自定义", BaseURL: "", DefaultModel: ""}, } } // ProviderPreset 将被转换成 JS 对象 `ProviderPreset` 供前端生成下拉框的 options。 type ProviderPreset struct { ID string `json:"id"` // 提供商内置映射 ID Label string `json:"label"` // 页面显示名称 BaseURL string `json:"base_url"` // 建议默认请求端点 DefaultModel string `json:"default_model"` // 建议默认使用的模型哈希 }