fix(universal): 兼容 server-main 脚本语义
ci / verify (pull_request) Successful in 9m52s
ci / verify (pull_request) Successful in 9m52s
补充历史脚本依赖的参数预处理上下文,并识别嵌套同步结果,使迁移后的 Universal 图片通道可按原配置执行。
This commit is contained in:
@@ -44,6 +44,8 @@ func (c UniversalClient) Run(ctx context.Context, request Request) (Response, er
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return Response{}, annotateResponseError(err, submitRequestID, startedAt, time.Now())
|
return Response{}, annotateResponseError(err, submitRequestID, startedAt, time.Now())
|
||||||
}
|
}
|
||||||
|
submitResult = universalEffectiveResult(submitResult)
|
||||||
|
submitRequestID = firstNonEmptyString(submitRequestID, requestIDFromResult(submitResult))
|
||||||
if isUniversalSuccess(submitResult) && submitResult["data"] != nil {
|
if isUniversalSuccess(submitResult) && submitResult["data"] != nil {
|
||||||
return Response{
|
return Response{
|
||||||
Result: normalizeUniversalResult(request, submitResult, ""),
|
Result: normalizeUniversalResult(request, submitResult, ""),
|
||||||
@@ -157,6 +159,7 @@ func (c UniversalClient) universalPollUntilDone(ctx context.Context, executor *s
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, "", annotateResponseError(err, firstNonEmptyString(pollRequestID, requestID, upstreamTaskID), pollStarted, pollFinished)
|
return nil, "", annotateResponseError(err, firstNonEmptyString(pollRequestID, requestID, upstreamTaskID), pollStarted, pollFinished)
|
||||||
}
|
}
|
||||||
|
result = universalEffectiveResult(result)
|
||||||
lastResult = result
|
lastResult = result
|
||||||
requestID = firstNonEmptyString(pollRequestID, requestID, requestIDFromResult(result), upstreamTaskID)
|
requestID = firstNonEmptyString(pollRequestID, requestID, requestIDFromResult(result), upstreamTaskID)
|
||||||
if isUniversalSuccess(result) {
|
if isUniversalSuccess(result) {
|
||||||
@@ -239,6 +242,10 @@ func universalScriptContext(request Request, modelType string, payload map[strin
|
|||||||
return selectedBase + "/" + strings.TrimLeft(path, "/")
|
return selectedBase + "/" + strings.TrimLeft(path, "/")
|
||||||
}
|
}
|
||||||
context["creatRequestURL"] = context["createRequestURL"]
|
context["creatRequestURL"] = context["createRequestURL"]
|
||||||
|
context["processedParams"] = cloneBody(request.Body)
|
||||||
|
context["preProcessParams"] = func(params map[string]any, _ ...string) map[string]any {
|
||||||
|
return cloneMapAny(params)
|
||||||
|
}
|
||||||
context["resolveGetTaskURL"] = func(taskID string) string {
|
context["resolveGetTaskURL"] = func(taskID string) string {
|
||||||
return resolveUniversalTaskURL(request.Candidate.PlatformConfig, taskID)
|
return resolveUniversalTaskURL(request.Candidate.PlatformConfig, taskID)
|
||||||
}
|
}
|
||||||
@@ -389,6 +396,20 @@ func universalStatus(result map[string]any) string {
|
|||||||
return strings.ToLower(strings.TrimSpace(firstNonEmptyString(result["status"], result["state"], result["task_status"])))
|
return strings.ToLower(strings.TrimSpace(firstNonEmptyString(result["status"], result["state"], result["task_status"])))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func universalEffectiveResult(result map[string]any) map[string]any {
|
||||||
|
nested, ok := result["result"].(map[string]any)
|
||||||
|
if !ok || nested == nil || isUniversalFailure(result) {
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
out := cloneMapAny(nested)
|
||||||
|
for _, key := range []string{"status", "request_id", "requestId", "upstream_task_id", "task_id", "taskId", "id"} {
|
||||||
|
if out[key] == nil && result[key] != nil {
|
||||||
|
out[key] = result[key]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
func universalTaskID(result map[string]any) string {
|
func universalTaskID(result map[string]any) string {
|
||||||
return firstNonEmptyString(result["upstream_task_id"], result["task_id"], result["taskId"], result["id"])
|
return firstNonEmptyString(result["upstream_task_id"], result["task_id"], result["taskId"], result["id"])
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -92,6 +92,47 @@ func TestUniversalClientDefaultSubmitAndPoll(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestUniversalClientSupportsServerMainScriptContextAndNestedResult(t *testing.T) {
|
||||||
|
request := Request{
|
||||||
|
Kind: "images.generations",
|
||||||
|
ModelType: "image_generate",
|
||||||
|
Model: "custom-image",
|
||||||
|
Body: map[string]any{"model": "custom-image", "prompt": "hello"},
|
||||||
|
Candidate: testUniversalCandidate(map[string]any{
|
||||||
|
"customGetParamsScript": map[string]any{
|
||||||
|
"image_generate": `async function getParams(params, context) {
|
||||||
|
const processed = await context.preProcessParams(params, context.type);
|
||||||
|
return { prompt: processed.prompt + "-" + context.processedParams.prompt };
|
||||||
|
}`,
|
||||||
|
},
|
||||||
|
"customSubmitScript": map[string]any{
|
||||||
|
"image_generate": `async function submitTask(payload) {
|
||||||
|
return {
|
||||||
|
status: "success",
|
||||||
|
result: {
|
||||||
|
status: "success",
|
||||||
|
data: [{ url: "https://cdn.example/" + payload.prompt + ".png" }]
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}`,
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
}
|
||||||
|
|
||||||
|
response, err := (UniversalClient{}).Run(context.Background(), request)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("run failed: %v", err)
|
||||||
|
}
|
||||||
|
data, ok := response.Result["data"].([]any)
|
||||||
|
if !ok || len(data) != 1 {
|
||||||
|
t.Fatalf("unexpected nested result: %#v", response.Result)
|
||||||
|
}
|
||||||
|
image, ok := data[0].(map[string]any)
|
||||||
|
if !ok || image["url"] != "https://cdn.example/hello-hello.png" {
|
||||||
|
t.Fatalf("unexpected image result: %#v", response.Result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestUniversalClientResumeSkipsSubmit(t *testing.T) {
|
func TestUniversalClientResumeSkipsSubmit(t *testing.T) {
|
||||||
request := Request{
|
request := Request{
|
||||||
Kind: "videos.generations",
|
Kind: "videos.generations",
|
||||||
|
|||||||
Reference in New Issue
Block a user