mirror of
https://github.com/Syngnat/GoNavi.git
synced 2026-05-21 16:23:29 +08:00
- 消息管理:新增聊天气泡的重试、编辑与单条删除功能及相对应的持久化状态函数 - 快捷操作:支持长文一键滑动到底端,并在代码块内增加SQL一键送入编辑器的快捷执行机制 - 视觉优化:深化AI回复背景沉浸感,重绘AI洞察按钮并移除设置面板所有的冗余紫色调 - 设置调优:放宽模型初始必填限制,新增内置系统提示词(Builtin Prompt)全览面板
75 lines
1.8 KiB
Go
75 lines
1.8 KiB
Go
package provider
|
||
|
||
import (
|
||
"context"
|
||
"fmt"
|
||
"strings"
|
||
|
||
"GoNavi-Wails/internal/ai"
|
||
)
|
||
|
||
// CustomProvider 自定义 Provider,根据 apiFormat 选择底层协议
|
||
// 支持 openai / anthropic / gemini 三种 API 格式
|
||
type CustomProvider struct {
|
||
inner Provider
|
||
name string
|
||
}
|
||
|
||
// NewCustomProvider 创建自定义 Provider 实例
|
||
func NewCustomProvider(config ai.ProviderConfig) (Provider, error) {
|
||
if strings.TrimSpace(config.BaseURL) == "" {
|
||
return nil, fmt.Errorf("自定义 Provider 必须指定 Base URL")
|
||
}
|
||
|
||
// 根据 apiFormat 决定使用哪个底层协议,默认 openai
|
||
apiFormat := strings.ToLower(strings.TrimSpace(config.APIFormat))
|
||
if apiFormat == "" {
|
||
apiFormat = "openai"
|
||
}
|
||
|
||
var innerProvider Provider
|
||
var err error
|
||
switch apiFormat {
|
||
case "anthropic":
|
||
innerProvider, err = NewAnthropicProvider(config)
|
||
case "gemini":
|
||
innerProvider, err = NewGeminiProvider(config)
|
||
case "claude-cli":
|
||
innerProvider, err = NewClaudeCLIProvider(config)
|
||
default: // "openai" 及其他
|
||
innerProvider, err = NewOpenAIProvider(config)
|
||
}
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
|
||
name := strings.TrimSpace(config.Name)
|
||
if name == "" {
|
||
name = "Custom"
|
||
}
|
||
|
||
return &CustomProvider{
|
||
inner: innerProvider,
|
||
name: name,
|
||
}, nil
|
||
}
|
||
|
||
func (p *CustomProvider) Name() string {
|
||
return p.name
|
||
}
|
||
|
||
func (p *CustomProvider) Validate() error {
|
||
if strings.TrimSpace(p.inner.(interface{ Name() string }).Name()) == "" {
|
||
// 对自定义 Provider,API Key 可选(部分本地服务不需要)
|
||
}
|
||
return nil
|
||
}
|
||
|
||
func (p *CustomProvider) Chat(ctx context.Context, req ai.ChatRequest) (*ai.ChatResponse, error) {
|
||
return p.inner.Chat(ctx, req)
|
||
}
|
||
|
||
func (p *CustomProvider) ChatStream(ctx context.Context, req ai.ChatRequest, callback func(ai.StreamChunk)) error {
|
||
return p.inner.ChatStream(ctx, req, callback)
|
||
}
|