| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- package coze
- import (
- "bytes"
- "errors"
- "net/http"
- "net/url"
- "strconv"
- "strings"
- "github.com/bytedance/sonic"
- "github.com/gin-gonic/gin"
- "github.com/labring/aiproxy/core/model"
- "github.com/labring/aiproxy/core/relay/adaptor"
- "github.com/labring/aiproxy/core/relay/meta"
- "github.com/labring/aiproxy/core/relay/mode"
- "github.com/labring/aiproxy/core/relay/utils"
- )
- type Adaptor struct{}
- const baseURL = "https://api.coze.com"
- func (a *Adaptor) DefaultBaseURL() string {
- return baseURL
- }
- func (a *Adaptor) SupportMode(m mode.Mode) bool {
- return m == mode.ChatCompletions
- }
- func (a *Adaptor) GetRequestURL(
- meta *meta.Meta,
- _ adaptor.Store,
- _ *gin.Context,
- ) (adaptor.RequestURL, error) {
- url, err := url.JoinPath(meta.Channel.BaseURL, "/open_api/v2/chat")
- if err != nil {
- return adaptor.RequestURL{}, err
- }
- return adaptor.RequestURL{
- Method: http.MethodPost,
- URL: url,
- }, nil
- }
- func (a *Adaptor) SetupRequestHeader(
- meta *meta.Meta,
- _ adaptor.Store,
- _ *gin.Context,
- req *http.Request,
- ) error {
- token, _, err := getTokenAndUserID(meta.Channel.Key)
- if err != nil {
- return err
- }
- req.Header.Set("Authorization", "Bearer "+token)
- return nil
- }
- func (a *Adaptor) ConvertRequest(
- meta *meta.Meta,
- _ adaptor.Store,
- req *http.Request,
- ) (adaptor.ConvertResult, error) {
- if meta.Mode != mode.ChatCompletions {
- return adaptor.ConvertResult{}, errors.New("coze only support chat completions")
- }
- request, err := utils.UnmarshalGeneralOpenAIRequest(req)
- if err != nil {
- return adaptor.ConvertResult{}, err
- }
- _, userID, err := getTokenAndUserID(meta.Channel.Key)
- if err != nil {
- return adaptor.ConvertResult{}, err
- }
- request.User = userID
- request.Model = meta.ActualModel
- cozeRequest := Request{
- Stream: request.Stream,
- User: request.User,
- BotID: strings.TrimPrefix(meta.ActualModel, "bot-"),
- }
- for i, message := range request.Messages {
- if i == len(request.Messages)-1 {
- cozeRequest.Query = message.StringContent()
- continue
- }
- cozeMessage := Message{
- Role: message.Role,
- Content: message.StringContent(),
- }
- cozeRequest.ChatHistory = append(cozeRequest.ChatHistory, cozeMessage)
- }
- data, err := sonic.Marshal(cozeRequest)
- if err != nil {
- return adaptor.ConvertResult{}, err
- }
- return adaptor.ConvertResult{
- Header: http.Header{
- "Content-Type": {"application/json"},
- "Content-Length": {strconv.Itoa(len(data))},
- },
- Body: bytes.NewReader(data),
- }, nil
- }
- func (a *Adaptor) DoRequest(
- meta *meta.Meta,
- _ adaptor.Store,
- _ *gin.Context,
- req *http.Request,
- ) (*http.Response, error) {
- return utils.DoRequest(req, meta.RequestTimeout)
- }
- func (a *Adaptor) DoResponse(
- meta *meta.Meta,
- _ adaptor.Store,
- c *gin.Context,
- resp *http.Response,
- ) (usage model.Usage, err adaptor.Error) {
- if utils.IsStreamResponse(resp) {
- usage, err = StreamHandler(meta, c, resp)
- } else {
- usage, err = Handler(meta, c, resp)
- }
- return usage, err
- }
- func (a *Adaptor) Metadata() adaptor.Metadata {
- return adaptor.Metadata{
- KeyHelp: "token|user_id",
- Models: ModelList,
- }
- }
|