Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

82 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

aigo

中文说明

aigo is an agent-native Go SDK for multimodal media generation. Describe work as a lightweight workflow graph, route it to 35+ execution engines, and get structured results with error classification, retry hints, and progress callbacks.

Architecture

Agent (LLM / code)
  │
  ▼
AgentTask ──► BuildGraph() ──► workflow.Graph (DAG)
                                    │
              ┌─────────┬──────────┼──────────┬──────────┐
              ▼          ▼          ▼          ▼          ▼
        engine/kling  engine/luma  engine/fal  ...   engine/comfyui
              │          │          │                     │
              ▼          ▼          ▼                     ▼
         Kling API   Luma API   Fal API             ComfyUI WS

Engines

Image Generation

Engine Backend Env Var
alibabacloud Alibaba Cloud DashScope (Qwen, Wan, Z-Image, HappyHorse) DASHSCOPE_API_KEY
openai OpenAI Images (gpt-image-2, DALL-E 3, DALL-E 2) OPENAI_API_KEY
google Google Imagen GOOGLE_API_KEY
flux Black Forest Labs FLUX BFL_API_KEY
stability Stability AI (SD3, Ultra, Core) STABILITY_API_KEY
ideogram Ideogram IDEOGRAM_API_KEY
recraft Recraft V3 RECRAFT_API_KEY
midjourney Midjourney (via GoAPI) GOAPI_KEY
jimeng Jimeng (Volcengine) JIMENG_API_KEY
liblib LibLibAI (HMAC-SHA1 auth) LIBLIB_ACCESS_KEY / LIBLIB_SECRET_KEY
ark Volcengine Ark (Seedream image) ARK_API_KEY

Video Generation

Engine Backend Env Var
alibabacloud DashScope HappyHorse (t2v, i2v, r2v, video-edit) DASHSCOPE_API_KEY
alibabacloud DashScope Wan (t2v, i2v, r2v, video-edit) DASHSCOPE_API_KEY
alibabacloud DashScope Kling V3 (video, omni-video) DASHSCOPE_API_KEY
ark Volcengine Ark Seedance 2.0 / 2.0 Fast / 1.0 Lite ARK_API_KEY
kling Kling AI (v1/v1.5/v2/v2.1) KLING_API_KEY
hailuo Hailuo / MiniMax Video HAILUO_API_KEY
luma Luma Dream Machine LUMA_API_KEY
runway Runway Gen-3/Gen-4 RUNWAY_API_KEY
pika Pika Labs PIKA_API_KEY
hedra Hedra (talking head video) HEDRA_API_KEY

Audio / Music / Speech

Engine Backend Env Var
alibabacloud DashScope TTS (Qwen3-TTS Flash / Instruct Flash) DASHSCOPE_API_KEY
alibabacloud DashScope Voice Design (Qwen Voice Design) DASHSCOPE_API_KEY
alibabacloud DashScope ASR (Qwen3-ASR Flash / Filetrans) DASHSCOPE_API_KEY
alibabacloud DashScope Fun-Music v1 (music generation) DASHSCOPE_API_KEY
elevenlabs ElevenLabs TTS ELEVENLABS_API_KEY
minimax MiniMax TTS & Music MINIMAX_API_KEY
suno Suno Music Generation SUNO_API_KEY
volcvoice Volcengine Speech VOLC_SPEECH_ACCESS_TOKEN

3D Generation

Engine Backend Env Var
meshy Meshy (text/image to 3D) MESHY_API_KEY
alibabacloud Alibaba Cloud Bailian — Tripo P1.0 / Tripo H3.1 (text / image / multi-image to 3D, .glb) DASHSCOPE_API_KEY

Multi-Modal Understanding

Engine Backend Env Var
gemini Google Gemini (vision + text) GEMINI_API_KEY
gpt4o OpenAI GPT-4o Vision OPENAI_API_KEY

Multi-Backend / Gateway

Engine Backend Env Var
newapi Multi-route gateway — 80+ models across OpenAI, Kling, Jimeng, Sora, Qwen, Gemini, Seedance, Hailuo/MiniMax, Vidu, Veo, Wan, Imagen; supports /v1/models auto-discovery NEWAPI_API_KEY
openrouter OpenRouter (multi-provider routing) OPENROUTER_API_KEY
fal Fal.ai (generic model runner) FAL_KEY
replicate Replicate (generic model runner) REPLICATE_API_TOKEN
comfydeploy ComfyDeploy (hosted ComfyUI) COMFYDEPLOY_API_TOKEN
comfyui ComfyUI server (WebSocket) COMFY_CLOUD_API_KEY
runninghub RunningHub (ComfyUI cloud) RH_API_KEY

Embedding

Engine Backend Env Var
embed/openai OpenAI Embeddings OPENAI_API_KEY
embed/gemini Google Gemini Embeddings GEMINI_API_KEY
embed/alibabacloud DashScope Embeddings (text + multimodal) DASHSCOPE_API_KEY
embed/jina Jina Embeddings JINA_API_KEY
embed/voyage Voyage AI Embeddings VOYAGE_API_KEY

Material Search

Backend Capability Env Var (legacy) URI Env Var
material/pexels Pexels photo + video search PEXELS_API_KEY PEXELS_URI
material/unsplash Unsplash photo search UNSPLASH_ACCESS_KEY UNSPLASH_URI
material/pixabay Pixabay image + video search PIXABAY_API_KEY PIXABAY_URI
material/ossmeta Alibaba Cloud OSS DoMetaQuery (scalar + semantic) OSS_ACCESS_KEY_ID / OSS_ACCESS_KEY_SECRET OSS_META_URI
material/local Local vector similarity search (via embed engines) Depends on embed backend LOCAL_MATERIAL_URI

Combined URI env var for all backends: MATERIAL_URIS="pexels://KEY,unsplash://KEY,oss://AK:SK@bucket.region"

See docs/material_search.md for details.

Install

go get github.com/godeps/aigo

Quick Start

Simple prompt

client := aigo.NewClient()

_ = client.RegisterEngine("img", alibabacloud.New(alibabacloud.Config{
    Model: alibabacloud.ModelQwenImage,
}))

result, err := client.ExecutePrompt(ctx, "img", "A shiba inu riding a vintage motorcycle")
fmt.Println(result.Value)   // URL or data URI
fmt.Println(result.Kind)    // aigo.OutputURL, OutputDataURI, etc.
fmt.Println(result.Engine)  // "img"
fmt.Println(result.Elapsed) // execution duration

Rich Result type

Every execution method returns aigo.Result:

type Result struct {
    Value    string         // raw output (URL, data URI, JSON, etc.)
    Kind     OutputKind     // authoritative classification
    Engine   string         // which engine produced this
    Elapsed  time.Duration  // wall-clock execution time
    Metadata map[string]any // engine-specific data (optional)
}

fmt.Println(result) // Result implements String(), prints Value

Structured task

result, err := client.ExecuteTask(ctx, "video", aigo.AgentTask{
    Prompt:   "Turn this product scene into a short ad",
    Duration: 2,
    Structured: &aigo.AgentTaskStructured{
        VideoSize: "1280*720",
        ImageSize: "1024*1024",
    },
    References: []aigo.ReferenceAsset{
        {Type: aigo.ReferenceTypeVideo, URL: "https://example.com/input.mp4"},
        {Type: aigo.ReferenceTypeImage, URL: "https://example.com/style.png"},
    },
})

TTS (text-to-speech)

result, err := client.ExecuteTask(ctx, "tts", aigo.AgentTask{
    Prompt: "Welcome to our product launch event",
    TTS: &aigo.TTSOptions{
        Voice:        "zhiyan",
        LanguageType: "zh",
    },
})

Voice design

result, err := client.ExecuteTask(ctx, "vd", aigo.AgentTask{
    Prompt: "design a voice",
    VoiceDesign: &aigo.VoiceDesignOptions{
        VoicePrompt:   "A warm, friendly female voice",
        PreviewText:   "Hello, welcome!",
        TargetModel:   "cosyvoice-v2",
        PreferredName: "custom-voice-01",
    },
})

Batch Registration

Register multiple engines at once

client.RegisterAll(map[string]engine.Engine{
    "img":   alibabacloud.New(alibabacloud.Config{Model: alibabacloud.ModelQwenImage}),
    "video": kling.New(kling.Config{Model: kling.ModelKlingV2Master}),
})

Conditional registration (skip if env var is missing)

client.RegisterAllIfKey([]aigo.EngineEntry{
    {Name: "kling-video", Engine: klingEngine, EnvVars: []string{"KLING_API_KEY"}},
    {Name: "luma-video",  Engine: lumaEngine,  EnvVars: []string{"LUMA_API_KEY"}},
    {Name: "local",       Engine: localEngine}, // always registered
})

Provider grouping

Register all engines from a vendor in one call. Engines whose required env vars are not set are silently skipped:

import "github.com/godeps/aigo/engine/alibabacloud"

registered, _ := client.RegisterProvider(alibabacloud.DefaultProvider())
// registered: ["alibabacloud-image", "alibabacloud-video", "alibabacloud-tts"]

Every engine package exports DefaultProvider() with sensible presets.

Declarative Configuration

Use declarative configuration when engines are selected by an application config, admin UI, or environment variable instead of hard-coded constructors. Provider factories consume engine.EngineConfig; import the engine packages you use so their factories are registered.

JSON Config

Declare engines in a JSON file and apply it at startup:

{
  "engines": [
    {"name": "img", "provider": "newapi", "model": "gpt-image-default", "quality": "high", "output_format": "webp"},
    {"name": "video", "provider": "kling", "model": "kling-v2-master", "wait_for_completion": true},
    {"name": "tts", "provider": "elevenlabs"},
    {"name": "backup", "provider": "runway", "enabled": false}
  ]
}
cfg, _ := aigo.LoadConfig("engines.json")
registered, _ := client.ApplyConfig(cfg)

Each engine package registers its factory via init(), so a blank import is enough for config-driven setup:

import (
    _ "github.com/godeps/aigo/engine/newapi"
    _ "github.com/godeps/aigo/engine/alibabacloud"
    _ "github.com/godeps/aigo/engine/kling"
    _ "github.com/godeps/aigo/engine/elevenlabs"
    _ "github.com/godeps/aigo/engine/runway"
)

URI Config

Use URI config for compact environment-driven setup:

export ENGINE_URIS='newapi://sk-xxx@gateway.example.com/v1?model=gpt-image-default&quality=high&output_format=webp,kling://sk-xxx?model=kling-v2-master&wait=true'
registered, _ := client.ApplyEnvURI()
// Or: registered, _ := client.ApplyURI(os.Getenv("ENGINE_URIS"))

Provider userinfo becomes api_key. If a URI contains @host/path, that becomes base_url; otherwise provider defaults or environment variables apply.

Common Fields

Field JSON / URI key Purpose
Name name Client registration name. Required for JSON config; URI config generates one from provider and model when omitted.
Provider URI scheme / provider Registered provider key such as newapi, openai, kling, alibabacloud.
Model model Upstream model name. Custom gateway model names are allowed.
APIKey URI userinfo / api_key Explicit API key. Provider env vars remain available as fallback.
BaseURL URI host/path / base_url Custom API endpoint or gateway origin.
Capability capability Route hint for multi-capability providers. Common values: image, image_edit, video, tts, asr, video_understanding, vision, music, 3d.
WaitForCompletion wait_for_completion / wait Poll async jobs until completion.
PollInterval poll_interval Polling cadence, for example 5s.
Enabled enabled Set false to skip a JSON config entry.
Metadata other query keys / metadata Provider-specific fields such as voiceId, endpoint, secretKey, or template IDs.

Image providers that support OpenAI-compatible options also accept:

Field JSON / URI key Notes
Quality quality Image quality tier, for example low, medium, high, auto, standard, or hd.
Style style Style hint such as vivid or natural; ignored by gpt-image-* requests.
Background background gpt-image-* background mode: transparent, opaque, or auto.
OutputFormat output_format gpt-image-* output format: png, jpeg, or webp.
Moderation moderation gpt-image-* moderation mode such as low or auto.
OutputCompression output_compression JPEG/WebP compression from 0 to 100.

NewAPI Custom Models

newapi resolves routes in this order: built-in model catalog, model-name inference, then capability fallback. Names such as gpt-image-default are recognized automatically because they start with gpt-image-; they use /v1/images/generations and the gpt-image-* request contract.

Use newapi.ResolveRoute(model, capability) before engine creation, or eng.RouteResolution() after factory creation, to inspect the resolved route, media kind, capability, decision source, and image contract.

For a model name that cannot be inferred, set capability:

{
  "engines": [
    {
      "name": "custom-img",
      "provider": "newapi",
      "model": "aihub-render-default",
      "capability": "image",
      "quality": "high"
    }
  ]
}
newapi://sk-xxx@gateway.example.com/v1?model=aihub-render-default&capability=image&quality=high&output_format=webp

Model i18n Metadata

Every model registered via engine packages carries i18n display names and descriptions:

import _ "github.com/godeps/aigo/engine/kling"

info, ok := client.ModelInfo("kling-v2-master")
fmt.Println(info.DisplayName["en"]) // "Kling V2 Master"
fmt.Println(info.DisplayName["zh"]) // "可灵 V2 大师版"
fmt.Println(info.Description["zh"]) // "最高画质视频和图片生成"
fmt.Println(info.Intro["zh"])       // "可灵旗舰视频生成模型,支持文生视频和图生视频..."
fmt.Println(info.DocURL)            // "https://docs.qingque.cn/..."
fmt.Println(info.Capability)        // "video"

List all registered models:

for _, m := range client.AllModelInfos() {
    fmt.Printf("%-25s %-8s %s\n", m.Name, m.Capability, m.DisplayName["zh"])
}

You can also use engine.LookupModelInfo(name) and engine.AllModelInfos() directly.

Filter models by capability

videoModels := client.ModelInfosByCapability("video")
for _, m := range videoModels {
    fmt.Printf("%s — %s\n", m.Name, m.DisplayName["en"])
}

Query models by provider (engine)

klingModels := client.ModelInfosByProvider("kling")
// Returns all ModelInfo entries registered by the kling engine package

Engine-level metadata

meta := engine.LookupEngineMetadata("kling")
fmt.Println(meta.DisplayName["en"]) // "Kling AI"
fmt.Println(meta.Intro["en"])       // detailed introduction
fmt.Println(meta.DocURL)            // official documentation URL

Agent-Native Features

Structured errors with retry classification

Errors from all engines are classified so agents can make retry decisions:

import "github.com/godeps/aigo/engine/aigoerr"

_, err := client.ExecutePrompt(ctx, "img", "...")
if aigoerr.IsRetryable(err) {
    // safe to retry (429, 5xx, timeout)
}

code, ok := aigoerr.GetCode(err)
// aigoerr.CodeRateLimit, CodeServerError, CodeInvalidInput, etc.

var ae *aigoerr.Error
if errors.As(err, &ae) {
    fmt.Println(ae.StatusCode)  // original HTTP status
    fmt.Println(ae.RetryAfter)  // parsed Retry-After header
}

JSON Schema tool definitions

Register aigo tools with any agent framework (OpenAI, Anthropic, LangChain, Vercel AI SDK):

import "github.com/godeps/aigo/tooldef"

tools := tooldef.AllTools()
// generate_image, generate_video, generate_3d, text_to_speech,
// design_voice, edit_image, edit_video, transcribe_audio, generate_music

Engine registry

Centralized engine registration, lookup, and capability-based discovery:

import "github.com/godeps/aigo/engine"

reg := engine.NewRegistry()
reg.Register("kling", engine.Entry{
    Name:   "kling",
    Engine: klingEngine,
    ConfigSchemaFunc:   kling.ConfigSchema,
    ModelsByCapability: kling.ModelsByCapability,
})

// Find all engines that can generate video
videoEngines := reg.FindByCapability("video")

// Get all models grouped by engine and capability
allModels := reg.AllModels()

Engine capability discovery

Query what engines can do — for dynamic tool selection:

cap, _ := client.EngineCapabilities("alibabacloud-img")
// cap.MediaTypes  → ["image"]
// cap.Models      → ["qwen-image"]
// cap.SupportsSync, cap.SupportsPoll

// Find all engines that handle video:
videoEngines := client.AvailableFor("video")

Engine controls

Dynamically enable, disable, or conditionally register engines:

// Disable an engine without removing it
client.DisableEngine("runway")

// Re-enable it later
client.EnableEngine("runway")

// Remove an engine entirely
client.UnregisterEngine("old-engine")

// Register only if the API key is available
client.RegisterEngineIfKey("kling", klingEngine, "KLING_API_KEY")

// Check if an engine is active
if client.IsEnabled("kling") { ... }

Selective tool definitions

Filter tool definitions by media type for your agent framework:

import "github.com/godeps/aigo/tooldef"

// All tools
tools := tooldef.AllTools() // 9 tools

// Only image tools (generate_image, edit_image)
imageTools := tooldef.ToolsFor("image")

// Multiple categories
mediaTools := tooldef.ToolsFor("video", "audio", "music")

Progress reporting

Monitor long-running tasks with real-time progress:

result, err := client.Execute(ctx, "video", graph, aigo.WithProgress(func(e aigo.ProgressEvent) {
    switch e.Phase {
    case "submitted":
        fmt.Println("Task submitted")
    case "polling":
        fmt.Printf("Attempt %d, %s elapsed", e.Attempt, e.Elapsed)
        if e.Percent > 0 {
            fmt.Printf(", %.0f%% complete", e.Percent*100)
        }
        if e.PreviewURL != "" {
            fmt.Printf(", preview: %s", e.PreviewURL)
        }
        fmt.Println()
    case "completed":
        fmt.Printf("Done in %s\n", e.Elapsed)
    }
}))

ProgressEvent fields:

Field Type Description
Phase string "submitted", "polling", "completed"
Attempt int Poll attempt number (0 for non-polling phases)
Elapsed time.Duration Wall-clock time since execution start
Percent float64 0~1, actual progress from upstream API (0 if unavailable)
PreviewURL string Intermediate preview URL, e.g. video first frame (empty if unavailable)

Percent is extracted from upstream API responses (e.g. DashScope task_metrics.SUCCEEDED / task_metrics.TOTAL) when available.

Result caching

Cache results to avoid redundant API calls:

import "github.com/godeps/aigo/engine"

cached := engine.WithCache(myEngine, 10*time.Minute, 100) // TTL + max entries
// Identical workflow graphs return cached results

HTTP retry & rate limiting

Built-in HTTP transports for resilient API calls:

import "github.com/godeps/aigo/engine/httpx"

// Auto-retry on 429/5xx with exponential backoff
retryClient := httpx.NewRetryClient(httpx.RetryOptions{
    MaxRetries: 3,
    BaseDelay:  time.Second,
})

// Token bucket rate limiting
rateLimitedClient := httpx.NewRateLimitedClient(10, 20, 30*time.Second) // 10 RPS, burst 20

Middleware

Add cross-cutting concerns (logging, retry, timing):

client.Use(aigo.WithLogging(os.Stderr))
client.Use(aigo.WithRetry(3)) // retry retryable errors up to 3 times

Pipeline chaining

Chain multi-step workflows where each step feeds the next:

p := aigo.NewPipeline("img", aigo.AgentTask{Prompt: "a cat"}).
    Then(func(prev aigo.Result) (aigo.AgentTask, string) {
        return aigo.AgentTask{
            Prompt:     "animate this image",
            References: []aigo.ReferenceAsset{{Type: aigo.ReferenceTypeImage, URL: prev.Value}},
        }, "video"
    })

results, err := client.ExecutePipeline(ctx, p)
// results[0] = image result, results[1] = video result

DryRun estimation

Check what would happen without executing:

dr, err := client.DryRun("video", aigo.AgentTask{Prompt: "..."})
// dr.WillPoll       — whether the engine will poll
// dr.EstimatedTime  — human-readable time estimate
// dr.Warnings       — potential issues

Auto-routing with selector

Let the LLM inside your agent choose the engine:

result, err := client.ExecuteTaskAuto(ctx, selector, aigo.AgentTask{
    Prompt:   "make a 2 second product video",
    Duration: 2,
})
// result.Engine       — which engine was selected
// result.Reason       — why it was selected
// result.Output.Value — the generation result

Capability-aware routing (RichSelector)

RichSelector receives engine capability metadata so the LLM (or rules) can make informed decisions:

// Query all engine capabilities
infos := client.EngineInfos()
// []EngineInfo{{Name: "kling", Capability: {MediaTypes: ["video"], MaxDuration: 10, ...}}, ...}

// RichSelector automatically receives capabilities — no extra code needed
result, err := client.ExecuteTaskAuto(ctx, myRichSelector, task)

Rule-based pre-filtering

Filter incompatible engines before LLM selection — by media type, size, duration, and voice:

filter := &aigo.RuleFilter{}
candidates := filter.Filter(task, client.EngineInfos())
// Only engines matching the task's constraints remain

Priority selector (no LLM needed)

Pick the first compatible engine from a priority-ordered list:

selector := &aigo.PrioritySelector{
    Priority: []string{"kling", "luma", "runway"},
    Filter:   &aigo.RuleFilter{}, // optional constraint filtering
}
result, err := client.ExecuteTaskAuto(ctx, selector, task)

Infer media type from task

Automatically detect what kind of media a task needs:

mediaType := aigo.InferMediaType(task)
// "video" if Duration > 0, "audio" if TTS set, "music" if Music set, "image" otherwise

Fallback across engines

Try multiple engines in order; first success wins:

result, err := client.ExecuteWithFallback(ctx, []string{"primary", "backup"}, graph)
// result.Engine       — which engine succeeded
// result.Output.Value — the result
// result.Skipped      — engines that failed (with errors)

Auto-routing with fallback

Combine selector-based routing with automatic failover:

result, err := client.ExecuteTaskAutoWithFallback(ctx, selector, task)
// Selector picks the best engine; if it fails, tries remaining candidates

Async execution

Non-blocking execution via channel:

ch := client.ExecuteAsync(ctx, "video", graph)
// ... do other work ...
ar := <-ch
if ar.Err != nil { ... }
fmt.Println(ar.Result.Value)

Low-Level API

If your agent already emits workflow graphs, call Execute directly:

graph := workflow.Graph{
    "1": {
        ClassType: "CLIPTextEncode",
        Inputs:    map[string]any{"text": "A cinematic lighthouse in a storm"},
    },
    "2": {
        ClassType: "EmptyLatentImage",
        Inputs:    map[string]any{"width": 1536, "height": 1024},
    },
}

result, err := client.Execute(ctx, "img", graph)

Internal Packages

Package Purpose
workflow Workflow graph types and validation
workflow/resolve Graph resolution (prompt extraction, option helpers, link following)
engine/poll Unified polling with backoff, progress callbacks (PollV2 + FetcherV2), and status mapping
engine/httpx HTTP client defaults, retry transport, rate limiting, file upload
engine/aigoerr Structured error classification for agent retry logic
engine/embed Embedding engine implementations (OpenAI, Gemini, Jina, Voyage, Aliyun)
engine/newapi Multi-route gateway engine — three-tier route resolution (knownModels → name inference → capability fallback), /v1/models dynamic discovery
tooldef JSON Schema tool definitions for agent frameworks

Advanced Polling (PollV2)

For engines that support progress percentage or intermediate previews, use PollV2 with FetcherV2:

import "github.com/godeps/aigo/engine/poll"

result, err := poll.PollV2(ctx, poll.Config{
    Interval: 3 * time.Second,
    Backoff:  1.5,
}, func(ctx context.Context) (poll.FetchResult, error) {
    // Query upstream task status
    status := fetchTaskStatus(ctx, taskID)
    return poll.FetchResult{
        Result:  status.URL,
        Done:    status.IsComplete,
        Percent: status.Progress, // 0~1 from upstream task_metrics
    }, nil
})

The ProgressInfo struct (passed to OnProgressV2 callbacks) extends OnProgress with Percent and PreviewURL.

Examples

# Alibaba Cloud
go run ./examples/alibabacloud_qwen_image
go run ./examples/alibabacloud_wan_image
go run ./examples/alibabacloud_zimage
go run ./examples/alibabacloud_wan_t2v
go run ./examples/alibabacloud_wan_r2v
go run ./examples/alibabacloud_wan_videoedit
go run ./examples/alibabacloud_qwen_tts
go run ./examples/alibabacloud_qwen_voice_design
ENGINE=text  go run ./examples/alibabacloud_tripo_3d  # also: ENGINE=image | ENGINE=multi

# New API gateway
go run ./examples/newapi_image
go run ./examples/newapi_speech
go run ./examples/newapi_video
go run ./examples/newapi_seedance_video

# Auto-routing
go run ./examples/agent_auto_router

Testing

go test ./... -cover

All 51 packages achieve 80%+ statement coverage with httptest-based integration tests and table-driven unit tests. Coverage overview:

Package Coverage
engine/newapi/internal/poll 100%
engine/alibabacloud/internal/threedgen 100%
engine/embed/gemini 98%
engine/embed 97%
engine/alibabacloud/internal/graphx 95%
aigo (root) 93%
engine/google 93%
engine/luma 92%
engine/ark 92%
engine/openrouter 92%
engine/liblib 92%
workflow/resolve 91%
engine/httpx 91%
engine/runninghub 91%
engine/comfyui 91%
engine/alibabacloud/internal/imggen 91%
engine/alibabacloud/internal/async 91%
engine/comfydeploy 91%
engine/volcvoice 90%
engine/fal 90%
engine/poll 90%
engine/newapi 90%
tooldef 90%
engine/jimeng 90%
engine/openai 89%
engine/flux 89%
engine/embed/jina 88%
engine/newapi/internal/rt 88%
engine/minimax 86%
engine/ideogram 86%
engine/elevenlabs 86%
engine/stability 86%
engine/embed/voyage 86%
engine/aigoerr 86%
engine/gemini 86%
engine/hedra 86%
engine/pika 85%
engine/alibabacloud/internal/audiogen 85%
engine/runway 85%
engine/embed/openai 85%
workflow 84%
engine/suno 84%
engine/meshy 84%
engine/kling 84%
engine/embed/alibabacloud 84%
engine/hailuo 84%
engine/alibabacloud 83%
engine/replicate 83%
engine/gpt4o 83%
engine/alibabacloud/internal/vidgen 83%
engine/qwenvl 83%
engine/newapi/internal/graph 82%
engine/recraft 81%
engine 81%
engine/midjourney 80%

Notes

  • Alibaba Cloud result URLs are temporary OSS links. Persist them immediately.
  • All async engines support WaitForCompletion mode for synchronous use and Resume() for reconnecting to running tasks.
  • All engines use unified API key resolution via engine.ResolveKey — configure via struct field or environment variable.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages