fix(runner): 修复转存后残留二进制误判

统一结果二进制探测与上传规则,避免将 thinking_bytes 等上游元数据误判为待转存媒体,同时保留显式媒体字段和签名识别。\n\n补充不含原始内容的安全诊断,并兼容对象存储前缀旧字段;修正真实 OSS 验收脚本使用的正式字段。\n\n验证:Go 全量测试、go vet、迁移安全检查、真实 Gemini 上游响应及阿里云 OSS 转存均通过。
This commit is contained in:
2026-08-04 14:33:04 +08:00
parent 394cc6288f
commit 5c7d6ac9aa
7 changed files with 142 additions and 22 deletions
+38
View File
@@ -348,6 +348,7 @@ func TestFinalizeGeneratedAssetsMaterializesDetectedMediaAndKeepsOpaqueMetadata(
result := map[string]any{
"provider_payload": base64.StdEncoding.EncodeToString(payload),
"thought_signature": opaque,
"thinking_bytes": opaque,
}
finalized, err := service.finalizeGeneratedAssets(
@@ -373,6 +374,43 @@ func TestFinalizeGeneratedAssetsMaterializesDetectedMediaAndKeepsOpaqueMetadata(
if finalized["thought_signature"] != opaque {
t.Fatal("opaque provider metadata must remain unchanged")
}
if finalized["thinking_bytes"] != opaque {
t.Fatal("opaque provider bytes metadata must remain unchanged")
}
}
func TestFinalizeGeneratedAssetsMaterializesGeminiImageData(t *testing.T) {
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { w.WriteHeader(http.StatusOK) }))
defer server.Close()
service := &Service{}
channels := []store.FileStorageChannel{testObjectStorageChannel("s3", server.URL, "s3-result")}
payload := append([]byte{0x89, 'P', 'N', 'G', 0x0d, 0x0a, 0x1a, 0x0a}, bytes.Repeat([]byte{0}, 256)...)
result := map[string]any{
"id": "gemini-image",
"created": float64(1),
"model": "gemini-3-pro-image",
"data": []any{map[string]any{
"b64_json": base64.StdEncoding.EncodeToString(payload),
"mime_type": "image/png",
}},
}
finalized, err := service.finalizeGeneratedAssets(
t.Context(), "task-gemini-image", "images.generations", result,
defaultGeneratedAssetUploadPolicy(), channels, true, 0,
)
if err != nil {
t.Fatal(err)
}
if TaskResultHasInlineBinary(finalized) {
t.Fatalf("Gemini image result still contains inline binary: %+v", taskResultInlineBinaryDiagnostics(finalized))
}
data := finalized["data"].([]any)
item := data[0].(map[string]any)
reference, ok := item["b64_json"].(map[string]any)
if !ok || reference["assetRef"] == nil || reference["upload"] == nil {
t.Fatalf("Gemini b64_json was not replaced by an object reference: %#v", item)
}
}
func TestResolvedGeneratedAssetContentTypePrefersDetectedMedia(t *testing.T) {