mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-04-20 14:30:41 +00:00
Replace the OpenAI GPT-based frame extraction approach (ffmpeg + screenshots) with Gemini 2.5 Flash's native video understanding. This eliminates false positives from frame-based analysis (e.g. "black screen = critical bug" during page transitions) and produces dramatically better QA reviews. Changes: - Remove ffmpeg frame extraction, ffprobe duration detection, and all related logic (~365 lines removed) - Add @google/generative-ai SDK for native video/mp4 upload to Gemini - Update CLI: remove --max-frames, --min-interval-seconds, --keep-frames flags - Update env: OPENAI_API_KEY → GEMINI_API_KEY - Update workflow: swap API key secret and model in pr-qa.yaml - Update report: replace "Frames analyzed" with "Video size" - Add note in prompt that brief black frames during transitions are normal Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
151 lines
3.8 KiB
TypeScript
151 lines
3.8 KiB
TypeScript
import { describe, expect, it } from 'vitest'
|
|
|
|
import {
|
|
extractPlatformFromArtifactDirName,
|
|
pickLatestVideosByPlatform,
|
|
selectVideoCandidateByFile
|
|
} from './qa-video-review'
|
|
|
|
describe('extractPlatformFromArtifactDirName', () => {
|
|
it('extracts and normalizes known qa artifact directory names', () => {
|
|
expect(
|
|
extractPlatformFromArtifactDirName('qa-report-Windows-22818315023')
|
|
).toBe('windows')
|
|
expect(
|
|
extractPlatformFromArtifactDirName('qa-report-macOS-22818315023')
|
|
).toBe('macos')
|
|
expect(
|
|
extractPlatformFromArtifactDirName('qa-report-Linux-22818315023')
|
|
).toBe('linux')
|
|
})
|
|
|
|
it('falls back to slugifying unknown directory names', () => {
|
|
expect(extractPlatformFromArtifactDirName('custom platform run')).toBe(
|
|
'custom-platform-run'
|
|
)
|
|
})
|
|
})
|
|
|
|
describe('pickLatestVideosByPlatform', () => {
|
|
it('keeps only the latest candidate per platform', () => {
|
|
const selected = pickLatestVideosByPlatform([
|
|
{
|
|
platformName: 'windows',
|
|
videoPath: '/tmp/windows-old.mp4',
|
|
mtimeMs: 100
|
|
},
|
|
{
|
|
platformName: 'windows',
|
|
videoPath: '/tmp/windows-new.mp4',
|
|
mtimeMs: 200
|
|
},
|
|
{
|
|
platformName: 'linux',
|
|
videoPath: '/tmp/linux.mp4',
|
|
mtimeMs: 150
|
|
}
|
|
])
|
|
|
|
expect(selected).toEqual([
|
|
{
|
|
platformName: 'linux',
|
|
videoPath: '/tmp/linux.mp4',
|
|
mtimeMs: 150
|
|
},
|
|
{
|
|
platformName: 'windows',
|
|
videoPath: '/tmp/windows-new.mp4',
|
|
mtimeMs: 200
|
|
}
|
|
])
|
|
})
|
|
})
|
|
|
|
describe('selectVideoCandidateByFile', () => {
|
|
it('selects a single candidate by artifacts-relative path', () => {
|
|
const selected = selectVideoCandidateByFile(
|
|
[
|
|
{
|
|
platformName: 'windows',
|
|
videoPath: '/tmp/qa-artifacts/qa-report-Windows-1/qa-session.mp4',
|
|
mtimeMs: 100
|
|
},
|
|
{
|
|
platformName: 'linux',
|
|
videoPath: '/tmp/qa-artifacts/qa-report-Linux-1/qa-session.mp4',
|
|
mtimeMs: 200
|
|
}
|
|
],
|
|
{
|
|
artifactsDir: '/tmp/qa-artifacts',
|
|
videoFile: 'qa-report-Linux-1/qa-session.mp4'
|
|
}
|
|
)
|
|
|
|
expect(selected).toEqual({
|
|
platformName: 'linux',
|
|
videoPath: '/tmp/qa-artifacts/qa-report-Linux-1/qa-session.mp4',
|
|
mtimeMs: 200
|
|
})
|
|
})
|
|
|
|
it('throws when basename matches multiple videos', () => {
|
|
expect(() =>
|
|
selectVideoCandidateByFile(
|
|
[
|
|
{
|
|
platformName: 'windows',
|
|
videoPath: '/tmp/qa-artifacts/qa-report-Windows-1/qa-session.mp4',
|
|
mtimeMs: 100
|
|
},
|
|
{
|
|
platformName: 'linux',
|
|
videoPath: '/tmp/qa-artifacts/qa-report-Linux-1/qa-session.mp4',
|
|
mtimeMs: 200
|
|
}
|
|
],
|
|
{
|
|
artifactsDir: '/tmp/qa-artifacts',
|
|
videoFile: 'qa-session.mp4'
|
|
}
|
|
)
|
|
).toThrow('matched 2 videos')
|
|
})
|
|
|
|
it('throws when there is no matching video', () => {
|
|
expect(() =>
|
|
selectVideoCandidateByFile(
|
|
[
|
|
{
|
|
platformName: 'windows',
|
|
videoPath: '/tmp/qa-artifacts/qa-report-Windows-1/qa-session.mp4',
|
|
mtimeMs: 100
|
|
}
|
|
],
|
|
{
|
|
artifactsDir: '/tmp/qa-artifacts',
|
|
videoFile: 'qa-report-macOS-1/qa-session.mp4'
|
|
}
|
|
)
|
|
).toThrow('No video matched')
|
|
})
|
|
|
|
it('throws when video file is missing', () => {
|
|
expect(() =>
|
|
selectVideoCandidateByFile(
|
|
[
|
|
{
|
|
platformName: 'windows',
|
|
videoPath: '/tmp/qa-artifacts/qa-report-Windows-1/qa-session.mp4',
|
|
mtimeMs: 100
|
|
}
|
|
],
|
|
{
|
|
artifactsDir: '/tmp/qa-artifacts',
|
|
videoFile: ' '
|
|
}
|
|
)
|
|
).toThrow('--video-file is required')
|
|
})
|
|
})
|