Merge branch 'master' of https://gitlink.org.cn/JointCloud/pcm-coordinator
Former-commit-id: ae4c26cce828d8ae65d44305b815aaca8f310476
This commit is contained in:
commit
1ec58ac8f2
|
@ -1827,8 +1827,8 @@ service AICore-api {
|
||||||
|
|
||||||
type (
|
type (
|
||||||
ChatReq{
|
ChatReq{
|
||||||
ApiUrl string `json:"apiUrl"`
|
id uint `json:"id,string"`
|
||||||
Method string `json:"method,optional"`
|
Method string `json:"method,optional"`
|
||||||
ReqData map[string]interface{} `json:"reqData"`
|
ReqData map[string]interface{} `json:"reqData"`
|
||||||
}
|
}
|
||||||
ChatResult{
|
ChatResult{
|
||||||
|
|
|
@ -386,8 +386,8 @@ service pcm {
|
||||||
|
|
||||||
/***********chat***********/
|
/***********chat***********/
|
||||||
@doc "文本识别"
|
@doc "文本识别"
|
||||||
@handler ProxyApiHandler
|
@handler ChatHandler
|
||||||
post /ai/chat (ChatReq) returns (CommonResp)
|
post /ai/chat (ChatReq) returns (ChatResult)
|
||||||
/******chat end***********/
|
/******chat end***********/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,24 +1,25 @@
|
||||||
package ai
|
package ai
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"gitlink.org.cn/JointCloud/pcm-coordinator/pkg/repository/result"
|
||||||
|
"net/http"
|
||||||
|
|
||||||
"github.com/zeromicro/go-zero/rest/httpx"
|
"github.com/zeromicro/go-zero/rest/httpx"
|
||||||
"gitlink.org.cn/JointCloud/pcm-coordinator/internal/logic/ai"
|
"gitlink.org.cn/JointCloud/pcm-coordinator/internal/logic/ai"
|
||||||
"gitlink.org.cn/JointCloud/pcm-coordinator/internal/svc"
|
"gitlink.org.cn/JointCloud/pcm-coordinator/internal/svc"
|
||||||
"gitlink.org.cn/JointCloud/pcm-coordinator/internal/types"
|
"gitlink.org.cn/JointCloud/pcm-coordinator/internal/types"
|
||||||
"gitlink.org.cn/JointCloud/pcm-coordinator/pkg/repository/result"
|
|
||||||
"net/http"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func ProxyApiHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
|
func ChatHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
|
||||||
return func(w http.ResponseWriter, r *http.Request) {
|
return func(w http.ResponseWriter, r *http.Request) {
|
||||||
var req types.ChatReq
|
var req types.ChatReq
|
||||||
if err := httpx.Parse(r, &req); err != nil {
|
if err := httpx.Parse(r, &req); err != nil {
|
||||||
result.ParamErrorResult(r, w, err)
|
httpx.ErrorCtx(r.Context(), w, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
l := ai.NewProxyApiLogic(r.Context(), svcCtx)
|
l := ai.NewChatLogic(r.Context(), svcCtx)
|
||||||
resp, err := l.ProxyApi(&req)
|
resp, err := l.Chat(&req)
|
||||||
result.HttpResult(r, w, resp, err)
|
result.HttpResult(r, w, resp, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -460,7 +460,7 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
|
||||||
{
|
{
|
||||||
Method: http.MethodPost,
|
Method: http.MethodPost,
|
||||||
Path: "/ai/chat",
|
Path: "/ai/chat",
|
||||||
Handler: ai.ProxyApiHandler(serverCtx),
|
Handler: ai.ChatHandler(serverCtx),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
rest.WithPrefix("/pcm/v1"),
|
rest.WithPrefix("/pcm/v1"),
|
||||||
|
|
|
@ -0,0 +1,94 @@
|
||||||
|
package ai
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"context"
|
||||||
|
"crypto/tls"
|
||||||
|
"github.com/go-resty/resty/v2"
|
||||||
|
"github.com/pkg/errors"
|
||||||
|
"gitlink.org.cn/JointCloud/pcm-coordinator/pkg/constants"
|
||||||
|
"gitlink.org.cn/JointCloud/pcm-coordinator/pkg/models"
|
||||||
|
"gitlink.org.cn/JointCloud/pcm-coordinator/pkg/utils/hws"
|
||||||
|
"k8s.io/apimachinery/pkg/util/json"
|
||||||
|
"net/http"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"gitlink.org.cn/JointCloud/pcm-coordinator/internal/svc"
|
||||||
|
"gitlink.org.cn/JointCloud/pcm-coordinator/internal/types"
|
||||||
|
|
||||||
|
"github.com/zeromicro/go-zero/core/logx"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ChatLogic struct {
|
||||||
|
logx.Logger
|
||||||
|
ctx context.Context
|
||||||
|
svcCtx *svc.ServiceContext
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewChatLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ChatLogic {
|
||||||
|
return &ChatLogic{
|
||||||
|
Logger: logx.WithContext(ctx),
|
||||||
|
ctx: ctx,
|
||||||
|
svcCtx: svcCtx,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *ChatLogic) Chat(req *types.ChatReq) (resp *types.ChatResult, err error) {
|
||||||
|
resp = &types.ChatResult{}
|
||||||
|
jsonBytes, err := json.Marshal(&req.ReqData)
|
||||||
|
if err != nil {
|
||||||
|
logx.Errorf("【序列化请求数据失败: %v】", err)
|
||||||
|
return nil, errors.New("请求数据序列化失败")
|
||||||
|
}
|
||||||
|
|
||||||
|
taskAi := models.TaskAi{}
|
||||||
|
l.svcCtx.DbEngin.Model(models.TaskAi{}).Where("id", req.Id).Scan(&taskAi)
|
||||||
|
logx.Infof("【开始处理请求,目标URL: %s】", taskAi.InferUrl)
|
||||||
|
|
||||||
|
// 构建 HTTP 请求
|
||||||
|
request, err := http.NewRequest("POST", taskAi.InferUrl, bytes.NewBuffer(jsonBytes))
|
||||||
|
if err != nil {
|
||||||
|
logx.Errorf("【构建 HTTP 请求失败: %v】", err)
|
||||||
|
return nil, errors.New("网络错误,请稍后重试")
|
||||||
|
}
|
||||||
|
client := resty.New().SetTLSClientConfig(&tls.Config{InsecureSkipVerify: true})
|
||||||
|
restReq := client.R()
|
||||||
|
|
||||||
|
//ModelArts
|
||||||
|
cluster := models.CloudModel{}
|
||||||
|
l.svcCtx.DbEngin.Table("t_cluster").Where("id", taskAi.ClusterId).Scan(&cluster)
|
||||||
|
if strings.EqualFold(cluster.Label, constants.MODELARTS) {
|
||||||
|
signer := &hws.Signer{
|
||||||
|
Key: cluster.Ak,
|
||||||
|
Secret: cluster.Sk,
|
||||||
|
}
|
||||||
|
if err := signer.Sign(request); err != nil {
|
||||||
|
logx.Errorf("【接口签名错误: %v】", err)
|
||||||
|
return nil, errors.New("网络错误,请稍后重试")
|
||||||
|
}
|
||||||
|
restReq.
|
||||||
|
SetHeader("X-Project-Id", cluster.ProjectId).
|
||||||
|
SetHeader("x-stage", "RELEASE").
|
||||||
|
SetHeader("Authorization", request.Header.Get(hws.HeaderXAuthorization)).
|
||||||
|
SetHeader("X-Sdk-Date", request.Header.Get(hws.HeaderXDateTime))
|
||||||
|
}
|
||||||
|
|
||||||
|
response, err := restReq.
|
||||||
|
SetHeader("Content-Type", "application/json").
|
||||||
|
SetBody(jsonBytes).
|
||||||
|
SetResult(&resp).
|
||||||
|
Post(taskAi.InferUrl)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
logx.Errorf("【远程调用接口URL:%s, 返回错误: %s】", taskAi.InferUrl, err.Error())
|
||||||
|
return nil, errors.New("网络错误,请稍后重试")
|
||||||
|
}
|
||||||
|
|
||||||
|
if response.StatusCode() != 200 {
|
||||||
|
logx.Errorf("【远程调用接口URL:%s, 返回错误: %s】", taskAi.InferUrl, response.Body())
|
||||||
|
return nil, errors.New("网络错误,请稍后重试")
|
||||||
|
}
|
||||||
|
|
||||||
|
logx.Infof("【请求处理成功,目标URL: %s】", taskAi.InferUrl)
|
||||||
|
return resp, nil
|
||||||
|
}
|
|
@ -1,91 +0,0 @@
|
||||||
package ai
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"context"
|
|
||||||
"crypto/tls"
|
|
||||||
"encoding/json"
|
|
||||||
"github.com/go-resty/resty/v2"
|
|
||||||
"github.com/pkg/errors"
|
|
||||||
"gitlink.org.cn/JointCloud/pcm-coordinator/pkg/utils/hws"
|
|
||||||
"net/http"
|
|
||||||
|
|
||||||
"gitlink.org.cn/JointCloud/pcm-coordinator/internal/svc"
|
|
||||||
"gitlink.org.cn/JointCloud/pcm-coordinator/internal/types"
|
|
||||||
|
|
||||||
"github.com/zeromicro/go-zero/core/logx"
|
|
||||||
)
|
|
||||||
|
|
||||||
type ProxyApiLogic struct {
|
|
||||||
logx.Logger
|
|
||||||
ctx context.Context
|
|
||||||
svcCtx *svc.ServiceContext
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewProxyApiLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ProxyApiLogic {
|
|
||||||
return &ProxyApiLogic{
|
|
||||||
Logger: logx.WithContext(ctx),
|
|
||||||
ctx: ctx,
|
|
||||||
svcCtx: svcCtx,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const (
|
|
||||||
XProjectID = "d18190e28e3f45a281ef0b0696ec9d52"
|
|
||||||
XStage = "RELEASE"
|
|
||||||
ContentType = "application/json"
|
|
||||||
)
|
|
||||||
|
|
||||||
func (l *ProxyApiLogic) ProxyApi(req *types.ChatReq) (resp *types.ChatResult, err error) {
|
|
||||||
logx.Infof("【开始处理请求,目标URL: %s】", req.ApiUrl)
|
|
||||||
|
|
||||||
jsonBytes, err := json.Marshal(&req.ReqData)
|
|
||||||
if err != nil {
|
|
||||||
logx.Errorf("【序列化请求数据失败: %v】", err)
|
|
||||||
return nil, errors.New("请求数据序列化失败")
|
|
||||||
}
|
|
||||||
|
|
||||||
resp = &types.ChatResult{}
|
|
||||||
|
|
||||||
// 构建 HTTP 请求
|
|
||||||
request, err := http.NewRequest("POST", req.ApiUrl, bytes.NewBuffer(jsonBytes))
|
|
||||||
if err != nil {
|
|
||||||
logx.Errorf("【构建 HTTP 请求失败: %v】", err)
|
|
||||||
return nil, errors.New("网络错误,请稍后重试")
|
|
||||||
}
|
|
||||||
|
|
||||||
signer := &hws.Signer{
|
|
||||||
Key: "UNEHPHO4Z7YSNPKRXFE4",
|
|
||||||
Secret: "JWXCE9qcYbc7RjpSRIWt4WgG3ZKF6Q4lPzkJReX9",
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := signer.Sign(request); err != nil {
|
|
||||||
logx.Errorf("【接口签名错误: %v】", err)
|
|
||||||
return nil, errors.New("网络错误,请稍后重试")
|
|
||||||
}
|
|
||||||
|
|
||||||
client := resty.New().SetTLSClientConfig(&tls.Config{InsecureSkipVerify: true})
|
|
||||||
|
|
||||||
response, err := client.R().
|
|
||||||
SetHeader("X-Project-Id", XProjectID).
|
|
||||||
SetHeader("x-stage", XStage).
|
|
||||||
SetHeader("Content-Type", ContentType).
|
|
||||||
SetHeader("Authorization", request.Header.Get(hws.HeaderXAuthorization)).
|
|
||||||
SetHeader("X-Sdk-Date", request.Header.Get(hws.HeaderXDateTime)).
|
|
||||||
SetBody(jsonBytes).
|
|
||||||
SetResult(&resp).
|
|
||||||
Post(req.ApiUrl)
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
logx.Errorf("【远程调用接口URL:%s, 返回错误: %s】", req.ApiUrl, err.Error())
|
|
||||||
return nil, errors.New("网络错误,请稍后重试")
|
|
||||||
}
|
|
||||||
|
|
||||||
if response.StatusCode() != 200 {
|
|
||||||
logx.Errorf("【远程调用接口URL:%s, 返回错误: %s】", req.ApiUrl, response.Body())
|
|
||||||
return nil, errors.New("网络错误,请稍后重试")
|
|
||||||
}
|
|
||||||
|
|
||||||
logx.Infof("【请求处理成功,目标URL: %s】", req.ApiUrl)
|
|
||||||
return resp, nil
|
|
||||||
}
|
|
|
@ -201,10 +201,11 @@ func (m *ModelArtsLink) GetResourceStats(ctx context.Context) (*collector.Resour
|
||||||
num32, _ := strconv.Atoi(resp1.Items[0].Spec.Npu.Size)
|
num32, _ := strconv.Atoi(resp1.Items[0].Spec.Npu.Size)
|
||||||
var cards []*collector.Card
|
var cards []*collector.Card
|
||||||
card := &collector.Card{
|
card := &collector.Card{
|
||||||
Platform: MODELARTS,
|
Platform: MODELARTS,
|
||||||
Type: CARD,
|
Type: CARD,
|
||||||
Name: Npu,
|
Name: Npu,
|
||||||
CardNum: int32(num32),
|
CardNum: int32(num32),
|
||||||
|
TOpsAtFp16: float64(num32 * 320),
|
||||||
}
|
}
|
||||||
cards = append(cards, card)
|
cards = append(cards, card)
|
||||||
resourceStats.CardsAvail = cards
|
resourceStats.CardsAvail = cards
|
||||||
|
|
|
@ -21,7 +21,7 @@ import (
|
||||||
"github.com/robfig/cron/v3"
|
"github.com/robfig/cron/v3"
|
||||||
"github.com/zeromicro/go-zero/core/logx"
|
"github.com/zeromicro/go-zero/core/logx"
|
||||||
"github.com/zeromicro/go-zero/zrpc"
|
"github.com/zeromicro/go-zero/zrpc"
|
||||||
hpcacclient "gitlink.org.cn/JointCloud/pcm-ac/hpcacclient"
|
"gitlink.org.cn/JointCloud/pcm-ac/hpcacclient"
|
||||||
"gitlink.org.cn/JointCloud/pcm-coordinator/internal/config"
|
"gitlink.org.cn/JointCloud/pcm-coordinator/internal/config"
|
||||||
"gitlink.org.cn/JointCloud/pcm-coordinator/internal/scheduler"
|
"gitlink.org.cn/JointCloud/pcm-coordinator/internal/scheduler"
|
||||||
"gitlink.org.cn/JointCloud/pcm-coordinator/internal/scheduler/database"
|
"gitlink.org.cn/JointCloud/pcm-coordinator/internal/scheduler/database"
|
||||||
|
|
|
@ -2908,7 +2908,7 @@ type TrainingTaskStatResp struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
type ChatReq struct {
|
type ChatReq struct {
|
||||||
ApiUrl string `json:"apiUrl"`
|
Id uint `json:"id,string"`
|
||||||
Method string `json:"method,optional"`
|
Method string `json:"method,optional"`
|
||||||
ReqData map[string]interface{} `json:"reqData"`
|
ReqData map[string]interface{} `json:"reqData"`
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,4 +28,5 @@ const (
|
||||||
WaitStart = "WaitStart"
|
WaitStart = "WaitStart"
|
||||||
Pending = "Pending"
|
Pending = "Pending"
|
||||||
Stopped = "Stopped"
|
Stopped = "Stopped"
|
||||||
|
Deploying = "Deploying"
|
||||||
)
|
)
|
||||||
|
|
Loading…
Reference in New Issue