English | 简体中文
This project provides a full OpenAI-compatible API for generating longer Sora videos by intelligently splitting them into segments and ensuring seamless continuity.
prompt: A dog is making tutorial about the Quantum Mechanics.
segment_01.mp4 |
segment_02.mp4 |
output.mp4 |
LongSoraGen overcomes Sora's duration limitations by breaking down long video generation requests into multiple connected segments. The system uses AI-powered planning to create coherent narratives across segments and maintains visual continuity by using the last frame of each segment as a reference for the next.
Some of the code and idea is from https://github.com/mshumer/sora-extend, thank you for their work.
✅ Note: This codebase has been tested and verified to work correctly. If you encounter any issues or have suggestions for improvement, please feel free to open an issue or submit a pull request.
LongSoraGen's main idea follows mshumer's ideas and operates in three main stages:
-
We segment the total video durations into segmentations, and generate prompt for each segmentation.
-
We use the frame from the last video as the frame reference to generate the following frames.
-
Finally, we combine all the video segments.
FFmpeg is needed for video processing, please install it first.
- Install from pypi:
We have distributed our library to PyPI, check it out:
pip install longsora- Install from scratch:
We highly recommend using the uv to install the environments:
uv syncThe environment will be installed in .venv. Activate it using:
source .venv/bin/activateexport OPENAI_API_KEY='your-api-key-here'from pathlib import Path
from longsora import OpenAI
output_dir = Path("resources") / "case1"
prompt = "A woman is dancing in a bunch of trees."
model = "sora-2"
seconds_per_segment = 8
num_generations = 3
print(f"the video will be {seconds_per_segment * num_generations} seconds long")
if __name__ == "__main__":
client = OpenAI()
client.create_video(
prompt=prompt,
model=model,
seconds_per_segment=seconds_per_segment,
output_dir=output_dir,
num_generations=num_generations,
verbose=True,
save_segments=True,
plan_model="gpt-5",
)import asyncio
from pathlib import Path
from longsora import AsyncOpenAI
output_dir = Path("resources") / "case2"
prompt = "A woman is dancing in a bunch of trees."
seconds_per_segment = 8
model = "sora-2"
num_generations = 2
print(f"the video will be {seconds_per_segment * num_generations} seconds long")
async def main():
client = AsyncOpenAI()
await client.create_video(
prompt=prompt,
model=model,
seconds_per_segment=seconds_per_segment,
output_dir=output_dir,
num_generations=num_generations,
verbose=True,
save_segments=True,
plan_model="gpt-5",
)
if __name__ == "__main__":
asyncio.run(main())MIT License
Copyright (c) 2025 LLinkedlist
See LICENSE for details.
If you use this project in your research or applications, please cite:
@misc{longsoragen2025,
author = {linkedlist771},
title = {LongSoraGen: Extended Video Generation with OpenAI Sora},
year = {2025},
url = {https://github.com/linkedlist771/LongSoraGen}
}