feat(api, xai): add xAI Grok video model support with API integration

- Introduced new xAI `grok-imagine-video` model for video generation with configurable options (e.g., duration, size, resolution).
- Implemented video-specific API endpoints (`/v1/videos`, `/v1/videos/generations`, `/v1/videos/edits`, `/v1/videos/extensions`), including request validation and model handling.
- Enhanced model registry with `xaiBuiltinVideoModelID` and metadata for video capabilities.
- Added unit tests to validate video model support, request structures, and API response handling.
- Extended `XAIExecutor` to integrate video generation and retrieval via runtime requests.
This commit is contained in:
Luis Pater
2026-05-17 02:53:50 +08:00
parent 2ff9e33e26
commit 53d1fd6c5c
9 changed files with 1130 additions and 2 deletions
+16 -2
View File
@@ -10,6 +10,7 @@ const (
codexBuiltinImageModelID = "gpt-image-2"
xaiBuiltinImageModelID = "grok-imagine-image"
xaiBuiltinImageQualityModelID = "grok-imagine-image-quality"
xaiBuiltinVideoModelID = "grok-imagine-video"
)
// staticModelsJSON mirrors the top-level structure of models.json.
@@ -95,10 +96,10 @@ func WithCodexBuiltins(models []*ModelInfo) []*ModelInfo {
return upsertModelInfos(models, codexBuiltinImageModelInfo())
}
// WithXAIBuiltins injects hard-coded xAI image model definitions that should
// WithXAIBuiltins injects hard-coded xAI image/video model definitions that should
// not depend on remote models.json updates.
func WithXAIBuiltins(models []*ModelInfo) []*ModelInfo {
return upsertModelInfos(models, xaiBuiltinImageModelInfo(), xaiBuiltinImageQualityModelInfo())
return upsertModelInfos(models, xaiBuiltinImageModelInfo(), xaiBuiltinImageQualityModelInfo(), xaiBuiltinVideoModelInfo())
}
func codexBuiltinImageModelInfo() *ModelInfo {
@@ -139,6 +140,19 @@ func xaiBuiltinImageQualityModelInfo() *ModelInfo {
}
}
func xaiBuiltinVideoModelInfo() *ModelInfo {
return &ModelInfo{
ID: xaiBuiltinVideoModelID,
Object: "model",
Created: 1735689600, // 2025-01-01
OwnedBy: "xai",
Type: "xai",
DisplayName: "Grok Imagine Video",
Name: xaiBuiltinVideoModelID,
Description: "xAI Grok video generation model.",
}
}
func upsertModelInfos(models []*ModelInfo, extras ...*ModelInfo) []*ModelInfo {
if len(extras) == 0 {
return models
@@ -33,6 +33,22 @@ func TestCodexStaticModelsIncludeGPT55(t *testing.T) {
assertGPT55ModelInfo(t, "lookup", model)
}
func TestWithXAIBuiltinsAddsVideoModel(t *testing.T) {
models := WithXAIBuiltins(nil)
found := false
for _, model := range models {
if model != nil && model.ID == xaiBuiltinVideoModelID {
found = true
if model.OwnedBy != "xai" {
t.Fatalf("OwnedBy = %q, want xai", model.OwnedBy)
}
}
}
if !found {
t.Fatalf("expected %s builtin model", xaiBuiltinVideoModelID)
}
}
func findModelInfo(models []*ModelInfo, id string) *ModelInfo {
for _, model := range models {
if model != nil && model.ID == id {