Add video generation support to Microsoft.Extensions.AI#7420
Draft
ericstj wants to merge 4 commits intodotnet:mainfrom
Draft
Add video generation support to Microsoft.Extensions.AI#7420ericstj wants to merge 4 commits intodotnet:mainfrom
ericstj wants to merge 4 commits intodotnet:mainfrom
Conversation
Introduces `IVideoGenerator`, a new modality abstraction for video generation that follows the existing patterns established by `IChatClient` and `IImageGenerator`. ## Abstractions (Microsoft.Extensions.AI.Abstractions) - `IVideoGenerator` interface with `GenerateAsync` accepting request, options, progress, and cancellation - `VideoGenerationRequest` with `Prompt` and `OriginalMedia` (provider-neutral; image content = reference for generation, video content = source for editing) - `VideoGenerationOptions` with `Count`, `Duration`, `FramesPerSecond`, `MediaType`, `ModelId`, `VideoSize`, `ResponseFormat`, `RawRepresentationFactory`, and `AdditionalProperties` - `VideoGenerationResponse` with `Contents`, `Usage`, `ModelId`, `RawRepresentation`, and `AdditionalProperties` - `VideoGenerationProgress` for reporting async job status and percent complete via `IProgress<T>` - `VideoGenerationResponseFormat` enum (`Uri`, `Data`, `Hosted`) - `VideoGeneratorMetadata` for provider name, endpoint, and default model - `DelegatingVideoGenerator` base class for middleware - `VideoGeneratorExtensions` with `GenerateAsync`/`EditVideoAsync`/`EditVideosAsync` convenience overloads - `HostedVideoGenerationTool` and supporting tool content types for chat-client-driven video generation ## Middleware (Microsoft.Extensions.AI) - `VideoGeneratorBuilder` with DI integration (`AddVideoGenerator` on `IServiceCollection`) - `LoggingVideoGenerator` middleware with builder extension - `OpenTelemetryVideoGenerator` middleware with builder extension - `ConfigureOptionsVideoGenerator` middleware with builder extension - `VideoGeneratingChatClient` that bridges `IChatClient` tool calls to `IVideoGenerator` ## OpenAI Provider (Microsoft.Extensions.AI.OpenAI) - `OpenAIVideoGenerator` implementing `IVideoGenerator` via `VideoClient` - `AsIVideoGenerator` extension method on `VideoClient` - Routing based on request contents and `AdditionalProperties` keys: - **Text-to-video**: `POST /videos` (via SDK `CreateVideoAsync`) - **Image-to-video**: `POST /videos` with `input_reference` — URL in JSON or image bytes via multipart (via SDK `CreateVideoAsync`) - **Edit by video ID**: `POST /videos/edits` with `edit_video_id` key (via raw `ClientPipeline`) - **Edit by upload**: `POST /videos/edits` with `video/*` `OriginalMedia` as multipart (via raw `ClientPipeline`) - **Extend**: `POST /videos/extensions` with `extend_video_id` key (via raw `ClientPipeline`) - **Characters**: `characters` array forwarded in `POST /videos` body via `AdditionalProperties` - Edit, extend, and character endpoints not yet in the OpenAI SDK are supported by constructing `PipelineMessage` directly against `VideoClient.Pipeline`/`VideoClient.Endpoint` - Async create → poll → download pattern with `IProgress<VideoGenerationProgress>` reporting ## Tests - Abstraction unit tests: `DelegatingVideoGeneratorTests`, `VideoGenerationOptionsTests`, `VideoGenerationResponseTests`, `VideoGeneratorExtensionsTests`, `VideoGeneratorMetadataTests`, `VideoGeneratorTests` - Middleware tests: `ConfigureOptionsVideoGeneratorTests`, `LoggingVideoGeneratorTests`, `OpenTelemetryVideoGeneratorTests`, `VideoGeneratorBuilderTests`, `VideoGeneratorDependencyInjectionPatterns` - OpenAI tests: `OpenAIVideoGeneratorTests`, `OpenAIVideoGeneratorIntegrationTests` - Shared `TestVideoGenerator` and `VideoGeneratorIntegrationTests` base class ## POC Sample - `samples/VideoGenerationPOC` demonstrating all scenarios with `System.CommandLine` - Uses `DataContent.LoadFromAsync` for file loading with automatic media type inference - Uses `DataContent.SaveToAsync` for output - CLI args: `--input`, `--edit`, `--extend`, `--character`, `--model`, `--output`
Contributor
There was a problem hiding this comment.
Pull request overview
Adds an experimental video-generation modality to the Microsoft.Extensions.AI stack, aligning with existing patterns used for chat/image modalities and providing a first provider implementation via OpenAI.
Changes:
- Introduces new video generation abstractions in
Microsoft.Extensions.AI.Abstractions(IVideoGenerator, request/response/options/progress types, tool content types, and extensions). - Adds middleware/pipeline + DI registration support in
Microsoft.Extensions.AI(builder, logging, OpenTelemetry, options configuration) and aVideoGeneratingChatClientbridge for tool-driven generation. - Implements an OpenAI provider (
OpenAIVideoGenerator) with polling + download flow, plus unit/integration tests and a POC sample.
Reviewed changes
Copilot reviewed 45 out of 45 changed files in this pull request and generated 7 comments.
Show a summary per file
| File | Description |
|---|---|
| test/Libraries/Microsoft.Extensions.AI.Tests/Video/VideoGeneratorDependencyInjectionPatterns.cs | Validates DI registration patterns and lifetimes for IVideoGenerator. |
| test/Libraries/Microsoft.Extensions.AI.Tests/Video/VideoGeneratorBuilderTests.cs | Tests builder pipeline ordering, null handling, and service provider flow. |
| test/Libraries/Microsoft.Extensions.AI.Tests/Video/SingletonVideoGeneratorExtensions.cs | Test-only middleware helper for singleton pipeline behavior. |
| test/Libraries/Microsoft.Extensions.AI.Tests/Video/OpenTelemetryVideoGeneratorTests.cs | Verifies OTel tags/events emitted for video generation and exceptions. |
| test/Libraries/Microsoft.Extensions.AI.Tests/Video/LoggingVideoGeneratorTests.cs | Verifies logging behavior across log levels and scenarios. |
| test/Libraries/Microsoft.Extensions.AI.Tests/Video/ConfigureOptionsVideoGeneratorTests.cs | Verifies options cloning and configuration middleware behavior. |
| test/Libraries/Microsoft.Extensions.AI.Tests/Microsoft.Extensions.AI.Tests.csproj | Adds shared TestVideoGenerator compilation into middleware test project. |
| test/Libraries/Microsoft.Extensions.AI.OpenAI.Tests/OpenAIVideoGeneratorTests.cs | Tests OpenAI VideoClient adapter + metadata/service retrieval. |
| test/Libraries/Microsoft.Extensions.AI.OpenAI.Tests/OpenAIVideoGeneratorIntegrationTests.cs | Adds OpenAI integration coverage using shared base tests. |
| test/Libraries/Microsoft.Extensions.AI.Integration.Tests/VideoGeneratorIntegrationTests.cs | Adds common integration test suite for IVideoGenerator. |
| test/Libraries/Microsoft.Extensions.AI.Abstractions.Tests/Video/VideoGeneratorTests.cs | Tests IVideoGenerator test double and basic behavior. |
| test/Libraries/Microsoft.Extensions.AI.Abstractions.Tests/Video/VideoGeneratorMetadataTests.cs | Tests metadata construction and defaults. |
| test/Libraries/Microsoft.Extensions.AI.Abstractions.Tests/Video/VideoGeneratorExtensionsTests.cs | Tests convenience extension methods for generate/edit and service access. |
| test/Libraries/Microsoft.Extensions.AI.Abstractions.Tests/Video/VideoGenerationResponseTests.cs | Tests response defaults and JSON round-tripping. |
| test/Libraries/Microsoft.Extensions.AI.Abstractions.Tests/Video/VideoGenerationOptionsTests.cs | Tests options defaults, cloning, and JSON round-tripping. |
| test/Libraries/Microsoft.Extensions.AI.Abstractions.Tests/Video/DelegatingVideoGeneratorTests.cs | Tests delegating generator behavior and service passthrough. |
| test/Libraries/Microsoft.Extensions.AI.Abstractions.Tests/TestVideoGenerator.cs | Adds a reusable IVideoGenerator test implementation. |
| src/Shared/DiagnosticIds/DiagnosticIds.cs | Adds experiment IDs for video generation and OpenAI video client. |
| src/Libraries/Microsoft.Extensions.AI/Video/VideoGeneratorBuilderVideoGeneratorExtensions.cs | Adds AsBuilder() extension for IVideoGenerator. |
| src/Libraries/Microsoft.Extensions.AI/Video/VideoGeneratorBuilderServiceCollectionExtensions.cs | Adds IServiceCollection registration helpers for video generators. |
| src/Libraries/Microsoft.Extensions.AI/Video/VideoGeneratorBuilder.cs | Adds middleware pipeline builder for IVideoGenerator. |
| src/Libraries/Microsoft.Extensions.AI/Video/LoggingVideoGeneratorBuilderExtensions.cs | Adds logging middleware builder extension for video generation. |
| src/Libraries/Microsoft.Extensions.AI/Video/LoggingVideoGenerator.cs | Implements logging middleware for IVideoGenerator. |
| src/Libraries/Microsoft.Extensions.AI/Video/ConfigureOptionsVideoGeneratorBuilderExtensions.cs | Adds options-configuration middleware builder extension. |
| src/Libraries/Microsoft.Extensions.AI/Video/ConfigureOptionsVideoGenerator.cs | Implements options-cloning/configuration middleware. |
| src/Libraries/Microsoft.Extensions.AI/OpenTelemetryConsts.cs | Adds OTel constant for video content type. |
| src/Libraries/Microsoft.Extensions.AI/ChatCompletion/VideoGeneratingChatClientBuilderExtensions.cs | Adds chat client builder extension for tool-driven video generation. |
| src/Libraries/Microsoft.Extensions.AI/ChatCompletion/VideoGeneratingChatClient.cs | Implements chat client wrapper bridging tool calls to IVideoGenerator. |
| src/Libraries/Microsoft.Extensions.AI/ChatCompletion/OpenTelemetryVideoGeneratorBuilderExtensions.cs | Adds OpenTelemetry middleware builder extension for video generation. |
| src/Libraries/Microsoft.Extensions.AI/ChatCompletion/OpenTelemetryVideoGenerator.cs | Implements OTel semantic conventions for video generation operations. |
| src/Libraries/Microsoft.Extensions.AI.OpenAI/OpenAIVideoGenerator.cs | Implements OpenAI-backed IVideoGenerator with create/poll/download + extra endpoints. |
| src/Libraries/Microsoft.Extensions.AI.OpenAI/OpenAIClientExtensions.cs | Adds VideoClient.AsIVideoGenerator() adapter extension method. |
| src/Libraries/Microsoft.Extensions.AI.Abstractions/Video/VideoGeneratorMetadata.cs | Adds provider metadata type for video generators. |
| src/Libraries/Microsoft.Extensions.AI.Abstractions/Video/VideoGeneratorExtensions.cs | Adds convenience overloads + service access helpers for IVideoGenerator. |
| src/Libraries/Microsoft.Extensions.AI.Abstractions/Video/VideoGenerationToolResultContent.cs | Adds tool result content type for returning generated videos. |
| src/Libraries/Microsoft.Extensions.AI.Abstractions/Video/VideoGenerationToolCallContent.cs | Adds tool call content type for representing tool invocation. |
| src/Libraries/Microsoft.Extensions.AI.Abstractions/Video/VideoGenerationResponse.cs | Adds response type for video generation. |
| src/Libraries/Microsoft.Extensions.AI.Abstractions/Video/VideoGenerationRequest.cs | Adds request type with prompt + original media. |
| src/Libraries/Microsoft.Extensions.AI.Abstractions/Video/VideoGenerationProgress.cs | Adds progress payload for async generation status reporting. |
| src/Libraries/Microsoft.Extensions.AI.Abstractions/Video/VideoGenerationOptions.cs | Adds options type + response-format enum and clone support. |
| src/Libraries/Microsoft.Extensions.AI.Abstractions/Video/IVideoGenerator.cs | Adds the core IVideoGenerator abstraction. |
| src/Libraries/Microsoft.Extensions.AI.Abstractions/Video/HostedVideoGenerationTool.cs | Adds hosted tool marker for enabling video generation. |
| src/Libraries/Microsoft.Extensions.AI.Abstractions/Video/DelegatingVideoGenerator.cs | Adds delegating base class for composable video generator middleware. |
| samples/VideoGenerationPOC/VideoGenerationPOC.csproj | Adds a CLI POC sample project. |
| samples/VideoGenerationPOC/Program.cs | Implements the CLI POC demonstrating create/edit/extend/characters flows. |
src/Libraries/Microsoft.Extensions.AI.OpenAI/OpenAIVideoGenerator.cs
Outdated
Show resolved
Hide resolved
src/Libraries/Microsoft.Extensions.AI.OpenAI/OpenAIVideoGenerator.cs
Outdated
Show resolved
Hide resolved
src/Libraries/Microsoft.Extensions.AI.OpenAI/OpenAIVideoGenerator.cs
Outdated
Show resolved
Hide resolved
src/Libraries/Microsoft.Extensions.AI/Video/VideoGeneratorBuilderServiceCollectionExtensions.cs
Outdated
Show resolved
Hide resolved
src/Libraries/Microsoft.Extensions.AI/Video/VideoGeneratorBuilderServiceCollectionExtensions.cs
Outdated
Show resolved
Hide resolved
src/Libraries/Microsoft.Extensions.AI.Abstractions/Video/VideoGenerationResponse.cs
Outdated
Show resolved
Hide resolved
src/Libraries/Microsoft.Extensions.AI.OpenAI/OpenAIVideoGenerator.cs
Outdated
Show resolved
Hide resolved
stephentoub
reviewed
Mar 20, 2026
src/Libraries/Microsoft.Extensions.AI.Abstractions/Video/HostedVideoGenerationTool.cs
Outdated
Show resolved
Hide resolved
Comment on lines
+19
to
+33
| /// <summary>Initializes a new instance of the <see cref="VideoGenerationRequest"/> class.</summary> | ||
| /// <param name="prompt">The prompt to guide the video generation.</param> | ||
| public VideoGenerationRequest(string prompt) | ||
| { | ||
| Prompt = prompt; | ||
| } | ||
|
|
||
| /// <summary>Initializes a new instance of the <see cref="VideoGenerationRequest"/> class.</summary> | ||
| /// <param name="prompt">The prompt to guide the video generation.</param> | ||
| /// <param name="originalMedia">The original media (images or videos) to base edits on.</param> | ||
| public VideoGenerationRequest(string prompt, IEnumerable<AIContent>? originalMedia) | ||
| { | ||
| Prompt = prompt; | ||
| OriginalMedia = originalMedia; | ||
| } |
Member
There was a problem hiding this comment.
Given both properties are get;set, do we need these constructors?
Member
Author
There was a problem hiding this comment.
We have the same pattern on ImageGenerationRequest. I'm ok to change but we should change both. Maybe make prompt required.
src/Libraries/Microsoft.Extensions.AI.Abstractions/Video/VideoGenerationToolResultContent.cs
Outdated
Show resolved
Hide resolved
src/Libraries/Microsoft.Extensions.AI.OpenAI/OpenAIVideoGenerator.cs
Outdated
Show resolved
Hide resolved
src/Libraries/Microsoft.Extensions.AI.OpenAI/OpenAIVideoGenerator.cs
Outdated
Show resolved
Hide resolved
src/Libraries/Microsoft.Extensions.AI/ChatCompletion/OpenTelemetryVideoGenerator.cs
Show resolved
Hide resolved
src/Libraries/Microsoft.Extensions.AI/ChatCompletion/OpenTelemetryVideoGenerator.cs
Outdated
Show resolved
Hide resolved
src/Libraries/Microsoft.Extensions.AI/ChatCompletion/VideoGeneratingChatClient.cs
Outdated
Show resolved
Hide resolved
...braries/Microsoft.Extensions.AI/ChatCompletion/VideoGeneratingChatClientBuilderExtensions.cs
Outdated
Show resolved
Hide resolved
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Introduces
IVideoGenerator, a new modality abstraction for video generation that follows the existing patterns established byIChatClientandIImageGenerator.Abstractions (Microsoft.Extensions.AI.Abstractions)
IVideoGeneratorinterface withGenerateAsyncaccepting request, options, progress, and cancellationVideoGenerationRequestwithPromptandOriginalMedia(provider-neutral; image content = reference for generation, video content = source for editing)VideoGenerationOptionswithCount,Duration,FramesPerSecond,MediaType,ModelId,VideoSize,ResponseFormat,RawRepresentationFactory, andAdditionalPropertiesVideoGenerationResponsewithContents,Usage,ModelId,RawRepresentation, andAdditionalPropertiesVideoGenerationProgressfor reporting async job status and percent complete viaIProgress<T>VideoGenerationResponseFormatenum (Uri,Data,Hosted)VideoGeneratorMetadatafor provider name, endpoint, and default modelDelegatingVideoGeneratorbase class for middlewareVideoGeneratorExtensionswithGenerateAsync/EditVideoAsync/EditVideosAsyncconvenience overloadsHostedVideoGenerationTooland supporting tool content types for chat-client-driven video generationMiddleware (Microsoft.Extensions.AI)
VideoGeneratorBuilderwith DI integration (AddVideoGeneratoronIServiceCollection)LoggingVideoGeneratormiddleware with builder extensionOpenTelemetryVideoGeneratormiddleware with builder extensionConfigureOptionsVideoGeneratormiddleware with builder extensionVideoGeneratingChatClientthat bridgesIChatClienttool calls toIVideoGeneratorOpenAI Provider (Microsoft.Extensions.AI.OpenAI)
OpenAIVideoGeneratorimplementingIVideoGeneratorviaVideoClientAsIVideoGeneratorextension method onVideoClientAdditionalPropertieskeys:POST /videos(via SDKCreateVideoAsync)POST /videoswithinput_reference— URL in JSON or image bytes via multipart (via SDKCreateVideoAsync)POST /videos/editswithedit_video_idkey (via rawClientPipeline)POST /videos/editswithvideo/*OriginalMediaas multipart (via rawClientPipeline)POST /videos/extensionswithextend_video_idkey (via rawClientPipeline)charactersarray forwarded inPOST /videosbody viaAdditionalPropertiesPipelineMessagedirectly againstVideoClient.Pipeline/VideoClient.EndpointIProgress<VideoGenerationProgress>reportingTests
DelegatingVideoGeneratorTests,VideoGenerationOptionsTests,VideoGenerationResponseTests,VideoGeneratorExtensionsTests,VideoGeneratorMetadataTests,VideoGeneratorTestsConfigureOptionsVideoGeneratorTests,LoggingVideoGeneratorTests,OpenTelemetryVideoGeneratorTests,VideoGeneratorBuilderTests,VideoGeneratorDependencyInjectionPatternsOpenAIVideoGeneratorTests,OpenAIVideoGeneratorIntegrationTestsTestVideoGeneratorandVideoGeneratorIntegrationTestsbase classPOC Sample
samples/VideoGenerationPOCdemonstrating all scenarios withSystem.CommandLineDataContent.LoadFromAsyncfor file loading with automatic media type inferenceDataContent.SaveToAsyncfor output--input,--edit,--extend,--character,--model,--outputvideo_20260319_225333.mp4
Microsoft Reviewers: Open in CodeFlow