Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
phsl
/
new-api
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Members
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
58c9d08f
authored
Aug 25, 2024
by
GuoRuqiang
Committed by
GitHub
Aug 25, 2024
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'Calcium-Ion:main' into main
parents
2c370c4d
045e2cfd
Show whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
52 additions
and
7 deletions
+52
-7
common/email-outlook-auth.go
+8
-0
common/email.go
+1
-1
controller/relay.go
+3
-3
relay/channel/claude/relay-claude.go
+17
-0
relay/relay-image.go
+4
-3
relay/relay_rerank.go
+17
-0
service/channel.go
+2
-0
No files found.
common/email-outlook-auth.go
View file @
58c9d08f
...
@@ -3,6 +3,7 @@ package common
...
@@ -3,6 +3,7 @@ package common
import
(
import
(
"errors"
"errors"
"net/smtp"
"net/smtp"
"strings"
)
)
type
outlookAuth
struct
{
type
outlookAuth
struct
{
...
@@ -30,3 +31,10 @@ func (a *outlookAuth) Next(fromServer []byte, more bool) ([]byte, error) {
...
@@ -30,3 +31,10 @@ func (a *outlookAuth) Next(fromServer []byte, more bool) ([]byte, error) {
}
}
return
nil
,
nil
return
nil
,
nil
}
}
func
isOutlookServer
(
server
string
)
bool
{
// 兼容多地区的outlook邮箱和ofb邮箱
// 其实应该加一个Option来区分是否用LOGIN的方式登录
// 先临时兼容一下
return
strings
.
Contains
(
server
,
"outlook"
)
||
strings
.
Contains
(
server
,
"onmicrosoft"
)
}
common/email.go
View file @
58c9d08f
...
@@ -68,7 +68,7 @@ func SendEmail(subject string, receiver string, content string) error {
...
@@ -68,7 +68,7 @@ func SendEmail(subject string, receiver string, content string) error {
if
err
!=
nil
{
if
err
!=
nil
{
return
err
return
err
}
}
}
else
if
strings
.
HasSuffix
(
SMTPAccount
,
"outlook.com"
)
{
}
else
if
isOutlookServer
(
SMTPAccount
)
{
auth
=
LoginAuth
(
SMTPAccount
,
SMTPToken
)
auth
=
LoginAuth
(
SMTPAccount
,
SMTPToken
)
err
=
smtp
.
SendMail
(
addr
,
auth
,
SMTPAccount
,
to
,
mail
)
err
=
smtp
.
SendMail
(
addr
,
auth
,
SMTPAccount
,
to
,
mail
)
}
else
{
}
else
{
...
...
controller/relay.go
View file @
58c9d08f
...
@@ -121,6 +121,9 @@ func shouldRetry(c *gin.Context, openaiErr *dto.OpenAIErrorWithStatusCode, retry
...
@@ -121,6 +121,9 @@ func shouldRetry(c *gin.Context, openaiErr *dto.OpenAIErrorWithStatusCode, retry
if
openaiErr
==
nil
{
if
openaiErr
==
nil
{
return
false
return
false
}
}
if
openaiErr
.
LocalError
{
return
false
}
if
retryTimes
<=
0
{
if
retryTimes
<=
0
{
return
false
return
false
}
}
...
@@ -151,9 +154,6 @@ func shouldRetry(c *gin.Context, openaiErr *dto.OpenAIErrorWithStatusCode, retry
...
@@ -151,9 +154,6 @@ func shouldRetry(c *gin.Context, openaiErr *dto.OpenAIErrorWithStatusCode, retry
// azure处理超时不重试
// azure处理超时不重试
return
false
return
false
}
}
if
openaiErr
.
LocalError
{
return
false
}
if
openaiErr
.
StatusCode
/
100
==
2
{
if
openaiErr
.
StatusCode
/
100
==
2
{
return
false
return
false
}
}
...
...
relay/channel/claude/relay-claude.go
View file @
58c9d08f
...
@@ -139,6 +139,7 @@ func RequestOpenAI2ClaudeMessage(textRequest dto.GeneralOpenAIRequest) (*ClaudeR
...
@@ -139,6 +139,7 @@ func RequestOpenAI2ClaudeMessage(textRequest dto.GeneralOpenAIRequest) (*ClaudeR
}
}
claudeMessages
:=
make
([]
ClaudeMessage
,
0
)
claudeMessages
:=
make
([]
ClaudeMessage
,
0
)
isFirstMessage
:=
true
for
_
,
message
:=
range
formatMessages
{
for
_
,
message
:=
range
formatMessages
{
if
message
.
Role
==
"system"
{
if
message
.
Role
==
"system"
{
if
message
.
IsStringContent
()
{
if
message
.
IsStringContent
()
{
...
@@ -154,6 +155,22 @@ func RequestOpenAI2ClaudeMessage(textRequest dto.GeneralOpenAIRequest) (*ClaudeR
...
@@ -154,6 +155,22 @@ func RequestOpenAI2ClaudeMessage(textRequest dto.GeneralOpenAIRequest) (*ClaudeR
claudeRequest
.
System
=
content
claudeRequest
.
System
=
content
}
}
}
else
{
}
else
{
if
isFirstMessage
{
isFirstMessage
=
false
if
message
.
Role
!=
"user"
{
// fix: first message is assistant, add user message
claudeMessage
:=
ClaudeMessage
{
Role
:
"user"
,
Content
:
[]
ClaudeMediaMessage
{
{
Type
:
"text"
,
Text
:
"..."
,
},
},
}
claudeMessages
=
append
(
claudeMessages
,
claudeMessage
)
}
}
claudeMessage
:=
ClaudeMessage
{
claudeMessage
:=
ClaudeMessage
{
Role
:
message
.
Role
,
Role
:
message
.
Role
,
}
}
...
...
relay/relay-image.go
View file @
58c9d08f
...
@@ -38,9 +38,7 @@ func getAndValidImageRequest(c *gin.Context, info *relaycommon.RelayInfo) (*dto.
...
@@ -38,9 +38,7 @@ func getAndValidImageRequest(c *gin.Context, info *relaycommon.RelayInfo) (*dto.
if
imageRequest
.
Model
==
""
{
if
imageRequest
.
Model
==
""
{
imageRequest
.
Model
=
"dall-e-2"
imageRequest
.
Model
=
"dall-e-2"
}
}
if
imageRequest
.
Quality
==
""
{
imageRequest
.
Quality
=
"standard"
}
// Not "256x256", "512x512", or "1024x1024"
// Not "256x256", "512x512", or "1024x1024"
if
imageRequest
.
Model
==
"dall-e-2"
||
imageRequest
.
Model
==
"dall-e"
{
if
imageRequest
.
Model
==
"dall-e-2"
||
imageRequest
.
Model
==
"dall-e"
{
if
imageRequest
.
Size
!=
""
&&
imageRequest
.
Size
!=
"256x256"
&&
imageRequest
.
Size
!=
"512x512"
&&
imageRequest
.
Size
!=
"1024x1024"
{
if
imageRequest
.
Size
!=
""
&&
imageRequest
.
Size
!=
"256x256"
&&
imageRequest
.
Size
!=
"512x512"
&&
imageRequest
.
Size
!=
"1024x1024"
{
...
@@ -50,6 +48,9 @@ func getAndValidImageRequest(c *gin.Context, info *relaycommon.RelayInfo) (*dto.
...
@@ -50,6 +48,9 @@ func getAndValidImageRequest(c *gin.Context, info *relaycommon.RelayInfo) (*dto.
if
imageRequest
.
Size
!=
""
&&
imageRequest
.
Size
!=
"1024x1024"
&&
imageRequest
.
Size
!=
"1024x1792"
&&
imageRequest
.
Size
!=
"1792x1024"
{
if
imageRequest
.
Size
!=
""
&&
imageRequest
.
Size
!=
"1024x1024"
&&
imageRequest
.
Size
!=
"1024x1792"
&&
imageRequest
.
Size
!=
"1792x1024"
{
return
nil
,
errors
.
New
(
"size must be one of 256x256, 512x512, or 1024x1024, dall-e-3 1024x1792 or 1792x1024"
)
return
nil
,
errors
.
New
(
"size must be one of 256x256, 512x512, or 1024x1024, dall-e-3 1024x1792 or 1792x1024"
)
}
}
if
imageRequest
.
Quality
==
""
{
imageRequest
.
Quality
=
"standard"
}
//if imageRequest.N != 1 {
//if imageRequest.N != 1 {
// return nil, errors.New("n must be 1")
// return nil, errors.New("n must be 1")
//}
//}
...
...
relay/relay_rerank.go
View file @
58c9d08f
...
@@ -38,6 +38,23 @@ func RerankHelper(c *gin.Context, relayMode int) *dto.OpenAIErrorWithStatusCode
...
@@ -38,6 +38,23 @@ func RerankHelper(c *gin.Context, relayMode int) *dto.OpenAIErrorWithStatusCode
if
len
(
rerankRequest
.
Documents
)
==
0
{
if
len
(
rerankRequest
.
Documents
)
==
0
{
return
service
.
OpenAIErrorWrapperLocal
(
fmt
.
Errorf
(
"documents is empty"
),
"invalid_documents"
,
http
.
StatusBadRequest
)
return
service
.
OpenAIErrorWrapperLocal
(
fmt
.
Errorf
(
"documents is empty"
),
"invalid_documents"
,
http
.
StatusBadRequest
)
}
}
// map model name
modelMapping
:=
c
.
GetString
(
"model_mapping"
)
//isModelMapped := false
if
modelMapping
!=
""
&&
modelMapping
!=
"{}"
{
modelMap
:=
make
(
map
[
string
]
string
)
err
:=
json
.
Unmarshal
([]
byte
(
modelMapping
),
&
modelMap
)
if
err
!=
nil
{
return
service
.
OpenAIErrorWrapperLocal
(
err
,
"unmarshal_model_mapping_failed"
,
http
.
StatusInternalServerError
)
}
if
modelMap
[
rerankRequest
.
Model
]
!=
""
{
rerankRequest
.
Model
=
modelMap
[
rerankRequest
.
Model
]
// set upstream model name
//isModelMapped = true
}
}
relayInfo
.
UpstreamModelName
=
rerankRequest
.
Model
relayInfo
.
UpstreamModelName
=
rerankRequest
.
Model
modelPrice
,
success
:=
common
.
GetModelPrice
(
rerankRequest
.
Model
,
false
)
modelPrice
,
success
:=
common
.
GetModelPrice
(
rerankRequest
.
Model
,
false
)
groupRatio
:=
common
.
GetGroupRatio
(
relayInfo
.
Group
)
groupRatio
:=
common
.
GetGroupRatio
(
relayInfo
.
Group
)
...
...
service/channel.go
View file @
58c9d08f
...
@@ -54,6 +54,8 @@ func ShouldDisableChannel(channelType int, err *relaymodel.OpenAIErrorWithStatus
...
@@ -54,6 +54,8 @@ func ShouldDisableChannel(channelType int, err *relaymodel.OpenAIErrorWithStatus
switch
err
.
Error
.
Type
{
switch
err
.
Error
.
Type
{
case
"insufficient_quota"
:
case
"insufficient_quota"
:
return
true
return
true
case
"insufficient_user_quota"
:
return
true
// https://docs.anthropic.com/claude/reference/errors
// https://docs.anthropic.com/claude/reference/errors
case
"authentication_error"
:
case
"authentication_error"
:
return
true
return
true
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment