diff --git a/plugins/wasm-go/extensions/ai-cache/README.md b/plugins/wasm-go/extensions/ai-cache/README.md index 999f47227..70f3e1b9d 100644 --- a/plugins/wasm-go/extensions/ai-cache/README.md +++ b/plugins/wasm-go/extensions/ai-cache/README.md @@ -86,7 +86,8 @@ LLM 结果缓存插件,默认配置方式可以直接用于 openai 协议的 | cache.password | string | optional | "" | 缓存服务密码 | | cache.timeout | uint32 | optional | 10000 | 缓存服务的超时时间,单位为毫秒。默认值是10000,即10秒 | | cache.cacheTTL | int | optional | 0 | 缓存过期时间,单位为秒。默认值是 0,即 永不过期| -| cacheKeyPrefix | string | optional | "higress-ai-cache:" | 缓存 Key 的前缀,默认值为 "higress-ai-cache:" | +| cache.cacheKeyPrefix | string | optional | "higress-ai-cache:" | 缓存 Key 的前缀,默认值为 "higress-ai-cache:" | +| cache.database | int | optional | 0 | 使用的数据库id,仅限redis,例如配置为1,对应`SELECT 1` | ## 其他配置 @@ -168,6 +169,7 @@ redis: serviceName: my_redis.dns servicePort: 6379 timeout: 100 + database: 1 ``` ## 进阶用法 diff --git a/plugins/wasm-go/extensions/ai-cache/README_EN.md b/plugins/wasm-go/extensions/ai-cache/README_EN.md index 754499599..d48f9f71b 100644 --- a/plugins/wasm-go/extensions/ai-cache/README_EN.md +++ b/plugins/wasm-go/extensions/ai-cache/README_EN.md @@ -15,26 +15,29 @@ Plugin Execution Phase: `Authentication Phase` Plugin Execution Priority: `10` ## Configuration Description -| Name | Type | Requirement | Default | Description | -| -------- | -------- | -------- | -------- | -------- | -| cacheKeyFrom.requestBody | string | optional | "messages.@reverse.0.content" | Extracts a string from the request Body based on [GJSON PATH](https://github.com/tidwall/gjson/blob/master/SYNTAX.md) syntax | -| cacheValueFrom.responseBody | string | optional | "choices.0.message.content" | Extracts a string from the response Body based on [GJSON PATH](https://github.com/tidwall/gjson/blob/master/SYNTAX.md) syntax | +| Name | Type | Requirement | Default | Description | +| -------- | -------- | -------- | -------- | -------- | +| cacheKeyFrom.requestBody | string | optional | "messages.@reverse.0.content" | Extracts a string from the request Body based on [GJSON PATH](https://github.com/tidwall/gjson/blob/master/SYNTAX.md) syntax | +| cacheValueFrom.responseBody | string | optional | "choices.0.message.content" | Extracts a string from the response Body based on [GJSON PATH](https://github.com/tidwall/gjson/blob/master/SYNTAX.md) syntax | | cacheStreamValueFrom.responseBody | string | optional | "choices.0.delta.content" | Extracts a string from the streaming response Body based on [GJSON PATH](https://github.com/tidwall/gjson/blob/master/SYNTAX.md) syntax | -| cacheKeyPrefix | string | optional | "higress-ai-cache:" | Prefix for the Redis cache key | -| cacheTTL | integer | optional | 0 | Cache expiration time in seconds, default value is 0, which means never expire | -| redis.serviceName | string | required | - | The complete FQDN name of the Redis service, including the service type, e.g., my-redis.dns, redis.my-ns.svc.cluster.local | -| redis.servicePort | integer | optional | 6379 | Redis service port | -| redis.timeout | integer | optional | 1000 | Timeout for requests to Redis, in milliseconds | -| redis.username | string | optional | - | Username for logging into Redis | -| redis.password | string | optional | - | Password for logging into Redis | -| returnResponseTemplate | string | optional | `{"id":"from-cache","choices":[%s],"model":"gpt-4o","object":"chat.completion","usage":{"prompt_tokens":0,"completion_tokens":0,"total_tokens":0}}` | Template for returning HTTP response, with %s marking the part to be replaced by cache value | -| returnStreamResponseTemplate | string | optional | `data:{"id":"from-cache","choices":[{"index":0,"delta":{"role":"assistant","content":"%s"},"finish_reason":"stop"}],"model":"gpt-4o","object":"chat.completion","usage":{"prompt_tokens":0,"completion_tokens":0,"total_tokens":0}}\n\ndata:[DONE]\n\n` | Template for returning streaming HTTP response, with %s marking the part to be replaced by cache value | +| cacheKeyPrefix | string | optional | "higress-ai-cache:" | Prefix for the Redis cache key | +| cacheTTL | integer | optional | 0 | Cache expiration time in seconds, default value is 0, which means never expire | +| redis.serviceName | string | required | - | The complete FQDN name of the Redis service, including the service type, e.g., my-redis.dns, redis.my-ns.svc.cluster.local | +| redis.servicePort | integer | optional | 6379 | Redis service port | +| redis.timeout | integer | optional | 1000 | Timeout for requests to Redis, in milliseconds | +| redis.username | string | optional | - | Username for logging into Redis | +| redis.database | int | optional | 0 | The database ID used, limited to Redis, for example, configured as 1, corresponds to `SELECT 1`. | +| redis.password | string | optional | - | Password for logging into Redis | +| returnResponseTemplate | string | optional | `{"id":"from-cache","choices":[%s],"model":"gpt-4o","object":"chat.completion","usage":{"prompt_tokens":0,"completion_tokens":0,"total_tokens":0}}` | Template for returning HTTP response, with %s marking the part to be replaced by cache value | +| returnStreamResponseTemplate | string | optional | `data:{"id":"from-cache","choices":[{"index":0,"delta":{"role":"assistant","content":"%s"},"finish_reason":"stop"}],"model":"gpt-4o","object":"chat.completion","usage":{"prompt_tokens":0,"completion_tokens":0,"total_tokens":0}}\n\ndata:[DONE]\n\n` | Template for returning streaming HTTP response, with %s marking the part to be replaced by cache value | ## Configuration Example ```yaml redis: serviceName: my-redis.dns timeout: 2000 + servicePort: 6379 + database: 1 ``` ## Advanced Usage diff --git a/plugins/wasm-go/extensions/ai-cache/cache/provider.go b/plugins/wasm-go/extensions/ai-cache/cache/provider.go index d68acd509..9afca2c12 100644 --- a/plugins/wasm-go/extensions/ai-cache/cache/provider.go +++ b/plugins/wasm-go/extensions/ai-cache/cache/provider.go @@ -52,6 +52,9 @@ type ProviderConfig struct { // @Title 缓存 Key 前缀 // @Description 缓存 Key 的前缀,默认值为 "higressAiCache:" cacheKeyPrefix string + // @Title redis database + // @Description 指定 redis 的 database,默认使用0 + database int } func (c *ProviderConfig) GetProviderType() string { @@ -79,6 +82,7 @@ func (c *ProviderConfig) FromJson(json gjson.Result) { if !json.Get("password").Exists() { c.password = "" } + c.database = int(json.Get("database").Int()) c.timeout = uint32(json.Get("timeout").Int()) if !json.Get("timeout").Exists() { c.timeout = 10000 diff --git a/plugins/wasm-go/extensions/ai-cache/cache/redis.go b/plugins/wasm-go/extensions/ai-cache/cache/redis.go index 4cb69744e..b4a116ab8 100644 --- a/plugins/wasm-go/extensions/ai-cache/cache/redis.go +++ b/plugins/wasm-go/extensions/ai-cache/cache/redis.go @@ -38,7 +38,7 @@ func (rp *redisProvider) GetProviderType() string { } func (rp *redisProvider) Init(username string, password string, timeout uint32) error { - return rp.client.Init(rp.config.username, rp.config.password, int64(rp.config.timeout)) + return rp.client.Init(rp.config.username, rp.config.password, int64(rp.config.timeout), wrapper.WithDataBase(rp.config.database)) } func (rp *redisProvider) Get(key string, cb wrapper.RedisResponseCallback) error { diff --git a/plugins/wasm-go/extensions/ai-cache/config/config.go b/plugins/wasm-go/extensions/ai-cache/config/config.go index 80c614737..bc1093a56 100644 --- a/plugins/wasm-go/extensions/ai-cache/config/config.go +++ b/plugins/wasm-go/extensions/ai-cache/config/config.go @@ -28,9 +28,9 @@ type PluginConfig struct { embeddingProvider embedding.Provider vectorProvider vector.Provider - embeddingProviderConfig embedding.ProviderConfig - vectorProviderConfig vector.ProviderConfig - cacheProviderConfig cache.ProviderConfig + embeddingProviderConfig *embedding.ProviderConfig + vectorProviderConfig *vector.ProviderConfig + cacheProviderConfig *cache.ProviderConfig CacheKeyFrom string CacheValueFrom string @@ -47,7 +47,9 @@ type PluginConfig struct { } func (c *PluginConfig) FromJson(json gjson.Result, log wrapper.Log) { - + c.embeddingProviderConfig = &embedding.ProviderConfig{} + c.vectorProviderConfig = &vector.ProviderConfig{} + c.cacheProviderConfig = &cache.ProviderConfig{} c.vectorProviderConfig.FromJson(json.Get("vector")) c.embeddingProviderConfig.FromJson(json.Get("embedding")) c.cacheProviderConfig.FromJson(json.Get("cache")) @@ -142,7 +144,7 @@ func (c *PluginConfig) Complete(log wrapper.Log) error { var err error if c.embeddingProviderConfig.GetProviderType() != "" { log.Debugf("embedding provider is set to %s", c.embeddingProviderConfig.GetProviderType()) - c.embeddingProvider, err = embedding.CreateProvider(c.embeddingProviderConfig) + c.embeddingProvider, err = embedding.CreateProvider(*c.embeddingProviderConfig) if err != nil { return err } @@ -152,7 +154,7 @@ func (c *PluginConfig) Complete(log wrapper.Log) error { } if c.cacheProviderConfig.GetProviderType() != "" { log.Debugf("cache provider is set to %s", c.cacheProviderConfig.GetProviderType()) - c.cacheProvider, err = cache.CreateProvider(c.cacheProviderConfig) + c.cacheProvider, err = cache.CreateProvider(*c.cacheProviderConfig) if err != nil { return err } @@ -162,7 +164,7 @@ func (c *PluginConfig) Complete(log wrapper.Log) error { } if c.vectorProviderConfig.GetProviderType() != "" { log.Debugf("vector provider is set to %s", c.vectorProviderConfig.GetProviderType()) - c.vectorProvider, err = vector.CreateProvider(c.vectorProviderConfig) + c.vectorProvider, err = vector.CreateProvider(*c.vectorProviderConfig) if err != nil { return err } @@ -182,7 +184,7 @@ func (c *PluginConfig) GetVectorProvider() vector.Provider { } func (c *PluginConfig) GetVectorProviderConfig() vector.ProviderConfig { - return c.vectorProviderConfig + return *c.vectorProviderConfig } func (c *PluginConfig) GetCacheProvider() cache.Provider { diff --git a/plugins/wasm-go/extensions/ai-history/README.md b/plugins/wasm-go/extensions/ai-history/README.md index d4684d292..b8462345c 100644 --- a/plugins/wasm-go/extensions/ai-history/README.md +++ b/plugins/wasm-go/extensions/ai-history/README.md @@ -20,17 +20,18 @@ description: AI 历史对话插件配置参考 ## 配置字段 -| 名称 | 数据类型 | 填写要求 | 默认值 | Description | -|-------------------|---------|----------|-----------------------|---------------------------------------------------------------------------| -| identityHeader | string | optional | "Authorization" | 身份解析对应的请求头,可用 Authorization,X-Mse-Consumer等 | -| fillHistoryCnt | integer | optional | 3 | 默认填充历史对话轮次 | -| cacheKeyPrefix | string | optional | "higress-ai-history:" | Redis缓存Key的前缀 | -| cacheTTL | integer | optional | 0 | 缓存的过期时间,单位是秒,默认值为0,即永不过期 | -| redis.serviceName | string | required | - | redis 服务名称,带服务类型的完整 FQDN 名称,例如 my-redis.dns、redis.my-ns.svc.cluster.local | -| redis.servicePort | integer | optional | 6379 | redis 服务端口 | -| redis.timeout | integer | optional | 1000 | 请求 redis 的超时时间,单位为毫秒 | -| redis.username | string | optional | - | 登陆 redis 的用户名 | -| redis.password | string | optional | - | 登陆 redis 的密码 | +| 名称 | 数据类型 | 填写要求 | 默认值 | Description | +|-------------------|----------|----------|-----------------------|----------------------------------------------------------------------------------------------| +| identityHeader | string | optional | "Authorization" | 身份解析对应的请求头,可用 Authorization,X-Mse-Consumer等 | +| fillHistoryCnt | integer | optional | 3 | 默认填充历史对话轮次 | +| cacheKeyPrefix | string | optional | "higress-ai-history:" | Redis缓存Key的前缀 | +| cacheTTL | integer | optional | 0 | 缓存的过期时间,单位是秒,默认值为0,即永不过期 | +| redis.serviceName | string | required | - | redis 服务名称,带服务类型的完整 FQDN 名称,例如 my-redis.dns、redis.my-ns.svc.cluster.local | +| redis.servicePort | integer | optional | 6379 | redis 服务端口 | +| redis.timeout | integer | optional | 1000 | 请求 redis 的超时时间,单位为毫秒 | +| redis.username | string | optional | - | 登陆 redis 的用户名 | +| redis.password | string | optional | - | 登陆 redis 的密码 | +| redis.database | int | optional | 0 | 使用的数据库id,例如配置为1,对应`SELECT 1` | ## 用法示例 diff --git a/plugins/wasm-go/extensions/ai-history/README_EN.md b/plugins/wasm-go/extensions/ai-history/README_EN.md index 1fc6144d4..7d0149a01 100644 --- a/plugins/wasm-go/extensions/ai-history/README_EN.md +++ b/plugins/wasm-go/extensions/ai-history/README_EN.md @@ -15,17 +15,19 @@ Plugin Execution Phase: `Default Phase` Plugin Execution Priority: `650` ## Configuration Fields -| Name | Data Type | Required | Default Value | Description | -|-------------------|---------|----------|-----------------------|---------------------------------------------------------------------------| -| identityHeader | string | optional | "Authorization" | The request header for identity resolution, can be Authorization, X-Mse-Consumer, etc. | -| fillHistoryCnt | integer | optional | 3 | Default number of historical dialogues to be filled. | -| cacheKeyPrefix | string | optional | "higress-ai-history:" | Prefix for Redis cache key. | -| cacheTTL | integer | optional | 0 | Cache expiration time in seconds, default value is 0, meaning it never expires. | -| redis.serviceName | string | required | - | Redis service name, full FQDN name with service type, e.g., my-redis.dns, redis.my-ns.svc.cluster.local | -| redis.servicePort | integer | optional | 6379 | Redis service port. | -| redis.timeout | integer | optional | 1000 | Timeout for requests to Redis, in milliseconds. | -| redis.username | string | optional | - | Username for logging into Redis. | -| redis.password | string | optional | - | Password for logging into Redis. | +| Name | Data Type | Required | Default Value | Description | +|-------------------|-----------|----------|-----------------------|---------------------------------------------------------------------------------------------------------| +| identityHeader | string | optional | "Authorization" | The request header for identity resolution, can be Authorization, X-Mse-Consumer, etc. | +| fillHistoryCnt | integer | optional | 3 | Default number of historical dialogues to be filled. | +| cacheKeyPrefix | string | optional | "higress-ai-history:" | Prefix for Redis cache key. | +| cacheTTL | integer | optional | 0 | Cache expiration time in seconds, default value is 0, meaning it never expires. | +| redis.serviceName | string | required | - | Redis service name, full FQDN name with service type, e.g., my-redis.dns, redis.my-ns.svc.cluster.local | +| redis.servicePort | integer | optional | 6379 | Redis service port. | +| redis.timeout | integer | optional | 1000 | Timeout for requests to Redis, in milliseconds. | +| redis.username | string | optional | - | Username for logging into Redis. | +| redis.password | string | optional | - | Password for logging into Redis. | +| redis.database | int | optional | 0 | The database ID used, for example, configured as 1, corresponds to `SELECT 1`. | + ## Usage Example ### Configuration Information diff --git a/plugins/wasm-go/extensions/ai-history/main.go b/plugins/wasm-go/extensions/ai-history/main.go index 3f728dd96..f0fabaaa4 100644 --- a/plugins/wasm-go/extensions/ai-history/main.go +++ b/plugins/wasm-go/extensions/ai-history/main.go @@ -76,6 +76,9 @@ type RedisInfo struct { // @Title zh-CN 请求超时 // @Description zh-CN 请求 redis 的超时时间,单位为毫秒。默认值是1000,即1秒 Timeout int `required:"false" yaml:"timeout" json:"timeout"` + // @Title zh-CN Database + // @Description zh-CN redis database + Database int `required:"false" yaml:"database" json:"database"` } type KVExtractor struct { @@ -138,6 +141,7 @@ func parseConfig(json gjson.Result, c *PluginConfig, log wrapper.Log) error { if c.RedisInfo.Timeout == 0 { c.RedisInfo.Timeout = 1000 } + c.RedisInfo.Database = int(json.Get("redis.database").Int()) c.QuestionFrom.RequestBody = "messages.@reverse.0.content" c.AnswerValueFrom.ResponseBody = "choices.0.message.content" c.AnswerStreamValueFrom.ResponseBody = "choices.0.delta.content" @@ -159,7 +163,7 @@ func parseConfig(json gjson.Result, c *PluginConfig, log wrapper.Log) error { FQDN: c.RedisInfo.ServiceName, Port: int64(c.RedisInfo.ServicePort), }) - return c.redisClient.Init(c.RedisInfo.Username, c.RedisInfo.Password, int64(c.RedisInfo.Timeout)) + return c.redisClient.Init(c.RedisInfo.Username, c.RedisInfo.Password, int64(c.RedisInfo.Timeout), wrapper.WithDataBase(c.RedisInfo.Database)) } func onHttpRequestHeaders(ctx wrapper.HttpContext, config PluginConfig, log wrapper.Log) types.Action { diff --git a/plugins/wasm-go/extensions/ai-quota/README.md b/plugins/wasm-go/extensions/ai-quota/README.md index 430527290..4b0d362fe 100644 --- a/plugins/wasm-go/extensions/ai-quota/README.md +++ b/plugins/wasm-go/extensions/ai-quota/README.md @@ -26,14 +26,14 @@ description: AI 配额管理插件配置参考 `redis`中每一项的配置字段说明 -| 配置项 | 类型 | 必填 | 默认值 | 说明 | -| ------------ | ------ | ---- | ---------------------------------------------------------- | --------------------------- | -| service_name | string | 必填 | - | redis 服务名称,带服务类型的完整 FQDN 名称,例如 my-redis.dns、redis.my-ns.svc.cluster.local | -| service_port | int | 否 | 服务类型为固定地址(static service)默认值为80,其他为6379 | 输入redis服务的服务端口 | -| username | string | 否 | - | redis用户名 | -| password | string | 否 | - | redis密码 | -| timeout | int | 否 | 1000 | redis连接超时时间,单位毫秒 | - +| 配置项 | 类型 | 必填 | 默认值 | 说明 | +| ------------ | ------ | ---- | ---------------------------------------------------------- | --------------------------- | +| service_name | string | 必填 | - | redis 服务名称,带服务类型的完整 FQDN 名称,例如 my-redis.dns、redis.my-ns.svc.cluster.local | +| service_port | int | 否 | 服务类型为固定地址(static service)默认值为80,其他为6379 | 输入redis服务的服务端口 | +| username | string | 否 | - | redis用户名 | +| password | string | 否 | - | redis密码 | +| timeout | int | 否 | 1000 | redis连接超时时间,单位毫秒 | +| database | int | 否 | 0 | 使用的数据库id,例如配置为1,对应`SELECT 1` | ## 配置示例 diff --git a/plugins/wasm-go/extensions/ai-quota/README_EN.md b/plugins/wasm-go/extensions/ai-quota/README_EN.md index e136a7596..0eff19aee 100644 --- a/plugins/wasm-go/extensions/ai-quota/README_EN.md +++ b/plugins/wasm-go/extensions/ai-quota/README_EN.md @@ -18,13 +18,14 @@ Plugin execution priority: `750` | `admin_path` | string | Optional | /quota | Prefix for the path to manage quota requests | | `redis` | object | Yes | | Redis related configuration | Explanation of each configuration field in `redis` -| Configuration Item | Type | Required | Default Value | Explanation | -|---------------------|------------------|----------|---------------------------------------------------------|-----------------------------------------------| -| service_name | string | Required | - | Redis service name, full FQDN name with service type, e.g., my-redis.dns, redis.my-ns.svc.cluster.local | -| service_port | int | No | Default value for static service is 80; others are 6379 | Service port for the redis service | -| username | string | No | - | Redis username | -| password | string | No | - | Redis password | -| timeout | int | No | 1000 | Redis connection timeout in milliseconds | +| Configuration Item | Type | Required | Default Value | Explanation | +|--------------------|--------|----------|---------------------------------------------------------|---------------------------------------------------------------------------------------------------------| +| service_name | string | Required | - | Redis service name, full FQDN name with service type, e.g., my-redis.dns, redis.my-ns.svc.cluster.local | +| service_port | int | No | Default value for static service is 80; others are 6379 | Service port for the redis service | +| username | string | No | - | Redis username | +| password | string | No | - | Redis password | +| timeout | int | No | 1000 | Redis connection timeout in milliseconds | +| database | int | No | 0 | The database ID used, for example, configured as 1, corresponds to `SELECT 1`. | ## Configuration Example ### Identify request parameter apikey and apply rate limiting accordingly diff --git a/plugins/wasm-go/extensions/ai-quota/go.mod b/plugins/wasm-go/extensions/ai-quota/go.mod index ec77e402e..8b9e11fd1 100644 --- a/plugins/wasm-go/extensions/ai-quota/go.mod +++ b/plugins/wasm-go/extensions/ai-quota/go.mod @@ -2,11 +2,11 @@ module github.com/alibaba/higress/plugins/wasm-go/extensions/ai-quota go 1.19 -//replace github.com/alibaba/higress/plugins/wasm-go => ../.. +replace github.com/alibaba/higress/plugins/wasm-go => ../.. require ( github.com/alibaba/higress/plugins/wasm-go v1.4.3-0.20240808022948-34f5722d93de - github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240711023527-ba358c48772f + github.com/higress-group/proxy-wasm-go-sdk v1.0.0 github.com/tidwall/gjson v1.17.3 github.com/tidwall/resp v0.1.1 ) diff --git a/plugins/wasm-go/extensions/ai-quota/go.sum b/plugins/wasm-go/extensions/ai-quota/go.sum index 996d474d4..b4ab172fe 100644 --- a/plugins/wasm-go/extensions/ai-quota/go.sum +++ b/plugins/wasm-go/extensions/ai-quota/go.sum @@ -1,12 +1,10 @@ -github.com/alibaba/higress/plugins/wasm-go v1.4.3-0.20240808022948-34f5722d93de h1:lDLqj7Hw41ox8VdsP7oCTPhjPa3+QJUCKApcLh2a45Y= -github.com/alibaba/higress/plugins/wasm-go v1.4.3-0.20240808022948-34f5722d93de/go.mod h1:359don/ahMxpfeLMzr29Cjwcu8IywTTDUzWlBPRNLHw= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= 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-20240711023527-ba358c48772f h1:ZIiIBRvIw62gA5MJhuwp1+2wWbqL9IGElQ499rUsYYg= -github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20240711023527-ba358c48772f/go.mod h1:hNFjhrLUIq+kJ9bOcs8QtiplSQ61GZXtd2xHKx4BYRo= +github.com/higress-group/proxy-wasm-go-sdk v1.0.0 h1:BZRNf4R7jr9hwRivg/E29nkVaKEak5MWjBDhWjuHijU= +github.com/higress-group/proxy-wasm-go-sdk v1.0.0/go.mod h1:iiSyFbo+rAtbtGt/bsefv8GU57h9CCLYGJA74/tF5/0= 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-quota/main.go b/plugins/wasm-go/extensions/ai-quota/main.go index 2facd912b..2c6d75e8f 100644 --- a/plugins/wasm-go/extensions/ai-quota/main.go +++ b/plugins/wasm-go/extensions/ai-quota/main.go @@ -69,6 +69,7 @@ type RedisInfo struct { Username string `required:"false" yaml:"username" json:"username"` Password string `required:"false" yaml:"password" json:"password"` Timeout int `required:"false" yaml:"timeout" json:"timeout"` + Database int `required:"false" yaml:"database" json:"database"` } func parseConfig(json gjson.Result, config *QuotaConfig, log wrapper.Log) error { @@ -110,17 +111,19 @@ func parseConfig(json gjson.Result, config *QuotaConfig, log wrapper.Log) error if timeout == 0 { timeout = 1000 } + database := int(redisConfig.Get("database").Int()) config.redisInfo.ServiceName = serviceName config.redisInfo.ServicePort = servicePort config.redisInfo.Username = username config.redisInfo.Password = password config.redisInfo.Timeout = timeout + config.redisInfo.Database = database config.redisClient = wrapper.NewRedisClusterClient(wrapper.FQDNCluster{ FQDN: serviceName, Port: int64(servicePort), }) - return config.redisClient.Init(username, password, int64(timeout)) + return config.redisClient.Init(username, password, int64(timeout), wrapper.WithDataBase(database)) } func onHttpRequestHeaders(context wrapper.HttpContext, config QuotaConfig, log wrapper.Log) types.Action { diff --git a/plugins/wasm-go/extensions/ai-token-ratelimit/README.md b/plugins/wasm-go/extensions/ai-token-ratelimit/README.md index a1d6a2fe3..7b0b290cb 100644 --- a/plugins/wasm-go/extensions/ai-token-ratelimit/README.md +++ b/plugins/wasm-go/extensions/ai-token-ratelimit/README.md @@ -51,14 +51,14 @@ description: AI Token限流插件配置参考 `redis`中每一项的配置字段说明 -| 配置项 | 类型 | 必填 | 默认值 | 说明 | -| ------------ | ------ | ---- | ---------------------------------------------------------- | --------------------------- | -| service_name | string | 必填 | - | redis 服务名称,带服务类型的完整 FQDN 名称,例如 my-redis.dns、redis.my-ns.svc.cluster.local | -| service_port | int | 否 | 服务类型为固定地址(static service)默认值为80,其他为6379 | 输入redis服务的服务端口 | -| username | string | 否 | - | redis用户名 | -| password | string | 否 | - | redis密码 | -| timeout | int | 否 | 1000 | redis连接超时时间,单位毫秒 | - +| 配置项 | 类型 | 必填 | 默认值 | 说明 | +| ------------ | ------ | ---- | ---------------------------------------------------------- | --------------------------- | +| service_name | string | 必填 | - | redis 服务名称,带服务类型的完整 FQDN 名称,例如 my-redis.dns、redis.my-ns.svc.cluster.local | +| service_port | int | 否 | 服务类型为固定地址(static service)默认值为80,其他为6379 | 输入redis服务的服务端口 | +| username | string | 否 | - | redis用户名 | +| password | string | 否 | - | redis密码 | +| timeout | int | 否 | 1000 | redis连接超时时间,单位毫秒 | +| database | int | 否 | 0 | 使用的数据库id,例如配置为1,对应`SELECT 1` | ## 配置示例 diff --git a/plugins/wasm-go/extensions/ai-token-ratelimit/README_EN.md b/plugins/wasm-go/extensions/ai-token-ratelimit/README_EN.md index c07e7aa2f..768433c05 100644 --- a/plugins/wasm-go/extensions/ai-token-ratelimit/README_EN.md +++ b/plugins/wasm-go/extensions/ai-token-ratelimit/README_EN.md @@ -43,13 +43,14 @@ Field descriptions for each item in `limit_keys` | token_per_day | int | No, optionally select one in `token_per_second`, `token_per_minute`, `token_per_hour`, `token_per_day` | - | Allowed number of token requests per day | Field descriptions for each item in `redis` -| Configuration Item | Type | Required | Default Value | Description | -| ----------------------- | ----------------- | -------- | --------------------------------------------------------------- | ----------------------------------------------- | -| service_name | string | Required | - | Full FQDN name of the redis service, including service type, e.g., my-redis.dns, redis.my-ns.svc.cluster.local | -| service_port | int | No | Default value for static addresses (static service) is 80; otherwise, it is 6379 | Input the service port of the redis service | -| username | string | No | - | Redis username | -| password | string | No | - | Redis password | -| timeout | int | No | 1000 | Redis connection timeout in milliseconds | +| Configuration Item | Type | Required | Default Value | Description | +| ----------------------- | ----------------- | -------- | --------------------------------------------------------------- | ----------------------------------------------- | +| service_name | string | Required | - | Full FQDN name of the redis service, including service type, e.g., my-redis.dns, redis.my-ns.svc.cluster.local | +| service_port | int | No | Default value for static addresses (static service) is 80; otherwise, it is 6379 | Input the service port of the redis service | +| username | string | No | - | Redis username | +| password | string | No | - | Redis password | +| timeout | int | No | 1000 | Redis connection timeout in milliseconds | +| database | int | No | 0 | The database ID used, for example, configured as 1, corresponds to `SELECT 1`. | ## Configuration Examples ### Identify request parameter apikey for differentiated rate limiting diff --git a/plugins/wasm-go/extensions/ai-token-ratelimit/config.go b/plugins/wasm-go/extensions/ai-token-ratelimit/config.go index 9668f1861..743f2925f 100644 --- a/plugins/wasm-go/extensions/ai-token-ratelimit/config.go +++ b/plugins/wasm-go/extensions/ai-token-ratelimit/config.go @@ -110,7 +110,8 @@ func initRedisClusterClient(json gjson.Result, config *ClusterKeyRateLimitConfig FQDN: serviceName, Port: int64(servicePort), }) - return config.redisClient.Init(username, password, int64(timeout)) + database := int(redisConfig.Get("database").Int()) + return config.redisClient.Init(username, password, int64(timeout), wrapper.WithDataBase(database)) } func parseClusterKeyRateLimitConfig(json gjson.Result, config *ClusterKeyRateLimitConfig) error { diff --git a/plugins/wasm-go/extensions/cluster-key-rate-limit/README.md b/plugins/wasm-go/extensions/cluster-key-rate-limit/README.md index 883e2535c..f75ea01bc 100644 --- a/plugins/wasm-go/extensions/cluster-key-rate-limit/README.md +++ b/plugins/wasm-go/extensions/cluster-key-rate-limit/README.md @@ -52,13 +52,14 @@ description: 基于 Key 集群限流插件配置参考 `redis` 中每一项的配置字段说明。 -| 配置项 | 类型 | 必填 | 默认值 | 说明 | -| ------------ | ------ | ---- | ---------------------------------------------------------- |---------------------------------------------------------------------------| +| 配置项 | 类型 | 必填 | 默认值 | 说明 | +| ------------ | ------ | ---- | ---------------------------------------------------------- | --------------------------------------------------------------------------- | | service_name | string | 必填 | - | redis 服务名称,带服务类型的完整 FQDN 名称,例如 my-redis.dns、redis.my-ns.svc.cluster.local | -| service_port | int | 否 | 服务类型为固定地址(static service)默认值为80,其他为6379 | 输入redis服务的服务端口 | -| username | string | 否 | - | redis 用户名 | -| password | string | 否 | - | redis 密码 | -| timeout | int | 否 | 1000 | redis 连接超时时间,单位毫秒 | +| service_port | int | 否 | 服务类型为固定地址(static service)默认值为80,其他为6379 | 输入redis服务的服务端口 | +| username | string | 否 | - | redis 用户名 | +| password | string | 否 | - | redis 密码 | +| timeout | int | 否 | 1000 | redis 连接超时时间,单位毫秒 | +| database | int | 否 | 0 | 使用的数据库id,例如配置为1,对应`SELECT 1` | ## 配置示例 diff --git a/plugins/wasm-go/extensions/cluster-key-rate-limit/README_EN.md b/plugins/wasm-go/extensions/cluster-key-rate-limit/README_EN.md index 4a4dcf863..83e0935d9 100644 --- a/plugins/wasm-go/extensions/cluster-key-rate-limit/README_EN.md +++ b/plugins/wasm-go/extensions/cluster-key-rate-limit/README_EN.md @@ -46,13 +46,15 @@ Description of configuration fields for each item in `limit_keys`. | query_per_day | int | No, one of `query_per_second`, `query_per_minute`, `query_per_hour`, `query_per_day` is optional. | - | Allowed number of requests per day. | Description of configuration fields for each item in `redis`. -| Configuration Item | Type | Required | Default Value | Description | -|---------------------------|---------------|----------|------------------------------------------------------------|---------------------------------------------------------------------------| -| service_name | string | Required | - | Full FQDN name of the Redis service, including service type, e.g., my-redis.dns, redis.my-ns.svc.cluster.local. | -| service_port | int | No | 80 for static services; otherwise 6379 | Service port for the Redis service. | -| username | string | No | - | Redis username. | -| password | string | No | - | Redis password. | -| timeout | int | No | 1000 | Redis connection timeout in milliseconds. | +| Configuration Item | Type | Required | Default Value | Description | +|--------------------|--------|----------|----------------------------------------|-----------------------------------------------------------------------------------------------------------------| +| service_name | string | Required | - | Full FQDN name of the Redis service, including service type, e.g., my-redis.dns, redis.my-ns.svc.cluster.local. | +| service_port | int | No | 80 for static services; otherwise 6379 | Service port for the Redis service. | +| username | string | No | - | Redis username. | +| password | string | No | - | Redis password. | +| timeout | int | No | 1000 | Redis connection timeout in milliseconds. | +| database | int | No | 0 | The database ID used, for example, configured as 1, corresponds to `SELECT 1`. | + ## Configuration Examples diff --git a/plugins/wasm-go/extensions/cluster-key-rate-limit/config.go b/plugins/wasm-go/extensions/cluster-key-rate-limit/config.go index 3689c3656..00d84b21f 100644 --- a/plugins/wasm-go/extensions/cluster-key-rate-limit/config.go +++ b/plugins/wasm-go/extensions/cluster-key-rate-limit/config.go @@ -110,7 +110,8 @@ func initRedisClusterClient(json gjson.Result, config *ClusterKeyRateLimitConfig FQDN: serviceName, Port: int64(servicePort), }) - return config.redisClient.Init(username, password, int64(timeout)) + database := int(redisConfig.Get("database").Int()) + return config.redisClient.Init(username, password, int64(timeout), wrapper.WithDataBase(database)) } func parseClusterKeyRateLimitConfig(json gjson.Result, config *ClusterKeyRateLimitConfig) error {