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.
Agent (LLM / code)
│
▼
AgentTask ──► BuildGraph() ──► workflow.Graph (DAG)
│
┌─────────┬──────────┼──────────┬──────────┐
▼ ▼ ▼ ▼ ▼
engine/kling engine/luma engine/fal ... engine/comfyui
│ │ │ │
▼ ▼ ▼ ▼
Kling API Luma API Fal API ComfyUI WS
| 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 |
| 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 |
| 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 |
| 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 |
| Engine | Backend | Env Var |
|---|---|---|
gemini |
Google Gemini (vision + text) | GEMINI_API_KEY |
gpt4o |
OpenAI GPT-4o Vision | OPENAI_API_KEY |
| 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 |
| 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 |
| 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.
go get github.com/godeps/aigoclient := 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 durationEvery 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 Valueresult, 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"},
},
})result, err := client.ExecuteTask(ctx, "tts", aigo.AgentTask{
Prompt: "Welcome to our product launch event",
TTS: &aigo.TTSOptions{
Voice: "zhiyan",
LanguageType: "zh",
},
})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",
},
})client.RegisterAll(map[string]engine.Engine{
"img": alibabacloud.New(alibabacloud.Config{Model: alibabacloud.ModelQwenImage}),
"video": kling.New(kling.Config{Model: kling.ModelKlingV2Master}),
})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
})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.
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.
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"
)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.
| 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 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
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.
videoModels := client.ModelInfosByCapability("video")
for _, m := range videoModels {
fmt.Printf("%s — %s\n", m.Name, m.DisplayName["en"])
}klingModels := client.ModelInfosByProvider("kling")
// Returns all ModelInfo entries registered by the kling engine packagemeta := engine.LookupEngineMetadata("kling")
fmt.Println(meta.DisplayName["en"]) // "Kling AI"
fmt.Println(meta.Intro["en"]) // detailed introduction
fmt.Println(meta.DocURL) // official documentation URLErrors 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
}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_musicCentralized 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()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")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") { ... }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")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.
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 resultsBuilt-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 20Add cross-cutting concerns (logging, retry, timing):
client.Use(aigo.WithLogging(os.Stderr))
client.Use(aigo.WithRetry(3)) // retry retryable errors up to 3 timesChain 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 resultCheck 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 issuesLet 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 resultRichSelector 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)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 remainPick 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)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" otherwiseTry 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)Combine selector-based routing with automatic failover:
result, err := client.ExecuteTaskAutoWithFallback(ctx, selector, task)
// Selector picks the best engine; if it fails, tries remaining candidatesNon-blocking execution via channel:
ch := client.ExecuteAsync(ctx, "video", graph)
// ... do other work ...
ar := <-ch
if ar.Err != nil { ... }
fmt.Println(ar.Result.Value)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)| 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 |
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.
# 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_routergo test ./... -coverAll 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% |
- Alibaba Cloud result URLs are temporary OSS links. Persist them immediately.
- All async engines support
WaitForCompletionmode for synchronous use andResume()for reconnecting to running tasks. - All engines use unified API key resolution via
engine.ResolveKey— configure via struct field or environment variable.