forked from alibaba/higress
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'main' into dockerfile_prepare
- Loading branch information
Showing
8 changed files
with
211 additions
and
14 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
name: Release CRD to GitHub | ||
|
||
on: | ||
push: | ||
tags: | ||
- "v*.*.*" | ||
workflow_dispatch: ~ | ||
|
||
jobs: | ||
release-crd: | ||
runs-on: ubuntu-latest | ||
steps: | ||
- uses: actions/checkout@v4 | ||
|
||
- name: generate crds | ||
run: | | ||
cat helm/core/crds/customresourcedefinitions.gen.yaml helm/core/crds/istio-envoyfilter.yaml > crd.yaml | ||
- name: Upload hgctl packages to the GitHub release | ||
uses: softprops/action-gh-release@v2 | ||
if: startsWith(github.ref, 'refs/tags/') | ||
with: | ||
files: | | ||
crd.yaml |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1 +1 @@ | ||
v2.0.2 | ||
v2.0.3 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,4 @@ | ||
--- | ||
apiVersion: apiextensions.k8s.io/v1 | ||
kind: CustomResourceDefinition | ||
metadata: | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,9 +1,9 @@ | ||
dependencies: | ||
- name: higress-core | ||
repository: file://../core | ||
version: 2.0.2 | ||
version: 2.0.3 | ||
- name: higress-console | ||
repository: https://higress.io/helm-charts/ | ||
version: 1.4.4 | ||
digest: sha256:a424449caa01a71798c7fec9769ef97be7658354c028a3cede4790e4b6094532 | ||
generated: "2024-10-28T18:50:27.528097+08:00" | ||
version: 1.4.5 | ||
digest: sha256:74b772113264168483961f5d0424459fd7359adc509a4b50400229581d7cddbf | ||
generated: "2024-11-08T14:06:51.871719+08:00" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
161 changes: 161 additions & 0 deletions
161
plugins/wasm-go/extensions/ai-cache/embedding/textin.go
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,161 @@ | ||
package embedding | ||
|
||
import ( | ||
"encoding/json" | ||
"errors" | ||
"fmt" | ||
"net/http" | ||
"strconv" | ||
|
||
"github.com/alibaba/higress/plugins/wasm-go/pkg/wrapper" | ||
) | ||
|
||
const ( | ||
TEXTIN_DOMAIN = "api.textin.com" | ||
TEXTIN_PORT = 443 | ||
TEXTIN_DEFAULT_MODEL_NAME = "acge-text-embedding" | ||
TEXTIN_ENDPOINT = "/ai/service/v1/acge_embedding" | ||
) | ||
|
||
type textInProviderInitializer struct { | ||
} | ||
|
||
func (t *textInProviderInitializer) ValidateConfig(config ProviderConfig) error { | ||
if config.textinAppId == "" { | ||
return errors.New("embedding service TextIn App ID is required") | ||
} | ||
if config.textinSecretCode == "" { | ||
return errors.New("embedding service TextIn Secret Code is required") | ||
} | ||
if config.textinMatryoshkaDim == 0 { | ||
return errors.New("embedding service TextIn Matryoshka Dim is required") | ||
} | ||
return nil | ||
} | ||
|
||
func (t *textInProviderInitializer) CreateProvider(c ProviderConfig) (Provider, error) { | ||
if c.servicePort == 0 { | ||
c.servicePort = TEXTIN_PORT | ||
} | ||
if c.serviceHost == "" { | ||
c.serviceHost = TEXTIN_DOMAIN | ||
} | ||
return &TIProvider{ | ||
config: c, | ||
client: wrapper.NewClusterClient(wrapper.FQDNCluster{ | ||
FQDN: c.serviceName, | ||
Host: c.serviceHost, | ||
Port: int64(c.servicePort), | ||
}), | ||
}, nil | ||
} | ||
|
||
func (t *TIProvider) GetProviderType() string { | ||
return PROVIDER_TYPE_TEXTIN | ||
} | ||
|
||
type TextInResponse struct { | ||
Code int `json:"code"` | ||
Message string `json:"message"` | ||
Duration float64 `json:"duration"` | ||
Result TextInResult `json:"result"` | ||
} | ||
|
||
type TextInResult struct { | ||
Embeddings [][]float64 `json:"embedding"` | ||
MatryoshkaDim int `json:"matryoshka_dim"` | ||
} | ||
|
||
type TextInEmbeddingRequest struct { | ||
Input []string `json:"input"` | ||
MatryoshkaDim int `json:"matryoshka_dim"` | ||
} | ||
|
||
type TIProvider struct { | ||
config ProviderConfig | ||
client wrapper.HttpClient | ||
} | ||
|
||
func (t *TIProvider) constructParameters(texts []string, log wrapper.Log) (string, [][2]string, []byte, error) { | ||
|
||
data := TextInEmbeddingRequest{ | ||
Input: texts, | ||
MatryoshkaDim: t.config.textinMatryoshkaDim, | ||
} | ||
|
||
requestBody, err := json.Marshal(data) | ||
if err != nil { | ||
log.Errorf("failed to marshal request data: %v", err) | ||
return "", nil, nil, err | ||
} | ||
|
||
if t.config.textinAppId == "" { | ||
err := errors.New("textinAppId is empty") | ||
log.Errorf("failed to construct headers: %v", err) | ||
return "", nil, nil, err | ||
} | ||
if t.config.textinSecretCode == "" { | ||
err := errors.New("textinSecretCode is empty") | ||
log.Errorf("failed to construct headers: %v", err) | ||
return "", nil, nil, err | ||
} | ||
|
||
headers := [][2]string{ | ||
{"x-ti-app-id", t.config.textinAppId}, | ||
{"x-ti-secret-code", t.config.textinSecretCode}, | ||
{"Content-Type", "application/json"}, | ||
} | ||
|
||
return TEXTIN_ENDPOINT, headers, requestBody, err | ||
} | ||
|
||
func (t *TIProvider) parseTextEmbedding(responseBody []byte) (*TextInResponse, error) { | ||
var resp TextInResponse | ||
err := json.Unmarshal(responseBody, &resp) | ||
if err != nil { | ||
return nil, err | ||
} | ||
return &resp, nil | ||
} | ||
|
||
func (t *TIProvider) GetEmbedding( | ||
queryString string, | ||
ctx wrapper.HttpContext, | ||
log wrapper.Log, | ||
callback func(emb []float64, err error)) error { | ||
embUrl, embHeaders, embRequestBody, err := t.constructParameters([]string{queryString}, log) | ||
if err != nil { | ||
log.Errorf("failed to construct parameters: %v", err) | ||
return err | ||
} | ||
|
||
var resp *TextInResponse | ||
err = t.client.Post(embUrl, embHeaders, embRequestBody, | ||
func(statusCode int, responseHeaders http.Header, responseBody []byte) { | ||
|
||
if statusCode != http.StatusOK { | ||
err = errors.New("failed to get embedding due to status code: " + strconv.Itoa(statusCode)) | ||
callback(nil, err) | ||
return | ||
} | ||
|
||
log.Debugf("get embedding response: %d, %s", statusCode, responseBody) | ||
|
||
resp, err = t.parseTextEmbedding(responseBody) | ||
if err != nil { | ||
err = fmt.Errorf("failed to parse response: %v", err) | ||
callback(nil, err) | ||
return | ||
} | ||
|
||
if len(resp.Result.Embeddings) == 0 { | ||
err = errors.New("no embedding found in response") | ||
callback(nil, err) | ||
return | ||
} | ||
|
||
callback(resp.Result.Embeddings[0], nil) | ||
|
||
}, t.config.timeout) | ||
return err | ||
} |