diff --git a/plugins/wasm-go/extensions/ai-proxy/README.md b/plugins/wasm-go/extensions/ai-proxy/README.md index c2dc62c95..dab13579a 100644 --- a/plugins/wasm-go/extensions/ai-proxy/README.md +++ b/plugins/wasm-go/extensions/ai-proxy/README.md @@ -602,6 +602,51 @@ provider: } ``` +### 使用original协议代理百炼智能体应用 +**配置信息** + +```yaml +provider: + type: qwen + apiTokens: + - "YOUR_DASHSCOPE_API_TOKEN" + protocol: original +``` + +**请求实例** +```json +{ + "input": { + "prompt": "介绍一下Dubbo" + }, + "parameters": {}, + "debug": {} +} +``` + +**响应实例** + +```json +{ + "output": { + "finish_reason": "stop", + "session_id": "677e7e8fbb874e1b84792b65042e1599", + "text": "Apache Dubbo 是一个..." + }, + "usage": { + "models": [ + { + "output_tokens": 449, + "model_id": "qwen-max", + "input_tokens": 282 + } + ] + }, + "request_id": "b59e45e3-5af4-91df-b7c6-9d746fd3297c" +} +``` + + ### 使用月之暗面配合其原生的文件上下文 提前上传文件至月之暗面,以文件内容作为上下文使用其 AI 服务。 diff --git a/plugins/wasm-go/extensions/ai-proxy/main.go b/plugins/wasm-go/extensions/ai-proxy/main.go index 56e9f5808..b01986c7e 100644 --- a/plugins/wasm-go/extensions/ai-proxy/main.go +++ b/plugins/wasm-go/extensions/ai-proxy/main.go @@ -64,7 +64,8 @@ func onHttpRequestHeader(ctx wrapper.HttpContext, pluginConfig config.PluginConf rawPath := ctx.Path() path, _ := url.Parse(rawPath) apiName := getOpenAiApiName(path.Path) - if apiName == "" { + providerConfig := pluginConfig.GetProviderConfig() + if apiName == "" && !providerConfig.IsOriginal() { log.Debugf("[onHttpRequestHeader] unsupported path: %s", path.Path) _ = util.SendResponse(404, "ai-proxy.unknown_api", util.MimeTypeTextPlain, "API not found: "+path.Path) return types.ActionContinue diff --git a/plugins/wasm-go/extensions/ai-proxy/provider/provider.go b/plugins/wasm-go/extensions/ai-proxy/provider/provider.go index bf2f652a6..16e8aaf8e 100644 --- a/plugins/wasm-go/extensions/ai-proxy/provider/provider.go +++ b/plugins/wasm-go/extensions/ai-proxy/provider/provider.go @@ -314,6 +314,10 @@ func (c *ProviderConfig) GetRandomToken() string { } } +func (c *ProviderConfig) IsOriginal() bool { + return c.protocol == protocolOriginal +} + func CreateProvider(pc ProviderConfig) (Provider, error) { initializer, has := providerInitializers[pc.typ] if !has { diff --git a/plugins/wasm-go/extensions/ai-proxy/provider/qwen.go b/plugins/wasm-go/extensions/ai-proxy/provider/qwen.go index ffa5be2e3..f673fa98b 100644 --- a/plugins/wasm-go/extensions/ai-proxy/provider/qwen.go +++ b/plugins/wasm-go/extensions/ai-proxy/provider/qwen.go @@ -68,7 +68,13 @@ func (m *qwenProvider) GetProviderType() string { } func (m *qwenProvider) OnRequestHeaders(ctx wrapper.HttpContext, apiName ApiName, log wrapper.Log) (types.Action, error) { - if m.config.qwenEnableCompatible { + _ = util.OverwriteRequestHost(qwenDomain) + _ = util.OverwriteRequestAuthorization("Bearer " + m.config.GetRandomToken()) + + if m.config.protocol == protocolOriginal { + ctx.DontReadRequestBody() + return types.ActionContinue, nil + } else if m.config.qwenEnableCompatible { _ = util.OverwriteRequestPath(qwenCompatiblePath) } else if apiName == ApiNameChatCompletion { _ = util.OverwriteRequestPath(qwenChatCompletionPath) @@ -77,12 +83,6 @@ func (m *qwenProvider) OnRequestHeaders(ctx wrapper.HttpContext, apiName ApiName } else { return types.ActionContinue, errUnsupportedApiName } - _ = util.OverwriteRequestHost(qwenDomain) - _ = util.OverwriteRequestAuthorization("Bearer " + m.config.GetRandomToken()) - - if m.config.protocol == protocolOriginal { - return types.ActionContinue, nil - } _ = proxywasm.RemoveHttpRequestHeader("Accept-Encoding") _ = proxywasm.RemoveHttpRequestHeader("Content-Length")