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
e69b5c45
authored
Aug 07, 2025
by
Calcium-Ion
Committed by
GitHub
Aug 07, 2025
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #1517 from RedwindA/fix/gemini-fetch-models
Fix/gemini-fetch-models
parents
cdc6ab61
b2597206
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
10 additions
and
50 deletions
+10
-50
controller/channel.go
+10
-50
No files found.
controller/channel.go
View file @
e69b5c45
...
...
@@ -36,30 +36,11 @@ type OpenAIModel struct {
Parent
string
`json:"parent"`
}
type
GoogleOpenAICompatibleModels
[]
struct
{
Name
string
`json:"name"`
Version
string
`json:"version"`
DisplayName
string
`json:"displayName"`
Description
string
`json:"description,omitempty"`
InputTokenLimit
int
`json:"inputTokenLimit"`
OutputTokenLimit
int
`json:"outputTokenLimit"`
SupportedGenerationMethods
[]
string
`json:"supportedGenerationMethods"`
Temperature
float64
`json:"temperature,omitempty"`
TopP
float64
`json:"topP,omitempty"`
TopK
int
`json:"topK,omitempty"`
MaxTemperature
int
`json:"maxTemperature,omitempty"`
}
type
OpenAIModelsResponse
struct
{
Data
[]
OpenAIModel
`json:"data"`
Success
bool
`json:"success"`
}
type
GoogleOpenAICompatibleResponse
struct
{
Models
[]
GoogleOpenAICompatibleModels
`json:"models"`
NextPageToken
string
`json:"nextPageToken"`
}
func
parseStatusFilter
(
statusParam
string
)
int
{
switch
strings
.
ToLower
(
statusParam
)
{
case
"enabled"
,
"1"
:
...
...
@@ -203,7 +184,7 @@ func FetchUpstreamModels(c *gin.Context) {
switch
channel
.
Type
{
case
constant
.
ChannelTypeGemini
:
// curl https://example.com/v1beta/models?key=$GEMINI_API_KEY
url
=
fmt
.
Sprintf
(
"%s/v1beta/openai/models
?key=%s"
,
baseURL
,
channel
.
Key
)
url
=
fmt
.
Sprintf
(
"%s/v1beta/openai/models
"
,
baseURL
)
// Remove key in url since we need to use AuthHeader
case
constant
.
ChannelTypeAli
:
url
=
fmt
.
Sprintf
(
"%s/compatible-mode/v1/models"
,
baseURL
)
default
:
...
...
@@ -212,10 +193,11 @@ func FetchUpstreamModels(c *gin.Context) {
// 获取响应体 - 根据渠道类型决定是否添加 AuthHeader
var
body
[]
byte
key
:=
strings
.
Split
(
channel
.
Key
,
"
\n
"
)[
0
]
if
channel
.
Type
==
constant
.
ChannelTypeGemini
{
body
,
err
=
GetResponseBody
(
"GET"
,
url
,
channel
,
nil
)
// I don't know why, but Gemini requires no AuthHeader
body
,
err
=
GetResponseBody
(
"GET"
,
url
,
channel
,
GetAuthHeader
(
key
))
// Use AuthHeader since Gemini now forces it
}
else
{
body
,
err
=
GetResponseBody
(
"GET"
,
url
,
channel
,
GetAuthHeader
(
channel
.
K
ey
))
body
,
err
=
GetResponseBody
(
"GET"
,
url
,
channel
,
GetAuthHeader
(
k
ey
))
}
if
err
!=
nil
{
common
.
ApiError
(
c
,
err
)
...
...
@@ -223,34 +205,12 @@ func FetchUpstreamModels(c *gin.Context) {
}
var
result
OpenAIModelsResponse
var
parseSuccess
bool
// 适配特殊格式
switch
channel
.
Type
{
case
constant
.
ChannelTypeGemini
:
var
googleResult
GoogleOpenAICompatibleResponse
if
err
=
json
.
Unmarshal
(
body
,
&
googleResult
);
err
==
nil
{
// 转换Google格式到OpenAI格式
for
_
,
model
:=
range
googleResult
.
Models
{
for
_
,
gModel
:=
range
model
{
result
.
Data
=
append
(
result
.
Data
,
OpenAIModel
{
ID
:
gModel
.
Name
,
})
}
}
parseSuccess
=
true
}
}
// 如果解析失败,尝试OpenAI格式
if
!
parseSuccess
{
if
err
=
json
.
Unmarshal
(
body
,
&
result
);
err
!=
nil
{
c
.
JSON
(
http
.
StatusOK
,
gin
.
H
{
"success"
:
false
,
"message"
:
fmt
.
Sprintf
(
"解析响应失败: %s"
,
err
.
Error
()),
})
return
}
if
err
=
json
.
Unmarshal
(
body
,
&
result
);
err
!=
nil
{
c
.
JSON
(
http
.
StatusOK
,
gin
.
H
{
"success"
:
false
,
"message"
:
fmt
.
Sprintf
(
"解析响应失败: %s"
,
err
.
Error
()),
})
return
}
var
ids
[]
string
...
...
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