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
5069482d
authored
Oct 14, 2025
by
CaIon
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
refactor: update ConvertToOpenAIVideo method to return byte array and improve error handling
parent
6e08c5dc
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
35 additions
and
23 deletions
+35
-23
controller/task_video.go
+8
-2
dto/openai_video.go
+1
-1
relay/channel/adapter.go
+1
-1
relay/channel/task/jimeng/adaptor.go
+4
-2
relay/channel/task/kling/adaptor.go
+4
-3
relay/channel/task/sora/adaptor.go
+4
-10
relay/channel/task/vidu/adaptor.go
+4
-2
relay/common/relay_info.go
+7
-0
relay/relay_task.go
+2
-2
No files found.
controller/task_video.go
View file @
5069482d
...
...
@@ -88,10 +88,13 @@ func updateVideoSingleTask(ctx context.Context, adaptor channel.TaskAdaptor, cha
return
fmt
.
Errorf
(
"readAll failed for task %s: %w"
,
taskId
,
err
)
}
logger
.
LogDebug
(
ctx
,
fmt
.
Sprintf
(
"UpdateVideoSingleTask response: %s"
,
string
(
responseBody
)))
taskResult
:=
&
relaycommon
.
TaskInfo
{}
// try parse as New API response format
var
responseItems
dto
.
TaskResponse
[
model
.
Task
]
if
err
=
json
.
Unmarshal
(
responseBody
,
&
responseItems
);
err
==
nil
&&
responseItems
.
IsSuccess
()
{
if
err
=
common
.
Unmarshal
(
responseBody
,
&
responseItems
);
err
==
nil
&&
responseItems
.
IsSuccess
()
{
logger
.
LogDebug
(
ctx
,
fmt
.
Sprintf
(
"UpdateVideoSingleTask parsed as new api response format: %+v"
,
responseItems
))
t
:=
responseItems
.
Data
taskResult
.
TaskID
=
t
.
TaskID
taskResult
.
Status
=
string
(
t
.
Status
)
...
...
@@ -105,9 +108,12 @@ func updateVideoSingleTask(ctx context.Context, adaptor channel.TaskAdaptor, cha
task
.
Data
=
redactVideoResponseBody
(
responseBody
)
}
logger
.
LogDebug
(
ctx
,
fmt
.
Sprintf
(
"UpdateVideoSingleTask taskResult: %+v"
,
taskResult
))
now
:=
time
.
Now
()
.
Unix
()
if
taskResult
.
Status
==
""
{
return
fmt
.
Errorf
(
"task %s status is empty"
,
taskId
)
//return fmt.Errorf("task %s status is empty", taskId)
taskResult
=
relaycommon
.
FailTaskInfo
(
"upstream returned empty status"
)
}
task
.
Status
=
model
.
TaskStatus
(
taskResult
.
Status
)
switch
taskResult
.
Status
{
...
...
dto/openai_video.go
View file @
5069482d
...
...
@@ -27,7 +27,7 @@ type OpenAIVideo struct {
Size
string
`json:"size,omitempty"`
RemixedFromVideoID
string
`json:"remixed_from_video_id,omitempty"`
Error
*
OpenAIVideoError
`json:"error,omitempty"`
Metadata
map
[
string
]
any
`json:"metadata,omitempty"`
Metadata
map
[
string
]
any
`json:"meta
_
data,omitempty"`
}
func
(
m
*
OpenAIVideo
)
SetProgressStr
(
progress
string
)
{
...
...
relay/channel/adapter.go
View file @
5069482d
...
...
@@ -53,5 +53,5 @@ type TaskAdaptor interface {
}
type
OpenAIVideoConverter
interface
{
ConvertToOpenAIVideo
(
originTask
*
model
.
Task
)
(
*
dto
.
OpenAIVideo
,
error
)
ConvertToOpenAIVideo
(
originTask
*
model
.
Task
)
(
[]
byte
,
error
)
}
relay/channel/task/jimeng/adaptor.go
View file @
5069482d
...
...
@@ -15,6 +15,7 @@ import (
"strings"
"time"
"github.com/QuantumNous/new-api/common"
"github.com/QuantumNous/new-api/model"
"github.com/gin-gonic/gin"
...
...
@@ -446,7 +447,7 @@ func (a *TaskAdaptor) ParseTaskResult(respBody []byte) (*relaycommon.TaskInfo, e
return
&
taskResult
,
nil
}
func
(
a
*
TaskAdaptor
)
ConvertToOpenAIVideo
(
originTask
*
model
.
Task
)
(
*
dto
.
OpenAIVideo
,
error
)
{
func
(
a
*
TaskAdaptor
)
ConvertToOpenAIVideo
(
originTask
*
model
.
Task
)
(
[]
byte
,
error
)
{
var
jimengResp
responseTask
if
err
:=
json
.
Unmarshal
(
originTask
.
Data
,
&
jimengResp
);
err
!=
nil
{
return
nil
,
errors
.
Wrap
(
err
,
"unmarshal jimeng task data failed"
)
...
...
@@ -467,7 +468,8 @@ func (a *TaskAdaptor) ConvertToOpenAIVideo(originTask *model.Task) (*dto.OpenAIV
}
}
return
openAIVideo
,
nil
jsonData
,
_
:=
common
.
Marshal
(
openAIVideo
)
return
jsonData
,
nil
}
func
isNewAPIRelay
(
apiKey
string
)
bool
{
...
...
relay/channel/task/kling/adaptor.go
View file @
5069482d
...
...
@@ -9,6 +9,7 @@ import (
"strings"
"time"
"github.com/QuantumNous/new-api/common"
"github.com/QuantumNous/new-api/model"
"github.com/samber/lo"
...
...
@@ -367,7 +368,7 @@ func isNewAPIRelay(apiKey string) bool {
return
strings
.
HasPrefix
(
apiKey
,
"sk-"
)
}
func
(
a
*
TaskAdaptor
)
ConvertToOpenAIVideo
(
originTask
*
model
.
Task
)
(
*
dto
.
OpenAIVideo
,
error
)
{
func
(
a
*
TaskAdaptor
)
ConvertToOpenAIVideo
(
originTask
*
model
.
Task
)
(
[]
byte
,
error
)
{
var
klingResp
responsePayload
if
err
:=
json
.
Unmarshal
(
originTask
.
Data
,
&
klingResp
);
err
!=
nil
{
return
nil
,
errors
.
Wrap
(
err
,
"unmarshal kling task data failed"
)
...
...
@@ -396,6 +397,6 @@ func (a *TaskAdaptor) ConvertToOpenAIVideo(originTask *model.Task) (*dto.OpenAIV
Code
:
fmt
.
Sprintf
(
"%d"
,
klingResp
.
Code
),
}
}
return
openAIVideo
,
nil
jsonData
,
_
:=
common
.
Marshal
(
openAIVideo
)
return
jsonData
,
nil
}
relay/channel/task/sora/adaptor.go
View file @
5069482d
...
...
@@ -2,7 +2,6 @@ package sora
import
(
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"
...
...
@@ -107,7 +106,7 @@ func (a *TaskAdaptor) DoResponse(c *gin.Context, resp *http.Response, _ *relayco
// Parse Sora response
var
dResp
responseTask
if
err
:=
js
on
.
Unmarshal
(
responseBody
,
&
dResp
);
err
!=
nil
{
if
err
:=
comm
on
.
Unmarshal
(
responseBody
,
&
dResp
);
err
!=
nil
{
taskErr
=
service
.
TaskErrorWrapper
(
errors
.
Wrapf
(
err
,
"body: %s"
,
responseBody
),
"unmarshal_response_body_failed"
,
http
.
StatusInternalServerError
)
return
}
...
...
@@ -154,7 +153,7 @@ func (a *TaskAdaptor) GetChannelName() string {
func
(
a
*
TaskAdaptor
)
ParseTaskResult
(
respBody
[]
byte
)
(
*
relaycommon
.
TaskInfo
,
error
)
{
resTask
:=
responseTask
{}
if
err
:=
js
on
.
Unmarshal
(
respBody
,
&
resTask
);
err
!=
nil
{
if
err
:=
comm
on
.
Unmarshal
(
respBody
,
&
resTask
);
err
!=
nil
{
return
nil
,
errors
.
Wrap
(
err
,
"unmarshal task result failed"
)
}
...
...
@@ -186,11 +185,6 @@ func (a *TaskAdaptor) ParseTaskResult(respBody []byte) (*relaycommon.TaskInfo, e
return
&
taskResult
,
nil
}
func
(
a
*
TaskAdaptor
)
ConvertToOpenAIVideo
(
task
*
model
.
Task
)
(
*
dto
.
OpenAIVideo
,
error
)
{
openAIVideo
:=
&
dto
.
OpenAIVideo
{}
err
:=
json
.
Unmarshal
(
task
.
Data
,
openAIVideo
)
if
err
!=
nil
{
return
nil
,
errors
.
Wrap
(
err
,
"unmarshal to OpenAIVideo failed"
)
}
return
openAIVideo
,
nil
func
(
a
*
TaskAdaptor
)
ConvertToOpenAIVideo
(
task
*
model
.
Task
)
([]
byte
,
error
)
{
return
task
.
Data
,
nil
}
relay/channel/task/vidu/adaptor.go
View file @
5069482d
...
...
@@ -8,6 +8,7 @@ import (
"net/http"
"time"
"github.com/QuantumNous/new-api/common"
"github.com/gin-gonic/gin"
"github.com/QuantumNous/new-api/constant"
...
...
@@ -263,7 +264,7 @@ func (a *TaskAdaptor) ParseTaskResult(respBody []byte) (*relaycommon.TaskInfo, e
return
taskInfo
,
nil
}
func
(
a
*
TaskAdaptor
)
ConvertToOpenAIVideo
(
originTask
*
model
.
Task
)
(
*
dto
.
OpenAIVideo
,
error
)
{
func
(
a
*
TaskAdaptor
)
ConvertToOpenAIVideo
(
originTask
*
model
.
Task
)
(
[]
byte
,
error
)
{
var
viduResp
taskResultResponse
if
err
:=
json
.
Unmarshal
(
originTask
.
Data
,
&
viduResp
);
err
!=
nil
{
return
nil
,
errors
.
Wrap
(
err
,
"unmarshal vidu task data failed"
)
...
...
@@ -287,5 +288,6 @@ func (a *TaskAdaptor) ConvertToOpenAIVideo(originTask *model.Task) (*dto.OpenAIV
}
}
return
openAIVideo
,
nil
jsonData
,
_
:=
common
.
Marshal
(
openAIVideo
)
return
jsonData
,
nil
}
relay/common/relay_info.go
View file @
5069482d
...
...
@@ -512,6 +512,13 @@ type TaskInfo struct {
TotalTokens
int
`json:"total_tokens,omitempty"`
// 用于按倍率计费
}
func
FailTaskInfo
(
reason
string
)
*
TaskInfo
{
return
&
TaskInfo
{
Status
:
"FAILURE"
,
Reason
:
reason
,
}
}
// RemoveDisabledFields 从请求 JSON 数据中移除渠道设置中禁用的字段
// service_tier: 服务层级字段,可能导致额外计费(OpenAI、Claude、Responses API 支持)
// store: 数据存储授权字段,涉及用户隐私(仅 OpenAI、Responses API 支持,默认允许透传,禁用后可能导致 Codex 无法使用)
...
...
relay/relay_task.go
View file @
5069482d
...
...
@@ -397,12 +397,12 @@ func videoFetchByIDRespBodyBuilder(c *gin.Context) (respBody []byte, taskResp *d
return
}
if
converter
,
ok
:=
adaptor
.
(
channel
.
OpenAIVideoConverter
);
ok
{
openAIVideo
,
err
:=
converter
.
ConvertToOpenAIVideo
(
originTask
)
openAIVideo
Data
,
err
:=
converter
.
ConvertToOpenAIVideo
(
originTask
)
if
err
!=
nil
{
taskResp
=
service
.
TaskErrorWrapper
(
err
,
"convert_to_openai_video_failed"
,
http
.
StatusInternalServerError
)
return
}
respBody
,
_
=
json
.
Marshal
(
openAIVideo
)
respBody
=
openAIVideoData
return
}
taskResp
=
service
.
TaskErrorWrapperLocal
(
errors
.
New
(
fmt
.
Sprintf
(
"not_implemented:%s"
,
originTask
.
Platform
)),
"not_implemented"
,
http
.
StatusNotImplemented
)
...
...
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