move glm to https://apigo.cloud/git/agi/bigmodel
This commit is contained in:
parent
3c91197c3f
commit
8d1efaa676
142
glm/glm.go
142
glm/glm.go
@ -1,142 +0,0 @@
|
|||||||
package glm
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bufio"
|
|
||||||
"github.com/api-go/plugin"
|
|
||||||
"github.com/golang-jwt/jwt"
|
|
||||||
"github.com/ssgo/httpclient"
|
|
||||||
"github.com/ssgo/u"
|
|
||||||
"io"
|
|
||||||
"strings"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
var apiKey string
|
|
||||||
|
|
||||||
type Option struct {
|
|
||||||
Model string
|
|
||||||
TopP float64
|
|
||||||
Temperature float64
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
plugin.Register(plugin.Plugin{
|
|
||||||
Id: "glm",
|
|
||||||
Name: "智谱ChatGLM",
|
|
||||||
ConfigSample: `apiKey: <**encrypted_apiKey**> # 从bigmodel.cn获得的APIKey`,
|
|
||||||
Init: func(conf map[string]interface{}) {
|
|
||||||
apiKey = u.String(conf["apiKey"])
|
|
||||||
},
|
|
||||||
Objects: map[string]interface{}{
|
|
||||||
// send 方法说明(注释中需包含方法名称)
|
|
||||||
// * prompt 提示词
|
|
||||||
// * parentMessages 历史消息(可选)
|
|
||||||
// * option 选项(可选,model[chatglm_lite/chatglm_std/chatglm_pro/chatglm_turbo],topP[0-1],temperature[0-1])
|
|
||||||
// send return 回答内容
|
|
||||||
"send": func(prompt string, parentMessages *[]map[string]interface{}, option *Option) (map[string]interface{}, error) {
|
|
||||||
url, message := makeRequest(prompt, parentMessages, option)
|
|
||||||
c := httpclient.GetClient(300 * time.Second)
|
|
||||||
r := c.Post(url+"invoke", message, "Authorization", generateToken(apiKey))
|
|
||||||
return r.Map(), r.Error
|
|
||||||
},
|
|
||||||
// sendAsync 方法说明(注释中需包含方法名称)
|
|
||||||
// sendAsync callback 回调函数,返回参数为event(add|finish)和data
|
|
||||||
// sendAsync meta 回答内容
|
|
||||||
"sendAsync": func(callback func(event, data string), prompt string, parentMessages *[]map[string]interface{}, option *Option) (meta map[string]interface{}, err error) {
|
|
||||||
url, message := makeRequest(prompt, parentMessages, option)
|
|
||||||
message["stream"] = true
|
|
||||||
c := httpclient.GetClient(300 * time.Second)
|
|
||||||
r := c.ManualDo("POST", url+"sse-invoke", message, "Authorization", generateToken(apiKey), "Accept", "text/event-stream")
|
|
||||||
reader := bufio.NewReader(r.Response.Body)
|
|
||||||
lastEvent := ""
|
|
||||||
//lastId := ""
|
|
||||||
meta = map[string]interface{}{}
|
|
||||||
for {
|
|
||||||
buf, _, err := reader.ReadLine()
|
|
||||||
if err == io.EOF {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
if err != nil {
|
|
||||||
return meta, err
|
|
||||||
}
|
|
||||||
line := string(buf)
|
|
||||||
pos := strings.IndexByte(line, ':')
|
|
||||||
if pos != -1 {
|
|
||||||
k := line[0:pos]
|
|
||||||
v := line[pos+1:]
|
|
||||||
switch k {
|
|
||||||
case "id":
|
|
||||||
//lastId = v
|
|
||||||
case "event":
|
|
||||||
lastEvent = v
|
|
||||||
case "data":
|
|
||||||
if v == "" {
|
|
||||||
v = "\n"
|
|
||||||
}
|
|
||||||
callback(lastEvent, v)
|
|
||||||
case "meta":
|
|
||||||
meta = u.UnJsonMap(v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return meta, nil
|
|
||||||
},
|
|
||||||
},
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func makeRequest(prompt string, parentMessages *[]map[string]interface{}, option *Option) (url string, message map[string]interface{}) {
|
|
||||||
if option == nil {
|
|
||||||
option = &Option{}
|
|
||||||
if option.Model == "" {
|
|
||||||
option.Model = "chatglm_std"
|
|
||||||
}
|
|
||||||
if option.TopP == 0 {
|
|
||||||
option.TopP = 0.7
|
|
||||||
}
|
|
||||||
if option.Temperature == 0 {
|
|
||||||
option.Temperature = 0.9
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if parentMessages == nil {
|
|
||||||
parentMessages = &[]map[string]interface{}{}
|
|
||||||
}
|
|
||||||
messages := append(*parentMessages, map[string]interface{}{
|
|
||||||
"role": "user",
|
|
||||||
"content": prompt,
|
|
||||||
})
|
|
||||||
|
|
||||||
return "https://open.bigmodel.cn/api/paas/v3/model-api/" + option.Model + "/", map[string]interface{}{
|
|
||||||
"model": option.Model,
|
|
||||||
"topP": option.TopP,
|
|
||||||
"temperature": option.Temperature,
|
|
||||||
"prompt": messages,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func generateToken(apikey string) string {
|
|
||||||
parts := strings.Split(apikey, ".")
|
|
||||||
if len(parts) != 2 {
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
id := parts[0]
|
|
||||||
secret := parts[1]
|
|
||||||
|
|
||||||
payload := jwt.MapClaims{
|
|
||||||
"api_key": id,
|
|
||||||
"exp": time.Now().Add(time.Second * 180).Unix(),
|
|
||||||
"timestamp": time.Now().Unix(),
|
|
||||||
}
|
|
||||||
|
|
||||||
token := jwt.NewWithClaims(jwt.SigningMethodHS256, payload)
|
|
||||||
token.Header["alg"] = "HS256"
|
|
||||||
token.Header["sign_type"] = "SIGN"
|
|
||||||
|
|
||||||
signedToken, err := token.SignedString([]byte(secret))
|
|
||||||
if err != nil {
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
return signedToken
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user