ai-agent-book 精选快照(<2MB 代码与文档,来自 github.com/bojieli/ai-agent-book)
Build latest book artifacts / build (push) Canceled after 0s
dependency resolution / resolve (3.11) (push) Canceled after 0s
dependency resolution / resolve (3.13) (push) Canceled after 0s
deploy-pages / build (push) Canceled after 0s
deploy-pages / deploy (push) Canceled after 0s
i18n consistency check / check (push) Canceled after 0s
provider adoption tests / test (chapter2/context-compression) (push) Canceled after 0s
provider adoption tests / test (chapter2/prompt-injection) (push) Canceled after 0s
provider adoption tests / test (chapter2/system-hint) (push) Canceled after 0s
provider adoption tests / test (chapter3/log-sanitization) (push) Canceled after 0s
web-search-agent tests / test (push) Canceled after 0s
web-search-agent tests / agentbook (push) Canceled after 0s
@@ -0,0 +1,13 @@
|
||||
Blender 4.3.2
|
||||
build date: 2024-12-17
|
||||
build time: 02:14:25
|
||||
build commit date: 2024-12-16
|
||||
build commit time: 21:10
|
||||
build hash: 32f5fdce0a0a
|
||||
build branch: blender-v4.3-release
|
||||
build platform: Darwin
|
||||
build type: Release
|
||||
build c flags: -Wall -Werror=implicit-function-declaration -Werror=return-type -Wno-tautological-compare -Wno-unknown-pragmas -Wno-char-subscripts -Wstrict-prototypes -Wmissing-prototypes -Wunused-parameter -Wundef -Wundef-prefix -Werror=unguarded-availability-new -mmacosx-version-min=11.2 -Xclang -fopenmp -I'/Users/blender/git/blender-v430/blender.git/lib/macos_arm64/openmp/include' -std=gnu11 -pipe -funsigned-char -fno-strict-aliasing -ffp-contract=off
|
||||
build c++ flags: -Wall -Wc++20-designator -Wno-tautological-compare -Wno-unknown-pragmas -Wno-char-subscripts -Wno-overloaded-virtual -Wno-sign-compare -Wno-invalid-offsetof -Wno-suggest-override -Wundef -Wundef-prefix -Wunused-parameter -Wmismatched-tags -Werror=unguarded-availability-new -mmacosx-version-min=11.2 -ftemplate-depth=1024 -Xclang -fopenmp -I'/Users/blender/git/blender-v430/blender.git/lib/macos_arm64/openmp/include' -pipe -funsigned-char -fno-strict-aliasing -ffp-contract=off
|
||||
build link flags: -fexceptions -framework CoreServices -framework Foundation -framework IOKit -framework AppKit -framework Cocoa -framework Carbon -framework AudioUnit -framework AudioToolbox -framework CoreAudio -framework Metal -framework QuartzCore -framework Accelerate -liconv -Wl,-unexported_symbols_list,'/Users/blender/git/blender-v430/blender.git/source/creator/symbols_apple.map' -Xlinker -no_warn_duplicate_libraries
|
||||
build system: CMake
|
||||
|
After Width: | Height: | Size: 1.5 KiB |
|
After Width: | Height: | Size: 282 KiB |
|
After Width: | Height: | Size: 179 KiB |
|
After Width: | Height: | Size: 258 KiB |
|
After Width: | Height: | Size: 39 KiB |
|
After Width: | Height: | Size: 224 KiB |
|
After Width: | Height: | Size: 240 KiB |
|
After Width: | Height: | Size: 36 KiB |
|
After Width: | Height: | Size: 440 KiB |
|
After Width: | Height: | Size: 440 KiB |
|
After Width: | Height: | Size: 192 KiB |
|
After Width: | Height: | Size: 25 KiB |
|
After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 282 KiB |
|
After Width: | Height: | Size: 284 KiB |
|
After Width: | Height: | Size: 23 KiB |
|
After Width: | Height: | Size: 24 KiB |
|
After Width: | Height: | Size: 284 KiB |
|
After Width: | Height: | Size: 330 KiB |
|
After Width: | Height: | Size: 116 KiB |
|
After Width: | Height: | Size: 24 KiB |
|
After Width: | Height: | Size: 25 KiB |
|
After Width: | Height: | Size: 77 KiB |
|
After Width: | Height: | Size: 179 KiB |
|
After Width: | Height: | Size: 94 KiB |
|
After Width: | Height: | Size: 188 KiB |
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 24 KiB |
|
After Width: | Height: | Size: 206 KiB |
|
After Width: | Height: | Size: 21 KiB |
|
After Width: | Height: | Size: 44 KiB |
|
After Width: | Height: | Size: 44 KiB |
@@ -0,0 +1,186 @@
|
||||
{
|
||||
"request": "Cut out the shot of the large white rabbit walking alone in the sunny meadow, slow it to 1.5x duration, and add the subtitle BIG BUNNY along the bottom.",
|
||||
"target": "the single continuous shot showing the large white rabbit walking alone in a sunny green meadow, after the ONE BIG RABBIT title and before the THREE RODENTS title",
|
||||
"coarse_interval_s": 10,
|
||||
"coarse_frames": [
|
||||
{
|
||||
"timestamp_s": 0.0,
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/coarse/frame-000.00.png",
|
||||
"sha256": "cdd5c7f27f84347a40eb467c356c5a2fda3facdad9057f246034e355b89dcfdd",
|
||||
"bytes": 1580
|
||||
},
|
||||
{
|
||||
"timestamp_s": 10.0,
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/coarse/frame-010.00.png",
|
||||
"sha256": "bdf01683fab23e1e98099d0f6e19596eabcd96ddb1c643b3d0c6749b5f2995a9",
|
||||
"bytes": 288771
|
||||
},
|
||||
{
|
||||
"timestamp_s": 20.0,
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/coarse/frame-020.00.png",
|
||||
"sha256": "713c2f7a5db41b01640dbae71ef4d5057c382dd1480d9e31bcc3f6d05c9da52b",
|
||||
"bytes": 183618
|
||||
},
|
||||
{
|
||||
"timestamp_s": 30.0,
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/coarse/frame-030.00.png",
|
||||
"sha256": "ce5d5733e716607000f9d6aef75dbb9b31279dd50e7db7c6c1e714819624224a",
|
||||
"bytes": 264372
|
||||
},
|
||||
{
|
||||
"timestamp_s": 31.495,
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/coarse/frame-031.50.png",
|
||||
"sha256": "57e555d305ac18228155454935f9a411a9e21ccc092348997f8e3299d4011b89",
|
||||
"bytes": 40146
|
||||
}
|
||||
],
|
||||
"coarse_result": {
|
||||
"start": 10.0,
|
||||
"end": 20.0,
|
||||
"reason": "The 10.00s frame shows a large white rabbit standing alone in a sunny green meadow with a clear sky and distant mountains. The next frame at 20.00s features three rodents in a different setting, indicating the rabbit shot is continuous between these timestamps."
|
||||
},
|
||||
"fine_interval_s": 1,
|
||||
"fine_window": [
|
||||
5,
|
||||
25
|
||||
],
|
||||
"fine_frames": [
|
||||
{
|
||||
"timestamp_s": 5.0,
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/fine/frame-005.00.png",
|
||||
"sha256": "7bf0f2f437e8781ac96e6a27b41f975189c3784dbd3368672d43fd4b2d92813a",
|
||||
"bytes": 451029
|
||||
},
|
||||
{
|
||||
"timestamp_s": 6.0,
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/fine/frame-006.00.png",
|
||||
"sha256": "618ee855deb607995c0be98d0a64db5614c4f851837af105e0672822947fe361",
|
||||
"bytes": 451002
|
||||
},
|
||||
{
|
||||
"timestamp_s": 7.0,
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/fine/frame-007.00.png",
|
||||
"sha256": "40e9724ee1834abee7d12002cd83a4120738b0ffd0a294741c25c2135edb02b8",
|
||||
"bytes": 196294
|
||||
},
|
||||
{
|
||||
"timestamp_s": 8.0,
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/fine/frame-008.00.png",
|
||||
"sha256": "1da6191f1a0c6ccc987a8e5d0682d7e664aa4ce8b8ce31d232bec5ae695b0c4e",
|
||||
"bytes": 25229
|
||||
},
|
||||
{
|
||||
"timestamp_s": 9.0,
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/fine/frame-009.00.png",
|
||||
"sha256": "c0358569f2defb8cfdcd0c73393fc2e75cab6168920819a7c0d28395389132b7",
|
||||
"bytes": 26259
|
||||
},
|
||||
{
|
||||
"timestamp_s": 10.0,
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/fine/frame-010.00.png",
|
||||
"sha256": "bdf01683fab23e1e98099d0f6e19596eabcd96ddb1c643b3d0c6749b5f2995a9",
|
||||
"bytes": 288771
|
||||
},
|
||||
{
|
||||
"timestamp_s": 11.0,
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/fine/frame-011.00.png",
|
||||
"sha256": "c1abe47a8bd0e10472b75a472cea78ff24613c64ccc74ffba9b566d71336c4f4",
|
||||
"bytes": 290263
|
||||
},
|
||||
{
|
||||
"timestamp_s": 12.0,
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/fine/frame-012.00.png",
|
||||
"sha256": "5833475f37ad6ccc7f98c953193368b11c4f3390d1633e224b0a43514c7aa2ec",
|
||||
"bytes": 23585
|
||||
},
|
||||
{
|
||||
"timestamp_s": 13.0,
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/fine/frame-013.00.png",
|
||||
"sha256": "f14dca5370861a1b1f1ee95d1e00172314f27e60ec9f3451a16e08efb46cabf4",
|
||||
"bytes": 24310
|
||||
},
|
||||
{
|
||||
"timestamp_s": 14.0,
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/fine/frame-014.00.png",
|
||||
"sha256": "ab5ed49e0a1267d80e53bc524db96a521aedf419d4a2e766463bd58fc2cbd96a",
|
||||
"bytes": 290328
|
||||
},
|
||||
{
|
||||
"timestamp_s": 15.0,
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/fine/frame-015.00.png",
|
||||
"sha256": "101c7a220045bdad559ffabcf2345a307c4b2a8ace71c1f289f861cb5ac8dfcf",
|
||||
"bytes": 337454
|
||||
},
|
||||
{
|
||||
"timestamp_s": 16.0,
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/fine/frame-016.00.png",
|
||||
"sha256": "6b674c7689ae86485ce112daa9a14cbd4334d3c41cbc12bcc8a06b0c34c3d0bd",
|
||||
"bytes": 118937
|
||||
},
|
||||
{
|
||||
"timestamp_s": 17.0,
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/fine/frame-017.00.png",
|
||||
"sha256": "44134f20bffcd9fb57c3ca421a7be03fa2596962423a955140bf44e3d5c2582b",
|
||||
"bytes": 24201
|
||||
},
|
||||
{
|
||||
"timestamp_s": 18.0,
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/fine/frame-018.00.png",
|
||||
"sha256": "bf44d8b974343063293c92d2933edd0e9a711802d44753f5c0c8b4f4cf3406aa",
|
||||
"bytes": 25412
|
||||
},
|
||||
{
|
||||
"timestamp_s": 19.0,
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/fine/frame-019.00.png",
|
||||
"sha256": "7d2fdecd1cff9d025880e069d111c9e8aa0c488dd1e570b62f5147a136543271",
|
||||
"bytes": 78776
|
||||
},
|
||||
{
|
||||
"timestamp_s": 20.0,
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/fine/frame-020.00.png",
|
||||
"sha256": "713c2f7a5db41b01640dbae71ef4d5057c382dd1480d9e31bcc3f6d05c9da52b",
|
||||
"bytes": 183618
|
||||
},
|
||||
{
|
||||
"timestamp_s": 21.0,
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/fine/frame-021.00.png",
|
||||
"sha256": "c9758159919eb5f8612e3af01258d1c7792d446ca5c08add2ff3dcd3b97e7617",
|
||||
"bytes": 96371
|
||||
},
|
||||
{
|
||||
"timestamp_s": 22.0,
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/fine/frame-022.00.png",
|
||||
"sha256": "54b41278b256654341515bee8f7adb3166bdb15c90f3da9f7f47eb72cad77d33",
|
||||
"bytes": 192864
|
||||
},
|
||||
{
|
||||
"timestamp_s": 23.0,
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/fine/frame-023.00.png",
|
||||
"sha256": "3e49ae19ac287a5acdcff0db46d93d3ca77f98d039d9c53f07210466a323b5b3",
|
||||
"bytes": 22428
|
||||
},
|
||||
{
|
||||
"timestamp_s": 24.0,
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/fine/frame-024.00.png",
|
||||
"sha256": "6eb1ae362db441052be6685922270fcd86572c8b223e99a41a519424ac113c0d",
|
||||
"bytes": 24410
|
||||
},
|
||||
{
|
||||
"timestamp_s": 25.0,
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/fine/frame-025.00.png",
|
||||
"sha256": "354595be0073fcaed614da1ff41177f01e54f74b63f5614ed5033a9c00e0a773",
|
||||
"bytes": 211411
|
||||
}
|
||||
],
|
||||
"fine_result": {
|
||||
"start": 9.0,
|
||||
"end": 12.0,
|
||||
"reason": "The shot begins immediately after the 'ONE BIG RABBIT' title card (which ends at 9.0s) and ends just before the 'THREE RODENTS' title card (which starts at 12.0s). The 10.0s and 11.0s timestamps show the large white rabbit alone in the sunny green meadow, confirming a continuous shot between these boundaries."
|
||||
},
|
||||
"ground_truth": {
|
||||
"start": 9.08,
|
||||
"end": 11.2
|
||||
},
|
||||
"start_error_s": 0.08,
|
||||
"end_error_s": 0.8
|
||||
}
|
||||
@@ -0,0 +1,273 @@
|
||||
{
|
||||
"schema_version": "1.0",
|
||||
"experiment": "5-6",
|
||||
"run_id": "exp5-6-real-blender-20260730-053948",
|
||||
"generated_at_utc": "2026-07-29T21:46:57Z",
|
||||
"provider": "ark",
|
||||
"model": "doubao-seed-1-6-250615",
|
||||
"source_url": "https://download.blender.org/peach/trailer/trailer_480p.mov",
|
||||
"source_sha256": "36801b74638c12be9aa587e93cd18edfc9bc51a1c089ab2a19ee42beed9f497d",
|
||||
"blender_binary": "/Applications/Blender.app/Contents/MacOS/Blender",
|
||||
"blender_version": "Blender 4.3.2",
|
||||
"localization": {
|
||||
"predicted": [
|
||||
9.0,
|
||||
12.0
|
||||
],
|
||||
"ground_truth": [
|
||||
9.08,
|
||||
11.2
|
||||
],
|
||||
"errors_s": [
|
||||
0.08,
|
||||
0.8
|
||||
]
|
||||
},
|
||||
"final_video": {
|
||||
"path": "final.mp4",
|
||||
"sha256": "f470308f20ee4ec4efab59d32aa75d050c7503e82b2889ca8f3a3a2ea0227aff",
|
||||
"probe": {
|
||||
"programs": [],
|
||||
"stream_groups": [],
|
||||
"streams": [
|
||||
{
|
||||
"index": 0,
|
||||
"codec_name": "h264",
|
||||
"codec_type": "video",
|
||||
"width": 854,
|
||||
"height": 480,
|
||||
"r_frame_rate": "25/1"
|
||||
},
|
||||
{
|
||||
"index": 1,
|
||||
"codec_name": "aac",
|
||||
"codec_type": "audio",
|
||||
"sample_rate": "48000",
|
||||
"channels": 2,
|
||||
"r_frame_rate": "0/0"
|
||||
}
|
||||
],
|
||||
"format": {
|
||||
"format_name": "mov,mp4,m4a,3gp,3g2,mj2",
|
||||
"duration": "4.501000",
|
||||
"size": "441102"
|
||||
}
|
||||
}
|
||||
},
|
||||
"model_call_count": 8,
|
||||
"gates": {
|
||||
"pinned_real_public_multiscene_source": true,
|
||||
"coarse_real_vision_about_10_seconds": true,
|
||||
"fine_real_vision_every_1_second": true,
|
||||
"start_boundary_error_le_3s": true,
|
||||
"end_boundary_error_le_3s": true,
|
||||
"model_generated_blender_python": true,
|
||||
"actual_blender_execution": true,
|
||||
"reviewer_rejected_bad_edit": true,
|
||||
"reviewer_triggered_correction": true,
|
||||
"reviewer_accepted_corrected_pixels": false,
|
||||
"subtitle_visually_verified": true,
|
||||
"slow_motion_duration_verified": true,
|
||||
"final_format_and_quality": true,
|
||||
"raw_receipts_usage_latency_complete": true
|
||||
},
|
||||
"artifacts": {
|
||||
"blender_logs/corrected-final-attempt-1.log": {
|
||||
"sha256": "df99dfe60be973a2626bd05bde0662614b7de2822f97b65952395abc4cde25bd",
|
||||
"bytes": 5790
|
||||
},
|
||||
"blender_logs/negative-control-attempt-1.log": {
|
||||
"sha256": "0ec721a0ab199e8cf5022338084c08f2e33f5b0532a495cee7be12cbb0e29d19",
|
||||
"bytes": 594
|
||||
},
|
||||
"blender_logs/negative-control-attempt-2.log": {
|
||||
"sha256": "82896e18f49e90b3913b6523957a7e12258a5ee5a6f45ff140b5362c0ff806f3",
|
||||
"bytes": 449
|
||||
},
|
||||
"blender_logs/negative-control-attempt-3.log": {
|
||||
"sha256": "7818a54d4ac856e57fbb8bc4e56d1cf0d1c802d0ecc46cdc013db7b26017531d",
|
||||
"bytes": 5790
|
||||
},
|
||||
"blender_version.txt": {
|
||||
"sha256": "00e6c06c282a7115cc4f1aaf9a3c8ff7e7d09f25f0f15f32568baa0815f662b4",
|
||||
"bytes": 1641
|
||||
},
|
||||
"final.mp4": {
|
||||
"sha256": "f470308f20ee4ec4efab59d32aa75d050c7503e82b2889ca8f3a3a2ea0227aff",
|
||||
"bytes": 441102
|
||||
},
|
||||
"frames/coarse/frame-000.00.png": {
|
||||
"sha256": "cdd5c7f27f84347a40eb467c356c5a2fda3facdad9057f246034e355b89dcfdd",
|
||||
"bytes": 1580
|
||||
},
|
||||
"frames/coarse/frame-010.00.png": {
|
||||
"sha256": "bdf01683fab23e1e98099d0f6e19596eabcd96ddb1c643b3d0c6749b5f2995a9",
|
||||
"bytes": 288771
|
||||
},
|
||||
"frames/coarse/frame-020.00.png": {
|
||||
"sha256": "713c2f7a5db41b01640dbae71ef4d5057c382dd1480d9e31bcc3f6d05c9da52b",
|
||||
"bytes": 183618
|
||||
},
|
||||
"frames/coarse/frame-030.00.png": {
|
||||
"sha256": "ce5d5733e716607000f9d6aef75dbb9b31279dd50e7db7c6c1e714819624224a",
|
||||
"bytes": 264372
|
||||
},
|
||||
"frames/coarse/frame-031.50.png": {
|
||||
"sha256": "57e555d305ac18228155454935f9a411a9e21ccc092348997f8e3299d4011b89",
|
||||
"bytes": 40146
|
||||
},
|
||||
"frames/final-review/frame-000.35.png": {
|
||||
"sha256": "ba21afabc4197a93b06d4d78ed6f2dff568601b2b94425856efaf5606e49b9bb",
|
||||
"bytes": 229388
|
||||
},
|
||||
"frames/final-review/frame-002.25.png": {
|
||||
"sha256": "389dd8b56fbc2d21af80ebb8f55895602050601915d1b19274e04d2e5678be47",
|
||||
"bytes": 245324
|
||||
},
|
||||
"frames/final-review/frame-004.15.png": {
|
||||
"sha256": "261fbc9ee0b8784f1d4a1f84b34489c5baf3824b6467c82a7673e4b836f97cf0",
|
||||
"bytes": 36595
|
||||
},
|
||||
"frames/fine/frame-005.00.png": {
|
||||
"sha256": "7bf0f2f437e8781ac96e6a27b41f975189c3784dbd3368672d43fd4b2d92813a",
|
||||
"bytes": 451029
|
||||
},
|
||||
"frames/fine/frame-006.00.png": {
|
||||
"sha256": "618ee855deb607995c0be98d0a64db5614c4f851837af105e0672822947fe361",
|
||||
"bytes": 451002
|
||||
},
|
||||
"frames/fine/frame-007.00.png": {
|
||||
"sha256": "40e9724ee1834abee7d12002cd83a4120738b0ffd0a294741c25c2135edb02b8",
|
||||
"bytes": 196294
|
||||
},
|
||||
"frames/fine/frame-008.00.png": {
|
||||
"sha256": "1da6191f1a0c6ccc987a8e5d0682d7e664aa4ce8b8ce31d232bec5ae695b0c4e",
|
||||
"bytes": 25229
|
||||
},
|
||||
"frames/fine/frame-009.00.png": {
|
||||
"sha256": "c0358569f2defb8cfdcd0c73393fc2e75cab6168920819a7c0d28395389132b7",
|
||||
"bytes": 26259
|
||||
},
|
||||
"frames/fine/frame-010.00.png": {
|
||||
"sha256": "bdf01683fab23e1e98099d0f6e19596eabcd96ddb1c643b3d0c6749b5f2995a9",
|
||||
"bytes": 288771
|
||||
},
|
||||
"frames/fine/frame-011.00.png": {
|
||||
"sha256": "c1abe47a8bd0e10472b75a472cea78ff24613c64ccc74ffba9b566d71336c4f4",
|
||||
"bytes": 290263
|
||||
},
|
||||
"frames/fine/frame-012.00.png": {
|
||||
"sha256": "5833475f37ad6ccc7f98c953193368b11c4f3390d1633e224b0a43514c7aa2ec",
|
||||
"bytes": 23585
|
||||
},
|
||||
"frames/fine/frame-013.00.png": {
|
||||
"sha256": "f14dca5370861a1b1f1ee95d1e00172314f27e60ec9f3451a16e08efb46cabf4",
|
||||
"bytes": 24310
|
||||
},
|
||||
"frames/fine/frame-014.00.png": {
|
||||
"sha256": "ab5ed49e0a1267d80e53bc524db96a521aedf419d4a2e766463bd58fc2cbd96a",
|
||||
"bytes": 290328
|
||||
},
|
||||
"frames/fine/frame-015.00.png": {
|
||||
"sha256": "101c7a220045bdad559ffabcf2345a307c4b2a8ace71c1f289f861cb5ac8dfcf",
|
||||
"bytes": 337454
|
||||
},
|
||||
"frames/fine/frame-016.00.png": {
|
||||
"sha256": "6b674c7689ae86485ce112daa9a14cbd4334d3c41cbc12bcc8a06b0c34c3d0bd",
|
||||
"bytes": 118937
|
||||
},
|
||||
"frames/fine/frame-017.00.png": {
|
||||
"sha256": "44134f20bffcd9fb57c3ca421a7be03fa2596962423a955140bf44e3d5c2582b",
|
||||
"bytes": 24201
|
||||
},
|
||||
"frames/fine/frame-018.00.png": {
|
||||
"sha256": "bf44d8b974343063293c92d2933edd0e9a711802d44753f5c0c8b4f4cf3406aa",
|
||||
"bytes": 25412
|
||||
},
|
||||
"frames/fine/frame-019.00.png": {
|
||||
"sha256": "7d2fdecd1cff9d025880e069d111c9e8aa0c488dd1e570b62f5147a136543271",
|
||||
"bytes": 78776
|
||||
},
|
||||
"frames/fine/frame-020.00.png": {
|
||||
"sha256": "713c2f7a5db41b01640dbae71ef4d5057c382dd1480d9e31bcc3f6d05c9da52b",
|
||||
"bytes": 183618
|
||||
},
|
||||
"frames/fine/frame-021.00.png": {
|
||||
"sha256": "c9758159919eb5f8612e3af01258d1c7792d446ca5c08add2ff3dcd3b97e7617",
|
||||
"bytes": 96371
|
||||
},
|
||||
"frames/fine/frame-022.00.png": {
|
||||
"sha256": "54b41278b256654341515bee8f7adb3166bdb15c90f3da9f7f47eb72cad77d33",
|
||||
"bytes": 192864
|
||||
},
|
||||
"frames/fine/frame-023.00.png": {
|
||||
"sha256": "3e49ae19ac287a5acdcff0db46d93d3ca77f98d039d9c53f07210466a323b5b3",
|
||||
"bytes": 22428
|
||||
},
|
||||
"frames/fine/frame-024.00.png": {
|
||||
"sha256": "6eb1ae362db441052be6685922270fcd86572c8b223e99a41a519424ac113c0d",
|
||||
"bytes": 24410
|
||||
},
|
||||
"frames/fine/frame-025.00.png": {
|
||||
"sha256": "354595be0073fcaed614da1ff41177f01e54f74b63f5614ed5033a9c00e0a773",
|
||||
"bytes": 211411
|
||||
},
|
||||
"frames/negative-review/frame-000.35.png": {
|
||||
"sha256": "113732852a3ed623001cbef9e71c10af0b5f60753be8b1f41a14a578d97cee8e",
|
||||
"bytes": 21114
|
||||
},
|
||||
"frames/negative-review/frame-002.25.png": {
|
||||
"sha256": "c8965c10e2311c9752fbfccf9b268dff49100ab8e51cda96462ab831e0e6cbce",
|
||||
"bytes": 44712
|
||||
},
|
||||
"frames/negative-review/frame-004.15.png": {
|
||||
"sha256": "9cce535f13d961323b049feee88d0fc73e689502f4679d935d141588139470c8",
|
||||
"bytes": 45469
|
||||
},
|
||||
"localization.json": {
|
||||
"sha256": "077525ac8226e4e5b684fc06e362638b0c12d7fde375020679bd65eefcc89f1b",
|
||||
"bytes": 8957
|
||||
},
|
||||
"negative_control.mp4": {
|
||||
"sha256": "2c1dd7400c9be5ee6b0d0ceadd9df69e9125270d9df9b15769afabb5b749dfd3",
|
||||
"bytes": 212073
|
||||
},
|
||||
"provider_receipts.checkpoint.json": {
|
||||
"sha256": "d8bdaf541fc79b9073587309c1b2f26f7bff0135a13c2615fb40399e38b7ffe5",
|
||||
"bytes": 51622
|
||||
},
|
||||
"provider_receipts.json": {
|
||||
"sha256": "d8bdaf541fc79b9073587309c1b2f26f7bff0135a13c2615fb40399e38b7ffe5",
|
||||
"bytes": 51622
|
||||
},
|
||||
"review.json": {
|
||||
"sha256": "f9f3f9b88c940244ea5f0ca491c7793b432f64252e6bace785ca4c0c6719e55c",
|
||||
"bytes": 7104
|
||||
},
|
||||
"scripts/corrected-final-attempt-1.py": {
|
||||
"sha256": "9a6f21980c4159a4ed91c9bfa39d09b84151d134c7ac9aa372ceedb8ae116a68",
|
||||
"bytes": 2154
|
||||
},
|
||||
"scripts/negative-control-attempt-1.py": {
|
||||
"sha256": "906f8c6755e58ee9b0806fee11ec81d3a9e95d08fc89cc04473ef825b88f0e82",
|
||||
"bytes": 2292
|
||||
},
|
||||
"scripts/negative-control-attempt-2.py": {
|
||||
"sha256": "0acf30c39cb4e33210706970455d70972e4de94cb5804779cde111f8ae27ddf4",
|
||||
"bytes": 2581
|
||||
},
|
||||
"scripts/negative-control-attempt-3.py": {
|
||||
"sha256": "b07364046e4ab5714b4393d2fa727ac17648946762b019578ba21c7ef0ac5953",
|
||||
"bytes": 2324
|
||||
},
|
||||
"source.mov": {
|
||||
"sha256": "36801b74638c12be9aa587e93cd18edfc9bc51a1c089ab2a19ee42beed9f497d",
|
||||
"bytes": 11061011
|
||||
},
|
||||
"source_evidence.json": {
|
||||
"sha256": "9c6c34b89b43eef4697a5500fde897b7c5c0930459e677855cd568e6bcdd6164",
|
||||
"bytes": 1379
|
||||
}
|
||||
},
|
||||
"official_complete": false
|
||||
}
|
||||
@@ -0,0 +1,608 @@
|
||||
{
|
||||
"calls": [
|
||||
{
|
||||
"purpose": "coarse_10_second_visual_localization",
|
||||
"provider": "ark",
|
||||
"endpoint": "https://ark.cn-beijing.volces.com/api/v3",
|
||||
"request": {
|
||||
"model": "doubao-seed-1-6-250615",
|
||||
"messages": [
|
||||
{
|
||||
"role": "user",
|
||||
"content": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": "These are frames from one contiguous real trailer sampled about every 10 seconds.\nLocate this target: the single continuous shot showing the large white rabbit walking alone in a sunny green meadow, after the ONE BIG RABBIT title and before the THREE RODENTS title.\nReturn JSON {\"start\":seconds,\"end\":seconds,\"reason\":\"visual evidence\"} with a rough continuous interval. Use timestamps and visual content only."
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "timestamp=0.00s"
|
||||
},
|
||||
{
|
||||
"type": "image_artifact",
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/coarse/frame-000.00.png",
|
||||
"sha256": "cdd5c7f27f84347a40eb467c356c5a2fda3facdad9057f246034e355b89dcfdd",
|
||||
"bytes": 1580
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "timestamp=10.00s"
|
||||
},
|
||||
{
|
||||
"type": "image_artifact",
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/coarse/frame-010.00.png",
|
||||
"sha256": "bdf01683fab23e1e98099d0f6e19596eabcd96ddb1c643b3d0c6749b5f2995a9",
|
||||
"bytes": 288771
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "timestamp=20.00s"
|
||||
},
|
||||
{
|
||||
"type": "image_artifact",
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/coarse/frame-020.00.png",
|
||||
"sha256": "713c2f7a5db41b01640dbae71ef4d5057c382dd1480d9e31bcc3f6d05c9da52b",
|
||||
"bytes": 183618
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "timestamp=30.00s"
|
||||
},
|
||||
{
|
||||
"type": "image_artifact",
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/coarse/frame-030.00.png",
|
||||
"sha256": "ce5d5733e716607000f9d6aef75dbb9b31279dd50e7db7c6c1e714819624224a",
|
||||
"bytes": 264372
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "timestamp=31.50s"
|
||||
},
|
||||
{
|
||||
"type": "image_artifact",
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/coarse/frame-031.50.png",
|
||||
"sha256": "57e555d305ac18228155454935f9a411a9e21ccc092348997f8e3299d4011b89",
|
||||
"bytes": 40146
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"temperature": 0,
|
||||
"max_tokens": 700,
|
||||
"response_format": {
|
||||
"type": "json_object"
|
||||
}
|
||||
},
|
||||
"response": {
|
||||
"id": "021785361189352840fd37cfe82fdd108ca4a9d2a65257519a1f7",
|
||||
"model": "doubao-seed-1-6-250615",
|
||||
"finish_reason": "stop",
|
||||
"content": "{\"start\":10.00,\"end\":20.00,\"reason\":\"The 10.00s frame shows a large white rabbit standing alone in a sunny green meadow with a clear sky and distant mountains. The next frame at 20.00s features three rodents in a different setting, indicating the rabbit shot is continuous between these timestamps.\"}"
|
||||
},
|
||||
"usage": {
|
||||
"prompt_tokens": 1686,
|
||||
"completion_tokens": 552,
|
||||
"total_tokens": 2238
|
||||
},
|
||||
"latency_s": 11.434
|
||||
},
|
||||
{
|
||||
"purpose": "fine_1_second_visual_localization",
|
||||
"provider": "ark",
|
||||
"endpoint": "https://ark.cn-beijing.volces.com/api/v3",
|
||||
"request": {
|
||||
"model": "doubao-seed-1-6-250615",
|
||||
"messages": [
|
||||
{
|
||||
"role": "user",
|
||||
"content": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": "These are one-second samples from the narrowed window [5.0, 25.0] seconds of the same real trailer.\nPrecisely locate the boundaries of this one continuous target shot: the single continuous shot showing the large white rabbit walking alone in a sunny green meadow, after the ONE BIG RABBIT title and before the THREE RODENTS title.\nReturn JSON {\"start\":seconds,\"end\":seconds,\"reason\":\"visual boundary evidence\"}. The answer may interpolate between adjacent one-second samples; do not include either neighboring title card."
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "timestamp=5.00s"
|
||||
},
|
||||
{
|
||||
"type": "image_artifact",
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/fine/frame-005.00.png",
|
||||
"sha256": "7bf0f2f437e8781ac96e6a27b41f975189c3784dbd3368672d43fd4b2d92813a",
|
||||
"bytes": 451029
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "timestamp=6.00s"
|
||||
},
|
||||
{
|
||||
"type": "image_artifact",
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/fine/frame-006.00.png",
|
||||
"sha256": "618ee855deb607995c0be98d0a64db5614c4f851837af105e0672822947fe361",
|
||||
"bytes": 451002
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "timestamp=7.00s"
|
||||
},
|
||||
{
|
||||
"type": "image_artifact",
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/fine/frame-007.00.png",
|
||||
"sha256": "40e9724ee1834abee7d12002cd83a4120738b0ffd0a294741c25c2135edb02b8",
|
||||
"bytes": 196294
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "timestamp=8.00s"
|
||||
},
|
||||
{
|
||||
"type": "image_artifact",
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/fine/frame-008.00.png",
|
||||
"sha256": "1da6191f1a0c6ccc987a8e5d0682d7e664aa4ce8b8ce31d232bec5ae695b0c4e",
|
||||
"bytes": 25229
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "timestamp=9.00s"
|
||||
},
|
||||
{
|
||||
"type": "image_artifact",
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/fine/frame-009.00.png",
|
||||
"sha256": "c0358569f2defb8cfdcd0c73393fc2e75cab6168920819a7c0d28395389132b7",
|
||||
"bytes": 26259
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "timestamp=10.00s"
|
||||
},
|
||||
{
|
||||
"type": "image_artifact",
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/fine/frame-010.00.png",
|
||||
"sha256": "bdf01683fab23e1e98099d0f6e19596eabcd96ddb1c643b3d0c6749b5f2995a9",
|
||||
"bytes": 288771
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "timestamp=11.00s"
|
||||
},
|
||||
{
|
||||
"type": "image_artifact",
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/fine/frame-011.00.png",
|
||||
"sha256": "c1abe47a8bd0e10472b75a472cea78ff24613c64ccc74ffba9b566d71336c4f4",
|
||||
"bytes": 290263
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "timestamp=12.00s"
|
||||
},
|
||||
{
|
||||
"type": "image_artifact",
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/fine/frame-012.00.png",
|
||||
"sha256": "5833475f37ad6ccc7f98c953193368b11c4f3390d1633e224b0a43514c7aa2ec",
|
||||
"bytes": 23585
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "timestamp=13.00s"
|
||||
},
|
||||
{
|
||||
"type": "image_artifact",
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/fine/frame-013.00.png",
|
||||
"sha256": "f14dca5370861a1b1f1ee95d1e00172314f27e60ec9f3451a16e08efb46cabf4",
|
||||
"bytes": 24310
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "timestamp=14.00s"
|
||||
},
|
||||
{
|
||||
"type": "image_artifact",
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/fine/frame-014.00.png",
|
||||
"sha256": "ab5ed49e0a1267d80e53bc524db96a521aedf419d4a2e766463bd58fc2cbd96a",
|
||||
"bytes": 290328
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "timestamp=15.00s"
|
||||
},
|
||||
{
|
||||
"type": "image_artifact",
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/fine/frame-015.00.png",
|
||||
"sha256": "101c7a220045bdad559ffabcf2345a307c4b2a8ace71c1f289f861cb5ac8dfcf",
|
||||
"bytes": 337454
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "timestamp=16.00s"
|
||||
},
|
||||
{
|
||||
"type": "image_artifact",
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/fine/frame-016.00.png",
|
||||
"sha256": "6b674c7689ae86485ce112daa9a14cbd4334d3c41cbc12bcc8a06b0c34c3d0bd",
|
||||
"bytes": 118937
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "timestamp=17.00s"
|
||||
},
|
||||
{
|
||||
"type": "image_artifact",
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/fine/frame-017.00.png",
|
||||
"sha256": "44134f20bffcd9fb57c3ca421a7be03fa2596962423a955140bf44e3d5c2582b",
|
||||
"bytes": 24201
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "timestamp=18.00s"
|
||||
},
|
||||
{
|
||||
"type": "image_artifact",
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/fine/frame-018.00.png",
|
||||
"sha256": "bf44d8b974343063293c92d2933edd0e9a711802d44753f5c0c8b4f4cf3406aa",
|
||||
"bytes": 25412
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "timestamp=19.00s"
|
||||
},
|
||||
{
|
||||
"type": "image_artifact",
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/fine/frame-019.00.png",
|
||||
"sha256": "7d2fdecd1cff9d025880e069d111c9e8aa0c488dd1e570b62f5147a136543271",
|
||||
"bytes": 78776
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "timestamp=20.00s"
|
||||
},
|
||||
{
|
||||
"type": "image_artifact",
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/fine/frame-020.00.png",
|
||||
"sha256": "713c2f7a5db41b01640dbae71ef4d5057c382dd1480d9e31bcc3f6d05c9da52b",
|
||||
"bytes": 183618
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "timestamp=21.00s"
|
||||
},
|
||||
{
|
||||
"type": "image_artifact",
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/fine/frame-021.00.png",
|
||||
"sha256": "c9758159919eb5f8612e3af01258d1c7792d446ca5c08add2ff3dcd3b97e7617",
|
||||
"bytes": 96371
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "timestamp=22.00s"
|
||||
},
|
||||
{
|
||||
"type": "image_artifact",
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/fine/frame-022.00.png",
|
||||
"sha256": "54b41278b256654341515bee8f7adb3166bdb15c90f3da9f7f47eb72cad77d33",
|
||||
"bytes": 192864
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "timestamp=23.00s"
|
||||
},
|
||||
{
|
||||
"type": "image_artifact",
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/fine/frame-023.00.png",
|
||||
"sha256": "3e49ae19ac287a5acdcff0db46d93d3ca77f98d039d9c53f07210466a323b5b3",
|
||||
"bytes": 22428
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "timestamp=24.00s"
|
||||
},
|
||||
{
|
||||
"type": "image_artifact",
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/fine/frame-024.00.png",
|
||||
"sha256": "6eb1ae362db441052be6685922270fcd86572c8b223e99a41a519424ac113c0d",
|
||||
"bytes": 24410
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "timestamp=25.00s"
|
||||
},
|
||||
{
|
||||
"type": "image_artifact",
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/fine/frame-025.00.png",
|
||||
"sha256": "354595be0073fcaed614da1ff41177f01e54f74b63f5614ed5033a9c00e0a773",
|
||||
"bytes": 211411
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"temperature": 0,
|
||||
"max_tokens": 700,
|
||||
"response_format": {
|
||||
"type": "json_object"
|
||||
}
|
||||
},
|
||||
"response": {
|
||||
"id": "021785361202231840fd37cfe82fdd108ca4a9d2a652575b39e13",
|
||||
"model": "doubao-seed-1-6-250615",
|
||||
"finish_reason": "stop",
|
||||
"content": "{\"start\":9.0,\"end\":12.0,\"reason\":\"The shot begins immediately after the 'ONE BIG RABBIT' title card (which ends at 9.0s) and ends just before the 'THREE RODENTS' title card (which starts at 12.0s). The 10.0s and 11.0s timestamps show the large white rabbit alone in the sunny green meadow, confirming a continuous shot between these boundaries.\"}"
|
||||
},
|
||||
"usage": {
|
||||
"prompt_tokens": 6555,
|
||||
"completion_tokens": 1585,
|
||||
"total_tokens": 8140
|
||||
},
|
||||
"latency_s": 29.433
|
||||
},
|
||||
{
|
||||
"purpose": "blender_script_negative-control_attempt_1",
|
||||
"provider": "ark",
|
||||
"endpoint": "https://ark.cn-beijing.volces.com/api/v3",
|
||||
"request": {
|
||||
"model": "doubao-seed-1-6-250615",
|
||||
"messages": [
|
||||
{
|
||||
"role": "system",
|
||||
"content": "You are a Blender VSE engineer. Return one JSON object only."
|
||||
},
|
||||
{
|
||||
"role": "user",
|
||||
"content": "Generate a complete Blender 4.3 Python script for this video edit.\n\nInput movie: /Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/source.mov\nOutput MP4: /Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/negative_control.mp4\nSource FPS: 25\nSource size: 853x480; render at 854x480 (one-pixel even-width pad required by H.264)\nTrim interval: [0.000, 3.000] seconds\nEffects: slow playback so output duration is 1.5 times the trimmed interval; add bottom-centered subtitle BIG BUNNY with a visible semi-transparent dark box.\n\nRequirements:\n- Use bpy and Blender's Video Sequence Editor, including new_movie, new_sound when available, frame_offset_start/frame_final_duration, a SPEED effect, and a TEXT effect.\n- Render exactly 854x480 at 25 fps through Blender to MPEG-4 H.264 with AAC audio.\n- Set the scene frame range to the slowed duration and call bpy.ops.render.render(animation=True).\n- Create only the requested output. Do not invoke ffmpeg, subprocesses, a shell, the network, or read credentials.\n- Use APIs available in Blender 4.3 (scene.sequence_editor_create().sequences).\n- In Blender 4.3, SpeedControlSequence has no use_audio property. Never read or assign use_audio, and do not apply a SPEED effect to the sound strip. A valid movie slow-motion pattern is speed_control='MULTIPLY', speed_factor=1/1.5, and extending the movie/render duration; the sound strip may remain normally trimmed.\n- For the subtitle background, prefer the TEXT strip's use_box=True and box_color=(0,0,0,0.6); do not assume a COLOR strip has text-layout properties.\n\nUse this real-Blender-4.3-validated timing pattern, substituting the supplied paths and interval but preserving the timing relationships exactly:\n```\nFPS = 25\nstart_frame = int(round(START_SECONDS * FPS))\ndur_frames = max(1, int(round((END_SECONDS - START_SECONDS) * FPS)))\nrender_dur = int(round(dur_frames * 1.5))\nse = scene.sequence_editor_create()\nmovie = se.sequences.new_movie(name='clip', filepath=INPUT_PATH, channel=1,\n frame_start=1 - start_frame)\nsound = se.sequences.new_sound(name='audio', filepath=INPUT_PATH, channel=2,\n frame_start=1 - start_frame)\nfor strip in (movie, sound):\n strip.frame_offset_start = start_frame\n strip.frame_final_duration = dur_frames\nspeed = se.sequences.new_effect(name='slowmo', type='SPEED', channel=3,\n frame_start=1, frame_end=1 + dur_frames, seq1=movie)\nspeed.use_default_fade = False\nspeed.speed_control = 'MULTIPLY'\nspeed.speed_factor = 1.0 / 1.5\nmovie.frame_final_duration = render_dur\ntext = se.sequences.new_effect(name='subtitle', type='TEXT', channel=4,\n frame_start=1, frame_end=1 + render_dur)\ntext.text = 'BIG BUNNY'; text.location = (0.5, 0.12)\ntext.align_x = 'CENTER'; text.align_y = 'BOTTOM'\ntext.use_box = True; text.box_color = (0.0, 0.0, 0.0, 0.6)\nscene.frame_start = 1; scene.frame_end = render_dur\n```\nThis pattern was executed against Blender 4.3.2 and visibly retained the requested source frames through the whole slowed output. Do not replace its negative source-strip frame_start with frame_start=1: frame_offset_start would then move the visible strip later and render black frames.\n\nReturn one JSON object only: {\"code\":\"complete executable Python source\"}.\n"
|
||||
}
|
||||
],
|
||||
"temperature": 0,
|
||||
"max_tokens": 7000,
|
||||
"response_format": {
|
||||
"type": "json_object"
|
||||
}
|
||||
},
|
||||
"response": {
|
||||
"id": "021785361231647840fd37cfe82fdd108ca4a9d2a6525756884c8",
|
||||
"model": "doubao-seed-1-6-250615",
|
||||
"finish_reason": "stop",
|
||||
"content": "{\"code\": \"import bpy\\n\\n# Configuration\\nINPUT_PATH = '/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/source.mov'\\nOUTPUT_PATH = '/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/negative_control.mp4'\\nSTART_SECONDS = 0.000\\nEND_SECONDS = 3.000\\nFPS = 25\\n\\n# Calculate timing parameters\\nstart_frame = int(round(START_SECONDS * FPS))\\ndur_frames = max(1, int(round((END_SECONDS - START_SECONDS) * FPS)))\\nrender_dur = int(round(dur_frames * 1.5))\\n\\n# Initialize scene\\nscene = bpy.context.scene\\nscene.sequence_editor_clear()\\n\\n# Render settings\\nscene.render.resolution_x = 854\\nscene.render.resolution_y = 480\\nscene.render.resolution_percentage = 100\\nscene.render.fps = FPS\\nscene.render.fps_base = 1.0\\nscene.render.filepath = OUTPUT_PATH\\nscene.render.image_settings.file_format = 'MPEG4'\\nscene.render.ffmpeg.format = 'MPEG4'\\nscene.render.ffmpeg.codec = 'H264'\\nscene.render.ffmpeg.audio_codec = 'AAC'\\n\\n# Video Sequence Editor setup\\nse = scene.sequence_editor_create()\\n\\n# Add movie and audio strips\\nmovie = se.sequences.new_movie(\\n name='clip',\\n filepath=INPUT_PATH,\\n channel=1,\\n frame_start=1 - start_frame\\n)\\nsound = se.sequences.new_sound(\\n name='audio',\\n filepath=INPUT_PATH,\\n channel=2,\\n frame_start=1 - start_frame\\n)\\n\\n# Set trim for both media strips\\nfor strip in (movie, sound):\\n strip.frame_offset_start = start_frame\\n strip.frame_final_duration = dur_frames\\n\\n# Add speed effect for slow motion\\nspeed = se.sequences.new_effect(\\n name='slowmo',\\n type='SPEED',\\n channel=3,\\n frame_start=1,\\n frame_end=1 + dur_frames,\\n seq1=movie\\n)\\nspeed.speed_control = 'MULTIPLY'\\nspeed.speed_factor = 1 / 1.5\\nspeed.use_default_fade = False\\n\\n# Extend movie strip to match render duration\\nmovie.frame_final_duration = render_dur\\n\\n# Add subtitle text strip\\ntext = se.sequences.new_effect(\\n name='subtitle',\\n type='TEXT',\\n channel=4,\\n frame_start=1,\\n frame_end=1 + render_dur\\n)\\ntext.text = 'BIG BUNNY'\\ntext.location = (0.5, 0.12)\\ntext.align_x = 'CENTER'\\ntext.align_y = 'BOTTOM'\\ntext.use_box = True\\ntext.box_color = (0, 0, 0, 0.6)\\n\\n# Set render frame range\\nscene.frame_start = 1\\nscene.frame_end = render_dur\\n\\n# Render animation\\nbpy.ops.render.render(animation=True)\"}"
|
||||
},
|
||||
"usage": {
|
||||
"prompt_tokens": 1083,
|
||||
"completion_tokens": 4029,
|
||||
"total_tokens": 5112
|
||||
},
|
||||
"latency_s": 88.991
|
||||
},
|
||||
{
|
||||
"purpose": "blender_script_negative-control_attempt_2",
|
||||
"provider": "ark",
|
||||
"endpoint": "https://ark.cn-beijing.volces.com/api/v3",
|
||||
"request": {
|
||||
"model": "doubao-seed-1-6-250615",
|
||||
"messages": [
|
||||
{
|
||||
"role": "system",
|
||||
"content": "You are a Blender VSE engineer. Return one JSON object only."
|
||||
},
|
||||
{
|
||||
"role": "user",
|
||||
"content": "Generate a complete Blender 4.3 Python script for this video edit.\n\nInput movie: /Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/source.mov\nOutput MP4: /Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/negative_control.mp4\nSource FPS: 25\nSource size: 853x480; render at 854x480 (one-pixel even-width pad required by H.264)\nTrim interval: [0.000, 3.000] seconds\nEffects: slow playback so output duration is 1.5 times the trimmed interval; add bottom-centered subtitle BIG BUNNY with a visible semi-transparent dark box.\n\nRequirements:\n- Use bpy and Blender's Video Sequence Editor, including new_movie, new_sound when available, frame_offset_start/frame_final_duration, a SPEED effect, and a TEXT effect.\n- Render exactly 854x480 at 25 fps through Blender to MPEG-4 H.264 with AAC audio.\n- Set the scene frame range to the slowed duration and call bpy.ops.render.render(animation=True).\n- Create only the requested output. Do not invoke ffmpeg, subprocesses, a shell, the network, or read credentials.\n- Use APIs available in Blender 4.3 (scene.sequence_editor_create().sequences).\n- In Blender 4.3, SpeedControlSequence has no use_audio property. Never read or assign use_audio, and do not apply a SPEED effect to the sound strip. A valid movie slow-motion pattern is speed_control='MULTIPLY', speed_factor=1/1.5, and extending the movie/render duration; the sound strip may remain normally trimmed.\n- For the subtitle background, prefer the TEXT strip's use_box=True and box_color=(0,0,0,0.6); do not assume a COLOR strip has text-layout properties.\n\nUse this real-Blender-4.3-validated timing pattern, substituting the supplied paths and interval but preserving the timing relationships exactly:\n```\nFPS = 25\nstart_frame = int(round(START_SECONDS * FPS))\ndur_frames = max(1, int(round((END_SECONDS - START_SECONDS) * FPS)))\nrender_dur = int(round(dur_frames * 1.5))\nse = scene.sequence_editor_create()\nmovie = se.sequences.new_movie(name='clip', filepath=INPUT_PATH, channel=1,\n frame_start=1 - start_frame)\nsound = se.sequences.new_sound(name='audio', filepath=INPUT_PATH, channel=2,\n frame_start=1 - start_frame)\nfor strip in (movie, sound):\n strip.frame_offset_start = start_frame\n strip.frame_final_duration = dur_frames\nspeed = se.sequences.new_effect(name='slowmo', type='SPEED', channel=3,\n frame_start=1, frame_end=1 + dur_frames, seq1=movie)\nspeed.use_default_fade = False\nspeed.speed_control = 'MULTIPLY'\nspeed.speed_factor = 1.0 / 1.5\nmovie.frame_final_duration = render_dur\ntext = se.sequences.new_effect(name='subtitle', type='TEXT', channel=4,\n frame_start=1, frame_end=1 + render_dur)\ntext.text = 'BIG BUNNY'; text.location = (0.5, 0.12)\ntext.align_x = 'CENTER'; text.align_y = 'BOTTOM'\ntext.use_box = True; text.box_color = (0.0, 0.0, 0.0, 0.6)\nscene.frame_start = 1; scene.frame_end = render_dur\n```\nThis pattern was executed against Blender 4.3.2 and visibly retained the requested source frames through the whole slowed output. Do not replace its negative source-strip frame_start with frame_start=1: frame_offset_start would then move the visible strip later and render black frames.\n\nReturn one JSON object only: {\"code\":\"complete executable Python source\"}.\n\nPrior executable feedback:\nBlender exit=0; output_exists=False. Tail of real Blender log:\nBlender 4.3.2 (hash 32f5fdce0a0a built 2024-12-17 02:14:25)\nTraceback (most recent call last):\n File \"/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/scripts/negative-control-attempt-1.py\", line 26, in <module>\n scene.render.image_settings.file_format = 'MPEG4'\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nTypeError: bpy_struct: item.attr = val: enum \"MPEG4\" not found in ('BMP', 'IRIS', 'PNG', 'JPEG', 'JPEG2000', 'TARGA', 'TARGA_RAW', 'CINEON', 'DPX', 'OPEN_EXR_MULTILAYER', 'OPEN_EXR', 'HDR', 'TIFF', 'WEBP', 'FFMPEG')\n\nBlender quit"
|
||||
}
|
||||
],
|
||||
"temperature": 0,
|
||||
"max_tokens": 7000,
|
||||
"response_format": {
|
||||
"type": "json_object"
|
||||
}
|
||||
},
|
||||
"response": {
|
||||
"id": "021785361321239840fd37cfe82fdd108ca4a9d2a6525759c9b50",
|
||||
"model": "doubao-seed-1-6-250615",
|
||||
"finish_reason": "stop",
|
||||
"content": "{\"code\": \"import bpy\\n\\n# Clear existing data\\nbpy.ops.wm.read_factory_settings(use_empty=True)\\nscene = bpy.context.scene\\n\\n# Configuration\\nINPUT_PATH = '/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/source.mov'\\nOUTPUT_PATH = '/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/negative_control.mp4'\\nFPS = 25\\nSTART_SECONDS = 0.000\\nEND_SECONDS = 3.000\\n\\n# Calculate timing variables\\nstart_frame = int(round(START_SECONDS * FPS))\\ndur_frames = max(1, int(round((END_SECONDS - START_SECONDS) * FPS)))\\nrender_dur = int(round(dur_frames * 1.5))\\n\\n# Scene settings\\nscene.frame_start = 1\\nscene.frame_end = render_dur\\nscene.render.fps = FPS\\nscene.render.fps_base = 1.0\\n\\n# Render resolution (854x480 for H.264 compatibility)\\nscene.render.resolution_x = 854\\nscene.render.resolution_y = 480\\nscene.render.resolution_percentage = 100\\n\\n# Output settings\\nscene.render.image_settings.file_format = 'FFMPEG'\\nscene.render.ffmpeg.format = 'MPEG4'\\nscene.render.ffmpeg.codec = 'H264'\\nscene.render.ffmpeg.constant_rate_factor = 'MEDIUM'\\nscene.render.ffmpeg.audio_codec = 'AAC'\\nscene.render.ffmpeg.audio_bitrate = 192\\nscene.render.ffmpeg.audio_channels = 'STEREO'\\nscene.render.ffmpeg.audio_sample_rate = 44100\\nscene.render.filepath = OUTPUT_PATH\\n\\n# Create sequence editor\\nse = scene.sequence_editor_create()\\n\\n# Add video clip\\nmovie = se.sequences.new_movie(\\n name='clip',\\n filepath=INPUT_PATH,\\n channel=1,\\n frame_start=1 - start_frame\\n)\\n\\n# Add audio track\\nsound = se.sequences.new_sound(\\n name='audio',\\n filepath=INPUT_PATH,\\n channel=2,\\n frame_start=1 - start_frame\\n)\\n\\n# Set initial trim for video and audio\\nfor strip in (movie, sound):\\n strip.frame_offset_start = start_frame\\n strip.frame_final_duration = dur_frames\\n\\n# Add slow-motion effect to video\\nspeed = se.sequences.new_effect(\\n name='slowmo',\\n type='SPEED',\\n channel=3,\\n frame_start=1,\\n frame_end=1 + dur_frames,\\n seq1=movie\\n)\\nspeed.speed_control = 'MULTIPLY'\\nspeed.speed_factor = 1 / 1.5\\nspeed.use_default_fade = False\\n\\n# Extend video duration for slow-motion\\nmovie.frame_final_duration = render_dur\\n\\n# Add subtitle with background box\\ntext = se.sequences.new_effect(\\n name='subtitle',\\n type='TEXT',\\n channel=4,\\n frame_start=1,\\n frame_end=1 + render_dur\\n)\\ntext.text = 'BIG BUNNY'\\ntext.location = (0.5, 0.12)\\ntext.align_x = 'CENTER'\\ntext.align_y = 'BOTTOM'\\ntext.font_size = 48\\ntext.use_box = True\\ntext.box_color = (0.0, 0.0, 0.0, 0.6)\\n\\n# Render animation\\nbpy.ops.render.render(animation=True)\"}"
|
||||
},
|
||||
"usage": {
|
||||
"prompt_tokens": 1349,
|
||||
"completion_tokens": 5153,
|
||||
"total_tokens": 6502
|
||||
},
|
||||
"latency_s": 108.775
|
||||
},
|
||||
{
|
||||
"purpose": "blender_script_negative-control_attempt_3",
|
||||
"provider": "ark",
|
||||
"endpoint": "https://ark.cn-beijing.volces.com/api/v3",
|
||||
"request": {
|
||||
"model": "doubao-seed-1-6-250615",
|
||||
"messages": [
|
||||
{
|
||||
"role": "system",
|
||||
"content": "You are a Blender VSE engineer. Return one JSON object only."
|
||||
},
|
||||
{
|
||||
"role": "user",
|
||||
"content": "Generate a complete Blender 4.3 Python script for this video edit.\n\nInput movie: /Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/source.mov\nOutput MP4: /Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/negative_control.mp4\nSource FPS: 25\nSource size: 853x480; render at 854x480 (one-pixel even-width pad required by H.264)\nTrim interval: [0.000, 3.000] seconds\nEffects: slow playback so output duration is 1.5 times the trimmed interval; add bottom-centered subtitle BIG BUNNY with a visible semi-transparent dark box.\n\nRequirements:\n- Use bpy and Blender's Video Sequence Editor, including new_movie, new_sound when available, frame_offset_start/frame_final_duration, a SPEED effect, and a TEXT effect.\n- Render exactly 854x480 at 25 fps through Blender to MPEG-4 H.264 with AAC audio.\n- Set the scene frame range to the slowed duration and call bpy.ops.render.render(animation=True).\n- Create only the requested output. Do not invoke ffmpeg, subprocesses, a shell, the network, or read credentials.\n- Use APIs available in Blender 4.3 (scene.sequence_editor_create().sequences).\n- In Blender 4.3, SpeedControlSequence has no use_audio property. Never read or assign use_audio, and do not apply a SPEED effect to the sound strip. A valid movie slow-motion pattern is speed_control='MULTIPLY', speed_factor=1/1.5, and extending the movie/render duration; the sound strip may remain normally trimmed.\n- For the subtitle background, prefer the TEXT strip's use_box=True and box_color=(0,0,0,0.6); do not assume a COLOR strip has text-layout properties.\n\nUse this real-Blender-4.3-validated timing pattern, substituting the supplied paths and interval but preserving the timing relationships exactly:\n```\nFPS = 25\nstart_frame = int(round(START_SECONDS * FPS))\ndur_frames = max(1, int(round((END_SECONDS - START_SECONDS) * FPS)))\nrender_dur = int(round(dur_frames * 1.5))\nse = scene.sequence_editor_create()\nmovie = se.sequences.new_movie(name='clip', filepath=INPUT_PATH, channel=1,\n frame_start=1 - start_frame)\nsound = se.sequences.new_sound(name='audio', filepath=INPUT_PATH, channel=2,\n frame_start=1 - start_frame)\nfor strip in (movie, sound):\n strip.frame_offset_start = start_frame\n strip.frame_final_duration = dur_frames\nspeed = se.sequences.new_effect(name='slowmo', type='SPEED', channel=3,\n frame_start=1, frame_end=1 + dur_frames, seq1=movie)\nspeed.use_default_fade = False\nspeed.speed_control = 'MULTIPLY'\nspeed.speed_factor = 1.0 / 1.5\nmovie.frame_final_duration = render_dur\ntext = se.sequences.new_effect(name='subtitle', type='TEXT', channel=4,\n frame_start=1, frame_end=1 + render_dur)\ntext.text = 'BIG BUNNY'; text.location = (0.5, 0.12)\ntext.align_x = 'CENTER'; text.align_y = 'BOTTOM'\ntext.use_box = True; text.box_color = (0.0, 0.0, 0.0, 0.6)\nscene.frame_start = 1; scene.frame_end = render_dur\n```\nThis pattern was executed against Blender 4.3.2 and visibly retained the requested source frames through the whole slowed output. Do not replace its negative source-strip frame_start with frame_start=1: frame_offset_start would then move the visible strip later and render black frames.\n\nReturn one JSON object only: {\"code\":\"complete executable Python source\"}.\n\nPrior executable feedback:\nBlender exit=0; output_exists=False. Tail of real Blender log:\nBlender 4.3.2 (hash 32f5fdce0a0a built 2024-12-17 02:14:25)\nTraceback (most recent call last):\n File \"/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/scripts/negative-control-attempt-2.py\", line 38, in <module>\n scene.render.ffmpeg.audio_sample_rate = 44100\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nAttributeError: 'FFmpegSettings' object has no attribute 'audio_sample_rate'\n\nBlender quit"
|
||||
}
|
||||
],
|
||||
"temperature": 0,
|
||||
"max_tokens": 7000,
|
||||
"response_format": {
|
||||
"type": "json_object"
|
||||
}
|
||||
},
|
||||
"response": {
|
||||
"id": "021785361430689840fd37cfe82fdd108ca4a9d2a652575b048f8",
|
||||
"model": "doubao-seed-1-6-250615",
|
||||
"finish_reason": "stop",
|
||||
"content": "{\"code\": \"import bpy\\n\\n# Configuration\\nINPUT_PATH = '/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/source.mov'\\nOUTPUT_PATH = '/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/negative_control.mp4'\\nFPS = 25\\nSTART_SECONDS = 0.000\\nEND_SECONDS = 3.000\\n\\n# Calculate timing variables\\nstart_frame = int(round(START_SECONDS * FPS))\\ndur_frames = max(1, int(round((END_SECONDS - START_SECONDS) * FPS)))\\nrender_dur = int(round(dur_frames * 1.5))\\n\\n# Scene setup\\nscene = bpy.context.scene\\nscene.sequence_editor_clear() # Ensure clean state\\nse = scene.sequence_editor_create()\\n\\n# Add movie and audio strips\\nmovie = se.sequences.new_movie(\\n name='clip',\\n filepath=INPUT_PATH,\\n channel=1,\\n frame_start=1 - start_frame\\n)\\nsound = se.sequences.new_sound(\\n name='audio',\\n filepath=INPUT_PATH,\\n channel=2,\\n frame_start=1 - start_frame\\n)\\n\\n# Set trim for both strips\\nfor strip in (movie, sound):\\n strip.frame_offset_start = start_frame\\n strip.frame_final_duration = dur_frames\\n\\n# Add speed effect for slow motion\\nspeed = se.sequences.new_effect(\\n name='slowmo',\\n type='SPEED',\\n channel=3,\\n frame_start=1,\\n frame_end=1 + dur_frames,\\n seq1=movie\\n)\\nspeed.use_default_fade = False\\nspeed.speed_control = 'MULTIPLY'\\nspeed.speed_factor = 1.0 / 1.5\\nmovie.frame_final_duration = render_dur # Extend video to render duration\\n\\n# Add subtitle text strip\\ntext = se.sequences.new_effect(\\n name='subtitle',\\n type='TEXT',\\n channel=4,\\n frame_start=1,\\n frame_end=1 + render_dur\\n)\\ntext.text = 'BIG BUNNY'\\ntext.location = (0.5, 0.12) # Center horizontally, near bottom vertically\\ntext.align_x = 'CENTER'\\ntext.align_y = 'BOTTOM'\\ntext.use_box = True\\ntext.box_color = (0.0, 0.0, 0.0, 0.6) # Black semi-transparent background\\n\\n# Render settings\\nscene.frame_start = 1\\nscene.frame_end = render_dur\\nscene.render.fps = FPS\\nscene.render.fps_base = 1.0\\nscene.render.resolution_x = 854\\nscene.render.resolution_y = 480\\nscene.render.resolution_percentage = 100\\nscene.render.image_settings.file_format = 'FFMPEG'\\nscene.render.ffmpeg.format = 'MPEG4'\\nscene.render.ffmpeg.codec = 'H264'\\nscene.render.ffmpeg.audio_codec = 'AAC'\\nscene.render.filepath = OUTPUT_PATH\\n\\n# Execute render\\nbpy.ops.render.render(animation=True)\"}"
|
||||
},
|
||||
"usage": {
|
||||
"prompt_tokens": 1272,
|
||||
"completion_tokens": 3756,
|
||||
"total_tokens": 5028
|
||||
},
|
||||
"latency_s": 78.291
|
||||
},
|
||||
{
|
||||
"purpose": "review_negative_control_rendered_pixels",
|
||||
"provider": "ark",
|
||||
"endpoint": "https://ark.cn-beijing.volces.com/api/v3",
|
||||
"request": {
|
||||
"model": "doubao-seed-1-6-250615",
|
||||
"messages": [
|
||||
{
|
||||
"role": "user",
|
||||
"content": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": "Independently review these actual rendered keyframes against this edit request:\nCut out the shot of the large white rabbit walking alone in the sunny meadow, slow it to 1.5x duration, and add the subtitle BIG BUNNY along the bottom.\n\nThe target source shot is: the single continuous shot showing the large white rabbit walking alone in a sunny green meadow, after the ONE BIG RABBIT title and before the THREE RODENTS title.\nJudge the pixels, not filenames or claims. Return JSON exactly with:\n{\"pass\":boolean,\"target_present\":boolean,\"irrelevant_content_present\":boolean,\n \"subtitle_visible\":boolean,\"feedback\":\"specific evidence from the frames\"}.\nPass only if all frames show the intended large white rabbit meadow shot without title cards or unrelated scenes and the BIG BUNNY subtitle is visibly overlaid near the bottom.\n"
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "timestamp=0.35s"
|
||||
},
|
||||
{
|
||||
"type": "image_artifact",
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/negative-review/frame-000.35.png",
|
||||
"sha256": "113732852a3ed623001cbef9e71c10af0b5f60753be8b1f41a14a578d97cee8e",
|
||||
"bytes": 21114
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "timestamp=2.25s"
|
||||
},
|
||||
{
|
||||
"type": "image_artifact",
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/negative-review/frame-002.25.png",
|
||||
"sha256": "c8965c10e2311c9752fbfccf9b268dff49100ab8e51cda96462ab831e0e6cbce",
|
||||
"bytes": 44712
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "timestamp=4.15s"
|
||||
},
|
||||
{
|
||||
"type": "image_artifact",
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/negative-review/frame-004.15.png",
|
||||
"sha256": "9cce535f13d961323b049feee88d0fc73e689502f4679d935d141588139470c8",
|
||||
"bytes": 45469
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"temperature": 0,
|
||||
"max_tokens": 700,
|
||||
"response_format": {
|
||||
"type": "json_object"
|
||||
}
|
||||
},
|
||||
"response": {
|
||||
"id": "021785361511277840fd37cfe82fdd108ca4a9d2a652575aeef6b",
|
||||
"model": "doubao-seed-1-6-250615",
|
||||
"finish_reason": "stop",
|
||||
"content": "{\"pass\":false,\"target_present\":false,\"irrelevant_content_present\":true,\"subtitle_visible\":true,\"feedback\":\"All frames show title cards with 'THE PEACH OPEN MOVIE PROJECT PRESENTS' and 'BIG BUNNY' on a gray background; no large white rabbit, sunny meadow, or the target rabbit walking shot is visible.\"}"
|
||||
},
|
||||
"usage": {
|
||||
"prompt_tokens": 1177,
|
||||
"completion_tokens": 450,
|
||||
"total_tokens": 1627
|
||||
},
|
||||
"latency_s": 10.84
|
||||
},
|
||||
{
|
||||
"purpose": "blender_script_corrected-final_attempt_1",
|
||||
"provider": "ark",
|
||||
"endpoint": "https://ark.cn-beijing.volces.com/api/v3",
|
||||
"request": {
|
||||
"model": "doubao-seed-1-6-250615",
|
||||
"messages": [
|
||||
{
|
||||
"role": "system",
|
||||
"content": "You are a Blender VSE engineer. Return one JSON object only."
|
||||
},
|
||||
{
|
||||
"role": "user",
|
||||
"content": "Generate a complete Blender 4.3 Python script for this video edit.\n\nInput movie: /Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/source.mov\nOutput MP4: /Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/final.mp4\nSource FPS: 25\nSource size: 853x480; render at 854x480 (one-pixel even-width pad required by H.264)\nTrim interval: [9.000, 12.000] seconds\nEffects: slow playback so output duration is 1.5 times the trimmed interval; add bottom-centered subtitle BIG BUNNY with a visible semi-transparent dark box.\n\nRequirements:\n- Use bpy and Blender's Video Sequence Editor, including new_movie, new_sound when available, frame_offset_start/frame_final_duration, a SPEED effect, and a TEXT effect.\n- Render exactly 854x480 at 25 fps through Blender to MPEG-4 H.264 with AAC audio.\n- Set the scene frame range to the slowed duration and call bpy.ops.render.render(animation=True).\n- Create only the requested output. Do not invoke ffmpeg, subprocesses, a shell, the network, or read credentials.\n- Use APIs available in Blender 4.3 (scene.sequence_editor_create().sequences).\n- In Blender 4.3, SpeedControlSequence has no use_audio property. Never read or assign use_audio, and do not apply a SPEED effect to the sound strip. A valid movie slow-motion pattern is speed_control='MULTIPLY', speed_factor=1/1.5, and extending the movie/render duration; the sound strip may remain normally trimmed.\n- For the subtitle background, prefer the TEXT strip's use_box=True and box_color=(0,0,0,0.6); do not assume a COLOR strip has text-layout properties.\n\nUse this real-Blender-4.3-validated timing pattern, substituting the supplied paths and interval but preserving the timing relationships exactly:\n```\nFPS = 25\nstart_frame = int(round(START_SECONDS * FPS))\ndur_frames = max(1, int(round((END_SECONDS - START_SECONDS) * FPS)))\nrender_dur = int(round(dur_frames * 1.5))\nse = scene.sequence_editor_create()\nmovie = se.sequences.new_movie(name='clip', filepath=INPUT_PATH, channel=1,\n frame_start=1 - start_frame)\nsound = se.sequences.new_sound(name='audio', filepath=INPUT_PATH, channel=2,\n frame_start=1 - start_frame)\nfor strip in (movie, sound):\n strip.frame_offset_start = start_frame\n strip.frame_final_duration = dur_frames\nspeed = se.sequences.new_effect(name='slowmo', type='SPEED', channel=3,\n frame_start=1, frame_end=1 + dur_frames, seq1=movie)\nspeed.use_default_fade = False\nspeed.speed_control = 'MULTIPLY'\nspeed.speed_factor = 1.0 / 1.5\nmovie.frame_final_duration = render_dur\ntext = se.sequences.new_effect(name='subtitle', type='TEXT', channel=4,\n frame_start=1, frame_end=1 + render_dur)\ntext.text = 'BIG BUNNY'; text.location = (0.5, 0.12)\ntext.align_x = 'CENTER'; text.align_y = 'BOTTOM'\ntext.use_box = True; text.box_color = (0.0, 0.0, 0.0, 0.6)\nscene.frame_start = 1; scene.frame_end = render_dur\n```\nThis pattern was executed against Blender 4.3.2 and visibly retained the requested source frames through the whole slowed output. Do not replace its negative source-strip frame_start with frame_start=1: frame_offset_start would then move the visible strip later and render black frames.\n\nReturn one JSON object only: {\"code\":\"complete executable Python source\"}.\n"
|
||||
}
|
||||
],
|
||||
"temperature": 0,
|
||||
"max_tokens": 7000,
|
||||
"response_format": {
|
||||
"type": "json_object"
|
||||
}
|
||||
},
|
||||
"response": {
|
||||
"id": "021785361522116840fd37cfe82fdd108ca4a9d2a6525751d0232",
|
||||
"model": "doubao-seed-1-6-250615",
|
||||
"finish_reason": "stop",
|
||||
"content": "{\"code\": \"import bpy\\n\\n# Configuration\\nINPUT_PATH = \\\"/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/source.mov\\\"\\nOUTPUT_PATH = \\\"/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/final.mp4\\\"\\nFPS = 25\\nSTART_SECONDS = 9.000\\nEND_SECONDS = 12.000\\n\\n# Timing calculations\\nstart_frame = int(round(START_SECONDS * FPS))\\ndur_frames = max(1, int(round((END_SECONDS - START_SECONDS) * FPS)))\\nrender_dur = int(round(dur_frames * 1.5))\\n\\n# Scene setup\\nscene = bpy.context.scene\\n\\n# Render settings\\nscene.render.resolution_x = 854\\nscene.render.resolution_y = 480\\nscene.render.resolution_percentage = 100\\nscene.render.fps = FPS\\nscene.render.fps_base = 1.0\\nscene.render.image_settings.file_format = 'FFMPEG'\\nscene.render.ffmpeg.format = 'MPEG4'\\nscene.render.ffmpeg.codec = 'H264'\\nscene.render.ffmpeg.audio_codec = 'AAC'\\nscene.render.filepath = OUTPUT_PATH\\n\\n# Sequence Editor setup\\nse = scene.sequence_editor_create()\\n\\n# Video track\\nmovie = se.sequences.new_movie(\\n name='clip',\\n filepath=INPUT_PATH,\\n channel=1,\\n frame_start=1 - start_frame\\n)\\n\\n# Audio track\\nsound = se.sequences.new_sound(\\n name='audio',\\n filepath=INPUT_PATH,\\n channel=2,\\n frame_start=1 - start_frame\\n)\\n\\n# Trim media to interval\\nfor strip in (movie, sound):\\n strip.frame_offset_start = start_frame\\n strip.frame_final_duration = dur_frames\\n\\n# Slow motion effect\\nspeed = se.sequences.new_effect(\\n name='slowmo',\\n type='SPEED',\\n channel=3,\\n frame_start=1,\\n frame_end=1 + dur_frames,\\n seq1=movie\\n)\\nspeed.speed_control = 'MULTIPLY'\\nspeed.speed_factor = 1 / 1.5\\nspeed.use_default_fade = False\\nmovie.frame_final_duration = render_dur\\n\\n# Subtitle with background\\ntext = se.sequences.new_effect(\\n name='subtitle',\\n type='TEXT',\\n channel=4,\\n frame_start=1,\\n frame_end=1 + render_dur\\n)\\ntext.text = 'BIG BUNNY'\\ntext.location = (0.5, 0.12)\\ntext.align_x = 'CENTER'\\ntext.align_y = 'BOTTOM'\\ntext.use_box = True\\ntext.box_color = (0, 0, 0, 0.6)\\n\\n# Render range\\nscene.frame_start = 1\\nscene.frame_end = render_dur\\n\\n# Execute render\\nbpy.ops.render.render(animation=True)\"}"
|
||||
},
|
||||
"usage": {
|
||||
"prompt_tokens": 1083,
|
||||
"completion_tokens": 3693,
|
||||
"total_tokens": 4776
|
||||
},
|
||||
"latency_s": 72.017
|
||||
},
|
||||
{
|
||||
"purpose": "review_corrected_final_rendered_pixels",
|
||||
"provider": "ark",
|
||||
"endpoint": "https://ark.cn-beijing.volces.com/api/v3",
|
||||
"request": {
|
||||
"model": "doubao-seed-1-6-250615",
|
||||
"messages": [
|
||||
{
|
||||
"role": "user",
|
||||
"content": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": "Independently review these actual rendered keyframes against this edit request:\nCut out the shot of the large white rabbit walking alone in the sunny meadow, slow it to 1.5x duration, and add the subtitle BIG BUNNY along the bottom.\n\nThe target source shot is: the single continuous shot showing the large white rabbit walking alone in a sunny green meadow, after the ONE BIG RABBIT title and before the THREE RODENTS title.\nJudge the pixels, not filenames or claims. Return JSON exactly with:\n{\"pass\":boolean,\"target_present\":boolean,\"irrelevant_content_present\":boolean,\n \"subtitle_visible\":boolean,\"feedback\":\"specific evidence from the frames\"}.\nPass only if all frames show the intended large white rabbit meadow shot without title cards or unrelated scenes and the BIG BUNNY subtitle is visibly overlaid near the bottom.\n"
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "timestamp=0.35s"
|
||||
},
|
||||
{
|
||||
"type": "image_artifact",
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/final-review/frame-000.35.png",
|
||||
"sha256": "ba21afabc4197a93b06d4d78ed6f2dff568601b2b94425856efaf5606e49b9bb",
|
||||
"bytes": 229388
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "timestamp=2.25s"
|
||||
},
|
||||
{
|
||||
"type": "image_artifact",
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/final-review/frame-002.25.png",
|
||||
"sha256": "389dd8b56fbc2d21af80ebb8f55895602050601915d1b19274e04d2e5678be47",
|
||||
"bytes": 245324
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "timestamp=4.15s"
|
||||
},
|
||||
{
|
||||
"type": "image_artifact",
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/final-review/frame-004.15.png",
|
||||
"sha256": "261fbc9ee0b8784f1d4a1f84b34489c5baf3824b6467c82a7673e4b836f97cf0",
|
||||
"bytes": 36595
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"temperature": 0,
|
||||
"max_tokens": 700,
|
||||
"response_format": {
|
||||
"type": "json_object"
|
||||
}
|
||||
},
|
||||
"response": {
|
||||
"id": "021785361596706840fd37cfe82fdd108ca4a9d2a65257512a5a8",
|
||||
"model": "doubao-seed-1-6-250615",
|
||||
"finish_reason": "stop",
|
||||
"content": "{\"pass\":false,\"target_present\":true,\"irrelevant_content_present\":true,\"subtitle_visible\":true,\"feedback\":\"Third frame shows 'THREE RODENTS' title card (irrelevant content); first two frames show target large white rabbit in sunny meadow with 'BIG BUNNY' subtitle at bottom.\"}"
|
||||
},
|
||||
"usage": {
|
||||
"prompt_tokens": 1177,
|
||||
"completion_tokens": 1038,
|
||||
"total_tokens": 2215
|
||||
},
|
||||
"latency_s": 20.792
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,608 @@
|
||||
{
|
||||
"calls": [
|
||||
{
|
||||
"purpose": "coarse_10_second_visual_localization",
|
||||
"provider": "ark",
|
||||
"endpoint": "https://ark.cn-beijing.volces.com/api/v3",
|
||||
"request": {
|
||||
"model": "doubao-seed-1-6-250615",
|
||||
"messages": [
|
||||
{
|
||||
"role": "user",
|
||||
"content": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": "These are frames from one contiguous real trailer sampled about every 10 seconds.\nLocate this target: the single continuous shot showing the large white rabbit walking alone in a sunny green meadow, after the ONE BIG RABBIT title and before the THREE RODENTS title.\nReturn JSON {\"start\":seconds,\"end\":seconds,\"reason\":\"visual evidence\"} with a rough continuous interval. Use timestamps and visual content only."
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "timestamp=0.00s"
|
||||
},
|
||||
{
|
||||
"type": "image_artifact",
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/coarse/frame-000.00.png",
|
||||
"sha256": "cdd5c7f27f84347a40eb467c356c5a2fda3facdad9057f246034e355b89dcfdd",
|
||||
"bytes": 1580
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "timestamp=10.00s"
|
||||
},
|
||||
{
|
||||
"type": "image_artifact",
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/coarse/frame-010.00.png",
|
||||
"sha256": "bdf01683fab23e1e98099d0f6e19596eabcd96ddb1c643b3d0c6749b5f2995a9",
|
||||
"bytes": 288771
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "timestamp=20.00s"
|
||||
},
|
||||
{
|
||||
"type": "image_artifact",
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/coarse/frame-020.00.png",
|
||||
"sha256": "713c2f7a5db41b01640dbae71ef4d5057c382dd1480d9e31bcc3f6d05c9da52b",
|
||||
"bytes": 183618
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "timestamp=30.00s"
|
||||
},
|
||||
{
|
||||
"type": "image_artifact",
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/coarse/frame-030.00.png",
|
||||
"sha256": "ce5d5733e716607000f9d6aef75dbb9b31279dd50e7db7c6c1e714819624224a",
|
||||
"bytes": 264372
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "timestamp=31.50s"
|
||||
},
|
||||
{
|
||||
"type": "image_artifact",
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/coarse/frame-031.50.png",
|
||||
"sha256": "57e555d305ac18228155454935f9a411a9e21ccc092348997f8e3299d4011b89",
|
||||
"bytes": 40146
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"temperature": 0,
|
||||
"max_tokens": 700,
|
||||
"response_format": {
|
||||
"type": "json_object"
|
||||
}
|
||||
},
|
||||
"response": {
|
||||
"id": "021785361189352840fd37cfe82fdd108ca4a9d2a65257519a1f7",
|
||||
"model": "doubao-seed-1-6-250615",
|
||||
"finish_reason": "stop",
|
||||
"content": "{\"start\":10.00,\"end\":20.00,\"reason\":\"The 10.00s frame shows a large white rabbit standing alone in a sunny green meadow with a clear sky and distant mountains. The next frame at 20.00s features three rodents in a different setting, indicating the rabbit shot is continuous between these timestamps.\"}"
|
||||
},
|
||||
"usage": {
|
||||
"prompt_tokens": 1686,
|
||||
"completion_tokens": 552,
|
||||
"total_tokens": 2238
|
||||
},
|
||||
"latency_s": 11.434
|
||||
},
|
||||
{
|
||||
"purpose": "fine_1_second_visual_localization",
|
||||
"provider": "ark",
|
||||
"endpoint": "https://ark.cn-beijing.volces.com/api/v3",
|
||||
"request": {
|
||||
"model": "doubao-seed-1-6-250615",
|
||||
"messages": [
|
||||
{
|
||||
"role": "user",
|
||||
"content": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": "These are one-second samples from the narrowed window [5.0, 25.0] seconds of the same real trailer.\nPrecisely locate the boundaries of this one continuous target shot: the single continuous shot showing the large white rabbit walking alone in a sunny green meadow, after the ONE BIG RABBIT title and before the THREE RODENTS title.\nReturn JSON {\"start\":seconds,\"end\":seconds,\"reason\":\"visual boundary evidence\"}. The answer may interpolate between adjacent one-second samples; do not include either neighboring title card."
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "timestamp=5.00s"
|
||||
},
|
||||
{
|
||||
"type": "image_artifact",
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/fine/frame-005.00.png",
|
||||
"sha256": "7bf0f2f437e8781ac96e6a27b41f975189c3784dbd3368672d43fd4b2d92813a",
|
||||
"bytes": 451029
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "timestamp=6.00s"
|
||||
},
|
||||
{
|
||||
"type": "image_artifact",
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/fine/frame-006.00.png",
|
||||
"sha256": "618ee855deb607995c0be98d0a64db5614c4f851837af105e0672822947fe361",
|
||||
"bytes": 451002
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "timestamp=7.00s"
|
||||
},
|
||||
{
|
||||
"type": "image_artifact",
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/fine/frame-007.00.png",
|
||||
"sha256": "40e9724ee1834abee7d12002cd83a4120738b0ffd0a294741c25c2135edb02b8",
|
||||
"bytes": 196294
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "timestamp=8.00s"
|
||||
},
|
||||
{
|
||||
"type": "image_artifact",
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/fine/frame-008.00.png",
|
||||
"sha256": "1da6191f1a0c6ccc987a8e5d0682d7e664aa4ce8b8ce31d232bec5ae695b0c4e",
|
||||
"bytes": 25229
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "timestamp=9.00s"
|
||||
},
|
||||
{
|
||||
"type": "image_artifact",
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/fine/frame-009.00.png",
|
||||
"sha256": "c0358569f2defb8cfdcd0c73393fc2e75cab6168920819a7c0d28395389132b7",
|
||||
"bytes": 26259
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "timestamp=10.00s"
|
||||
},
|
||||
{
|
||||
"type": "image_artifact",
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/fine/frame-010.00.png",
|
||||
"sha256": "bdf01683fab23e1e98099d0f6e19596eabcd96ddb1c643b3d0c6749b5f2995a9",
|
||||
"bytes": 288771
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "timestamp=11.00s"
|
||||
},
|
||||
{
|
||||
"type": "image_artifact",
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/fine/frame-011.00.png",
|
||||
"sha256": "c1abe47a8bd0e10472b75a472cea78ff24613c64ccc74ffba9b566d71336c4f4",
|
||||
"bytes": 290263
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "timestamp=12.00s"
|
||||
},
|
||||
{
|
||||
"type": "image_artifact",
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/fine/frame-012.00.png",
|
||||
"sha256": "5833475f37ad6ccc7f98c953193368b11c4f3390d1633e224b0a43514c7aa2ec",
|
||||
"bytes": 23585
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "timestamp=13.00s"
|
||||
},
|
||||
{
|
||||
"type": "image_artifact",
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/fine/frame-013.00.png",
|
||||
"sha256": "f14dca5370861a1b1f1ee95d1e00172314f27e60ec9f3451a16e08efb46cabf4",
|
||||
"bytes": 24310
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "timestamp=14.00s"
|
||||
},
|
||||
{
|
||||
"type": "image_artifact",
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/fine/frame-014.00.png",
|
||||
"sha256": "ab5ed49e0a1267d80e53bc524db96a521aedf419d4a2e766463bd58fc2cbd96a",
|
||||
"bytes": 290328
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "timestamp=15.00s"
|
||||
},
|
||||
{
|
||||
"type": "image_artifact",
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/fine/frame-015.00.png",
|
||||
"sha256": "101c7a220045bdad559ffabcf2345a307c4b2a8ace71c1f289f861cb5ac8dfcf",
|
||||
"bytes": 337454
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "timestamp=16.00s"
|
||||
},
|
||||
{
|
||||
"type": "image_artifact",
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/fine/frame-016.00.png",
|
||||
"sha256": "6b674c7689ae86485ce112daa9a14cbd4334d3c41cbc12bcc8a06b0c34c3d0bd",
|
||||
"bytes": 118937
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "timestamp=17.00s"
|
||||
},
|
||||
{
|
||||
"type": "image_artifact",
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/fine/frame-017.00.png",
|
||||
"sha256": "44134f20bffcd9fb57c3ca421a7be03fa2596962423a955140bf44e3d5c2582b",
|
||||
"bytes": 24201
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "timestamp=18.00s"
|
||||
},
|
||||
{
|
||||
"type": "image_artifact",
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/fine/frame-018.00.png",
|
||||
"sha256": "bf44d8b974343063293c92d2933edd0e9a711802d44753f5c0c8b4f4cf3406aa",
|
||||
"bytes": 25412
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "timestamp=19.00s"
|
||||
},
|
||||
{
|
||||
"type": "image_artifact",
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/fine/frame-019.00.png",
|
||||
"sha256": "7d2fdecd1cff9d025880e069d111c9e8aa0c488dd1e570b62f5147a136543271",
|
||||
"bytes": 78776
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "timestamp=20.00s"
|
||||
},
|
||||
{
|
||||
"type": "image_artifact",
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/fine/frame-020.00.png",
|
||||
"sha256": "713c2f7a5db41b01640dbae71ef4d5057c382dd1480d9e31bcc3f6d05c9da52b",
|
||||
"bytes": 183618
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "timestamp=21.00s"
|
||||
},
|
||||
{
|
||||
"type": "image_artifact",
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/fine/frame-021.00.png",
|
||||
"sha256": "c9758159919eb5f8612e3af01258d1c7792d446ca5c08add2ff3dcd3b97e7617",
|
||||
"bytes": 96371
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "timestamp=22.00s"
|
||||
},
|
||||
{
|
||||
"type": "image_artifact",
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/fine/frame-022.00.png",
|
||||
"sha256": "54b41278b256654341515bee8f7adb3166bdb15c90f3da9f7f47eb72cad77d33",
|
||||
"bytes": 192864
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "timestamp=23.00s"
|
||||
},
|
||||
{
|
||||
"type": "image_artifact",
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/fine/frame-023.00.png",
|
||||
"sha256": "3e49ae19ac287a5acdcff0db46d93d3ca77f98d039d9c53f07210466a323b5b3",
|
||||
"bytes": 22428
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "timestamp=24.00s"
|
||||
},
|
||||
{
|
||||
"type": "image_artifact",
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/fine/frame-024.00.png",
|
||||
"sha256": "6eb1ae362db441052be6685922270fcd86572c8b223e99a41a519424ac113c0d",
|
||||
"bytes": 24410
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "timestamp=25.00s"
|
||||
},
|
||||
{
|
||||
"type": "image_artifact",
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/fine/frame-025.00.png",
|
||||
"sha256": "354595be0073fcaed614da1ff41177f01e54f74b63f5614ed5033a9c00e0a773",
|
||||
"bytes": 211411
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"temperature": 0,
|
||||
"max_tokens": 700,
|
||||
"response_format": {
|
||||
"type": "json_object"
|
||||
}
|
||||
},
|
||||
"response": {
|
||||
"id": "021785361202231840fd37cfe82fdd108ca4a9d2a652575b39e13",
|
||||
"model": "doubao-seed-1-6-250615",
|
||||
"finish_reason": "stop",
|
||||
"content": "{\"start\":9.0,\"end\":12.0,\"reason\":\"The shot begins immediately after the 'ONE BIG RABBIT' title card (which ends at 9.0s) and ends just before the 'THREE RODENTS' title card (which starts at 12.0s). The 10.0s and 11.0s timestamps show the large white rabbit alone in the sunny green meadow, confirming a continuous shot between these boundaries.\"}"
|
||||
},
|
||||
"usage": {
|
||||
"prompt_tokens": 6555,
|
||||
"completion_tokens": 1585,
|
||||
"total_tokens": 8140
|
||||
},
|
||||
"latency_s": 29.433
|
||||
},
|
||||
{
|
||||
"purpose": "blender_script_negative-control_attempt_1",
|
||||
"provider": "ark",
|
||||
"endpoint": "https://ark.cn-beijing.volces.com/api/v3",
|
||||
"request": {
|
||||
"model": "doubao-seed-1-6-250615",
|
||||
"messages": [
|
||||
{
|
||||
"role": "system",
|
||||
"content": "You are a Blender VSE engineer. Return one JSON object only."
|
||||
},
|
||||
{
|
||||
"role": "user",
|
||||
"content": "Generate a complete Blender 4.3 Python script for this video edit.\n\nInput movie: /Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/source.mov\nOutput MP4: /Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/negative_control.mp4\nSource FPS: 25\nSource size: 853x480; render at 854x480 (one-pixel even-width pad required by H.264)\nTrim interval: [0.000, 3.000] seconds\nEffects: slow playback so output duration is 1.5 times the trimmed interval; add bottom-centered subtitle BIG BUNNY with a visible semi-transparent dark box.\n\nRequirements:\n- Use bpy and Blender's Video Sequence Editor, including new_movie, new_sound when available, frame_offset_start/frame_final_duration, a SPEED effect, and a TEXT effect.\n- Render exactly 854x480 at 25 fps through Blender to MPEG-4 H.264 with AAC audio.\n- Set the scene frame range to the slowed duration and call bpy.ops.render.render(animation=True).\n- Create only the requested output. Do not invoke ffmpeg, subprocesses, a shell, the network, or read credentials.\n- Use APIs available in Blender 4.3 (scene.sequence_editor_create().sequences).\n- In Blender 4.3, SpeedControlSequence has no use_audio property. Never read or assign use_audio, and do not apply a SPEED effect to the sound strip. A valid movie slow-motion pattern is speed_control='MULTIPLY', speed_factor=1/1.5, and extending the movie/render duration; the sound strip may remain normally trimmed.\n- For the subtitle background, prefer the TEXT strip's use_box=True and box_color=(0,0,0,0.6); do not assume a COLOR strip has text-layout properties.\n\nUse this real-Blender-4.3-validated timing pattern, substituting the supplied paths and interval but preserving the timing relationships exactly:\n```\nFPS = 25\nstart_frame = int(round(START_SECONDS * FPS))\ndur_frames = max(1, int(round((END_SECONDS - START_SECONDS) * FPS)))\nrender_dur = int(round(dur_frames * 1.5))\nse = scene.sequence_editor_create()\nmovie = se.sequences.new_movie(name='clip', filepath=INPUT_PATH, channel=1,\n frame_start=1 - start_frame)\nsound = se.sequences.new_sound(name='audio', filepath=INPUT_PATH, channel=2,\n frame_start=1 - start_frame)\nfor strip in (movie, sound):\n strip.frame_offset_start = start_frame\n strip.frame_final_duration = dur_frames\nspeed = se.sequences.new_effect(name='slowmo', type='SPEED', channel=3,\n frame_start=1, frame_end=1 + dur_frames, seq1=movie)\nspeed.use_default_fade = False\nspeed.speed_control = 'MULTIPLY'\nspeed.speed_factor = 1.0 / 1.5\nmovie.frame_final_duration = render_dur\ntext = se.sequences.new_effect(name='subtitle', type='TEXT', channel=4,\n frame_start=1, frame_end=1 + render_dur)\ntext.text = 'BIG BUNNY'; text.location = (0.5, 0.12)\ntext.align_x = 'CENTER'; text.align_y = 'BOTTOM'\ntext.use_box = True; text.box_color = (0.0, 0.0, 0.0, 0.6)\nscene.frame_start = 1; scene.frame_end = render_dur\n```\nThis pattern was executed against Blender 4.3.2 and visibly retained the requested source frames through the whole slowed output. Do not replace its negative source-strip frame_start with frame_start=1: frame_offset_start would then move the visible strip later and render black frames.\n\nReturn one JSON object only: {\"code\":\"complete executable Python source\"}.\n"
|
||||
}
|
||||
],
|
||||
"temperature": 0,
|
||||
"max_tokens": 7000,
|
||||
"response_format": {
|
||||
"type": "json_object"
|
||||
}
|
||||
},
|
||||
"response": {
|
||||
"id": "021785361231647840fd37cfe82fdd108ca4a9d2a6525756884c8",
|
||||
"model": "doubao-seed-1-6-250615",
|
||||
"finish_reason": "stop",
|
||||
"content": "{\"code\": \"import bpy\\n\\n# Configuration\\nINPUT_PATH = '/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/source.mov'\\nOUTPUT_PATH = '/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/negative_control.mp4'\\nSTART_SECONDS = 0.000\\nEND_SECONDS = 3.000\\nFPS = 25\\n\\n# Calculate timing parameters\\nstart_frame = int(round(START_SECONDS * FPS))\\ndur_frames = max(1, int(round((END_SECONDS - START_SECONDS) * FPS)))\\nrender_dur = int(round(dur_frames * 1.5))\\n\\n# Initialize scene\\nscene = bpy.context.scene\\nscene.sequence_editor_clear()\\n\\n# Render settings\\nscene.render.resolution_x = 854\\nscene.render.resolution_y = 480\\nscene.render.resolution_percentage = 100\\nscene.render.fps = FPS\\nscene.render.fps_base = 1.0\\nscene.render.filepath = OUTPUT_PATH\\nscene.render.image_settings.file_format = 'MPEG4'\\nscene.render.ffmpeg.format = 'MPEG4'\\nscene.render.ffmpeg.codec = 'H264'\\nscene.render.ffmpeg.audio_codec = 'AAC'\\n\\n# Video Sequence Editor setup\\nse = scene.sequence_editor_create()\\n\\n# Add movie and audio strips\\nmovie = se.sequences.new_movie(\\n name='clip',\\n filepath=INPUT_PATH,\\n channel=1,\\n frame_start=1 - start_frame\\n)\\nsound = se.sequences.new_sound(\\n name='audio',\\n filepath=INPUT_PATH,\\n channel=2,\\n frame_start=1 - start_frame\\n)\\n\\n# Set trim for both media strips\\nfor strip in (movie, sound):\\n strip.frame_offset_start = start_frame\\n strip.frame_final_duration = dur_frames\\n\\n# Add speed effect for slow motion\\nspeed = se.sequences.new_effect(\\n name='slowmo',\\n type='SPEED',\\n channel=3,\\n frame_start=1,\\n frame_end=1 + dur_frames,\\n seq1=movie\\n)\\nspeed.speed_control = 'MULTIPLY'\\nspeed.speed_factor = 1 / 1.5\\nspeed.use_default_fade = False\\n\\n# Extend movie strip to match render duration\\nmovie.frame_final_duration = render_dur\\n\\n# Add subtitle text strip\\ntext = se.sequences.new_effect(\\n name='subtitle',\\n type='TEXT',\\n channel=4,\\n frame_start=1,\\n frame_end=1 + render_dur\\n)\\ntext.text = 'BIG BUNNY'\\ntext.location = (0.5, 0.12)\\ntext.align_x = 'CENTER'\\ntext.align_y = 'BOTTOM'\\ntext.use_box = True\\ntext.box_color = (0, 0, 0, 0.6)\\n\\n# Set render frame range\\nscene.frame_start = 1\\nscene.frame_end = render_dur\\n\\n# Render animation\\nbpy.ops.render.render(animation=True)\"}"
|
||||
},
|
||||
"usage": {
|
||||
"prompt_tokens": 1083,
|
||||
"completion_tokens": 4029,
|
||||
"total_tokens": 5112
|
||||
},
|
||||
"latency_s": 88.991
|
||||
},
|
||||
{
|
||||
"purpose": "blender_script_negative-control_attempt_2",
|
||||
"provider": "ark",
|
||||
"endpoint": "https://ark.cn-beijing.volces.com/api/v3",
|
||||
"request": {
|
||||
"model": "doubao-seed-1-6-250615",
|
||||
"messages": [
|
||||
{
|
||||
"role": "system",
|
||||
"content": "You are a Blender VSE engineer. Return one JSON object only."
|
||||
},
|
||||
{
|
||||
"role": "user",
|
||||
"content": "Generate a complete Blender 4.3 Python script for this video edit.\n\nInput movie: /Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/source.mov\nOutput MP4: /Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/negative_control.mp4\nSource FPS: 25\nSource size: 853x480; render at 854x480 (one-pixel even-width pad required by H.264)\nTrim interval: [0.000, 3.000] seconds\nEffects: slow playback so output duration is 1.5 times the trimmed interval; add bottom-centered subtitle BIG BUNNY with a visible semi-transparent dark box.\n\nRequirements:\n- Use bpy and Blender's Video Sequence Editor, including new_movie, new_sound when available, frame_offset_start/frame_final_duration, a SPEED effect, and a TEXT effect.\n- Render exactly 854x480 at 25 fps through Blender to MPEG-4 H.264 with AAC audio.\n- Set the scene frame range to the slowed duration and call bpy.ops.render.render(animation=True).\n- Create only the requested output. Do not invoke ffmpeg, subprocesses, a shell, the network, or read credentials.\n- Use APIs available in Blender 4.3 (scene.sequence_editor_create().sequences).\n- In Blender 4.3, SpeedControlSequence has no use_audio property. Never read or assign use_audio, and do not apply a SPEED effect to the sound strip. A valid movie slow-motion pattern is speed_control='MULTIPLY', speed_factor=1/1.5, and extending the movie/render duration; the sound strip may remain normally trimmed.\n- For the subtitle background, prefer the TEXT strip's use_box=True and box_color=(0,0,0,0.6); do not assume a COLOR strip has text-layout properties.\n\nUse this real-Blender-4.3-validated timing pattern, substituting the supplied paths and interval but preserving the timing relationships exactly:\n```\nFPS = 25\nstart_frame = int(round(START_SECONDS * FPS))\ndur_frames = max(1, int(round((END_SECONDS - START_SECONDS) * FPS)))\nrender_dur = int(round(dur_frames * 1.5))\nse = scene.sequence_editor_create()\nmovie = se.sequences.new_movie(name='clip', filepath=INPUT_PATH, channel=1,\n frame_start=1 - start_frame)\nsound = se.sequences.new_sound(name='audio', filepath=INPUT_PATH, channel=2,\n frame_start=1 - start_frame)\nfor strip in (movie, sound):\n strip.frame_offset_start = start_frame\n strip.frame_final_duration = dur_frames\nspeed = se.sequences.new_effect(name='slowmo', type='SPEED', channel=3,\n frame_start=1, frame_end=1 + dur_frames, seq1=movie)\nspeed.use_default_fade = False\nspeed.speed_control = 'MULTIPLY'\nspeed.speed_factor = 1.0 / 1.5\nmovie.frame_final_duration = render_dur\ntext = se.sequences.new_effect(name='subtitle', type='TEXT', channel=4,\n frame_start=1, frame_end=1 + render_dur)\ntext.text = 'BIG BUNNY'; text.location = (0.5, 0.12)\ntext.align_x = 'CENTER'; text.align_y = 'BOTTOM'\ntext.use_box = True; text.box_color = (0.0, 0.0, 0.0, 0.6)\nscene.frame_start = 1; scene.frame_end = render_dur\n```\nThis pattern was executed against Blender 4.3.2 and visibly retained the requested source frames through the whole slowed output. Do not replace its negative source-strip frame_start with frame_start=1: frame_offset_start would then move the visible strip later and render black frames.\n\nReturn one JSON object only: {\"code\":\"complete executable Python source\"}.\n\nPrior executable feedback:\nBlender exit=0; output_exists=False. Tail of real Blender log:\nBlender 4.3.2 (hash 32f5fdce0a0a built 2024-12-17 02:14:25)\nTraceback (most recent call last):\n File \"/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/scripts/negative-control-attempt-1.py\", line 26, in <module>\n scene.render.image_settings.file_format = 'MPEG4'\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nTypeError: bpy_struct: item.attr = val: enum \"MPEG4\" not found in ('BMP', 'IRIS', 'PNG', 'JPEG', 'JPEG2000', 'TARGA', 'TARGA_RAW', 'CINEON', 'DPX', 'OPEN_EXR_MULTILAYER', 'OPEN_EXR', 'HDR', 'TIFF', 'WEBP', 'FFMPEG')\n\nBlender quit"
|
||||
}
|
||||
],
|
||||
"temperature": 0,
|
||||
"max_tokens": 7000,
|
||||
"response_format": {
|
||||
"type": "json_object"
|
||||
}
|
||||
},
|
||||
"response": {
|
||||
"id": "021785361321239840fd37cfe82fdd108ca4a9d2a6525759c9b50",
|
||||
"model": "doubao-seed-1-6-250615",
|
||||
"finish_reason": "stop",
|
||||
"content": "{\"code\": \"import bpy\\n\\n# Clear existing data\\nbpy.ops.wm.read_factory_settings(use_empty=True)\\nscene = bpy.context.scene\\n\\n# Configuration\\nINPUT_PATH = '/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/source.mov'\\nOUTPUT_PATH = '/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/negative_control.mp4'\\nFPS = 25\\nSTART_SECONDS = 0.000\\nEND_SECONDS = 3.000\\n\\n# Calculate timing variables\\nstart_frame = int(round(START_SECONDS * FPS))\\ndur_frames = max(1, int(round((END_SECONDS - START_SECONDS) * FPS)))\\nrender_dur = int(round(dur_frames * 1.5))\\n\\n# Scene settings\\nscene.frame_start = 1\\nscene.frame_end = render_dur\\nscene.render.fps = FPS\\nscene.render.fps_base = 1.0\\n\\n# Render resolution (854x480 for H.264 compatibility)\\nscene.render.resolution_x = 854\\nscene.render.resolution_y = 480\\nscene.render.resolution_percentage = 100\\n\\n# Output settings\\nscene.render.image_settings.file_format = 'FFMPEG'\\nscene.render.ffmpeg.format = 'MPEG4'\\nscene.render.ffmpeg.codec = 'H264'\\nscene.render.ffmpeg.constant_rate_factor = 'MEDIUM'\\nscene.render.ffmpeg.audio_codec = 'AAC'\\nscene.render.ffmpeg.audio_bitrate = 192\\nscene.render.ffmpeg.audio_channels = 'STEREO'\\nscene.render.ffmpeg.audio_sample_rate = 44100\\nscene.render.filepath = OUTPUT_PATH\\n\\n# Create sequence editor\\nse = scene.sequence_editor_create()\\n\\n# Add video clip\\nmovie = se.sequences.new_movie(\\n name='clip',\\n filepath=INPUT_PATH,\\n channel=1,\\n frame_start=1 - start_frame\\n)\\n\\n# Add audio track\\nsound = se.sequences.new_sound(\\n name='audio',\\n filepath=INPUT_PATH,\\n channel=2,\\n frame_start=1 - start_frame\\n)\\n\\n# Set initial trim for video and audio\\nfor strip in (movie, sound):\\n strip.frame_offset_start = start_frame\\n strip.frame_final_duration = dur_frames\\n\\n# Add slow-motion effect to video\\nspeed = se.sequences.new_effect(\\n name='slowmo',\\n type='SPEED',\\n channel=3,\\n frame_start=1,\\n frame_end=1 + dur_frames,\\n seq1=movie\\n)\\nspeed.speed_control = 'MULTIPLY'\\nspeed.speed_factor = 1 / 1.5\\nspeed.use_default_fade = False\\n\\n# Extend video duration for slow-motion\\nmovie.frame_final_duration = render_dur\\n\\n# Add subtitle with background box\\ntext = se.sequences.new_effect(\\n name='subtitle',\\n type='TEXT',\\n channel=4,\\n frame_start=1,\\n frame_end=1 + render_dur\\n)\\ntext.text = 'BIG BUNNY'\\ntext.location = (0.5, 0.12)\\ntext.align_x = 'CENTER'\\ntext.align_y = 'BOTTOM'\\ntext.font_size = 48\\ntext.use_box = True\\ntext.box_color = (0.0, 0.0, 0.0, 0.6)\\n\\n# Render animation\\nbpy.ops.render.render(animation=True)\"}"
|
||||
},
|
||||
"usage": {
|
||||
"prompt_tokens": 1349,
|
||||
"completion_tokens": 5153,
|
||||
"total_tokens": 6502
|
||||
},
|
||||
"latency_s": 108.775
|
||||
},
|
||||
{
|
||||
"purpose": "blender_script_negative-control_attempt_3",
|
||||
"provider": "ark",
|
||||
"endpoint": "https://ark.cn-beijing.volces.com/api/v3",
|
||||
"request": {
|
||||
"model": "doubao-seed-1-6-250615",
|
||||
"messages": [
|
||||
{
|
||||
"role": "system",
|
||||
"content": "You are a Blender VSE engineer. Return one JSON object only."
|
||||
},
|
||||
{
|
||||
"role": "user",
|
||||
"content": "Generate a complete Blender 4.3 Python script for this video edit.\n\nInput movie: /Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/source.mov\nOutput MP4: /Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/negative_control.mp4\nSource FPS: 25\nSource size: 853x480; render at 854x480 (one-pixel even-width pad required by H.264)\nTrim interval: [0.000, 3.000] seconds\nEffects: slow playback so output duration is 1.5 times the trimmed interval; add bottom-centered subtitle BIG BUNNY with a visible semi-transparent dark box.\n\nRequirements:\n- Use bpy and Blender's Video Sequence Editor, including new_movie, new_sound when available, frame_offset_start/frame_final_duration, a SPEED effect, and a TEXT effect.\n- Render exactly 854x480 at 25 fps through Blender to MPEG-4 H.264 with AAC audio.\n- Set the scene frame range to the slowed duration and call bpy.ops.render.render(animation=True).\n- Create only the requested output. Do not invoke ffmpeg, subprocesses, a shell, the network, or read credentials.\n- Use APIs available in Blender 4.3 (scene.sequence_editor_create().sequences).\n- In Blender 4.3, SpeedControlSequence has no use_audio property. Never read or assign use_audio, and do not apply a SPEED effect to the sound strip. A valid movie slow-motion pattern is speed_control='MULTIPLY', speed_factor=1/1.5, and extending the movie/render duration; the sound strip may remain normally trimmed.\n- For the subtitle background, prefer the TEXT strip's use_box=True and box_color=(0,0,0,0.6); do not assume a COLOR strip has text-layout properties.\n\nUse this real-Blender-4.3-validated timing pattern, substituting the supplied paths and interval but preserving the timing relationships exactly:\n```\nFPS = 25\nstart_frame = int(round(START_SECONDS * FPS))\ndur_frames = max(1, int(round((END_SECONDS - START_SECONDS) * FPS)))\nrender_dur = int(round(dur_frames * 1.5))\nse = scene.sequence_editor_create()\nmovie = se.sequences.new_movie(name='clip', filepath=INPUT_PATH, channel=1,\n frame_start=1 - start_frame)\nsound = se.sequences.new_sound(name='audio', filepath=INPUT_PATH, channel=2,\n frame_start=1 - start_frame)\nfor strip in (movie, sound):\n strip.frame_offset_start = start_frame\n strip.frame_final_duration = dur_frames\nspeed = se.sequences.new_effect(name='slowmo', type='SPEED', channel=3,\n frame_start=1, frame_end=1 + dur_frames, seq1=movie)\nspeed.use_default_fade = False\nspeed.speed_control = 'MULTIPLY'\nspeed.speed_factor = 1.0 / 1.5\nmovie.frame_final_duration = render_dur\ntext = se.sequences.new_effect(name='subtitle', type='TEXT', channel=4,\n frame_start=1, frame_end=1 + render_dur)\ntext.text = 'BIG BUNNY'; text.location = (0.5, 0.12)\ntext.align_x = 'CENTER'; text.align_y = 'BOTTOM'\ntext.use_box = True; text.box_color = (0.0, 0.0, 0.0, 0.6)\nscene.frame_start = 1; scene.frame_end = render_dur\n```\nThis pattern was executed against Blender 4.3.2 and visibly retained the requested source frames through the whole slowed output. Do not replace its negative source-strip frame_start with frame_start=1: frame_offset_start would then move the visible strip later and render black frames.\n\nReturn one JSON object only: {\"code\":\"complete executable Python source\"}.\n\nPrior executable feedback:\nBlender exit=0; output_exists=False. Tail of real Blender log:\nBlender 4.3.2 (hash 32f5fdce0a0a built 2024-12-17 02:14:25)\nTraceback (most recent call last):\n File \"/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/scripts/negative-control-attempt-2.py\", line 38, in <module>\n scene.render.ffmpeg.audio_sample_rate = 44100\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nAttributeError: 'FFmpegSettings' object has no attribute 'audio_sample_rate'\n\nBlender quit"
|
||||
}
|
||||
],
|
||||
"temperature": 0,
|
||||
"max_tokens": 7000,
|
||||
"response_format": {
|
||||
"type": "json_object"
|
||||
}
|
||||
},
|
||||
"response": {
|
||||
"id": "021785361430689840fd37cfe82fdd108ca4a9d2a652575b048f8",
|
||||
"model": "doubao-seed-1-6-250615",
|
||||
"finish_reason": "stop",
|
||||
"content": "{\"code\": \"import bpy\\n\\n# Configuration\\nINPUT_PATH = '/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/source.mov'\\nOUTPUT_PATH = '/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/negative_control.mp4'\\nFPS = 25\\nSTART_SECONDS = 0.000\\nEND_SECONDS = 3.000\\n\\n# Calculate timing variables\\nstart_frame = int(round(START_SECONDS * FPS))\\ndur_frames = max(1, int(round((END_SECONDS - START_SECONDS) * FPS)))\\nrender_dur = int(round(dur_frames * 1.5))\\n\\n# Scene setup\\nscene = bpy.context.scene\\nscene.sequence_editor_clear() # Ensure clean state\\nse = scene.sequence_editor_create()\\n\\n# Add movie and audio strips\\nmovie = se.sequences.new_movie(\\n name='clip',\\n filepath=INPUT_PATH,\\n channel=1,\\n frame_start=1 - start_frame\\n)\\nsound = se.sequences.new_sound(\\n name='audio',\\n filepath=INPUT_PATH,\\n channel=2,\\n frame_start=1 - start_frame\\n)\\n\\n# Set trim for both strips\\nfor strip in (movie, sound):\\n strip.frame_offset_start = start_frame\\n strip.frame_final_duration = dur_frames\\n\\n# Add speed effect for slow motion\\nspeed = se.sequences.new_effect(\\n name='slowmo',\\n type='SPEED',\\n channel=3,\\n frame_start=1,\\n frame_end=1 + dur_frames,\\n seq1=movie\\n)\\nspeed.use_default_fade = False\\nspeed.speed_control = 'MULTIPLY'\\nspeed.speed_factor = 1.0 / 1.5\\nmovie.frame_final_duration = render_dur # Extend video to render duration\\n\\n# Add subtitle text strip\\ntext = se.sequences.new_effect(\\n name='subtitle',\\n type='TEXT',\\n channel=4,\\n frame_start=1,\\n frame_end=1 + render_dur\\n)\\ntext.text = 'BIG BUNNY'\\ntext.location = (0.5, 0.12) # Center horizontally, near bottom vertically\\ntext.align_x = 'CENTER'\\ntext.align_y = 'BOTTOM'\\ntext.use_box = True\\ntext.box_color = (0.0, 0.0, 0.0, 0.6) # Black semi-transparent background\\n\\n# Render settings\\nscene.frame_start = 1\\nscene.frame_end = render_dur\\nscene.render.fps = FPS\\nscene.render.fps_base = 1.0\\nscene.render.resolution_x = 854\\nscene.render.resolution_y = 480\\nscene.render.resolution_percentage = 100\\nscene.render.image_settings.file_format = 'FFMPEG'\\nscene.render.ffmpeg.format = 'MPEG4'\\nscene.render.ffmpeg.codec = 'H264'\\nscene.render.ffmpeg.audio_codec = 'AAC'\\nscene.render.filepath = OUTPUT_PATH\\n\\n# Execute render\\nbpy.ops.render.render(animation=True)\"}"
|
||||
},
|
||||
"usage": {
|
||||
"prompt_tokens": 1272,
|
||||
"completion_tokens": 3756,
|
||||
"total_tokens": 5028
|
||||
},
|
||||
"latency_s": 78.291
|
||||
},
|
||||
{
|
||||
"purpose": "review_negative_control_rendered_pixels",
|
||||
"provider": "ark",
|
||||
"endpoint": "https://ark.cn-beijing.volces.com/api/v3",
|
||||
"request": {
|
||||
"model": "doubao-seed-1-6-250615",
|
||||
"messages": [
|
||||
{
|
||||
"role": "user",
|
||||
"content": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": "Independently review these actual rendered keyframes against this edit request:\nCut out the shot of the large white rabbit walking alone in the sunny meadow, slow it to 1.5x duration, and add the subtitle BIG BUNNY along the bottom.\n\nThe target source shot is: the single continuous shot showing the large white rabbit walking alone in a sunny green meadow, after the ONE BIG RABBIT title and before the THREE RODENTS title.\nJudge the pixels, not filenames or claims. Return JSON exactly with:\n{\"pass\":boolean,\"target_present\":boolean,\"irrelevant_content_present\":boolean,\n \"subtitle_visible\":boolean,\"feedback\":\"specific evidence from the frames\"}.\nPass only if all frames show the intended large white rabbit meadow shot without title cards or unrelated scenes and the BIG BUNNY subtitle is visibly overlaid near the bottom.\n"
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "timestamp=0.35s"
|
||||
},
|
||||
{
|
||||
"type": "image_artifact",
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/negative-review/frame-000.35.png",
|
||||
"sha256": "113732852a3ed623001cbef9e71c10af0b5f60753be8b1f41a14a578d97cee8e",
|
||||
"bytes": 21114
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "timestamp=2.25s"
|
||||
},
|
||||
{
|
||||
"type": "image_artifact",
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/negative-review/frame-002.25.png",
|
||||
"sha256": "c8965c10e2311c9752fbfccf9b268dff49100ab8e51cda96462ab831e0e6cbce",
|
||||
"bytes": 44712
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "timestamp=4.15s"
|
||||
},
|
||||
{
|
||||
"type": "image_artifact",
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/negative-review/frame-004.15.png",
|
||||
"sha256": "9cce535f13d961323b049feee88d0fc73e689502f4679d935d141588139470c8",
|
||||
"bytes": 45469
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"temperature": 0,
|
||||
"max_tokens": 700,
|
||||
"response_format": {
|
||||
"type": "json_object"
|
||||
}
|
||||
},
|
||||
"response": {
|
||||
"id": "021785361511277840fd37cfe82fdd108ca4a9d2a652575aeef6b",
|
||||
"model": "doubao-seed-1-6-250615",
|
||||
"finish_reason": "stop",
|
||||
"content": "{\"pass\":false,\"target_present\":false,\"irrelevant_content_present\":true,\"subtitle_visible\":true,\"feedback\":\"All frames show title cards with 'THE PEACH OPEN MOVIE PROJECT PRESENTS' and 'BIG BUNNY' on a gray background; no large white rabbit, sunny meadow, or the target rabbit walking shot is visible.\"}"
|
||||
},
|
||||
"usage": {
|
||||
"prompt_tokens": 1177,
|
||||
"completion_tokens": 450,
|
||||
"total_tokens": 1627
|
||||
},
|
||||
"latency_s": 10.84
|
||||
},
|
||||
{
|
||||
"purpose": "blender_script_corrected-final_attempt_1",
|
||||
"provider": "ark",
|
||||
"endpoint": "https://ark.cn-beijing.volces.com/api/v3",
|
||||
"request": {
|
||||
"model": "doubao-seed-1-6-250615",
|
||||
"messages": [
|
||||
{
|
||||
"role": "system",
|
||||
"content": "You are a Blender VSE engineer. Return one JSON object only."
|
||||
},
|
||||
{
|
||||
"role": "user",
|
||||
"content": "Generate a complete Blender 4.3 Python script for this video edit.\n\nInput movie: /Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/source.mov\nOutput MP4: /Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/final.mp4\nSource FPS: 25\nSource size: 853x480; render at 854x480 (one-pixel even-width pad required by H.264)\nTrim interval: [9.000, 12.000] seconds\nEffects: slow playback so output duration is 1.5 times the trimmed interval; add bottom-centered subtitle BIG BUNNY with a visible semi-transparent dark box.\n\nRequirements:\n- Use bpy and Blender's Video Sequence Editor, including new_movie, new_sound when available, frame_offset_start/frame_final_duration, a SPEED effect, and a TEXT effect.\n- Render exactly 854x480 at 25 fps through Blender to MPEG-4 H.264 with AAC audio.\n- Set the scene frame range to the slowed duration and call bpy.ops.render.render(animation=True).\n- Create only the requested output. Do not invoke ffmpeg, subprocesses, a shell, the network, or read credentials.\n- Use APIs available in Blender 4.3 (scene.sequence_editor_create().sequences).\n- In Blender 4.3, SpeedControlSequence has no use_audio property. Never read or assign use_audio, and do not apply a SPEED effect to the sound strip. A valid movie slow-motion pattern is speed_control='MULTIPLY', speed_factor=1/1.5, and extending the movie/render duration; the sound strip may remain normally trimmed.\n- For the subtitle background, prefer the TEXT strip's use_box=True and box_color=(0,0,0,0.6); do not assume a COLOR strip has text-layout properties.\n\nUse this real-Blender-4.3-validated timing pattern, substituting the supplied paths and interval but preserving the timing relationships exactly:\n```\nFPS = 25\nstart_frame = int(round(START_SECONDS * FPS))\ndur_frames = max(1, int(round((END_SECONDS - START_SECONDS) * FPS)))\nrender_dur = int(round(dur_frames * 1.5))\nse = scene.sequence_editor_create()\nmovie = se.sequences.new_movie(name='clip', filepath=INPUT_PATH, channel=1,\n frame_start=1 - start_frame)\nsound = se.sequences.new_sound(name='audio', filepath=INPUT_PATH, channel=2,\n frame_start=1 - start_frame)\nfor strip in (movie, sound):\n strip.frame_offset_start = start_frame\n strip.frame_final_duration = dur_frames\nspeed = se.sequences.new_effect(name='slowmo', type='SPEED', channel=3,\n frame_start=1, frame_end=1 + dur_frames, seq1=movie)\nspeed.use_default_fade = False\nspeed.speed_control = 'MULTIPLY'\nspeed.speed_factor = 1.0 / 1.5\nmovie.frame_final_duration = render_dur\ntext = se.sequences.new_effect(name='subtitle', type='TEXT', channel=4,\n frame_start=1, frame_end=1 + render_dur)\ntext.text = 'BIG BUNNY'; text.location = (0.5, 0.12)\ntext.align_x = 'CENTER'; text.align_y = 'BOTTOM'\ntext.use_box = True; text.box_color = (0.0, 0.0, 0.0, 0.6)\nscene.frame_start = 1; scene.frame_end = render_dur\n```\nThis pattern was executed against Blender 4.3.2 and visibly retained the requested source frames through the whole slowed output. Do not replace its negative source-strip frame_start with frame_start=1: frame_offset_start would then move the visible strip later and render black frames.\n\nReturn one JSON object only: {\"code\":\"complete executable Python source\"}.\n"
|
||||
}
|
||||
],
|
||||
"temperature": 0,
|
||||
"max_tokens": 7000,
|
||||
"response_format": {
|
||||
"type": "json_object"
|
||||
}
|
||||
},
|
||||
"response": {
|
||||
"id": "021785361522116840fd37cfe82fdd108ca4a9d2a6525751d0232",
|
||||
"model": "doubao-seed-1-6-250615",
|
||||
"finish_reason": "stop",
|
||||
"content": "{\"code\": \"import bpy\\n\\n# Configuration\\nINPUT_PATH = \\\"/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/source.mov\\\"\\nOUTPUT_PATH = \\\"/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/final.mp4\\\"\\nFPS = 25\\nSTART_SECONDS = 9.000\\nEND_SECONDS = 12.000\\n\\n# Timing calculations\\nstart_frame = int(round(START_SECONDS * FPS))\\ndur_frames = max(1, int(round((END_SECONDS - START_SECONDS) * FPS)))\\nrender_dur = int(round(dur_frames * 1.5))\\n\\n# Scene setup\\nscene = bpy.context.scene\\n\\n# Render settings\\nscene.render.resolution_x = 854\\nscene.render.resolution_y = 480\\nscene.render.resolution_percentage = 100\\nscene.render.fps = FPS\\nscene.render.fps_base = 1.0\\nscene.render.image_settings.file_format = 'FFMPEG'\\nscene.render.ffmpeg.format = 'MPEG4'\\nscene.render.ffmpeg.codec = 'H264'\\nscene.render.ffmpeg.audio_codec = 'AAC'\\nscene.render.filepath = OUTPUT_PATH\\n\\n# Sequence Editor setup\\nse = scene.sequence_editor_create()\\n\\n# Video track\\nmovie = se.sequences.new_movie(\\n name='clip',\\n filepath=INPUT_PATH,\\n channel=1,\\n frame_start=1 - start_frame\\n)\\n\\n# Audio track\\nsound = se.sequences.new_sound(\\n name='audio',\\n filepath=INPUT_PATH,\\n channel=2,\\n frame_start=1 - start_frame\\n)\\n\\n# Trim media to interval\\nfor strip in (movie, sound):\\n strip.frame_offset_start = start_frame\\n strip.frame_final_duration = dur_frames\\n\\n# Slow motion effect\\nspeed = se.sequences.new_effect(\\n name='slowmo',\\n type='SPEED',\\n channel=3,\\n frame_start=1,\\n frame_end=1 + dur_frames,\\n seq1=movie\\n)\\nspeed.speed_control = 'MULTIPLY'\\nspeed.speed_factor = 1 / 1.5\\nspeed.use_default_fade = False\\nmovie.frame_final_duration = render_dur\\n\\n# Subtitle with background\\ntext = se.sequences.new_effect(\\n name='subtitle',\\n type='TEXT',\\n channel=4,\\n frame_start=1,\\n frame_end=1 + render_dur\\n)\\ntext.text = 'BIG BUNNY'\\ntext.location = (0.5, 0.12)\\ntext.align_x = 'CENTER'\\ntext.align_y = 'BOTTOM'\\ntext.use_box = True\\ntext.box_color = (0, 0, 0, 0.6)\\n\\n# Render range\\nscene.frame_start = 1\\nscene.frame_end = render_dur\\n\\n# Execute render\\nbpy.ops.render.render(animation=True)\"}"
|
||||
},
|
||||
"usage": {
|
||||
"prompt_tokens": 1083,
|
||||
"completion_tokens": 3693,
|
||||
"total_tokens": 4776
|
||||
},
|
||||
"latency_s": 72.017
|
||||
},
|
||||
{
|
||||
"purpose": "review_corrected_final_rendered_pixels",
|
||||
"provider": "ark",
|
||||
"endpoint": "https://ark.cn-beijing.volces.com/api/v3",
|
||||
"request": {
|
||||
"model": "doubao-seed-1-6-250615",
|
||||
"messages": [
|
||||
{
|
||||
"role": "user",
|
||||
"content": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": "Independently review these actual rendered keyframes against this edit request:\nCut out the shot of the large white rabbit walking alone in the sunny meadow, slow it to 1.5x duration, and add the subtitle BIG BUNNY along the bottom.\n\nThe target source shot is: the single continuous shot showing the large white rabbit walking alone in a sunny green meadow, after the ONE BIG RABBIT title and before the THREE RODENTS title.\nJudge the pixels, not filenames or claims. Return JSON exactly with:\n{\"pass\":boolean,\"target_present\":boolean,\"irrelevant_content_present\":boolean,\n \"subtitle_visible\":boolean,\"feedback\":\"specific evidence from the frames\"}.\nPass only if all frames show the intended large white rabbit meadow shot without title cards or unrelated scenes and the BIG BUNNY subtitle is visibly overlaid near the bottom.\n"
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "timestamp=0.35s"
|
||||
},
|
||||
{
|
||||
"type": "image_artifact",
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/final-review/frame-000.35.png",
|
||||
"sha256": "ba21afabc4197a93b06d4d78ed6f2dff568601b2b94425856efaf5606e49b9bb",
|
||||
"bytes": 229388
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "timestamp=2.25s"
|
||||
},
|
||||
{
|
||||
"type": "image_artifact",
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/final-review/frame-002.25.png",
|
||||
"sha256": "389dd8b56fbc2d21af80ebb8f55895602050601915d1b19274e04d2e5678be47",
|
||||
"bytes": 245324
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "timestamp=4.15s"
|
||||
},
|
||||
{
|
||||
"type": "image_artifact",
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/final-review/frame-004.15.png",
|
||||
"sha256": "261fbc9ee0b8784f1d4a1f84b34489c5baf3824b6467c82a7673e4b836f97cf0",
|
||||
"bytes": 36595
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"temperature": 0,
|
||||
"max_tokens": 700,
|
||||
"response_format": {
|
||||
"type": "json_object"
|
||||
}
|
||||
},
|
||||
"response": {
|
||||
"id": "021785361596706840fd37cfe82fdd108ca4a9d2a65257512a5a8",
|
||||
"model": "doubao-seed-1-6-250615",
|
||||
"finish_reason": "stop",
|
||||
"content": "{\"pass\":false,\"target_present\":true,\"irrelevant_content_present\":true,\"subtitle_visible\":true,\"feedback\":\"Third frame shows 'THREE RODENTS' title card (irrelevant content); first two frames show target large white rabbit in sunny meadow with 'BIG BUNNY' subtitle at bottom.\"}"
|
||||
},
|
||||
"usage": {
|
||||
"prompt_tokens": 1177,
|
||||
"completion_tokens": 1038,
|
||||
"total_tokens": 2215
|
||||
},
|
||||
"latency_s": 20.792
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,158 @@
|
||||
{
|
||||
"negative_control": {
|
||||
"plan": {
|
||||
"start": 0.0,
|
||||
"end": 3.0,
|
||||
"effects": [
|
||||
"slowmo:1.5",
|
||||
"subtitle:BIG BUNNY"
|
||||
]
|
||||
},
|
||||
"render": {
|
||||
"attempts": [
|
||||
{
|
||||
"attempt": 1,
|
||||
"script": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/scripts/negative-control-attempt-1.py",
|
||||
"script_sha256": "906f8c6755e58ee9b0806fee11ec81d3a9e95d08fc89cc04473ef825b88f0e82",
|
||||
"blender_log": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/blender_logs/negative-control-attempt-1.log",
|
||||
"blender_log_sha256": "0ec721a0ab199e8cf5022338084c08f2e33f5b0532a495cee7be12cbb0e29d19",
|
||||
"blender_exit_code": 0,
|
||||
"blender_latency_s": 0.596,
|
||||
"accepted": false
|
||||
},
|
||||
{
|
||||
"attempt": 2,
|
||||
"script": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/scripts/negative-control-attempt-2.py",
|
||||
"script_sha256": "0acf30c39cb4e33210706970455d70972e4de94cb5804779cde111f8ae27ddf4",
|
||||
"blender_log": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/blender_logs/negative-control-attempt-2.log",
|
||||
"blender_log_sha256": "82896e18f49e90b3913b6523957a7e12258a5ee5a6f45ff140b5362c0ff806f3",
|
||||
"blender_exit_code": 0,
|
||||
"blender_latency_s": 0.669,
|
||||
"accepted": false
|
||||
},
|
||||
{
|
||||
"attempt": 3,
|
||||
"script": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/scripts/negative-control-attempt-3.py",
|
||||
"script_sha256": "b07364046e4ab5714b4393d2fa727ac17648946762b019578ba21c7ef0ac5953",
|
||||
"blender_log": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/blender_logs/negative-control-attempt-3.log",
|
||||
"blender_log_sha256": "7818a54d4ac856e57fbb8bc4e56d1cf0d1c802d0ecc46cdc013db7b26017531d",
|
||||
"blender_exit_code": 0,
|
||||
"blender_latency_s": 1.833,
|
||||
"accepted": true
|
||||
}
|
||||
],
|
||||
"accepted_script": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/scripts/negative-control-attempt-3.py",
|
||||
"output": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/negative_control.mp4"
|
||||
},
|
||||
"review": {
|
||||
"pass": false,
|
||||
"target_present": false,
|
||||
"irrelevant_content_present": true,
|
||||
"subtitle_visible": true,
|
||||
"feedback": "All frames show title cards with 'THE PEACH OPEN MOVIE PROJECT PRESENTS' and 'BIG BUNNY' on a gray background; no large white rabbit, sunny meadow, or the target rabbit walking shot is visible."
|
||||
},
|
||||
"frames": [
|
||||
{
|
||||
"timestamp_s": 0.35,
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/negative-review/frame-000.35.png",
|
||||
"sha256": "113732852a3ed623001cbef9e71c10af0b5f60753be8b1f41a14a578d97cee8e",
|
||||
"bytes": 21114
|
||||
},
|
||||
{
|
||||
"timestamp_s": 2.251,
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/negative-review/frame-002.25.png",
|
||||
"sha256": "c8965c10e2311c9752fbfccf9b268dff49100ab8e51cda96462ab831e0e6cbce",
|
||||
"bytes": 44712
|
||||
},
|
||||
{
|
||||
"timestamp_s": 4.151,
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/negative-review/frame-004.15.png",
|
||||
"sha256": "9cce535f13d961323b049feee88d0fc73e689502f4679d935d141588139470c8",
|
||||
"bytes": 45469
|
||||
}
|
||||
]
|
||||
},
|
||||
"correction_triggered": true,
|
||||
"corrected_final": {
|
||||
"plan": {
|
||||
"start": 9.0,
|
||||
"end": 12.0,
|
||||
"effects": [
|
||||
"slowmo:1.5",
|
||||
"subtitle:BIG BUNNY"
|
||||
]
|
||||
},
|
||||
"render": {
|
||||
"attempts": [
|
||||
{
|
||||
"attempt": 1,
|
||||
"script": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/scripts/corrected-final-attempt-1.py",
|
||||
"script_sha256": "9a6f21980c4159a4ed91c9bfa39d09b84151d134c7ac9aa372ceedb8ae116a68",
|
||||
"blender_log": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/blender_logs/corrected-final-attempt-1.log",
|
||||
"blender_log_sha256": "df99dfe60be973a2626bd05bde0662614b7de2822f97b65952395abc4cde25bd",
|
||||
"blender_exit_code": 0,
|
||||
"blender_latency_s": 1.95,
|
||||
"accepted": true
|
||||
}
|
||||
],
|
||||
"accepted_script": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/scripts/corrected-final-attempt-1.py",
|
||||
"output": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/final.mp4"
|
||||
},
|
||||
"review": {
|
||||
"pass": false,
|
||||
"target_present": true,
|
||||
"irrelevant_content_present": true,
|
||||
"subtitle_visible": true,
|
||||
"feedback": "Third frame shows 'THREE RODENTS' title card (irrelevant content); first two frames show target large white rabbit in sunny meadow with 'BIG BUNNY' subtitle at bottom."
|
||||
},
|
||||
"frames": [
|
||||
{
|
||||
"timestamp_s": 0.35,
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/final-review/frame-000.35.png",
|
||||
"sha256": "ba21afabc4197a93b06d4d78ed6f2dff568601b2b94425856efaf5606e49b9bb",
|
||||
"bytes": 229388
|
||||
},
|
||||
{
|
||||
"timestamp_s": 2.251,
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/final-review/frame-002.25.png",
|
||||
"sha256": "389dd8b56fbc2d21af80ebb8f55895602050601915d1b19274e04d2e5678be47",
|
||||
"bytes": 245324
|
||||
},
|
||||
{
|
||||
"timestamp_s": 4.151,
|
||||
"path": "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/frames/final-review/frame-004.15.png",
|
||||
"sha256": "261fbc9ee0b8784f1d4a1f84b34489c5baf3824b6467c82a7673e4b836f97cf0",
|
||||
"bytes": 36595
|
||||
}
|
||||
],
|
||||
"probe": {
|
||||
"programs": [],
|
||||
"stream_groups": [],
|
||||
"streams": [
|
||||
{
|
||||
"index": 0,
|
||||
"codec_name": "h264",
|
||||
"codec_type": "video",
|
||||
"width": 854,
|
||||
"height": 480,
|
||||
"r_frame_rate": "25/1"
|
||||
},
|
||||
{
|
||||
"index": 1,
|
||||
"codec_name": "aac",
|
||||
"codec_type": "audio",
|
||||
"sample_rate": "48000",
|
||||
"channels": 2,
|
||||
"r_frame_rate": "0/0"
|
||||
}
|
||||
],
|
||||
"format": {
|
||||
"format_name": "mov,mp4,m4a,3gp,3g2,mj2",
|
||||
"duration": "4.501000",
|
||||
"size": "441102"
|
||||
}
|
||||
},
|
||||
"expected_slowed_duration_s": 4.5,
|
||||
"observed_duration_s": 4.501
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,88 @@
|
||||
import bpy
|
||||
|
||||
# Configuration
|
||||
INPUT_PATH = "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/source.mov"
|
||||
OUTPUT_PATH = "/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/final.mp4"
|
||||
FPS = 25
|
||||
START_SECONDS = 9.000
|
||||
END_SECONDS = 12.000
|
||||
|
||||
# Timing calculations
|
||||
start_frame = int(round(START_SECONDS * FPS))
|
||||
dur_frames = max(1, int(round((END_SECONDS - START_SECONDS) * FPS)))
|
||||
render_dur = int(round(dur_frames * 1.5))
|
||||
|
||||
# Scene setup
|
||||
scene = bpy.context.scene
|
||||
|
||||
# Render settings
|
||||
scene.render.resolution_x = 854
|
||||
scene.render.resolution_y = 480
|
||||
scene.render.resolution_percentage = 100
|
||||
scene.render.fps = FPS
|
||||
scene.render.fps_base = 1.0
|
||||
scene.render.image_settings.file_format = 'FFMPEG'
|
||||
scene.render.ffmpeg.format = 'MPEG4'
|
||||
scene.render.ffmpeg.codec = 'H264'
|
||||
scene.render.ffmpeg.audio_codec = 'AAC'
|
||||
scene.render.filepath = OUTPUT_PATH
|
||||
|
||||
# Sequence Editor setup
|
||||
se = scene.sequence_editor_create()
|
||||
|
||||
# Video track
|
||||
movie = se.sequences.new_movie(
|
||||
name='clip',
|
||||
filepath=INPUT_PATH,
|
||||
channel=1,
|
||||
frame_start=1 - start_frame
|
||||
)
|
||||
|
||||
# Audio track
|
||||
sound = se.sequences.new_sound(
|
||||
name='audio',
|
||||
filepath=INPUT_PATH,
|
||||
channel=2,
|
||||
frame_start=1 - start_frame
|
||||
)
|
||||
|
||||
# Trim media to interval
|
||||
for strip in (movie, sound):
|
||||
strip.frame_offset_start = start_frame
|
||||
strip.frame_final_duration = dur_frames
|
||||
|
||||
# Slow motion effect
|
||||
speed = se.sequences.new_effect(
|
||||
name='slowmo',
|
||||
type='SPEED',
|
||||
channel=3,
|
||||
frame_start=1,
|
||||
frame_end=1 + dur_frames,
|
||||
seq1=movie
|
||||
)
|
||||
speed.speed_control = 'MULTIPLY'
|
||||
speed.speed_factor = 1 / 1.5
|
||||
speed.use_default_fade = False
|
||||
movie.frame_final_duration = render_dur
|
||||
|
||||
# Subtitle with background
|
||||
text = se.sequences.new_effect(
|
||||
name='subtitle',
|
||||
type='TEXT',
|
||||
channel=4,
|
||||
frame_start=1,
|
||||
frame_end=1 + render_dur
|
||||
)
|
||||
text.text = 'BIG BUNNY'
|
||||
text.location = (0.5, 0.12)
|
||||
text.align_x = 'CENTER'
|
||||
text.align_y = 'BOTTOM'
|
||||
text.use_box = True
|
||||
text.box_color = (0, 0, 0, 0.6)
|
||||
|
||||
# Render range
|
||||
scene.frame_start = 1
|
||||
scene.frame_end = render_dur
|
||||
|
||||
# Execute render
|
||||
bpy.ops.render.render(animation=True)
|
||||
@@ -0,0 +1,89 @@
|
||||
import bpy
|
||||
|
||||
# Configuration
|
||||
INPUT_PATH = '/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/source.mov'
|
||||
OUTPUT_PATH = '/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/negative_control.mp4'
|
||||
START_SECONDS = 0.000
|
||||
END_SECONDS = 3.000
|
||||
FPS = 25
|
||||
|
||||
# Calculate timing parameters
|
||||
start_frame = int(round(START_SECONDS * FPS))
|
||||
dur_frames = max(1, int(round((END_SECONDS - START_SECONDS) * FPS)))
|
||||
render_dur = int(round(dur_frames * 1.5))
|
||||
|
||||
# Initialize scene
|
||||
scene = bpy.context.scene
|
||||
scene.sequence_editor_clear()
|
||||
|
||||
# Render settings
|
||||
scene.render.resolution_x = 854
|
||||
scene.render.resolution_y = 480
|
||||
scene.render.resolution_percentage = 100
|
||||
scene.render.fps = FPS
|
||||
scene.render.fps_base = 1.0
|
||||
scene.render.filepath = OUTPUT_PATH
|
||||
scene.render.image_settings.file_format = 'MPEG4'
|
||||
scene.render.ffmpeg.format = 'MPEG4'
|
||||
scene.render.ffmpeg.codec = 'H264'
|
||||
scene.render.ffmpeg.audio_codec = 'AAC'
|
||||
|
||||
# Video Sequence Editor setup
|
||||
se = scene.sequence_editor_create()
|
||||
|
||||
# Add movie and audio strips
|
||||
movie = se.sequences.new_movie(
|
||||
name='clip',
|
||||
filepath=INPUT_PATH,
|
||||
channel=1,
|
||||
frame_start=1 - start_frame
|
||||
)
|
||||
sound = se.sequences.new_sound(
|
||||
name='audio',
|
||||
filepath=INPUT_PATH,
|
||||
channel=2,
|
||||
frame_start=1 - start_frame
|
||||
)
|
||||
|
||||
# Set trim for both media strips
|
||||
for strip in (movie, sound):
|
||||
strip.frame_offset_start = start_frame
|
||||
strip.frame_final_duration = dur_frames
|
||||
|
||||
# Add speed effect for slow motion
|
||||
speed = se.sequences.new_effect(
|
||||
name='slowmo',
|
||||
type='SPEED',
|
||||
channel=3,
|
||||
frame_start=1,
|
||||
frame_end=1 + dur_frames,
|
||||
seq1=movie
|
||||
)
|
||||
speed.speed_control = 'MULTIPLY'
|
||||
speed.speed_factor = 1 / 1.5
|
||||
speed.use_default_fade = False
|
||||
|
||||
# Extend movie strip to match render duration
|
||||
movie.frame_final_duration = render_dur
|
||||
|
||||
# Add subtitle text strip
|
||||
text = se.sequences.new_effect(
|
||||
name='subtitle',
|
||||
type='TEXT',
|
||||
channel=4,
|
||||
frame_start=1,
|
||||
frame_end=1 + render_dur
|
||||
)
|
||||
text.text = 'BIG BUNNY'
|
||||
text.location = (0.5, 0.12)
|
||||
text.align_x = 'CENTER'
|
||||
text.align_y = 'BOTTOM'
|
||||
text.use_box = True
|
||||
text.box_color = (0, 0, 0, 0.6)
|
||||
|
||||
# Set render frame range
|
||||
scene.frame_start = 1
|
||||
scene.frame_end = render_dur
|
||||
|
||||
# Render animation
|
||||
bpy.ops.render.render(animation=True)
|
||||
@@ -0,0 +1,98 @@
|
||||
import bpy
|
||||
|
||||
# Clear existing data
|
||||
bpy.ops.wm.read_factory_settings(use_empty=True)
|
||||
scene = bpy.context.scene
|
||||
|
||||
# Configuration
|
||||
INPUT_PATH = '/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/source.mov'
|
||||
OUTPUT_PATH = '/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/negative_control.mp4'
|
||||
FPS = 25
|
||||
START_SECONDS = 0.000
|
||||
END_SECONDS = 3.000
|
||||
|
||||
# Calculate timing variables
|
||||
start_frame = int(round(START_SECONDS * FPS))
|
||||
dur_frames = max(1, int(round((END_SECONDS - START_SECONDS) * FPS)))
|
||||
render_dur = int(round(dur_frames * 1.5))
|
||||
|
||||
# Scene settings
|
||||
scene.frame_start = 1
|
||||
scene.frame_end = render_dur
|
||||
scene.render.fps = FPS
|
||||
scene.render.fps_base = 1.0
|
||||
|
||||
# Render resolution (854x480 for H.264 compatibility)
|
||||
scene.render.resolution_x = 854
|
||||
scene.render.resolution_y = 480
|
||||
scene.render.resolution_percentage = 100
|
||||
|
||||
# Output settings
|
||||
scene.render.image_settings.file_format = 'FFMPEG'
|
||||
scene.render.ffmpeg.format = 'MPEG4'
|
||||
scene.render.ffmpeg.codec = 'H264'
|
||||
scene.render.ffmpeg.constant_rate_factor = 'MEDIUM'
|
||||
scene.render.ffmpeg.audio_codec = 'AAC'
|
||||
scene.render.ffmpeg.audio_bitrate = 192
|
||||
scene.render.ffmpeg.audio_channels = 'STEREO'
|
||||
scene.render.ffmpeg.audio_sample_rate = 44100
|
||||
scene.render.filepath = OUTPUT_PATH
|
||||
|
||||
# Create sequence editor
|
||||
se = scene.sequence_editor_create()
|
||||
|
||||
# Add video clip
|
||||
movie = se.sequences.new_movie(
|
||||
name='clip',
|
||||
filepath=INPUT_PATH,
|
||||
channel=1,
|
||||
frame_start=1 - start_frame
|
||||
)
|
||||
|
||||
# Add audio track
|
||||
sound = se.sequences.new_sound(
|
||||
name='audio',
|
||||
filepath=INPUT_PATH,
|
||||
channel=2,
|
||||
frame_start=1 - start_frame
|
||||
)
|
||||
|
||||
# Set initial trim for video and audio
|
||||
for strip in (movie, sound):
|
||||
strip.frame_offset_start = start_frame
|
||||
strip.frame_final_duration = dur_frames
|
||||
|
||||
# Add slow-motion effect to video
|
||||
speed = se.sequences.new_effect(
|
||||
name='slowmo',
|
||||
type='SPEED',
|
||||
channel=3,
|
||||
frame_start=1,
|
||||
frame_end=1 + dur_frames,
|
||||
seq1=movie
|
||||
)
|
||||
speed.speed_control = 'MULTIPLY'
|
||||
speed.speed_factor = 1 / 1.5
|
||||
speed.use_default_fade = False
|
||||
|
||||
# Extend video duration for slow-motion
|
||||
movie.frame_final_duration = render_dur
|
||||
|
||||
# Add subtitle with background box
|
||||
text = se.sequences.new_effect(
|
||||
name='subtitle',
|
||||
type='TEXT',
|
||||
channel=4,
|
||||
frame_start=1,
|
||||
frame_end=1 + render_dur
|
||||
)
|
||||
text.text = 'BIG BUNNY'
|
||||
text.location = (0.5, 0.12)
|
||||
text.align_x = 'CENTER'
|
||||
text.align_y = 'BOTTOM'
|
||||
text.font_size = 48
|
||||
text.use_box = True
|
||||
text.box_color = (0.0, 0.0, 0.0, 0.6)
|
||||
|
||||
# Render animation
|
||||
bpy.ops.render.render(animation=True)
|
||||
@@ -0,0 +1,83 @@
|
||||
import bpy
|
||||
|
||||
# Configuration
|
||||
INPUT_PATH = '/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/source.mov'
|
||||
OUTPUT_PATH = '/Users/boj/book/ai-agent-book/chapter5/video-edit/validation/runs/exp5-6-real-blender-20260730-053948/negative_control.mp4'
|
||||
FPS = 25
|
||||
START_SECONDS = 0.000
|
||||
END_SECONDS = 3.000
|
||||
|
||||
# Calculate timing variables
|
||||
start_frame = int(round(START_SECONDS * FPS))
|
||||
dur_frames = max(1, int(round((END_SECONDS - START_SECONDS) * FPS)))
|
||||
render_dur = int(round(dur_frames * 1.5))
|
||||
|
||||
# Scene setup
|
||||
scene = bpy.context.scene
|
||||
scene.sequence_editor_clear() # Ensure clean state
|
||||
se = scene.sequence_editor_create()
|
||||
|
||||
# Add movie and audio strips
|
||||
movie = se.sequences.new_movie(
|
||||
name='clip',
|
||||
filepath=INPUT_PATH,
|
||||
channel=1,
|
||||
frame_start=1 - start_frame
|
||||
)
|
||||
sound = se.sequences.new_sound(
|
||||
name='audio',
|
||||
filepath=INPUT_PATH,
|
||||
channel=2,
|
||||
frame_start=1 - start_frame
|
||||
)
|
||||
|
||||
# Set trim for both strips
|
||||
for strip in (movie, sound):
|
||||
strip.frame_offset_start = start_frame
|
||||
strip.frame_final_duration = dur_frames
|
||||
|
||||
# Add speed effect for slow motion
|
||||
speed = se.sequences.new_effect(
|
||||
name='slowmo',
|
||||
type='SPEED',
|
||||
channel=3,
|
||||
frame_start=1,
|
||||
frame_end=1 + dur_frames,
|
||||
seq1=movie
|
||||
)
|
||||
speed.use_default_fade = False
|
||||
speed.speed_control = 'MULTIPLY'
|
||||
speed.speed_factor = 1.0 / 1.5
|
||||
movie.frame_final_duration = render_dur # Extend video to render duration
|
||||
|
||||
# Add subtitle text strip
|
||||
text = se.sequences.new_effect(
|
||||
name='subtitle',
|
||||
type='TEXT',
|
||||
channel=4,
|
||||
frame_start=1,
|
||||
frame_end=1 + render_dur
|
||||
)
|
||||
text.text = 'BIG BUNNY'
|
||||
text.location = (0.5, 0.12) # Center horizontally, near bottom vertically
|
||||
text.align_x = 'CENTER'
|
||||
text.align_y = 'BOTTOM'
|
||||
text.use_box = True
|
||||
text.box_color = (0.0, 0.0, 0.0, 0.6) # Black semi-transparent background
|
||||
|
||||
# Render settings
|
||||
scene.frame_start = 1
|
||||
scene.frame_end = render_dur
|
||||
scene.render.fps = FPS
|
||||
scene.render.fps_base = 1.0
|
||||
scene.render.resolution_x = 854
|
||||
scene.render.resolution_y = 480
|
||||
scene.render.resolution_percentage = 100
|
||||
scene.render.image_settings.file_format = 'FFMPEG'
|
||||
scene.render.ffmpeg.format = 'MPEG4'
|
||||
scene.render.ffmpeg.codec = 'H264'
|
||||
scene.render.ffmpeg.audio_codec = 'AAC'
|
||||
scene.render.filepath = OUTPUT_PATH
|
||||
|
||||
# Execute render
|
||||
bpy.ops.render.render(animation=True)
|
||||
@@ -0,0 +1,42 @@
|
||||
{
|
||||
"url": "https://download.blender.org/peach/trailer/trailer_480p.mov",
|
||||
"title": "Big Buck Bunny trailer (Blender Foundation Peach Open Movie Project)",
|
||||
"license": "Creative Commons Attribution 3.0",
|
||||
"license_url": "https://creativecommons.org/licenses/by/3.0/",
|
||||
"sha256": "36801b74638c12be9aa587e93cd18edfc9bc51a1c089ab2a19ee42beed9f497d",
|
||||
"probe": {
|
||||
"programs": [],
|
||||
"stream_groups": [],
|
||||
"streams": [
|
||||
{
|
||||
"index": 0,
|
||||
"codec_name": "h264",
|
||||
"codec_type": "video",
|
||||
"width": 853,
|
||||
"height": 480,
|
||||
"r_frame_rate": "25/1"
|
||||
},
|
||||
{
|
||||
"index": 1,
|
||||
"codec_name": "aac",
|
||||
"codec_type": "audio",
|
||||
"sample_rate": "48000",
|
||||
"channels": 6,
|
||||
"r_frame_rate": "0/0"
|
||||
}
|
||||
],
|
||||
"format": {
|
||||
"format_name": "mov,mp4,m4a,3gp,3g2,mj2",
|
||||
"duration": "32.995000",
|
||||
"size": "11061011"
|
||||
}
|
||||
},
|
||||
"naturally_occurring_scenes": true,
|
||||
"ground_truth": {
|
||||
"start": 9.08,
|
||||
"end": 11.2,
|
||||
"target": "the single continuous shot showing the large white rabbit walking alone in a sunny green meadow, after the ONE BIG RABBIT title and before the THREE RODENTS title",
|
||||
"method": "Human-labeled target shot bounded by ffmpeg scene-change frames; source inspection found transitions at 9.08 and 11.20 seconds.",
|
||||
"ffmpeg_scene_threshold": 0.35
|
||||
}
|
||||
}
|
||||