mirror of
https://github.com/alibaba/higress.git
synced 2026-05-27 06:07:27 +08:00
Simplify the implementation of ai-search integration with quark and add a tutorial. (#1838)
This commit is contained in:
@@ -11,7 +11,6 @@ import (
|
||||
"net/url"
|
||||
"sort"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/alibaba/higress/plugins/wasm-go/pkg/wrapper"
|
||||
"github.com/tidwall/gjson"
|
||||
@@ -21,11 +20,10 @@ import (
|
||||
|
||||
type QuarkSearch struct {
|
||||
apiKey string
|
||||
secretKey string
|
||||
timeoutMillisecond uint32
|
||||
client wrapper.HttpClient
|
||||
count uint32
|
||||
endpoint string
|
||||
optionArgs map[string]string
|
||||
}
|
||||
|
||||
const (
|
||||
@@ -87,10 +85,6 @@ func NewQuarkSearch(config *gjson.Result) (*QuarkSearch, error) {
|
||||
if engine.apiKey == "" {
|
||||
return nil, errors.New("apiKey not found")
|
||||
}
|
||||
engine.secretKey = config.Get("secretKey").String()
|
||||
if engine.secretKey == "" {
|
||||
return nil, errors.New("secretKey not found")
|
||||
}
|
||||
serviceName := config.Get("serviceName").String()
|
||||
if serviceName == "" {
|
||||
return nil, errors.New("serviceName not found")
|
||||
@@ -99,10 +93,6 @@ func NewQuarkSearch(config *gjson.Result) (*QuarkSearch, error) {
|
||||
if servicePort == 0 {
|
||||
return nil, errors.New("servicePort not found")
|
||||
}
|
||||
engine.endpoint = config.Get("endpoint").String()
|
||||
if engine.endpoint == "" {
|
||||
engine.endpoint = "iqs.cn-zhangjiakou.aliyuncs.com"
|
||||
}
|
||||
engine.count = uint32(config.Get("count").Int())
|
||||
if engine.count == 0 {
|
||||
engine.count = 10
|
||||
@@ -115,6 +105,13 @@ func NewQuarkSearch(config *gjson.Result) (*QuarkSearch, error) {
|
||||
if engine.timeoutMillisecond == 0 {
|
||||
engine.timeoutMillisecond = 5000
|
||||
}
|
||||
engine.optionArgs = map[string]string{}
|
||||
for key, value := range config.Get("optionArgs").Map() {
|
||||
valStr := value.String()
|
||||
if valStr != "" {
|
||||
engine.optionArgs[key] = value.String()
|
||||
}
|
||||
}
|
||||
return engine, nil
|
||||
}
|
||||
|
||||
@@ -127,52 +124,22 @@ func (g QuarkSearch) Client() wrapper.HttpClient {
|
||||
}
|
||||
|
||||
func (g QuarkSearch) CallArgs(ctx engine.SearchContext) engine.CallArgs {
|
||||
query := strings.Join(ctx.Querys, " ")
|
||||
canonicalURI := Path
|
||||
queryParams := map[string]string{
|
||||
"query": query,
|
||||
"timeRange": "NoLimit",
|
||||
queryUrl := fmt.Sprintf("https://cloud-iqs.aliyuncs.com/search/genericSearch?query=%s",
|
||||
url.QueryEscape(strings.Join(ctx.Querys, " ")))
|
||||
var extraArgs []string
|
||||
for key, value := range g.optionArgs {
|
||||
extraArgs = append(extraArgs, fmt.Sprintf("%s=%s", key, url.QueryEscape(value)))
|
||||
}
|
||||
queryParamsStr := []string{}
|
||||
for k, v := range queryParams {
|
||||
queryParamsStr = append(queryParamsStr, k+"="+urlEncoding(v))
|
||||
if len(extraArgs) > 0 {
|
||||
queryUrl = fmt.Sprintf("%s&%s", queryUrl, strings.Join(extraArgs, "&"))
|
||||
}
|
||||
canonicalQueryString := strings.Join(queryParamsStr, "&")
|
||||
timeStamp := time.Now().UTC().Format("2006-01-02T15:04:05Z")
|
||||
randomID, _ := generateHexID(32)
|
||||
params := map[string]string{
|
||||
"host": g.endpoint,
|
||||
"x-acs-action": Action,
|
||||
"x-acs-content-sha256": ContentSha256,
|
||||
"x-acs-date": timeStamp,
|
||||
"x-acs-signature-nonce": randomID,
|
||||
"x-acs-version": Version,
|
||||
}
|
||||
canonicalHeaders := getCanonicalHeaders(params)
|
||||
canonicalRequest := http.MethodGet + "\n" + canonicalURI + "\n" + canonicalQueryString + "\n" + canonicalHeaders + "\n" + SignedHeaders + "\n" + ContentSha256
|
||||
stringToSign := SignatureAlgorithm + "\n" + getHasedString(canonicalRequest)
|
||||
|
||||
authHeaderFmt := "%s Credential=%s,SignedHeaders=%s,Signature=%s"
|
||||
authHeader := fmt.Sprintf(authHeaderFmt, SignatureAlgorithm, g.apiKey, SignedHeaders, getSignature(stringToSign, g.secretKey))
|
||||
|
||||
reqParams := url.Values{}
|
||||
for k, v := range queryParams {
|
||||
reqParams.Add(k, v)
|
||||
}
|
||||
requestURL := fmt.Sprintf("https://%s%s?%s", g.endpoint, Path, reqParams.Encode())
|
||||
|
||||
return engine.CallArgs{
|
||||
Method: http.MethodGet,
|
||||
Url: requestURL,
|
||||
Url: queryUrl,
|
||||
Headers: [][2]string{
|
||||
{"x-acs-date", timeStamp},
|
||||
{"x-acs-signature-nonce", randomID},
|
||||
{"x-acs-content-sha256", ContentSha256},
|
||||
{"x-acs-version", Version},
|
||||
{"x-acs-action", Action},
|
||||
{"Authorization", authHeader},
|
||||
{"Accept", "application/json"},
|
||||
{"X-API-Key", g.apiKey},
|
||||
},
|
||||
Body: nil,
|
||||
TimeoutMillisecond: g.timeoutMillisecond,
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user