mirror of
https://github.com/songquanpeng/one-api.git
synced 2025-09-17 17:16:38 +08:00
- Improve error handling across multiple middleware and adapter components, ensuring consistent error response formats in JSON. - Enhance the functionality of request conversion functions by including context parameters and robust error wrapping. - Introduce new features related to reasoning content in the messaging model, providing better customization and explanations in the documentation.
84 lines
2.2 KiB
Go
84 lines
2.2 KiB
Go
package anthropic
|
|
|
|
import (
|
|
"fmt"
|
|
"io"
|
|
"net/http"
|
|
"strings"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/pkg/errors"
|
|
"github.com/songquanpeng/one-api/relay/adaptor"
|
|
"github.com/songquanpeng/one-api/relay/meta"
|
|
"github.com/songquanpeng/one-api/relay/model"
|
|
)
|
|
|
|
type Adaptor struct {
|
|
}
|
|
|
|
func (a *Adaptor) Init(meta *meta.Meta) {
|
|
|
|
}
|
|
|
|
// https://docs.anthropic.com/claude/reference/messages_post
|
|
// anthopic migrate to Message API
|
|
func (a *Adaptor) GetRequestURL(meta *meta.Meta) (string, error) {
|
|
return fmt.Sprintf("%s/v1/messages", meta.BaseURL), nil
|
|
}
|
|
|
|
func (a *Adaptor) SetupRequestHeader(c *gin.Context, req *http.Request, meta *meta.Meta) error {
|
|
adaptor.SetupCommonRequestHeader(c, req, meta)
|
|
req.Header.Set("x-api-key", meta.APIKey)
|
|
anthropicVersion := c.Request.Header.Get("anthropic-version")
|
|
if anthropicVersion == "" {
|
|
anthropicVersion = "2023-06-01"
|
|
}
|
|
req.Header.Set("anthropic-version", anthropicVersion)
|
|
req.Header.Set("anthropic-beta", "messages-2023-12-15")
|
|
|
|
// https://x.com/alexalbert__/status/1812921642143900036
|
|
// claude-3-5-sonnet can support 8k context
|
|
if strings.HasPrefix(meta.ActualModelName, "claude-3-7-sonnet") {
|
|
req.Header.Set("anthropic-beta", "output-128k-2025-02-19")
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (a *Adaptor) ConvertRequest(c *gin.Context, relayMode int, request *model.GeneralOpenAIRequest) (any, error) {
|
|
if request == nil {
|
|
return nil, errors.New("request is nil")
|
|
}
|
|
|
|
c.Set("claude_model", request.Model)
|
|
return ConvertRequest(c, *request)
|
|
}
|
|
|
|
func (a *Adaptor) ConvertImageRequest(_ *gin.Context, request *model.ImageRequest) (any, error) {
|
|
if request == nil {
|
|
return nil, errors.New("request is nil")
|
|
}
|
|
return request, nil
|
|
}
|
|
|
|
func (a *Adaptor) DoRequest(c *gin.Context, meta *meta.Meta, requestBody io.Reader) (*http.Response, error) {
|
|
return adaptor.DoRequestHelper(a, c, meta, requestBody)
|
|
}
|
|
|
|
func (a *Adaptor) DoResponse(c *gin.Context, resp *http.Response, meta *meta.Meta) (usage *model.Usage, err *model.ErrorWithStatusCode) {
|
|
if meta.IsStream {
|
|
err, usage = StreamHandler(c, resp)
|
|
} else {
|
|
err, usage = Handler(c, resp, meta.PromptTokens, meta.ActualModelName)
|
|
}
|
|
return
|
|
}
|
|
|
|
func (a *Adaptor) GetModelList() []string {
|
|
return ModelList
|
|
}
|
|
|
|
func (a *Adaptor) GetChannelName() string {
|
|
return "anthropic"
|
|
}
|