From 76b5f2af79e5b035bcdcfc96643a492af1054a2f Mon Sep 17 00:00:00 2001 From: Kent Dong Date: Wed, 22 May 2024 20:30:46 +0800 Subject: [PATCH] feat: Enhance the feature of ai-proxy plugin (#976) --- plugins/wasm-go/extensions/ai-proxy/README.md | 258 +++++++++++++++++- plugins/wasm-go/extensions/ai-proxy/go.mod | 2 +- plugins/wasm-go/extensions/ai-proxy/go.sum | 4 +- plugins/wasm-go/extensions/ai-proxy/main.go | 13 + .../extensions/ai-proxy/provider/model.go | 87 +++++- .../extensions/ai-proxy/provider/provider.go | 20 +- .../extensions/ai-proxy/provider/qwen.go | 187 ++++++++----- .../ai-proxy/provider/request_helper.go | 2 +- .../extensions/ai-proxy/util/string.go | 8 + plugins/wasm-go/extensions/basic-auth/go.mod | 2 +- plugins/wasm-go/extensions/basic-auth/go.sum | 1 + plugins/wasm-go/extensions/bot-detect/go.mod | 2 +- plugins/wasm-go/extensions/bot-detect/go.sum | 1 + .../wasm-go/extensions/cache-control/go.mod | 2 +- .../wasm-go/extensions/cache-control/go.sum | 1 + .../wasm-go/extensions/chatgpt-proxy/go.mod | 2 +- .../wasm-go/extensions/chatgpt-proxy/go.sum | 1 + plugins/wasm-go/extensions/cors/go.mod | 2 +- plugins/wasm-go/extensions/cors/go.sum | 1 + .../wasm-go/extensions/custom-response/go.mod | 2 +- .../wasm-go/extensions/custom-response/go.sum | 1 + plugins/wasm-go/extensions/de-graphql/go.mod | 2 +- plugins/wasm-go/extensions/de-graphql/go.sum | 1 + plugins/wasm-go/extensions/gc-test/go.mod | 2 +- plugins/wasm-go/extensions/gc-test/go.sum | 1 + .../wasm-go/extensions/gw-error-format/go.mod | 2 +- .../wasm-go/extensions/gw-error-format/go.sum | 1 + plugins/wasm-go/extensions/hello-world/go.mod | 2 +- plugins/wasm-go/extensions/hello-world/go.sum | 1 + plugins/wasm-go/extensions/http-call/go.mod | 2 +- plugins/wasm-go/extensions/http-call/go.sum | 1 + .../wasm-go/extensions/ip-restriction/go.mod | 2 +- .../wasm-go/extensions/ip-restriction/go.sum | 1 + plugins/wasm-go/extensions/key-auth/go.mod | 2 +- plugins/wasm-go/extensions/key-auth/go.sum | 1 + plugins/wasm-go/extensions/oidc/go.mod | 2 +- plugins/wasm-go/extensions/oidc/go.sum | 1 + plugins/wasm-go/extensions/opa/go.mod | 2 +- plugins/wasm-go/extensions/opa/go.sum | 1 + .../wasm-go/extensions/request-block/go.mod | 2 +- .../wasm-go/extensions/request-block/go.sum | 1 + .../extensions/request-validation/go.mod | 2 +- .../extensions/request-validation/go.sum | 1 + .../wasm-go/extensions/simple-jwt-auth/go.mod | 2 +- .../wasm-go/extensions/simple-jwt-auth/go.sum | 1 + .../wasm-go/extensions/sni-misdirect/go.mod | 2 +- .../wasm-go/extensions/sni-misdirect/go.sum | 1 + .../extensions/streaming-body-example/go.mod | 2 +- .../extensions/streaming-body-example/go.sum | 1 + plugins/wasm-go/extensions/waf/go.mod | 2 +- plugins/wasm-go/extensions/waf/go.sum | 1 + plugins/wasm-go/pkg/wrapper/plugin_wrapper.go | 6 + 52 files changed, 543 insertions(+), 107 deletions(-) create mode 100644 plugins/wasm-go/extensions/ai-proxy/util/string.go diff --git a/plugins/wasm-go/extensions/ai-proxy/README.md b/plugins/wasm-go/extensions/ai-proxy/README.md index 9d221a3e5..06d411afb 100644 --- a/plugins/wasm-go/extensions/ai-proxy/README.md +++ b/plugins/wasm-go/extensions/ai-proxy/README.md @@ -62,7 +62,12 @@ Azure OpenAI 所对应的 `type` 为 `azure`。它特有的配置字段如下: #### 通义千问(Qwen) -通义千问所对应的 `type` 为 `qwen`。它并无特有的配置字段。 +通义千问所对应的 `type` 为 `qwen`。它特有的配置字段如下: + +| 名称 | 数据类型 | 填写要求 | 默认值 | 描述 | +|--------------------|-----------------|------|-----|------------------------------------------------------------------| +| `qwenEnableSearch` | boolean | 非必填 | - | 是否启用通义千问内置的互联网搜索功能。 | +| `qwenFileIds` | array of string | 非必填 | - | 通过文件接口上传至Dashscope的文件 ID,其内容将被用做 AI 对话的上下文。不可与 `context` 字段同时配置。 | #### 百川智能 (Baichuan AI) @@ -72,6 +77,18 @@ Azure OpenAI 所对应的 `type` 为 `azure`。它特有的配置字段如下: 零一万物所对应的 `type` 为 `yi`。它并无特有的配置字段。 +#### Groq + +Groq 所对应的 `type` 为 `groq`。它并无特有的配置字段。 + +#### Anthropic Claude + +Anthropic Claude 所对应的 `type` 为 `claude`。它特有的配置字段如下: + +| 名称 | 数据类型 | 填写要求 | 默认值 | 描述 | +|-----------|--------|-----|-----|-------------------| +| `version` | string | 必填 | - | Claude 服务的 API 版本 | + ## 用法示例 ### 使用 OpenAI 协议代理 Azure OpenAI 服务 @@ -291,6 +308,63 @@ provider: } ``` +### 使用通义千问配合其原生的文件上下文 + +提前上传文件至通义千问,以文件内容作为上下文使用其 AI 服务。 + +**配置信息** + +```yaml +provider: + type: qwen + apiTokens: + - "YOUR_QWEN_API_TOKEN" + modelMapping: + "*": "qwen-long" # 通义千问的文件上下文只能在 qwen-long 模型下使用 + qwenFileIds: + - "file-fe-xxx" + - "file-fe-yyy" +``` + +**请求示例** + +```json +{ + "model": "gpt-4-turbo", + "messages": [ + { + "role": "user", + "content": "请概述文案内容" + } + ], + "temperature": 0.3 +} +``` + +**响应示例** + +```json +{ + "output": { + "choices": [ + { + "finish_reason": "stop", + "message": { + "role": "assistant", + "content": "您上传了两个文件,`context.txt` 和 `context_2.txt`,它们似乎都包含了关于xxxx" + } + } + ] + }, + "usage": { + "total_tokens": 2023, + "output_tokens": 530, + "input_tokens": 1493 + }, + "request_id": "187e99ba-5b64-9ffe-8f69-01dafbaf6ed7" +} +``` + ### 使用月之暗面配合其原生的文件上下文 提前上传文件至月之暗面,以文件内容作为上下文使用其 AI 服务。 @@ -347,3 +421,185 @@ provider: } } ``` + +### 使用 OpenAI 协议代理 Groq 服务 + +**配置信息** + +```yaml +provider: + type: groq + apiTokens: + - "YOUR_GROQ_API_TOKEN" +``` + +**请求示例** + +```json +{ + "model": "llama3-8b-8192", + "messages": [ + { + "role": "user", + "content": "你好,你是谁?" + } + ] +} +``` + +**响应示例** + +```json +{ + "id": "chatcmpl-26733989-6c52-4056-b7a9-5da791bd7102", + "object": "chat.completion", + "created": 1715917967, + "model": "llama3-8b-8192", + "choices": [ + { + "index": 0, + "message": { + "role": "assistant", + "content": "😊 Ni Hao! (That's \"hello\" in Chinese!)\n\nI am LLaMA, an AI assistant developed by Meta AI that can understand and respond to human input in a conversational manner. I'm not a human, but a computer program designed to simulate conversations and answer questions to the best of my ability. I'm happy to chat with you in Chinese or help with any questions or topics you'd like to discuss! 😊" + }, + "logprobs": null, + "finish_reason": "stop" + } + ], + "usage": { + "prompt_tokens": 16, + "prompt_time": 0.005, + "completion_tokens": 89, + "completion_time": 0.104, + "total_tokens": 105, + "total_time": 0.109 + }, + "system_fingerprint": "fp_dadc9d6142", + "x_groq": { + "id": "req_01hy2awmcxfpwbq56qh6svm7qz" + } +} +``` + +### 使用 OpenAI 协议代理 Claude 服务 + +**配置信息** + +```yaml +provider: + type: claude + apiTokens: + - "YOUR_CLAUDE_API_TOKEN" +``` + +**请求示例** + +```json +{ + "model": "claude-3-opus-20240229", + "max_tokens": 1024, + "messages": [ + { + "role": "user", + "content": "你好,你是谁?" + } + ] +} +``` + +**响应示例** + +```json +{ + "id": "msg_01K8iLH18FGN7Xd9deurwtoD", + "type": "message", + "role": "assistant", + "model": "claude-3-opus-20240229", + "stop_sequence": null, + "usage": { + "input_tokens": 16, + "output_tokens": 141 + }, + "content": [ + { + "type": "text", + "text": "你好!我是Claude,一个由Anthropic公司开发的人工智能助手。我的任务是尽我所能帮助人类,比如回答问题,提供建议和意见,协助完成任务等。我掌握了很多知识,也具备一定的分析和推理能力,但我不是人类,也没有实体的身体。很高兴认识你!如果有什么需要帮助的地方,欢迎随时告诉我。" + } + ], + "stop_reason": "end_turn" +} +``` + +## 完整配置示例 + +以下以使用 OpenAI 协议代理 Groq 服务为例,展示完整的插件配置示例。 + +```yaml +apiVersion: extensions.higress.io/v1alpha1 +kind: WasmPlugin +metadata: + name: ai-proxy-groq + namespace: higress-system +spec: + matchRules: + - config: + provider: + type: groq + apiTokens: + - "YOUR_API_TOKEN" + ingress: + - groq + url: oci://higress-registry.cn-hangzhou.cr.aliyuncs.com/plugins/ai-proxy:1.0.0 +--- +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + annotations: + higress.io/backend-protocol: HTTPS + higress.io/destination: groq.dns + higress.io/proxy-ssl-name: api.groq.com + higress.io/proxy-ssl-server-name: "on" + labels: + higress.io/resource-definer: higress + name: groq + namespace: higress-system +spec: + ingressClassName: higress + rules: + - host: + http: + paths: + - backend: + resource: + apiGroup: networking.higress.io + kind: McpBridge + name: default + path: / + pathType: Prefix +--- +apiVersion: networking.higress.io/v1 +kind: McpBridge +metadata: + name: default + namespace: higress-system +spec: + registries: + - domain: api.groq.com + name: groq + port: 443 + type: dns +``` + +访问示例: + +```bash +curl "http:///v1/chat/completions" -H "Content-Type: application/json" -d '{ + "model": "llama3-8b-8192", + "messages": [ + { + "role": "user", + "content": "你好,你是谁?" + } + ] +}' +``` \ No newline at end of file diff --git a/plugins/wasm-go/extensions/ai-proxy/go.mod b/plugins/wasm-go/extensions/ai-proxy/go.mod index ab79abeb5..e6ca55640 100644 --- a/plugins/wasm-go/extensions/ai-proxy/go.mod +++ b/plugins/wasm-go/extensions/ai-proxy/go.mod @@ -8,7 +8,7 @@ replace github.com/alibaba/higress/plugins/wasm-go => ../.. require ( github.com/alibaba/higress/plugins/wasm-go v0.0.0 - github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240318034951-d5306e367c43 + github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240327114451-d6b7174a84fc github.com/stretchr/testify v1.8.4 github.com/tidwall/gjson v1.14.3 ) diff --git a/plugins/wasm-go/extensions/ai-proxy/go.sum b/plugins/wasm-go/extensions/ai-proxy/go.sum index ed2ae6abe..d8ab8342f 100644 --- a/plugins/wasm-go/extensions/ai-proxy/go.sum +++ b/plugins/wasm-go/extensions/ai-proxy/go.sum @@ -4,8 +4,8 @@ github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/higress-group/nottinygc v0.0.0-20231101025119-e93c4c2f8520 h1:IHDghbGQ2DTIXHBHxWfqCYQW1fKjyJ/I7W1pMyUDeEA= github.com/higress-group/nottinygc v0.0.0-20231101025119-e93c4c2f8520/go.mod h1:Nz8ORLaFiLWotg6GeKlJMhv8cci8mM43uEnLA5t8iew= -github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240318034951-d5306e367c43 h1:dCw7F/9ciw4NZN7w68wQRaygZ2zGOWMTIEoRvP1tlWs= -github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240318034951-d5306e367c43/go.mod h1:hNFjhrLUIq+kJ9bOcs8QtiplSQ61GZXtd2xHKx4BYRo= +github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240327114451-d6b7174a84fc h1:t2AT8zb6N/59Y78lyRWedVoVWHNRSCBh0oWCC+bluTQ= +github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240327114451-d6b7174a84fc/go.mod h1:hNFjhrLUIq+kJ9bOcs8QtiplSQ61GZXtd2xHKx4BYRo= github.com/magefile/mage v1.14.0 h1:6QDX3g6z1YvJ4olPhT1wksUcSa/V0a1B+pJb73fBjyo= github.com/magefile/mage v1.14.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/plugins/wasm-go/extensions/ai-proxy/main.go b/plugins/wasm-go/extensions/ai-proxy/main.go index 46e7af794..f4d67de42 100644 --- a/plugins/wasm-go/extensions/ai-proxy/main.go +++ b/plugins/wasm-go/extensions/ai-proxy/main.go @@ -57,6 +57,8 @@ func onHttpRequestHeader(ctx wrapper.HttpContext, pluginConfig config.PluginConf return types.ActionContinue } + log.Debugf("[onHttpRequestHeader] provider=%s", activeProvider.GetProviderType()) + rawPath := ctx.Path() path, _ := url.Parse(rawPath) apiName := getApiName(path.Path) @@ -125,6 +127,14 @@ func onHttpResponseHeaders(ctx wrapper.HttpContext, pluginConfig config.PluginCo return types.ActionContinue } + contentType, err := proxywasm.GetHttpResponseHeader("Content-Type") + if err != nil || !strings.HasPrefix(contentType, "text/event-stream") { + if err != nil { + log.Errorf("unable to load content-type header from response: %v", err) + } + ctx.BufferResponseBody() + } + if handler, ok := activeProvider.(provider.ResponseHeadersHandler); ok { apiName := ctx.GetContext(ctxKeyApiName).(provider.ApiName) action, err := handler.OnResponseHeaders(ctx, apiName, log) @@ -143,6 +153,9 @@ func onHttpResponseHeaders(ctx wrapper.HttpContext, pluginConfig config.PluginCo ctx.BufferResponseBody() } + // Disable the route re-calculation since the plugin may modify some headers related to the chosen route. + ctx.DisableReroute() + return types.ActionContinue } diff --git a/plugins/wasm-go/extensions/ai-proxy/provider/model.go b/plugins/wasm-go/extensions/ai-proxy/provider/model.go index 5c84adf8c..72e1cc01d 100644 --- a/plugins/wasm-go/extensions/ai-proxy/provider/model.go +++ b/plugins/wasm-go/extensions/ai-proxy/provider/model.go @@ -16,17 +16,40 @@ const ( ) type chatCompletionRequest struct { - Model string `json:"model"` - Messages []chatMessage `json:"messages"` - MaxTokens int `json:"max_tokens,omitempty"` - FrequencyPenalty float64 `json:"frequency_penalty,omitempty"` - N int `json:"n,omitempty"` - PresencePenalty float64 `json:"presence_penalty,omitempty"` - Seed int `json:"seed,omitempty"` - Stream bool `json:"stream,omitempty"` - Temperature float64 `json:"temperature,omitempty"` - TopP float64 `json:"top_p,omitempty"` - User string `json:"user,omitempty"` + Model string `json:"model"` + Messages []chatMessage `json:"messages"` + MaxTokens int `json:"max_tokens,omitempty"` + FrequencyPenalty float64 `json:"frequency_penalty,omitempty"` + N int `json:"n,omitempty"` + PresencePenalty float64 `json:"presence_penalty,omitempty"` + Seed int `json:"seed,omitempty"` + Stream bool `json:"stream,omitempty"` + StreamOptions *streamOptions `json:"stream_options,omitempty"` + Temperature float64 `json:"temperature,omitempty"` + TopP float64 `json:"top_p,omitempty"` + Tools []tool `json:"tools,omitempty"` + ToolChoice *toolChoice `json:"tool_choice,omitempty"` + User string `json:"user,omitempty"` +} + +type streamOptions struct { + IncludeUsage bool `json:"include_usage,omitempty"` +} + +type tool struct { + Type string `json:"type"` + Function function `json:"function"` +} + +type function struct { + Description string `json:"description,omitempty"` + Name string `json:"name"` + Parameters map[string]interface{} `json:"parameters,omitempty"` +} + +type toolChoice struct { + Type string `json:"type"` + Function function `json:"function"` } type chatCompletionResponse struct { @@ -53,9 +76,45 @@ type chatCompletionUsage struct { } type chatMessage struct { - Name string `json:"name,omitempty"` - Role string `json:"role,omitempty"` - Content string `json:"content,omitempty"` + Name string `json:"name,omitempty"` + Role string `json:"role,omitempty"` + Content string `json:"content,omitempty"` + ToolCalls []toolCall `json:"tool_calls,omitempty"` +} + +func (m *chatMessage) IsEmpty() bool { + if m.Content != "" { + return false + } + if len(m.ToolCalls) != 0 { + nonEmpty := false + for _, toolCall := range m.ToolCalls { + if !toolCall.Function.IsEmpty() { + nonEmpty = true + break + } + } + if nonEmpty { + return false + } + } + return true +} + +type toolCall struct { + Id string `json:"id"` + Type string `json:"type"` + Function functionCall `json:"function"` +} + +type functionCall struct { + Id string `json:"id,omitempty"` + Name string `json:"name,omitempty"` + Arguments string `json:"arguments"` +} + +func (m *functionCall) IsEmpty() bool { + return m.Name == "" && m.Arguments == "" } type streamEvent struct { diff --git a/plugins/wasm-go/extensions/ai-proxy/provider/provider.go b/plugins/wasm-go/extensions/ai-proxy/provider/provider.go index a408ace15..411cce473 100644 --- a/plugins/wasm-go/extensions/ai-proxy/provider/provider.go +++ b/plugins/wasm-go/extensions/ai-proxy/provider/provider.go @@ -23,15 +23,16 @@ const ( providerTypeBaichuan = "baichuan" providerTypeYi = "yi" - protocolOpenAI = "openai" - protocolOriginal = "original" + protocolOpenAI = "openai" + protocolOriginal = "original" roleSystem = "system" + ctxKeyIncrementalStreaming = "incrementalStreaming" ctxKeyStreamingBody = "streamingBody" ctxKeyOriginalRequestModel = "originalRequestModel" ctxKeyFinalRequestModel = "finalRequestModel" - ctxKeyPushedMessageContent = "pushedMessageContent" + ctxKeyPushedMessage = "pushedMessage" objectChatCompletion = "chat.completion" objectChatCompletionChunk = "chat.completion.chunk" @@ -95,11 +96,17 @@ type ProviderConfig struct { // @Description zh-CN 请求AI服务的超时时间,单位为毫秒。默认值为120000,即2分钟 timeout uint32 `required:"false" yaml:"timeout" json:"timeout"` // @Title zh-CN Moonshot File ID - // @Description zh-CN 仅适用于Moonshot AI服务。Moonshot AI服务的文件 ID,其内容用于补充 AI 请求上下文 + // @Description zh-CN 仅适用于Moonshot AI服务。Moonshot AI服务的文件ID,其内容用于补充AI请求上下文 moonshotFileId string `required:"false" yaml:"moonshotFileId" json:"moonshotFileId"` // @Title zh-CN Azure OpenAI Service URL // @Description zh-CN 仅适用于Azure OpenAI服务。要请求的OpenAI服务的完整URL,包含api-version等参数 azureServiceUrl string `required:"false" yaml:"azureServiceUrl" json:"azureServiceUrl"` + // @Title zh-CN 通义千问File ID + // @Description zh-CN 仅适用于通义千问服务。上传到Dashscope的文件ID,其内容用于补充AI请求上下文。仅支持qwen-long模型。 + qwenFileIds []string `required:"false" yaml:"qwenFileIds" json:"qwenFileIds"` + // @Title zh-CN 启用通义千问搜索服务 + // @Description zh-CN 仅适用于通义千问服务,表示是否启用通义千问的互联网搜索功能。 + qwenEnableSearch bool `required:"false" yaml:"qwenEnableSearch" json:"qwenEnableSearch"` // @Title zh-CN 模型名称映射表 // @Description zh-CN 用于将请求中的模型名称映射为目标AI服务商支持的模型名称。支持通过“*”来配置全局映射 modelMapping map[string]string `required:"false" yaml:"modelMapping" json:"modelMapping"` @@ -123,6 +130,11 @@ func (c *ProviderConfig) FromJson(json gjson.Result) { } c.moonshotFileId = json.Get("moonshotFileId").String() c.azureServiceUrl = json.Get("azureServiceUrl").String() + c.qwenFileIds = make([]string, 0) + for _, fileId := range json.Get("qwenFileIds").Array() { + c.qwenFileIds = append(c.qwenFileIds, fileId.String()) + } + c.qwenEnableSearch = json.Get("qwenEnableSearch").Bool() c.modelMapping = make(map[string]string) for k, v := range json.Get("modelMapping").Map() { c.modelMapping[k] = v.String() diff --git a/plugins/wasm-go/extensions/ai-proxy/provider/qwen.go b/plugins/wasm-go/extensions/ai-proxy/provider/qwen.go index aa0526c2a..821a601ad 100644 --- a/plugins/wasm-go/extensions/ai-proxy/provider/qwen.go +++ b/plugins/wasm-go/extensions/ai-proxy/provider/qwen.go @@ -24,12 +24,17 @@ const ( qwenTopPMin = 0.000001 qwenTopPMax = 0.999999 + + qwenDummySystemMessageContent = "You are a helpful assistant." ) type qwenProviderInitializer struct { } func (m *qwenProviderInitializer) ValidateConfig(config ProviderConfig) error { + if len(config.qwenFileIds) != 0 && config.context != nil { + return errors.New("qwenFileIds and context cannot be configured at the same time") + } return nil } @@ -50,10 +55,6 @@ func (m *qwenProvider) GetProviderType() string { return providerTypeQwen } -const ( - forceStreaming = true -) - func (m *qwenProvider) OnRequestHeaders(ctx wrapper.HttpContext, apiName ApiName, log wrapper.Log) (types.Action, error) { if apiName != ApiNameChatCompletion { return types.ActionContinue, errUnsupportedApiName @@ -67,17 +68,11 @@ func (m *qwenProvider) OnRequestHeaders(ctx wrapper.HttpContext, apiName ApiName return types.ActionContinue, nil } - if forceStreaming { - _ = proxywasm.RemoveHttpRequestHeader("Accept-Encoding") - _ = proxywasm.RemoveHttpRequestHeader("Content-Length") + _ = proxywasm.RemoveHttpRequestHeader("Accept-Encoding") + _ = proxywasm.RemoveHttpRequestHeader("Content-Length") - _ = proxywasm.ReplaceHttpRequestHeader("Accept", "text/event-stream") - _ = proxywasm.ReplaceHttpRequestHeader("X-DashScope-SSE", "enable") - return types.ActionContinue, nil - } else { - // Delay the header processing to allow changing streaming mode in OnRequestBody - return types.HeaderStopIteration, nil - } + // Delay the header processing to allow changing streaming mode in OnRequestBody + return types.HeaderStopIteration, nil } func (m *qwenProvider) OnRequestBody(ctx wrapper.HttpContext, apiName ApiName, body []byte, log wrapper.Log) (types.Action, error) { @@ -132,18 +127,20 @@ func (m *qwenProvider) OnRequestBody(ctx wrapper.HttpContext, apiName ApiName, b request.Model = mappedModel ctx.SetContext(ctxKeyFinalRequestModel, request.Model) - if !forceStreaming { - if request.Stream { - _ = proxywasm.ReplaceHttpRequestHeader("Accept", "text/event-stream") - _ = proxywasm.ReplaceHttpRequestHeader("X-DashScope-SSE", "enable") - } else { - _ = proxywasm.ReplaceHttpRequestHeader("Accept", "*/*") - _ = proxywasm.RemoveHttpRequestHeader("X-DashScope-SSE") - } + streaming := request.Stream + if streaming { + _ = proxywasm.ReplaceHttpRequestHeader("Accept", "text/event-stream") + _ = proxywasm.ReplaceHttpRequestHeader("X-DashScope-SSE", "enable") + } else { + _ = proxywasm.ReplaceHttpRequestHeader("Accept", "*/*") + _ = proxywasm.RemoveHttpRequestHeader("X-DashScope-SSE") } if m.config.context == nil { - qwenRequest := m.buildQwenTextGenerationRequest(request) + qwenRequest := m.buildQwenTextGenerationRequest(request, streaming) + if streaming { + ctx.SetContext(ctxKeyIncrementalStreaming, qwenRequest.Parameters.IncrementalOutput) + } return types.ActionContinue, replaceJsonRequestBody(qwenRequest, log) } @@ -156,7 +153,10 @@ func (m *qwenProvider) OnRequestBody(ctx wrapper.HttpContext, apiName ApiName, b _ = util.SendResponse(500, util.MimeTypeTextPlain, fmt.Sprintf("failed to load context file: %v", err)) } insertContextMessage(request, content) - qwenRequest := m.buildQwenTextGenerationRequest(request) + qwenRequest := m.buildQwenTextGenerationRequest(request, streaming) + if streaming { + ctx.SetContext(ctxKeyIncrementalStreaming, qwenRequest.Parameters.IncrementalOutput) + } if err := replaceJsonRequestBody(qwenRequest, log); err != nil { _ = util.SendResponse(500, util.MimeTypeTextPlain, fmt.Sprintf("failed to replace request body: %v", err)) } @@ -183,6 +183,11 @@ func (m *qwenProvider) OnStreamingResponseBody(ctx wrapper.HttpContext, name Api receivedBody = append(bufferedStreamingBody, chunk...) } + incrementalStreaming, err := ctx.GetContext(ctxKeyIncrementalStreaming).(bool) + if !err { + incrementalStreaming = false + } + eventStartIndex, lineStartIndex, valueStartIndex := -1, -1, -1 defer func() { @@ -194,7 +199,7 @@ func (m *qwenProvider) OnStreamingResponseBody(ctx wrapper.HttpContext, name Api } }() - // Sample event response: + // Sample Qwen event response: // // event:result // :HTTP_STATUS/200 @@ -233,12 +238,11 @@ func (m *qwenProvider) OnStreamingResponseBody(ctx wrapper.HttpContext, name Api if lineStartIndex != -1 { value := string(receivedBody[valueStartIndex:i]) - log.Debugf("key: %s value: %s", currentKey, value) currentEvent.setValue(currentKey, value) } else { // Extra new line. The current event is complete. log.Debugf("processing event: %v", currentEvent) - if err := m.convertStreamEvent(ctx, &responseBuilder, currentEvent, log); err != nil { + if err := m.convertStreamEvent(ctx, &responseBuilder, currentEvent, incrementalStreaming, log); err != nil { return nil, err } // Reset event parsing state. @@ -266,28 +270,52 @@ func (m *qwenProvider) OnResponseBody(ctx wrapper.HttpContext, apiName ApiName, return types.ActionContinue, replaceJsonResponseBody(response, log) } -func (m *qwenProvider) buildQwenTextGenerationRequest(origRequest *chatCompletionRequest) *qwenTextGenRequest { - return &qwenTextGenRequest{ +func (m *qwenProvider) buildQwenTextGenerationRequest(origRequest *chatCompletionRequest, streaming bool) *qwenTextGenRequest { + messages := make([]qwenMessage, 0, len(origRequest.Messages)) + for i := range origRequest.Messages { + messages = append(messages, chatMessage2QwenMessage(origRequest.Messages[i])) + } + request := &qwenTextGenRequest{ Model: origRequest.Model, Input: qwenTextGenInput{ - Messages: origRequest.Messages, + Messages: messages, }, Parameters: qwenTextGenParameters{ - ResultFormat: qwenResultFormatMessage, - MaxTokens: origRequest.MaxTokens, - N: origRequest.N, - Seed: origRequest.Seed, - Temperature: origRequest.Temperature, - TopP: math.Max(qwenTopPMin, math.Min(origRequest.TopP, qwenTopPMax)), + ResultFormat: qwenResultFormatMessage, + MaxTokens: origRequest.MaxTokens, + N: origRequest.N, + Seed: origRequest.Seed, + Temperature: origRequest.Temperature, + TopP: math.Max(qwenTopPMin, math.Min(origRequest.TopP, qwenTopPMax)), + IncrementalOutput: streaming && (origRequest.Tools == nil || len(origRequest.Tools) == 0), + EnableSearch: m.config.qwenEnableSearch, + Tools: origRequest.Tools, }, } + if len(m.config.qwenFileIds) != 0 { + builder := strings.Builder{} + for _, fileId := range m.config.qwenFileIds { + if builder.Len() != 0 { + builder.WriteRune(',') + } + builder.WriteString("fileid://") + builder.WriteString(fileId) + } + contextMessageId := m.insertContextMessage(request, builder.String()) + if contextMessageId == 0 { + // The context message cannot come first. We need to add another dummy system message before it. + request.Input.Messages = append([]qwenMessage{{Role: roleSystem, Content: qwenDummySystemMessageContent}}, request.Input.Messages...) + } + } + return request } func (m *qwenProvider) buildChatCompletionResponse(ctx wrapper.HttpContext, qwenResponse *qwenTextGenResponse) *chatCompletionResponse { choices := make([]chatCompletionChoice, 0, len(qwenResponse.Output.Choices)) for _, qwenChoice := range qwenResponse.Output.Choices { + message := qwenMessageToChatMessage(qwenChoice.Message) choices = append(choices, chatCompletionChoice{ - Message: &qwenChoice.Message, + Message: &message, FinishReason: qwenChoice.FinishReason, }) } @@ -306,7 +334,7 @@ func (m *qwenProvider) buildChatCompletionResponse(ctx wrapper.HttpContext, qwen } } -func (m *qwenProvider) buildChatCompletionStreamingResponse(ctx wrapper.HttpContext, qwenResponse *qwenTextGenResponse) []*chatCompletionResponse { +func (m *qwenProvider) buildChatCompletionStreamingResponse(ctx wrapper.HttpContext, qwenResponse *qwenTextGenResponse, incrementalStreaming bool, log wrapper.Log) []*chatCompletionResponse { baseMessage := chatCompletionResponse{ Id: qwenResponse.RequestId, Created: time.Now().UnixMilli() / 1000, @@ -320,17 +348,30 @@ func (m *qwenProvider) buildChatCompletionStreamingResponse(ctx wrapper.HttpCont qwenChoice := qwenResponse.Output.Choices[0] message := qwenChoice.Message - content := message.Content - if rawPushedContent := ctx.GetContext(ctxKeyPushedMessageContent); rawPushedContent != nil { - if pushedContent := rawPushedContent.(string); pushedContent != "" && strings.HasPrefix(content, pushedContent) { - content = content[len(pushedContent):] + deltaMessage := &chatMessage{Role: message.Role, Content: message.Content, ToolCalls: append([]toolCall{}, message.ToolCalls...)} + if !incrementalStreaming { + if pushedMessage, ok := ctx.GetContext(ctxKeyPushedMessage).(qwenMessage); ok { + deltaMessage.Content = util.StripPrefix(deltaMessage.Content, pushedMessage.Content) + if len(deltaMessage.ToolCalls) > 0 && pushedMessage.ToolCalls != nil { + for i, tc := range deltaMessage.ToolCalls { + if i >= len(pushedMessage.ToolCalls) { + break + } + pushedFunction := pushedMessage.ToolCalls[i].Function + tc.Function.Id = util.StripPrefix(tc.Function.Id, pushedFunction.Id) + tc.Function.Name = util.StripPrefix(tc.Function.Name, pushedFunction.Name) + tc.Function.Arguments = util.StripPrefix(tc.Function.Arguments, pushedFunction.Arguments) + deltaMessage.ToolCalls[i] = tc + } + } } + ctx.SetContext(ctxKeyPushedMessage, message) } - if content != "" { + + if !deltaMessage.IsEmpty() { deltaResponse := *&baseMessage - deltaResponse.Choices = append(deltaResponse.Choices, chatCompletionChoice{Delta: &chatMessage{Role: message.Role, Content: content}}) + deltaResponse.Choices = append(deltaResponse.Choices, chatCompletionChoice{Delta: deltaMessage}) responses = append(responses, &deltaResponse) - ctx.SetContext(ctxKeyPushedMessageContent, message.Content) } // Yes, Qwen uses a string "null" as null. @@ -343,7 +384,7 @@ func (m *qwenProvider) buildChatCompletionStreamingResponse(ctx wrapper.HttpCont return responses } -func (m *qwenProvider) convertStreamEvent(ctx wrapper.HttpContext, responseBuilder *strings.Builder, event *streamEvent, log wrapper.Log) error { +func (m *qwenProvider) convertStreamEvent(ctx wrapper.HttpContext, responseBuilder *strings.Builder, event *streamEvent, incrementalStreaming bool, log wrapper.Log) error { if event.Data == streamEndDataValue { m.appendStreamEvent(responseBuilder, event) return nil @@ -361,7 +402,7 @@ func (m *qwenProvider) convertStreamEvent(ctx wrapper.HttpContext, responseBuild return fmt.Errorf("unable to unmarshal Qwen response: %v", err) } - responses := m.buildChatCompletionStreamingResponse(ctx, qwenResponse) + responses := m.buildChatCompletionStreamingResponse(ctx, qwenResponse, incrementalStreaming, log) for _, response := range responses { responseBody, err := json.Marshal(response) if err != nil { @@ -376,8 +417,8 @@ func (m *qwenProvider) convertStreamEvent(ctx wrapper.HttpContext, responseBuild return nil } -func (m *qwenProvider) insertContextMessage(request *qwenTextGenRequest, content string) { - fileMessage := chatMessage{ +func (m *qwenProvider) insertContextMessage(request *qwenTextGenRequest, content string) int { + fileMessage := qwenMessage{ Role: roleSystem, Content: content, } @@ -392,23 +433,15 @@ func (m *qwenProvider) insertContextMessage(request *qwenTextGenRequest, content } } if firstNonSystemMessageIndex == -1 { - request.Input.Messages = append(request.Input.Messages, fileMessage) + request.Input.Messages = append([]qwenMessage{fileMessage}, request.Input.Messages...) + return 0 } else { - request.Input.Messages = append(request.Input.Messages[:firstNonSystemMessageIndex], append([]chatMessage{fileMessage}, request.Input.Messages[firstNonSystemMessageIndex:]...)...) + request.Input.Messages = append(request.Input.Messages[:firstNonSystemMessageIndex], append([]qwenMessage{fileMessage}, request.Input.Messages[firstNonSystemMessageIndex:]...)...) + return firstNonSystemMessageIndex } } func (m *qwenProvider) appendStreamEvent(responseBuilder *strings.Builder, event *streamEvent) { - responseBuilder.WriteString(streamEventIdItemKey) - responseBuilder.WriteString(event.Id) - responseBuilder.WriteString("\n") - responseBuilder.WriteString(streamEventNameItemKey) - responseBuilder.WriteString(event.Event) - responseBuilder.WriteString("\n") - responseBuilder.WriteString(streamBuiltInItemKey) - responseBuilder.WriteString(streamHttpStatusValuePrefix) - responseBuilder.WriteString(event.HttpStatus) - responseBuilder.WriteString("\n") responseBuilder.WriteString(streamDataItemKey) responseBuilder.WriteString(event.Data) responseBuilder.WriteString("\n\n") @@ -421,7 +454,7 @@ type qwenTextGenRequest struct { } type qwenTextGenInput struct { - Messages []chatMessage `json:"messages"` + Messages []qwenMessage `json:"messages"` } type qwenTextGenParameters struct { @@ -432,6 +465,9 @@ type qwenTextGenParameters struct { Seed int `json:"seed,omitempty"` Temperature float64 `json:"temperature,omitempty"` TopP float64 `json:"top_p,omitempty"` + IncrementalOutput bool `json:"incremental_output,omitempty"` + EnableSearch bool `json:"enable_search,omitempty"` + Tools []tool `json:"tools,omitempty"` } type qwenTextGenResponse struct { @@ -447,7 +483,7 @@ type qwenTextGenOutput struct { type qwenTextGenChoice struct { FinishReason string `json:"finish_reason"` - Message chatMessage `json:"message"` + Message qwenMessage `json:"message"` } type qwenTextGenUsage struct { @@ -455,3 +491,28 @@ type qwenTextGenUsage struct { OutputTokens int `json:"output_tokens"` TotalTokens int `json:"total_tokens"` } + +type qwenMessage struct { + Name string `json:"name,omitempty"` + Role string `json:"role"` + Content string `json:"content"` + ToolCalls []toolCall `json:"tool_calls,omitempty"` +} + +func qwenMessageToChatMessage(qwenMessage qwenMessage) chatMessage { + return chatMessage{ + Name: qwenMessage.Name, + Role: qwenMessage.Role, + Content: qwenMessage.Content, + ToolCalls: qwenMessage.ToolCalls, + } +} + +func chatMessage2QwenMessage(chatMessage chatMessage) qwenMessage { + return qwenMessage{ + Name: chatMessage.Name, + Role: chatMessage.Role, + Content: chatMessage.Content, + ToolCalls: chatMessage.ToolCalls, + } +} diff --git a/plugins/wasm-go/extensions/ai-proxy/provider/request_helper.go b/plugins/wasm-go/extensions/ai-proxy/provider/request_helper.go index 3e79d53bb..1c47fecc0 100644 --- a/plugins/wasm-go/extensions/ai-proxy/provider/request_helper.go +++ b/plugins/wasm-go/extensions/ai-proxy/provider/request_helper.go @@ -45,7 +45,7 @@ func insertContextMessage(request *chatCompletionRequest, content string) { } } if firstNonSystemMessageIndex == -1 { - request.Messages = append(request.Messages, fileMessage) + request.Messages = append([]chatMessage{fileMessage}, request.Messages...) } else { request.Messages = append(request.Messages[:firstNonSystemMessageIndex], append([]chatMessage{fileMessage}, request.Messages[firstNonSystemMessageIndex:]...)...) } diff --git a/plugins/wasm-go/extensions/ai-proxy/util/string.go b/plugins/wasm-go/extensions/ai-proxy/util/string.go new file mode 100644 index 000000000..391bca481 --- /dev/null +++ b/plugins/wasm-go/extensions/ai-proxy/util/string.go @@ -0,0 +1,8 @@ +package util + +func StripPrefix(s string, prefix string) string { + if len(prefix) != 0 && len(s) >= len(prefix) && s[0:len(prefix)] == prefix { + return s[len(prefix):] + } + return s +} diff --git a/plugins/wasm-go/extensions/basic-auth/go.mod b/plugins/wasm-go/extensions/basic-auth/go.mod index a3a6d0a5f..67e3504bb 100644 --- a/plugins/wasm-go/extensions/basic-auth/go.mod +++ b/plugins/wasm-go/extensions/basic-auth/go.mod @@ -6,7 +6,7 @@ replace github.com/alibaba/higress/plugins/wasm-go => ../.. require ( github.com/alibaba/higress/plugins/wasm-go v0.0.0 - github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240318034951-d5306e367c43 + github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240327114451-d6b7174a84fc github.com/pkg/errors v0.9.1 github.com/tidwall/gjson v1.14.3 ) diff --git a/plugins/wasm-go/extensions/basic-auth/go.sum b/plugins/wasm-go/extensions/basic-auth/go.sum index 084697e2d..25efb4cb8 100644 --- a/plugins/wasm-go/extensions/basic-auth/go.sum +++ b/plugins/wasm-go/extensions/basic-auth/go.sum @@ -6,6 +6,7 @@ github.com/higress-group/nottinygc v0.0.0-20231101025119-e93c4c2f8520/go.mod h1: github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240226064518-b3dc4646a35a h1:luYRvxLTE1xYxrXYj7nmjd1U0HHh8pUPiKfdZ0MhCGE= github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240226064518-b3dc4646a35a/go.mod h1:hNFjhrLUIq+kJ9bOcs8QtiplSQ61GZXtd2xHKx4BYRo= github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240318034951-d5306e367c43/go.mod h1:hNFjhrLUIq+kJ9bOcs8QtiplSQ61GZXtd2xHKx4BYRo= +github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240327114451-d6b7174a84fc/go.mod h1:hNFjhrLUIq+kJ9bOcs8QtiplSQ61GZXtd2xHKx4BYRo= github.com/magefile/mage v1.14.0 h1:6QDX3g6z1YvJ4olPhT1wksUcSa/V0a1B+pJb73fBjyo= github.com/magefile/mage v1.14.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= diff --git a/plugins/wasm-go/extensions/bot-detect/go.mod b/plugins/wasm-go/extensions/bot-detect/go.mod index 87e2a66e1..52af6b9f9 100644 --- a/plugins/wasm-go/extensions/bot-detect/go.mod +++ b/plugins/wasm-go/extensions/bot-detect/go.mod @@ -6,7 +6,7 @@ replace github.com/alibaba/higress/plugins/wasm-go => ../.. require ( github.com/alibaba/higress/plugins/wasm-go v1.3.2 - github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240318034951-d5306e367c43 + github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240327114451-d6b7174a84fc github.com/stretchr/testify v1.8.4 github.com/tidwall/gjson v1.14.3 github.com/wasilibs/go-re2 v1.4.1 diff --git a/plugins/wasm-go/extensions/bot-detect/go.sum b/plugins/wasm-go/extensions/bot-detect/go.sum index 7ffbc48ac..7bc4d7e73 100644 --- a/plugins/wasm-go/extensions/bot-detect/go.sum +++ b/plugins/wasm-go/extensions/bot-detect/go.sum @@ -7,6 +7,7 @@ github.com/higress-group/nottinygc v0.0.0-20231101025119-e93c4c2f8520/go.mod h1: github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240226064518-b3dc4646a35a h1:luYRvxLTE1xYxrXYj7nmjd1U0HHh8pUPiKfdZ0MhCGE= github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240226064518-b3dc4646a35a/go.mod h1:hNFjhrLUIq+kJ9bOcs8QtiplSQ61GZXtd2xHKx4BYRo= github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240318034951-d5306e367c43/go.mod h1:hNFjhrLUIq+kJ9bOcs8QtiplSQ61GZXtd2xHKx4BYRo= +github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240327114451-d6b7174a84fc/go.mod h1:hNFjhrLUIq+kJ9bOcs8QtiplSQ61GZXtd2xHKx4BYRo= github.com/magefile/mage v1.15.0 h1:BvGheCMAsG3bWUDbZ8AyXXpCNwU9u5CB6sM+HNb9HYg= github.com/magefile/mage v1.15.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/plugins/wasm-go/extensions/cache-control/go.mod b/plugins/wasm-go/extensions/cache-control/go.mod index 3958df033..e77683fec 100644 --- a/plugins/wasm-go/extensions/cache-control/go.mod +++ b/plugins/wasm-go/extensions/cache-control/go.mod @@ -6,7 +6,7 @@ replace github.com/alibaba/higress/plugins/wasm-go => ../.. require ( github.com/alibaba/higress/plugins/wasm-go v0.0.0 - github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240318034951-d5306e367c43 + github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240327114451-d6b7174a84fc github.com/tidwall/gjson v1.14.3 ) diff --git a/plugins/wasm-go/extensions/cache-control/go.sum b/plugins/wasm-go/extensions/cache-control/go.sum index 2be7ae07c..f88fca54a 100644 --- a/plugins/wasm-go/extensions/cache-control/go.sum +++ b/plugins/wasm-go/extensions/cache-control/go.sum @@ -1,6 +1,7 @@ github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/higress-group/nottinygc v0.0.0-20231101025119-e93c4c2f8520/go.mod h1:Nz8ORLaFiLWotg6GeKlJMhv8cci8mM43uEnLA5t8iew= github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240318034951-d5306e367c43/go.mod h1:hNFjhrLUIq+kJ9bOcs8QtiplSQ61GZXtd2xHKx4BYRo= +github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240327114451-d6b7174a84fc/go.mod h1:hNFjhrLUIq+kJ9bOcs8QtiplSQ61GZXtd2xHKx4BYRo= github.com/magefile/mage v1.14.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/tidwall/gjson v1.14.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= diff --git a/plugins/wasm-go/extensions/chatgpt-proxy/go.mod b/plugins/wasm-go/extensions/chatgpt-proxy/go.mod index d6f022dda..1887c8503 100644 --- a/plugins/wasm-go/extensions/chatgpt-proxy/go.mod +++ b/plugins/wasm-go/extensions/chatgpt-proxy/go.mod @@ -6,7 +6,7 @@ replace github.com/alibaba/higress/plugins/wasm-go => ../.. require ( github.com/alibaba/higress/plugins/wasm-go v0.0.0-20230629030002-81e467b6242d - github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240318034951-d5306e367c43 + github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240327114451-d6b7174a84fc github.com/tidwall/gjson v1.14.4 ) diff --git a/plugins/wasm-go/extensions/chatgpt-proxy/go.sum b/plugins/wasm-go/extensions/chatgpt-proxy/go.sum index 429d5028f..3978bea53 100644 --- a/plugins/wasm-go/extensions/chatgpt-proxy/go.sum +++ b/plugins/wasm-go/extensions/chatgpt-proxy/go.sum @@ -6,6 +6,7 @@ github.com/higress-group/nottinygc v0.0.0-20231101025119-e93c4c2f8520/go.mod h1: github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240226064518-b3dc4646a35a h1:luYRvxLTE1xYxrXYj7nmjd1U0HHh8pUPiKfdZ0MhCGE= github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240226064518-b3dc4646a35a/go.mod h1:hNFjhrLUIq+kJ9bOcs8QtiplSQ61GZXtd2xHKx4BYRo= github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240318034951-d5306e367c43/go.mod h1:hNFjhrLUIq+kJ9bOcs8QtiplSQ61GZXtd2xHKx4BYRo= +github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240327114451-d6b7174a84fc/go.mod h1:hNFjhrLUIq+kJ9bOcs8QtiplSQ61GZXtd2xHKx4BYRo= github.com/magefile/mage v1.14.0 h1:6QDX3g6z1YvJ4olPhT1wksUcSa/V0a1B+pJb73fBjyo= github.com/magefile/mage v1.14.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/plugins/wasm-go/extensions/cors/go.mod b/plugins/wasm-go/extensions/cors/go.mod index 1510c8b2f..2ee32715f 100644 --- a/plugins/wasm-go/extensions/cors/go.mod +++ b/plugins/wasm-go/extensions/cors/go.mod @@ -6,7 +6,7 @@ replace github.com/alibaba/higress/plugins/wasm-go => ../.. require ( github.com/alibaba/higress/plugins/wasm-go v0.0.0-20230519024024-625c06e58f91 - github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240318034951-d5306e367c43 + github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240327114451-d6b7174a84fc github.com/stretchr/testify v1.8.4 github.com/tidwall/gjson v1.14.4 ) diff --git a/plugins/wasm-go/extensions/cors/go.sum b/plugins/wasm-go/extensions/cors/go.sum index d59791425..f3527c05c 100644 --- a/plugins/wasm-go/extensions/cors/go.sum +++ b/plugins/wasm-go/extensions/cors/go.sum @@ -7,6 +7,7 @@ github.com/higress-group/nottinygc v0.0.0-20231101025119-e93c4c2f8520/go.mod h1: github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240226064518-b3dc4646a35a h1:luYRvxLTE1xYxrXYj7nmjd1U0HHh8pUPiKfdZ0MhCGE= github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240226064518-b3dc4646a35a/go.mod h1:hNFjhrLUIq+kJ9bOcs8QtiplSQ61GZXtd2xHKx4BYRo= github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240318034951-d5306e367c43/go.mod h1:hNFjhrLUIq+kJ9bOcs8QtiplSQ61GZXtd2xHKx4BYRo= +github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240327114451-d6b7174a84fc/go.mod h1:hNFjhrLUIq+kJ9bOcs8QtiplSQ61GZXtd2xHKx4BYRo= github.com/magefile/mage v1.14.0 h1:6QDX3g6z1YvJ4olPhT1wksUcSa/V0a1B+pJb73fBjyo= github.com/magefile/mage v1.14.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/plugins/wasm-go/extensions/custom-response/go.mod b/plugins/wasm-go/extensions/custom-response/go.mod index 23b2c31a6..502302bfe 100644 --- a/plugins/wasm-go/extensions/custom-response/go.mod +++ b/plugins/wasm-go/extensions/custom-response/go.mod @@ -6,7 +6,7 @@ replace github.com/alibaba/higress/plugins/wasm-go => ../.. require ( github.com/alibaba/higress/plugins/wasm-go v0.0.0 - github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240318034951-d5306e367c43 + github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240327114451-d6b7174a84fc github.com/tidwall/gjson v1.14.3 ) diff --git a/plugins/wasm-go/extensions/custom-response/go.sum b/plugins/wasm-go/extensions/custom-response/go.sum index 37ff5ba6c..cc4b46aa2 100644 --- a/plugins/wasm-go/extensions/custom-response/go.sum +++ b/plugins/wasm-go/extensions/custom-response/go.sum @@ -6,6 +6,7 @@ github.com/higress-group/nottinygc v0.0.0-20231101025119-e93c4c2f8520/go.mod h1: github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240226064518-b3dc4646a35a h1:luYRvxLTE1xYxrXYj7nmjd1U0HHh8pUPiKfdZ0MhCGE= github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240226064518-b3dc4646a35a/go.mod h1:hNFjhrLUIq+kJ9bOcs8QtiplSQ61GZXtd2xHKx4BYRo= github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240318034951-d5306e367c43/go.mod h1:hNFjhrLUIq+kJ9bOcs8QtiplSQ61GZXtd2xHKx4BYRo= +github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240327114451-d6b7174a84fc/go.mod h1:hNFjhrLUIq+kJ9bOcs8QtiplSQ61GZXtd2xHKx4BYRo= github.com/magefile/mage v1.14.0 h1:6QDX3g6z1YvJ4olPhT1wksUcSa/V0a1B+pJb73fBjyo= github.com/magefile/mage v1.14.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/plugins/wasm-go/extensions/de-graphql/go.mod b/plugins/wasm-go/extensions/de-graphql/go.mod index f2833d1fc..ee64f6911 100644 --- a/plugins/wasm-go/extensions/de-graphql/go.mod +++ b/plugins/wasm-go/extensions/de-graphql/go.mod @@ -6,7 +6,7 @@ replace github.com/alibaba/higress/plugins/wasm-go => ../.. require ( github.com/alibaba/higress/plugins/wasm-go v0.0.0-20230410091208-df60dd43079c - github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240318034951-d5306e367c43 + github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240327114451-d6b7174a84fc github.com/stretchr/testify v1.8.4 github.com/tidwall/gjson v1.14.4 ) diff --git a/plugins/wasm-go/extensions/de-graphql/go.sum b/plugins/wasm-go/extensions/de-graphql/go.sum index d59791425..f3527c05c 100644 --- a/plugins/wasm-go/extensions/de-graphql/go.sum +++ b/plugins/wasm-go/extensions/de-graphql/go.sum @@ -7,6 +7,7 @@ github.com/higress-group/nottinygc v0.0.0-20231101025119-e93c4c2f8520/go.mod h1: github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240226064518-b3dc4646a35a h1:luYRvxLTE1xYxrXYj7nmjd1U0HHh8pUPiKfdZ0MhCGE= github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240226064518-b3dc4646a35a/go.mod h1:hNFjhrLUIq+kJ9bOcs8QtiplSQ61GZXtd2xHKx4BYRo= github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240318034951-d5306e367c43/go.mod h1:hNFjhrLUIq+kJ9bOcs8QtiplSQ61GZXtd2xHKx4BYRo= +github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240327114451-d6b7174a84fc/go.mod h1:hNFjhrLUIq+kJ9bOcs8QtiplSQ61GZXtd2xHKx4BYRo= github.com/magefile/mage v1.14.0 h1:6QDX3g6z1YvJ4olPhT1wksUcSa/V0a1B+pJb73fBjyo= github.com/magefile/mage v1.14.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/plugins/wasm-go/extensions/gc-test/go.mod b/plugins/wasm-go/extensions/gc-test/go.mod index 50bc79106..635b75513 100644 --- a/plugins/wasm-go/extensions/gc-test/go.mod +++ b/plugins/wasm-go/extensions/gc-test/go.mod @@ -8,7 +8,7 @@ replace github.com/wasilibs/nottinygc v0.5.1 => github.com/higress-group/nottiny require ( github.com/alibaba/higress/plugins/wasm-go v0.0.0 - github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240318034951-d5306e367c43 + github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240327114451-d6b7174a84fc github.com/tidwall/gjson v1.14.3 ) diff --git a/plugins/wasm-go/extensions/gc-test/go.sum b/plugins/wasm-go/extensions/gc-test/go.sum index 37ff5ba6c..cc4b46aa2 100644 --- a/plugins/wasm-go/extensions/gc-test/go.sum +++ b/plugins/wasm-go/extensions/gc-test/go.sum @@ -6,6 +6,7 @@ github.com/higress-group/nottinygc v0.0.0-20231101025119-e93c4c2f8520/go.mod h1: github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240226064518-b3dc4646a35a h1:luYRvxLTE1xYxrXYj7nmjd1U0HHh8pUPiKfdZ0MhCGE= github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240226064518-b3dc4646a35a/go.mod h1:hNFjhrLUIq+kJ9bOcs8QtiplSQ61GZXtd2xHKx4BYRo= github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240318034951-d5306e367c43/go.mod h1:hNFjhrLUIq+kJ9bOcs8QtiplSQ61GZXtd2xHKx4BYRo= +github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240327114451-d6b7174a84fc/go.mod h1:hNFjhrLUIq+kJ9bOcs8QtiplSQ61GZXtd2xHKx4BYRo= github.com/magefile/mage v1.14.0 h1:6QDX3g6z1YvJ4olPhT1wksUcSa/V0a1B+pJb73fBjyo= github.com/magefile/mage v1.14.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/plugins/wasm-go/extensions/gw-error-format/go.mod b/plugins/wasm-go/extensions/gw-error-format/go.mod index c130eba49..0225c496b 100644 --- a/plugins/wasm-go/extensions/gw-error-format/go.mod +++ b/plugins/wasm-go/extensions/gw-error-format/go.mod @@ -5,7 +5,7 @@ go 1.18 replace github.com/alibaba/higress/plugins/wasm-go => ../.. require ( - github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240318034951-d5306e367c43 + github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240327114451-d6b7174a84fc github.com/tidwall/gjson v1.14.3 ) diff --git a/plugins/wasm-go/extensions/gw-error-format/go.sum b/plugins/wasm-go/extensions/gw-error-format/go.sum index 37ff5ba6c..cc4b46aa2 100644 --- a/plugins/wasm-go/extensions/gw-error-format/go.sum +++ b/plugins/wasm-go/extensions/gw-error-format/go.sum @@ -6,6 +6,7 @@ github.com/higress-group/nottinygc v0.0.0-20231101025119-e93c4c2f8520/go.mod h1: github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240226064518-b3dc4646a35a h1:luYRvxLTE1xYxrXYj7nmjd1U0HHh8pUPiKfdZ0MhCGE= github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240226064518-b3dc4646a35a/go.mod h1:hNFjhrLUIq+kJ9bOcs8QtiplSQ61GZXtd2xHKx4BYRo= github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240318034951-d5306e367c43/go.mod h1:hNFjhrLUIq+kJ9bOcs8QtiplSQ61GZXtd2xHKx4BYRo= +github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240327114451-d6b7174a84fc/go.mod h1:hNFjhrLUIq+kJ9bOcs8QtiplSQ61GZXtd2xHKx4BYRo= github.com/magefile/mage v1.14.0 h1:6QDX3g6z1YvJ4olPhT1wksUcSa/V0a1B+pJb73fBjyo= github.com/magefile/mage v1.14.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/plugins/wasm-go/extensions/hello-world/go.mod b/plugins/wasm-go/extensions/hello-world/go.mod index e718807fc..b92f63526 100644 --- a/plugins/wasm-go/extensions/hello-world/go.mod +++ b/plugins/wasm-go/extensions/hello-world/go.mod @@ -6,7 +6,7 @@ replace github.com/alibaba/higress/plugins/wasm-go => ../.. require ( github.com/alibaba/higress/plugins/wasm-go v0.0.0 - github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240318034951-d5306e367c43 + github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240327114451-d6b7174a84fc ) require ( diff --git a/plugins/wasm-go/extensions/hello-world/go.sum b/plugins/wasm-go/extensions/hello-world/go.sum index 37ff5ba6c..cc4b46aa2 100644 --- a/plugins/wasm-go/extensions/hello-world/go.sum +++ b/plugins/wasm-go/extensions/hello-world/go.sum @@ -6,6 +6,7 @@ github.com/higress-group/nottinygc v0.0.0-20231101025119-e93c4c2f8520/go.mod h1: github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240226064518-b3dc4646a35a h1:luYRvxLTE1xYxrXYj7nmjd1U0HHh8pUPiKfdZ0MhCGE= github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240226064518-b3dc4646a35a/go.mod h1:hNFjhrLUIq+kJ9bOcs8QtiplSQ61GZXtd2xHKx4BYRo= github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240318034951-d5306e367c43/go.mod h1:hNFjhrLUIq+kJ9bOcs8QtiplSQ61GZXtd2xHKx4BYRo= +github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240327114451-d6b7174a84fc/go.mod h1:hNFjhrLUIq+kJ9bOcs8QtiplSQ61GZXtd2xHKx4BYRo= github.com/magefile/mage v1.14.0 h1:6QDX3g6z1YvJ4olPhT1wksUcSa/V0a1B+pJb73fBjyo= github.com/magefile/mage v1.14.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/plugins/wasm-go/extensions/http-call/go.mod b/plugins/wasm-go/extensions/http-call/go.mod index 4f4a5ad7d..a23006e24 100644 --- a/plugins/wasm-go/extensions/http-call/go.mod +++ b/plugins/wasm-go/extensions/http-call/go.mod @@ -6,7 +6,7 @@ replace github.com/alibaba/higress/plugins/wasm-go => ../.. require ( github.com/alibaba/higress/plugins/wasm-go v0.0.0 - github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240318034951-d5306e367c43 + github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240327114451-d6b7174a84fc github.com/tidwall/gjson v1.14.3 ) diff --git a/plugins/wasm-go/extensions/http-call/go.sum b/plugins/wasm-go/extensions/http-call/go.sum index 37ff5ba6c..cc4b46aa2 100644 --- a/plugins/wasm-go/extensions/http-call/go.sum +++ b/plugins/wasm-go/extensions/http-call/go.sum @@ -6,6 +6,7 @@ github.com/higress-group/nottinygc v0.0.0-20231101025119-e93c4c2f8520/go.mod h1: github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240226064518-b3dc4646a35a h1:luYRvxLTE1xYxrXYj7nmjd1U0HHh8pUPiKfdZ0MhCGE= github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240226064518-b3dc4646a35a/go.mod h1:hNFjhrLUIq+kJ9bOcs8QtiplSQ61GZXtd2xHKx4BYRo= github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240318034951-d5306e367c43/go.mod h1:hNFjhrLUIq+kJ9bOcs8QtiplSQ61GZXtd2xHKx4BYRo= +github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240327114451-d6b7174a84fc/go.mod h1:hNFjhrLUIq+kJ9bOcs8QtiplSQ61GZXtd2xHKx4BYRo= github.com/magefile/mage v1.14.0 h1:6QDX3g6z1YvJ4olPhT1wksUcSa/V0a1B+pJb73fBjyo= github.com/magefile/mage v1.14.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/plugins/wasm-go/extensions/ip-restriction/go.mod b/plugins/wasm-go/extensions/ip-restriction/go.mod index 30d3d0cad..49aef33ea 100644 --- a/plugins/wasm-go/extensions/ip-restriction/go.mod +++ b/plugins/wasm-go/extensions/ip-restriction/go.mod @@ -6,7 +6,7 @@ replace github.com/alibaba/higress/plugins/wasm-go => ../.. require ( github.com/alibaba/higress/plugins/wasm-go v0.0.0 - github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240318034951-d5306e367c43 + github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240327114451-d6b7174a84fc github.com/tidwall/gjson v1.14.3 github.com/zmap/go-iptree v0.0.0-20210731043055-d4e632617837 ) diff --git a/plugins/wasm-go/extensions/ip-restriction/go.sum b/plugins/wasm-go/extensions/ip-restriction/go.sum index e8b7aa6e8..7f2e48c79 100644 --- a/plugins/wasm-go/extensions/ip-restriction/go.sum +++ b/plugins/wasm-go/extensions/ip-restriction/go.sum @@ -8,6 +8,7 @@ github.com/higress-group/nottinygc v0.0.0-20231101025119-e93c4c2f8520/go.mod h1: github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240226064518-b3dc4646a35a h1:luYRvxLTE1xYxrXYj7nmjd1U0HHh8pUPiKfdZ0MhCGE= github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240226064518-b3dc4646a35a/go.mod h1:hNFjhrLUIq+kJ9bOcs8QtiplSQ61GZXtd2xHKx4BYRo= github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240318034951-d5306e367c43/go.mod h1:hNFjhrLUIq+kJ9bOcs8QtiplSQ61GZXtd2xHKx4BYRo= +github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240327114451-d6b7174a84fc/go.mod h1:hNFjhrLUIq+kJ9bOcs8QtiplSQ61GZXtd2xHKx4BYRo= github.com/magefile/mage v1.14.0 h1:6QDX3g6z1YvJ4olPhT1wksUcSa/V0a1B+pJb73fBjyo= github.com/magefile/mage v1.14.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/plugins/wasm-go/extensions/key-auth/go.mod b/plugins/wasm-go/extensions/key-auth/go.mod index f2bf1038c..c93ed8c36 100644 --- a/plugins/wasm-go/extensions/key-auth/go.mod +++ b/plugins/wasm-go/extensions/key-auth/go.mod @@ -6,7 +6,7 @@ replace github.com/alibaba/higress/plugins/wasm-go => ../.. require ( github.com/alibaba/higress/plugins/wasm-go v0.0.0-20231017105619-a18879bf867c - github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240318034951-d5306e367c43 + github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240327114451-d6b7174a84fc github.com/tidwall/gjson v1.14.4 ) diff --git a/plugins/wasm-go/extensions/key-auth/go.sum b/plugins/wasm-go/extensions/key-auth/go.sum index 429d5028f..3978bea53 100644 --- a/plugins/wasm-go/extensions/key-auth/go.sum +++ b/plugins/wasm-go/extensions/key-auth/go.sum @@ -6,6 +6,7 @@ github.com/higress-group/nottinygc v0.0.0-20231101025119-e93c4c2f8520/go.mod h1: github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240226064518-b3dc4646a35a h1:luYRvxLTE1xYxrXYj7nmjd1U0HHh8pUPiKfdZ0MhCGE= github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240226064518-b3dc4646a35a/go.mod h1:hNFjhrLUIq+kJ9bOcs8QtiplSQ61GZXtd2xHKx4BYRo= github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240318034951-d5306e367c43/go.mod h1:hNFjhrLUIq+kJ9bOcs8QtiplSQ61GZXtd2xHKx4BYRo= +github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240327114451-d6b7174a84fc/go.mod h1:hNFjhrLUIq+kJ9bOcs8QtiplSQ61GZXtd2xHKx4BYRo= github.com/magefile/mage v1.14.0 h1:6QDX3g6z1YvJ4olPhT1wksUcSa/V0a1B+pJb73fBjyo= github.com/magefile/mage v1.14.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/plugins/wasm-go/extensions/oidc/go.mod b/plugins/wasm-go/extensions/oidc/go.mod index 007583c13..f547109bf 100644 --- a/plugins/wasm-go/extensions/oidc/go.mod +++ b/plugins/wasm-go/extensions/oidc/go.mod @@ -7,7 +7,7 @@ replace github.com/alibaba/higress/plugins/wasm-go => ../.. require ( github.com/alibaba/higress/plugins/wasm-go v0.0.0-20230807053545-d307d0e755f1 github.com/go-jose/go-jose/v3 v3.0.0 - github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240318034951-d5306e367c43 + github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240327114451-d6b7174a84fc github.com/tidwall/gjson v1.14.3 golang.org/x/oauth2 v0.11.0 ) diff --git a/plugins/wasm-go/extensions/oidc/go.sum b/plugins/wasm-go/extensions/oidc/go.sum index ad3095d39..9cfb6f7b5 100644 --- a/plugins/wasm-go/extensions/oidc/go.sum +++ b/plugins/wasm-go/extensions/oidc/go.sum @@ -16,6 +16,7 @@ github.com/higress-group/nottinygc v0.0.0-20231101025119-e93c4c2f8520/go.mod h1: github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240226064518-b3dc4646a35a h1:luYRvxLTE1xYxrXYj7nmjd1U0HHh8pUPiKfdZ0MhCGE= github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240226064518-b3dc4646a35a/go.mod h1:hNFjhrLUIq+kJ9bOcs8QtiplSQ61GZXtd2xHKx4BYRo= github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240318034951-d5306e367c43/go.mod h1:hNFjhrLUIq+kJ9bOcs8QtiplSQ61GZXtd2xHKx4BYRo= +github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240327114451-d6b7174a84fc/go.mod h1:hNFjhrLUIq+kJ9bOcs8QtiplSQ61GZXtd2xHKx4BYRo= github.com/magefile/mage v1.14.0 h1:6QDX3g6z1YvJ4olPhT1wksUcSa/V0a1B+pJb73fBjyo= github.com/magefile/mage v1.14.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/plugins/wasm-go/extensions/opa/go.mod b/plugins/wasm-go/extensions/opa/go.mod index 87aad15d2..f0fae2a5a 100644 --- a/plugins/wasm-go/extensions/opa/go.mod +++ b/plugins/wasm-go/extensions/opa/go.mod @@ -4,7 +4,7 @@ go 1.19 require ( github.com/alibaba/higress/plugins/wasm-go v0.0.0 - github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240318034951-d5306e367c43 + github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240327114451-d6b7174a84fc github.com/stretchr/testify v1.8.4 github.com/tidwall/gjson v1.14.4 ) diff --git a/plugins/wasm-go/extensions/opa/go.sum b/plugins/wasm-go/extensions/opa/go.sum index 186227911..99456144e 100644 --- a/plugins/wasm-go/extensions/opa/go.sum +++ b/plugins/wasm-go/extensions/opa/go.sum @@ -7,6 +7,7 @@ github.com/higress-group/nottinygc v0.0.0-20231101025119-e93c4c2f8520/go.mod h1: github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240226064518-b3dc4646a35a h1:luYRvxLTE1xYxrXYj7nmjd1U0HHh8pUPiKfdZ0MhCGE= github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240226064518-b3dc4646a35a/go.mod h1:hNFjhrLUIq+kJ9bOcs8QtiplSQ61GZXtd2xHKx4BYRo= github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240318034951-d5306e367c43/go.mod h1:hNFjhrLUIq+kJ9bOcs8QtiplSQ61GZXtd2xHKx4BYRo= +github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240327114451-d6b7174a84fc/go.mod h1:hNFjhrLUIq+kJ9bOcs8QtiplSQ61GZXtd2xHKx4BYRo= github.com/magefile/mage v1.14.0 h1:6QDX3g6z1YvJ4olPhT1wksUcSa/V0a1B+pJb73fBjyo= github.com/magefile/mage v1.14.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/plugins/wasm-go/extensions/request-block/go.mod b/plugins/wasm-go/extensions/request-block/go.mod index 4db936735..9cf12b8fd 100644 --- a/plugins/wasm-go/extensions/request-block/go.mod +++ b/plugins/wasm-go/extensions/request-block/go.mod @@ -6,7 +6,7 @@ replace github.com/alibaba/higress/plugins/wasm-go => ../.. require ( github.com/alibaba/higress/plugins/wasm-go v0.0.0 - github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240318034951-d5306e367c43 + github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240327114451-d6b7174a84fc github.com/tidwall/gjson v1.14.3 ) diff --git a/plugins/wasm-go/extensions/request-block/go.sum b/plugins/wasm-go/extensions/request-block/go.sum index 37ff5ba6c..cc4b46aa2 100644 --- a/plugins/wasm-go/extensions/request-block/go.sum +++ b/plugins/wasm-go/extensions/request-block/go.sum @@ -6,6 +6,7 @@ github.com/higress-group/nottinygc v0.0.0-20231101025119-e93c4c2f8520/go.mod h1: github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240226064518-b3dc4646a35a h1:luYRvxLTE1xYxrXYj7nmjd1U0HHh8pUPiKfdZ0MhCGE= github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240226064518-b3dc4646a35a/go.mod h1:hNFjhrLUIq+kJ9bOcs8QtiplSQ61GZXtd2xHKx4BYRo= github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240318034951-d5306e367c43/go.mod h1:hNFjhrLUIq+kJ9bOcs8QtiplSQ61GZXtd2xHKx4BYRo= +github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240327114451-d6b7174a84fc/go.mod h1:hNFjhrLUIq+kJ9bOcs8QtiplSQ61GZXtd2xHKx4BYRo= github.com/magefile/mage v1.14.0 h1:6QDX3g6z1YvJ4olPhT1wksUcSa/V0a1B+pJb73fBjyo= github.com/magefile/mage v1.14.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/plugins/wasm-go/extensions/request-validation/go.mod b/plugins/wasm-go/extensions/request-validation/go.mod index 0e3ee1fab..35f50b8e4 100644 --- a/plugins/wasm-go/extensions/request-validation/go.mod +++ b/plugins/wasm-go/extensions/request-validation/go.mod @@ -6,7 +6,7 @@ replace github.com/alibaba/higress/plugins/wasm-go => ../.. require ( github.com/alibaba/higress/plugins/wasm-go v1.3.1 - github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240318034951-d5306e367c43 + github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240327114451-d6b7174a84fc github.com/santhosh-tekuri/jsonschema v1.2.4 github.com/tidwall/gjson v1.17.0 ) diff --git a/plugins/wasm-go/extensions/request-validation/go.sum b/plugins/wasm-go/extensions/request-validation/go.sum index 790d63ae1..a7fc85a8a 100644 --- a/plugins/wasm-go/extensions/request-validation/go.sum +++ b/plugins/wasm-go/extensions/request-validation/go.sum @@ -6,6 +6,7 @@ github.com/higress-group/nottinygc v0.0.0-20231101025119-e93c4c2f8520/go.mod h1: github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240226065437-8f7a0b3c9071 h1:STb5rOHRZOzoiAa+gTz2LFqO1nYj7U/1eIVUJJadU4A= github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240226065437-8f7a0b3c9071/go.mod h1:hNFjhrLUIq+kJ9bOcs8QtiplSQ61GZXtd2xHKx4BYRo= github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240318034951-d5306e367c43/go.mod h1:hNFjhrLUIq+kJ9bOcs8QtiplSQ61GZXtd2xHKx4BYRo= +github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240327114451-d6b7174a84fc/go.mod h1:hNFjhrLUIq+kJ9bOcs8QtiplSQ61GZXtd2xHKx4BYRo= github.com/magefile/mage v1.14.0 h1:6QDX3g6z1YvJ4olPhT1wksUcSa/V0a1B+pJb73fBjyo= github.com/magefile/mage v1.14.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/plugins/wasm-go/extensions/simple-jwt-auth/go.mod b/plugins/wasm-go/extensions/simple-jwt-auth/go.mod index 15e972f31..0a1e93ee2 100644 --- a/plugins/wasm-go/extensions/simple-jwt-auth/go.mod +++ b/plugins/wasm-go/extensions/simple-jwt-auth/go.mod @@ -7,7 +7,7 @@ replace github.com/alibaba/higress/plugins/wasm-go => ../.. require ( github.com/alibaba/higress/plugins/wasm-go v0.0.0-20230811015533-49269b43032f github.com/dgrijalva/jwt-go v3.2.0+incompatible - github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240318034951-d5306e367c43 + github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240327114451-d6b7174a84fc github.com/tidwall/gjson v1.16.0 ) diff --git a/plugins/wasm-go/extensions/simple-jwt-auth/go.sum b/plugins/wasm-go/extensions/simple-jwt-auth/go.sum index 86ded50b0..358c731ae 100644 --- a/plugins/wasm-go/extensions/simple-jwt-auth/go.sum +++ b/plugins/wasm-go/extensions/simple-jwt-auth/go.sum @@ -8,6 +8,7 @@ github.com/higress-group/nottinygc v0.0.0-20231101025119-e93c4c2f8520/go.mod h1: github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240226064518-b3dc4646a35a h1:luYRvxLTE1xYxrXYj7nmjd1U0HHh8pUPiKfdZ0MhCGE= github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240226064518-b3dc4646a35a/go.mod h1:hNFjhrLUIq+kJ9bOcs8QtiplSQ61GZXtd2xHKx4BYRo= github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240318034951-d5306e367c43/go.mod h1:hNFjhrLUIq+kJ9bOcs8QtiplSQ61GZXtd2xHKx4BYRo= +github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240327114451-d6b7174a84fc/go.mod h1:hNFjhrLUIq+kJ9bOcs8QtiplSQ61GZXtd2xHKx4BYRo= github.com/magefile/mage v1.14.0 h1:6QDX3g6z1YvJ4olPhT1wksUcSa/V0a1B+pJb73fBjyo= github.com/magefile/mage v1.14.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/plugins/wasm-go/extensions/sni-misdirect/go.mod b/plugins/wasm-go/extensions/sni-misdirect/go.mod index 6bec9135c..8ed58599d 100644 --- a/plugins/wasm-go/extensions/sni-misdirect/go.mod +++ b/plugins/wasm-go/extensions/sni-misdirect/go.mod @@ -6,7 +6,7 @@ replace github.com/alibaba/higress/plugins/wasm-go => ../.. require ( github.com/alibaba/higress/plugins/wasm-go v1.3.1 - github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240318034951-d5306e367c43 + github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240327114451-d6b7174a84fc ) require ( diff --git a/plugins/wasm-go/extensions/sni-misdirect/go.sum b/plugins/wasm-go/extensions/sni-misdirect/go.sum index 37ff5ba6c..cc4b46aa2 100644 --- a/plugins/wasm-go/extensions/sni-misdirect/go.sum +++ b/plugins/wasm-go/extensions/sni-misdirect/go.sum @@ -6,6 +6,7 @@ github.com/higress-group/nottinygc v0.0.0-20231101025119-e93c4c2f8520/go.mod h1: github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240226064518-b3dc4646a35a h1:luYRvxLTE1xYxrXYj7nmjd1U0HHh8pUPiKfdZ0MhCGE= github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240226064518-b3dc4646a35a/go.mod h1:hNFjhrLUIq+kJ9bOcs8QtiplSQ61GZXtd2xHKx4BYRo= github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240318034951-d5306e367c43/go.mod h1:hNFjhrLUIq+kJ9bOcs8QtiplSQ61GZXtd2xHKx4BYRo= +github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240327114451-d6b7174a84fc/go.mod h1:hNFjhrLUIq+kJ9bOcs8QtiplSQ61GZXtd2xHKx4BYRo= github.com/magefile/mage v1.14.0 h1:6QDX3g6z1YvJ4olPhT1wksUcSa/V0a1B+pJb73fBjyo= github.com/magefile/mage v1.14.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/plugins/wasm-go/extensions/streaming-body-example/go.mod b/plugins/wasm-go/extensions/streaming-body-example/go.mod index 0eda554af..9b094399b 100644 --- a/plugins/wasm-go/extensions/streaming-body-example/go.mod +++ b/plugins/wasm-go/extensions/streaming-body-example/go.mod @@ -6,7 +6,7 @@ replace github.com/alibaba/higress/plugins/wasm-go => ../.. require ( github.com/alibaba/higress/plugins/wasm-go v0.0.0 - github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240318034951-d5306e367c43 + github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240327114451-d6b7174a84fc ) require ( diff --git a/plugins/wasm-go/extensions/streaming-body-example/go.sum b/plugins/wasm-go/extensions/streaming-body-example/go.sum index 37ff5ba6c..cc4b46aa2 100644 --- a/plugins/wasm-go/extensions/streaming-body-example/go.sum +++ b/plugins/wasm-go/extensions/streaming-body-example/go.sum @@ -6,6 +6,7 @@ github.com/higress-group/nottinygc v0.0.0-20231101025119-e93c4c2f8520/go.mod h1: github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240226064518-b3dc4646a35a h1:luYRvxLTE1xYxrXYj7nmjd1U0HHh8pUPiKfdZ0MhCGE= github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240226064518-b3dc4646a35a/go.mod h1:hNFjhrLUIq+kJ9bOcs8QtiplSQ61GZXtd2xHKx4BYRo= github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240318034951-d5306e367c43/go.mod h1:hNFjhrLUIq+kJ9bOcs8QtiplSQ61GZXtd2xHKx4BYRo= +github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240327114451-d6b7174a84fc/go.mod h1:hNFjhrLUIq+kJ9bOcs8QtiplSQ61GZXtd2xHKx4BYRo= github.com/magefile/mage v1.14.0 h1:6QDX3g6z1YvJ4olPhT1wksUcSa/V0a1B+pJb73fBjyo= github.com/magefile/mage v1.14.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/plugins/wasm-go/extensions/waf/go.mod b/plugins/wasm-go/extensions/waf/go.mod index 36253c647..020444b80 100644 --- a/plugins/wasm-go/extensions/waf/go.mod +++ b/plugins/wasm-go/extensions/waf/go.mod @@ -6,7 +6,7 @@ require ( github.com/alibaba/higress/plugins/wasm-go v0.0.0 github.com/corazawaf/coraza-wasilibs v0.0.0-20230408002644-e2e3af21f503 github.com/corazawaf/coraza/v3 v3.0.0-rc.1.0.20230407165813-a18681b1ec28 - github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240318034951-d5306e367c43 + github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240327114451-d6b7174a84fc github.com/tidwall/gjson v1.14.4 ) diff --git a/plugins/wasm-go/extensions/waf/go.sum b/plugins/wasm-go/extensions/waf/go.sum index 4d318e425..bc93f16b5 100644 --- a/plugins/wasm-go/extensions/waf/go.sum +++ b/plugins/wasm-go/extensions/waf/go.sum @@ -12,6 +12,7 @@ github.com/higress-group/nottinygc v0.0.0-20231101025119-e93c4c2f8520 h1:IHDghbG github.com/higress-group/nottinygc v0.0.0-20231101025119-e93c4c2f8520/go.mod h1:Nz8ORLaFiLWotg6GeKlJMhv8cci8mM43uEnLA5t8iew= github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240318034951-d5306e367c43 h1:dCw7F/9ciw4NZN7w68wQRaygZ2zGOWMTIEoRvP1tlWs= github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240318034951-d5306e367c43/go.mod h1:hNFjhrLUIq+kJ9bOcs8QtiplSQ61GZXtd2xHKx4BYRo= +github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240327114451-d6b7174a84fc/go.mod h1:hNFjhrLUIq+kJ9bOcs8QtiplSQ61GZXtd2xHKx4BYRo= github.com/magefile/mage v1.14.0 h1:6QDX3g6z1YvJ4olPhT1wksUcSa/V0a1B+pJb73fBjyo= github.com/magefile/mage v1.14.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/miekg/dns v1.1.50 h1:DQUfb9uc6smULcREF09Uc+/Gd46YWqJd5DbpPE9xkcA= diff --git a/plugins/wasm-go/pkg/wrapper/plugin_wrapper.go b/plugins/wasm-go/pkg/wrapper/plugin_wrapper.go index b0e08a6d9..1b1210fe5 100644 --- a/plugins/wasm-go/pkg/wrapper/plugin_wrapper.go +++ b/plugins/wasm-go/pkg/wrapper/plugin_wrapper.go @@ -46,6 +46,8 @@ type HttpContext interface { BufferRequestBody() // If the onHttpStreamingResponseBody handle is not set, and the onHttpResponseBody handle is set, the response body will be buffered by default BufferResponseBody() + // If any request header is changed in onHttpRequestHeaders, envoy will re-calculate the route. Call this function to disable the re-routing. + DisableReroute() } type ParseConfigFunc[PluginConfig any] func(json gjson.Result, config *PluginConfig, log Log) error @@ -331,6 +333,10 @@ func (ctx *CommonHttpCtx[PluginConfig]) BufferResponseBody() { ctx.streamingResponseBody = false } +func (ctx *CommonHttpCtx[PluginConfig]) DisableReroute() { + _ = proxywasm.SetProperty([]string{"clear_route_cache"}, []byte("off")) +} + func (ctx *CommonHttpCtx[PluginConfig]) OnHttpRequestHeaders(numHeaders int, endOfStream bool) types.Action { config, err := ctx.plugin.GetMatchConfig() if err != nil {