diff --git a/frontend/src/i18n/en/system.ts b/frontend/src/i18n/en/system.ts index 10623aa3c3b6cfb67af28d6bc468fb682f7b4c22..59f010c7c4c795330aa44ae712cf7cc44aae5311 100644 --- a/frontend/src/i18n/en/system.ts +++ b/frontend/src/i18n/en/system.ts @@ -193,7 +193,7 @@ export default { aiModelConf: 'AI Model Config', aiModel: 'Model', - aiModelPlaceholder: 'protocol/model name, such as openai/gpt-3.5-turbo', + aiModelPlaceholder: 'protocol/model name, such as openai/gpt-3.5-turbo, orcarouter/orcarouter/auto', aiBaseUrl: 'Base URL', aiBaseUrlPlaceholder: 'Please enter the model request URL', aiApiKey: 'API Key', diff --git a/frontend/src/i18n/zh-cn/system.ts b/frontend/src/i18n/zh-cn/system.ts index bfec43d905fbc0fd57795657003600418ee2ed26..32013c080682b32715b4d5de956c6c8571241724 100644 --- a/frontend/src/i18n/zh-cn/system.ts +++ b/frontend/src/i18n/zh-cn/system.ts @@ -193,7 +193,7 @@ export default { aiModelConf: 'AI模型配置', aiModel: '模型', - aiModelPlaceholder: '协议/模型名,如 openai/gpt-3.5-turbo', + aiModelPlaceholder: '协议/模型名,如 openai/gpt-3.5-turbo、orcarouter/orcarouter/auto', aiBaseUrl: '地址', aiBaseUrlPlaceholder: '请输入模型请求地址', aiApiKey: 'API Key', diff --git a/server/internal/ai/protocol/orcarouter.go b/server/internal/ai/protocol/orcarouter.go new file mode 100644 index 0000000000000000000000000000000000000000..381a931968ef0f00d79f15b0df1923a7d09a0a69 --- /dev/null +++ b/server/internal/ai/protocol/orcarouter.go @@ -0,0 +1,36 @@ +package protocol + +import ( + "context" + "mayfly-go/internal/ai/config" + "time" + + "github.com/cloudwego/eino-ext/components/model/openai" + "github.com/cloudwego/eino/components/model" +) + +type OrcaRouter struct { +} + +func (o *OrcaRouter) Name() string { + return ProtocolOrcaRouter +} + +func (o *OrcaRouter) NewChatModel(ctx context.Context, modelConfig *config.ModelConfig) (model.ToolCallingChatModel, error) { + return openai.NewChatModel(ctx, &openai.ChatModelConfig{ + BaseURL: orcaRouterBaseURL(modelConfig.BaseUrl), + Model: modelConfig.GetModelSpec().Model, + APIKey: modelConfig.ApiKey, + Timeout: time.Duration(modelConfig.TimeOut) * time.Second, + MaxTokens: &modelConfig.MaxTokens, + Temperature: &modelConfig.Temperature, + }) +} + +// orcaRouterBaseURL 默认使用 OrcaRouter 的 OpenAI 兼容网关地址 +func orcaRouterBaseURL(baseUrl string) string { + if baseUrl != "" { + return baseUrl + } + return "https://api.orcarouter.ai/v1" +} diff --git a/server/internal/ai/protocol/protocol.go b/server/internal/ai/protocol/protocol.go index 49fe695fac57f0abeb8651ebed986f4728a950e4..48ced17277fe016d36f1ad3d113e4636063d1e11 100644 --- a/server/internal/ai/protocol/protocol.go +++ b/server/internal/ai/protocol/protocol.go @@ -15,6 +15,8 @@ const ( const ProtocolOpenai = "openai" +const ProtocolOrcaRouter = "orcarouter" + type Protocol interface { // Name 返回协议标识,如 openai、azure 等 diff --git a/server/internal/ai/protocol/registry.go b/server/internal/ai/protocol/registry.go index 1ab8e9297ca1d0c699e0e581b1c8f13080a853b6..4b33f6197da32186b2ff53f7b7ddf58f6dd57653 100644 --- a/server/internal/ai/protocol/registry.go +++ b/server/internal/ai/protocol/registry.go @@ -15,6 +15,7 @@ import ( func init() { Register(new(Openai)) + Register(new(OrcaRouter)) } var (