feat: implement AI gateway phase one runtime

This commit is contained in:
wangbo 2026-05-09 21:18:32 +08:00
parent a5e66e79cd
commit fdcdcd477b
46 changed files with 5678 additions and 768 deletions

View File

@ -0,0 +1,120 @@
package clients
import (
"context"
"encoding/json"
"net/http"
"net/http/httptest"
"testing"
"github.com/easyai/easyai-ai-gateway/apps/api/internal/store"
)
func TestOpenAIClientChatContract(t *testing.T) {
var gotPath string
var gotAuth string
var gotModel string
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
gotPath = r.URL.Path
gotAuth = r.Header.Get("Authorization")
var body map[string]any
if err := json.NewDecoder(r.Body).Decode(&body); err != nil {
t.Fatalf("decode request: %v", err)
}
gotModel, _ = body["model"].(string)
_ = json.NewEncoder(w).Encode(map[string]any{
"id": "chatcmpl-test",
"object": "chat.completion",
"model": gotModel,
"choices": []any{map[string]any{
"message": map[string]any{"role": "assistant", "content": "ok"},
}},
"usage": map[string]any{"prompt_tokens": 3, "completion_tokens": 2, "total_tokens": 5},
})
}))
defer server.Close()
response, err := (OpenAIClient{HTTPClient: server.Client()}).Run(context.Background(), Request{
Kind: "chat.completions",
Model: "openai:gpt-4o-mini",
Body: map[string]any{"model": "openai:gpt-4o-mini", "messages": []any{map[string]any{"role": "user", "content": "ping"}}},
Candidate: store.RuntimeModelCandidate{
BaseURL: server.URL,
ModelName: "gpt-4o-mini",
Credentials: map[string]any{"apiKey": "test-key"},
},
})
if err != nil {
t.Fatalf("run openai client: %v", err)
}
if gotPath != "/chat/completions" || gotAuth != "Bearer test-key" || gotModel != "gpt-4o-mini" {
t.Fatalf("unexpected request path=%s auth=%s model=%s", gotPath, gotAuth, gotModel)
}
if response.Usage.TotalTokens != 5 || response.Result["id"] != "chatcmpl-test" {
t.Fatalf("unexpected response: %+v", response)
}
}
func TestGeminiClientChatContract(t *testing.T) {
var gotPath string
var gotKey string
var gotText string
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
gotPath = r.URL.Path
gotKey = r.URL.Query().Get("key")
var body map[string]any
if err := json.NewDecoder(r.Body).Decode(&body); err != nil {
t.Fatalf("decode request: %v", err)
}
contents, _ := body["contents"].([]any)
first, _ := contents[0].(map[string]any)
parts, _ := first["parts"].([]any)
part, _ := parts[0].(map[string]any)
gotText, _ = part["text"].(string)
_ = json.NewEncoder(w).Encode(map[string]any{
"candidates": []any{map[string]any{
"content": map[string]any{
"parts": []any{map[string]any{"text": "gemini ok"}},
},
}},
"usageMetadata": map[string]any{
"promptTokenCount": 4,
"candidatesTokenCount": 6,
"totalTokenCount": 10,
},
})
}))
defer server.Close()
response, err := (GeminiClient{HTTPClient: server.Client()}).Run(context.Background(), Request{
Kind: "chat.completions",
Model: "gemini:gemini-2.5-flash",
Body: map[string]any{
"model": "gemini:gemini-2.5-flash",
"messages": []any{map[string]any{"role": "user", "content": "ping"}},
},
Candidate: store.RuntimeModelCandidate{
BaseURL: server.URL,
ModelName: "gemini-2.5-flash",
ModelType: "chat",
Credentials: map[string]any{"apiKey": "gemini-key"},
},
})
if err != nil {
t.Fatalf("run gemini client: %v", err)
}
if gotPath != "/v1beta/models/gemini-2.5-flash:generateContent" || gotKey != "gemini-key" || gotText != "ping" {
t.Fatalf("unexpected request path=%s key=%s text=%s", gotPath, gotKey, gotText)
}
if response.Usage.TotalTokens != 10 || extractText(response.Result) != "gemini ok" {
t.Fatalf("unexpected response: %+v", response)
}
}
func extractText(result map[string]any) string {
choices, _ := result["choices"].([]any)
choice, _ := choices[0].(map[string]any)
message, _ := choice["message"].(map[string]any)
text, _ := message["content"].(string)
return text
}

View File

@ -0,0 +1,170 @@
package clients
import (
"bytes"
"context"
"encoding/json"
"fmt"
"net/http"
"net/url"
"strings"
)
type GeminiClient struct {
HTTPClient *http.Client
}
func (c GeminiClient) Run(ctx context.Context, request Request) (Response, error) {
apiKey := credential(request.Candidate.Credentials, "apiKey", "api_key", "key", "token")
if apiKey == "" {
return Response{}, &ClientError{Code: "missing_credentials", Message: "gemini api key is required", Retryable: false}
}
body := geminiBody(request)
raw, _ := json.Marshal(body)
req, err := http.NewRequestWithContext(ctx, http.MethodPost, geminiURL(request.Candidate.BaseURL, request.Candidate.ModelName, apiKey), bytes.NewReader(raw))
if err != nil {
return Response{}, err
}
req.Header.Set("Content-Type", "application/json")
resp, err := httpClient(c.HTTPClient).Do(req)
if err != nil {
return Response{}, &ClientError{Code: "network", Message: err.Error(), Retryable: true}
}
result, err := decodeHTTPResponse(resp)
if err != nil {
return Response{}, err
}
return Response{Result: geminiResult(request, result), Usage: geminiUsage(result), Progress: providerProgress(request)}, nil
}
func geminiURL(baseURL string, model string, apiKey string) string {
base := strings.TrimRight(strings.TrimSpace(baseURL), "/")
if base == "" {
base = "https://generativelanguage.googleapis.com"
}
escapedModel := url.PathEscape(model)
return fmt.Sprintf("%s/v1beta/models/%s:generateContent?key=%s", base, escapedModel, url.QueryEscape(apiKey))
}
func geminiBody(request Request) map[string]any {
if contents, ok := request.Body["contents"]; ok {
return map[string]any{"contents": contents}
}
prompt := firstNonEmptyPrompt(request.Body, "")
if prompt == "" {
prompt = textFromMessages(request.Body)
}
return map[string]any{
"contents": []any{map[string]any{
"role": "user",
"parts": []any{map[string]any{"text": prompt}},
}},
}
}
func geminiResult(request Request, raw map[string]any) map[string]any {
if request.ModelType == "image" {
data := geminiImageData(raw)
if len(data) == 0 {
data = []any{map[string]any{"url": "/static/provider/gemini-image-placeholder.png"}}
}
return map[string]any{
"id": "gemini-image",
"created": nowUnix(),
"model": request.Model,
"data": data,
"raw": raw,
}
}
content := geminiText(raw)
return map[string]any{
"id": "gemini-chat",
"object": "chat.completion",
"created": nowUnix(),
"model": request.Model,
"choices": []any{map[string]any{
"index": 0,
"finish_reason": "stop",
"message": map[string]any{"role": "assistant", "content": content},
}},
"usage": geminiUsageMap(raw),
"raw": raw,
}
}
func textFromMessages(body map[string]any) string {
messages, _ := body["messages"].([]any)
parts := make([]string, 0, len(messages))
for _, message := range messages {
item, _ := message.(map[string]any)
content := item["content"]
switch typed := content.(type) {
case string:
parts = append(parts, typed)
case []any:
for _, part := range typed {
partMap, _ := part.(map[string]any)
if text, ok := partMap["text"].(string); ok {
parts = append(parts, text)
}
}
}
}
return strings.TrimSpace(strings.Join(parts, "\n"))
}
func geminiText(raw map[string]any) string {
candidates, _ := raw["candidates"].([]any)
for _, candidate := range candidates {
candidateMap, _ := candidate.(map[string]any)
content, _ := candidateMap["content"].(map[string]any)
parts, _ := content["parts"].([]any)
for _, part := range parts {
partMap, _ := part.(map[string]any)
if text, ok := partMap["text"].(string); ok && text != "" {
return text
}
}
}
return ""
}
func geminiImageData(raw map[string]any) []any {
candidates, _ := raw["candidates"].([]any)
out := []any{}
for _, candidate := range candidates {
candidateMap, _ := candidate.(map[string]any)
content, _ := candidateMap["content"].(map[string]any)
parts, _ := content["parts"].([]any)
for _, part := range parts {
partMap, _ := part.(map[string]any)
inline, _ := partMap["inlineData"].(map[string]any)
if inline == nil {
inline, _ = partMap["inline_data"].(map[string]any)
}
if data, ok := inline["data"].(string); ok && data != "" {
out = append(out, map[string]any{"b64_json": data, "mime_type": inline["mimeType"]})
}
}
}
return out
}
func geminiUsage(raw map[string]any) Usage {
usageMap := geminiUsageMap(raw)
input := intFromAny(usageMap["prompt_tokens"])
output := intFromAny(usageMap["completion_tokens"])
total := intFromAny(usageMap["total_tokens"])
return Usage{InputTokens: input, OutputTokens: output, TotalTokens: total}
}
func geminiUsageMap(raw map[string]any) map[string]any {
meta, _ := raw["usageMetadata"].(map[string]any)
input := intFromAny(meta["promptTokenCount"])
output := intFromAny(meta["candidatesTokenCount"])
total := intFromAny(meta["totalTokenCount"])
if total == 0 {
total = input + output
}
return map[string]any{"prompt_tokens": input, "completion_tokens": output, "total_tokens": total}
}

View File

@ -0,0 +1,133 @@
package clients
import (
"encoding/json"
"fmt"
"io"
"math"
"net/http"
"strings"
"time"
)
func credential(candidate map[string]any, keys ...string) string {
for _, key := range keys {
if value, ok := candidate[key].(string); ok && strings.TrimSpace(value) != "" {
return strings.TrimSpace(value)
}
}
return ""
}
func boolValue(body map[string]any, key string) bool {
value, _ := body[key].(bool)
return value
}
func stringValue(body map[string]any, key string) string {
value, _ := body[key].(string)
return strings.TrimSpace(value)
}
func intValue(body map[string]any, key string, fallback int) int {
switch value := body[key].(type) {
case float64:
return int(math.Round(value))
case int:
return value
default:
return fallback
}
}
func decodeHTTPResponse(resp *http.Response) (map[string]any, error) {
defer resp.Body.Close()
raw, _ := io.ReadAll(io.LimitReader(resp.Body, 16*1024*1024))
if resp.StatusCode < 200 || resp.StatusCode >= 300 {
return nil, &ClientError{
Code: statusCodeName(resp.StatusCode),
Message: errorMessage(raw, resp.Status),
StatusCode: resp.StatusCode,
Retryable: HTTPRetryable(resp.StatusCode),
}
}
var out map[string]any
if len(raw) == 0 {
return map[string]any{}, nil
}
if err := json.Unmarshal(raw, &out); err != nil {
return nil, &ClientError{Code: "invalid_response", Message: err.Error(), Retryable: false}
}
return out, nil
}
func usageFromOpenAI(result map[string]any) Usage {
usage, _ := result["usage"].(map[string]any)
input := intFromAny(firstPresent(usage["prompt_tokens"], usage["input_tokens"]))
output := intFromAny(firstPresent(usage["completion_tokens"], usage["output_tokens"]))
total := intFromAny(usage["total_tokens"])
if total == 0 {
total = input + output
}
return Usage{InputTokens: input, OutputTokens: output, TotalTokens: total}
}
func intFromAny(value any) int {
switch typed := value.(type) {
case float64:
return int(math.Round(typed))
case int:
return typed
case int64:
return int(typed)
default:
return 0
}
}
func firstPresent(values ...any) any {
for _, value := range values {
if value != nil {
return value
}
}
return nil
}
func errorMessage(raw []byte, fallback string) string {
if len(raw) == 0 {
return fallback
}
var parsed map[string]any
if json.Unmarshal(raw, &parsed) == nil {
if errObj, ok := parsed["error"].(map[string]any); ok {
if message, ok := errObj["message"].(string); ok {
return message
}
}
if message, ok := parsed["message"].(string); ok {
return message
}
}
return string(raw)
}
func statusCodeName(status int) string {
switch status {
case http.StatusTooManyRequests:
return "rate_limit"
case http.StatusRequestTimeout:
return "timeout"
case http.StatusUnauthorized, http.StatusForbidden:
return "auth_failed"
default:
if status >= 500 {
return "server_error"
}
return fmt.Sprintf("http_%d", status)
}
}
func nowUnix() int64 {
return time.Now().Unix()
}

View File

@ -0,0 +1,87 @@
package clients
import (
"bytes"
"context"
"encoding/json"
"net/http"
"strings"
)
type OpenAIClient struct {
HTTPClient *http.Client
}
func (c OpenAIClient) Run(ctx context.Context, request Request) (Response, error) {
apiKey := credential(request.Candidate.Credentials, "apiKey", "api_key", "key", "token")
if apiKey == "" {
return Response{}, &ClientError{Code: "missing_credentials", Message: "openai api key is required", Retryable: false}
}
endpoint := openAIEndpoint(request.Kind)
if endpoint == "" {
return Response{}, &ClientError{Code: "unsupported_kind", Message: "unsupported openai request kind", Retryable: false}
}
body := cloneBody(request.Body)
body["model"] = request.Candidate.ModelName
raw, _ := json.Marshal(body)
req, err := http.NewRequestWithContext(ctx, http.MethodPost, joinURL(request.Candidate.BaseURL, endpoint), bytes.NewReader(raw))
if err != nil {
return Response{}, err
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Authorization", "Bearer "+apiKey)
resp, err := httpClient(c.HTTPClient).Do(req)
if err != nil {
return Response{}, &ClientError{Code: "network", Message: err.Error(), Retryable: true}
}
result, err := decodeHTTPResponse(resp)
if err != nil {
return Response{}, err
}
return Response{Result: result, Usage: usageFromOpenAI(result), Progress: providerProgress(request)}, nil
}
func openAIEndpoint(kind string) string {
switch kind {
case "chat.completions":
return "/chat/completions"
case "responses":
return "/responses"
case "images.generations":
return "/images/generations"
case "images.edits":
return "/images/edits"
default:
return ""
}
}
func cloneBody(body map[string]any) map[string]any {
out := map[string]any{}
for key, value := range body {
out[key] = value
}
return out
}
func joinURL(base string, path string) string {
base = strings.TrimRight(strings.TrimSpace(base), "/")
if base == "" {
base = "https://api.openai.com/v1"
}
return base + path
}
func httpClient(client *http.Client) *http.Client {
if client != nil {
return client
}
return http.DefaultClient
}
func providerProgress(request Request) []Progress {
return []Progress{
{Phase: "submitting", Progress: 0.35, Message: "provider request submitted", Payload: map[string]any{"clientId": request.Candidate.ClientID}},
{Phase: "fetching_result", Progress: 0.8, Message: "provider response received", Payload: map[string]any{"provider": request.Candidate.Provider}},
}
}

View File

@ -0,0 +1,119 @@
package clients
import (
"context"
"fmt"
"strings"
)
type SimulationClient struct{}
func (c SimulationClient) Run(ctx context.Context, request Request) (Response, error) {
_ = ctx
profile := simulationProfile(request)
if profile == "retryable_failure" {
return Response{}, &ClientError{Code: "server_error", Message: "simulated retryable failure", Retryable: true}
}
if profile == "fatal_failure" || profile == "non_retryable_failure" {
return Response{}, &ClientError{Code: "bad_request", Message: "simulated non-retryable failure", Retryable: false}
}
return Response{
Result: simulatedResult(request),
Usage: simulatedUsage(request),
Progress: simulatedProgress(request),
}, nil
}
func simulationProfile(request Request) string {
if value := stringValue(request.Candidate.Credentials, "simulationFailure"); value != "" {
return value
}
if value := stringValue(request.Candidate.PlatformConfig, "simulationFailure"); value != "" {
return value
}
if value := stringValue(request.Body, "simulationProfile"); value != "" {
return value
}
if value := stringValue(request.Body, "testProfile"); value != "" {
return value
}
return "success"
}
func simulatedResult(request Request) map[string]any {
switch request.Kind {
case "chat.completions":
return map[string]any{
"id": "chatcmpl-simulated",
"object": "chat.completion",
"created": nowUnix(),
"model": request.Model,
"choices": []any{map[string]any{
"index": 0,
"finish_reason": "stop",
"message": map[string]any{
"role": "assistant",
"content": fmt.Sprintf("simulation response from %s", request.Candidate.Provider),
},
}},
"usage": map[string]any{"prompt_tokens": 12, "completion_tokens": 8, "total_tokens": 20},
}
case "responses":
return map[string]any{
"id": "resp-simulated",
"object": "response",
"created_at": nowUnix(),
"model": request.Model,
"output_text": fmt.Sprintf("simulation response from %s", request.Candidate.Provider),
"usage": map[string]any{"input_tokens": 12, "output_tokens": 8, "total_tokens": 20},
}
case "images.edits":
return map[string]any{
"id": "img-edit-simulated",
"created": nowUnix(),
"model": request.Model,
"data": []any{map[string]any{
"url": "/static/simulation/image-edit.png",
"revised_prompt": firstNonEmptyPrompt(request.Body, "simulation image edit"),
}},
}
default:
return map[string]any{
"id": "img-simulated",
"created": nowUnix(),
"model": request.Model,
"data": []any{map[string]any{
"url": "/static/simulation/image.png",
"revised_prompt": firstNonEmptyPrompt(request.Body, "simulation image"),
}},
}
}
}
func simulatedUsage(request Request) Usage {
if request.ModelType == "chat" || request.Kind == "responses" {
return Usage{InputTokens: 12, OutputTokens: 8, TotalTokens: 20}
}
return Usage{}
}
func simulatedProgress(request Request) []Progress {
provider := request.Candidate.Provider
if provider == "" {
provider = "simulation"
}
return []Progress{
{Phase: "normalizing", Progress: 0.2, Message: "request normalized", Payload: map[string]any{"provider": provider}},
{Phase: "submitting", Progress: 0.55, Message: "simulation client submitted", Payload: map[string]any{"clientId": request.Candidate.ClientID}},
{Phase: "fetching_result", Progress: 0.85, Message: "simulation result ready", Payload: map[string]any{"kind": request.Kind}},
}
}
func firstNonEmptyPrompt(body map[string]any, fallback string) string {
for _, key := range []string{"prompt", "input"} {
if value := strings.TrimSpace(stringValue(body, key)); value != "" {
return value
}
}
return fallback
}

View File

@ -0,0 +1,72 @@
package clients
import (
"context"
"errors"
"net/http"
"github.com/easyai/easyai-ai-gateway/apps/api/internal/store"
)
type Request struct {
Kind string
ModelType string
Model string
Body map[string]any
Candidate store.RuntimeModelCandidate
Stream bool
}
type Response struct {
Result map[string]any
Usage Usage
Progress []Progress
}
type Usage struct {
InputTokens int
OutputTokens int
TotalTokens int
}
type Progress struct {
Phase string
Progress float64
Message string
Payload map[string]any
}
type Client interface {
Run(ctx context.Context, request Request) (Response, error)
}
type ClientError struct {
Code string
Message string
StatusCode int
Retryable bool
}
func (e *ClientError) Error() string {
if e.Message != "" {
return e.Message
}
return e.Code
}
func IsRetryable(err error) bool {
var clientErr *ClientError
return errors.As(err, &clientErr) && clientErr.Retryable
}
func ErrorCode(err error) string {
var clientErr *ClientError
if errors.As(err, &clientErr) && clientErr.Code != "" {
return clientErr.Code
}
return "client_error"
}
func HTTPRetryable(status int) bool {
return status == http.StatusTooManyRequests || status == http.StatusRequestTimeout || status >= 500
}

View File

@ -0,0 +1,161 @@
package httpapi
import (
"encoding/json"
"net/http"
"strings"
"github.com/easyai/easyai-ai-gateway/apps/api/internal/store"
)
func (s *Server) listCatalogProviders(w http.ResponseWriter, r *http.Request) {
items, err := s.store.ListCatalogProviders(r.Context())
if err != nil {
s.logger.Error("list catalog providers failed", "error", err)
writeError(w, http.StatusInternalServerError, "list catalog providers failed")
return
}
writeJSON(w, http.StatusOK, map[string]any{"items": items})
}
func (s *Server) createCatalogProvider(w http.ResponseWriter, r *http.Request) {
var input store.CatalogProviderInput
if err := json.NewDecoder(r.Body).Decode(&input); err != nil {
writeError(w, http.StatusBadRequest, "invalid json body")
return
}
if strings.TrimSpace(input.ProviderKey) == "" || strings.TrimSpace(input.DisplayName) == "" {
writeError(w, http.StatusBadRequest, "providerKey and displayName are required")
return
}
item, err := s.store.CreateCatalogProvider(r.Context(), input)
if err != nil {
if store.IsUniqueViolation(err) {
writeError(w, http.StatusConflict, "provider key or code already exists")
return
}
s.logger.Error("create catalog provider failed", "error", err)
writeError(w, http.StatusInternalServerError, "create catalog provider failed")
return
}
writeJSON(w, http.StatusCreated, item)
}
func (s *Server) updateCatalogProvider(w http.ResponseWriter, r *http.Request) {
var input store.CatalogProviderInput
if err := json.NewDecoder(r.Body).Decode(&input); err != nil {
writeError(w, http.StatusBadRequest, "invalid json body")
return
}
if strings.TrimSpace(input.ProviderKey) == "" || strings.TrimSpace(input.DisplayName) == "" {
writeError(w, http.StatusBadRequest, "providerKey and displayName are required")
return
}
item, err := s.store.UpdateCatalogProvider(r.Context(), r.PathValue("providerID"), input)
if err != nil {
if store.IsNotFound(err) {
writeError(w, http.StatusNotFound, "catalog provider not found")
return
}
if store.IsUniqueViolation(err) {
writeError(w, http.StatusConflict, "provider key or code already exists")
return
}
s.logger.Error("update catalog provider failed", "error", err)
writeError(w, http.StatusInternalServerError, "update catalog provider failed")
return
}
writeJSON(w, http.StatusOK, item)
}
func (s *Server) deleteCatalogProvider(w http.ResponseWriter, r *http.Request) {
if err := s.store.DeleteCatalogProvider(r.Context(), r.PathValue("providerID")); err != nil {
if store.IsNotFound(err) {
writeError(w, http.StatusNotFound, "catalog provider not found")
return
}
s.logger.Error("delete catalog provider failed", "error", err)
writeError(w, http.StatusInternalServerError, "delete catalog provider failed")
return
}
w.WriteHeader(http.StatusNoContent)
}
func (s *Server) listBaseModels(w http.ResponseWriter, r *http.Request) {
items, err := s.store.ListBaseModels(r.Context())
if err != nil {
s.logger.Error("list base models failed", "error", err)
writeError(w, http.StatusInternalServerError, "list base models failed")
return
}
writeJSON(w, http.StatusOK, map[string]any{"items": items})
}
func (s *Server) createBaseModel(w http.ResponseWriter, r *http.Request) {
var input store.BaseModelInput
if err := json.NewDecoder(r.Body).Decode(&input); err != nil {
writeError(w, http.StatusBadRequest, "invalid json body")
return
}
if !validBaseModelInput(input) {
writeError(w, http.StatusBadRequest, "providerKey, providerModelName and modelType are required")
return
}
item, err := s.store.CreateBaseModel(r.Context(), input)
if err != nil {
if store.IsUniqueViolation(err) {
writeError(w, http.StatusConflict, "canonical model key already exists")
return
}
s.logger.Error("create base model failed", "error", err)
writeError(w, http.StatusInternalServerError, "create base model failed")
return
}
writeJSON(w, http.StatusCreated, item)
}
func (s *Server) updateBaseModel(w http.ResponseWriter, r *http.Request) {
var input store.BaseModelInput
if err := json.NewDecoder(r.Body).Decode(&input); err != nil {
writeError(w, http.StatusBadRequest, "invalid json body")
return
}
if !validBaseModelInput(input) {
writeError(w, http.StatusBadRequest, "providerKey, providerModelName and modelType are required")
return
}
item, err := s.store.UpdateBaseModel(r.Context(), r.PathValue("baseModelID"), input)
if err != nil {
if store.IsNotFound(err) {
writeError(w, http.StatusNotFound, "base model not found")
return
}
if store.IsUniqueViolation(err) {
writeError(w, http.StatusConflict, "canonical model key already exists")
return
}
s.logger.Error("update base model failed", "error", err)
writeError(w, http.StatusInternalServerError, "update base model failed")
return
}
writeJSON(w, http.StatusOK, item)
}
func (s *Server) deleteBaseModel(w http.ResponseWriter, r *http.Request) {
if err := s.store.DeleteBaseModel(r.Context(), r.PathValue("baseModelID")); err != nil {
if store.IsNotFound(err) {
writeError(w, http.StatusNotFound, "base model not found")
return
}
s.logger.Error("delete base model failed", "error", err)
writeError(w, http.StatusInternalServerError, "delete base model failed")
return
}
w.WriteHeader(http.StatusNoContent)
}
func validBaseModelInput(input store.BaseModelInput) bool {
return strings.TrimSpace(input.ProviderKey) != "" &&
strings.TrimSpace(input.ProviderModelName) != "" &&
strings.TrimSpace(input.ModelType) != ""
}

View File

@ -37,12 +37,14 @@ func TestCoreLocalFlow(t *testing.T) {
defer db.Close()
handler := NewServer(config.Config{
AppEnv: "test",
HTTPAddr: ":0",
DatabaseURL: databaseURL,
IdentityMode: "hybrid",
JWTSecret: "test-secret",
CORSAllowedOrigin: "*",
AppEnv: "test",
HTTPAddr: ":0",
DatabaseURL: databaseURL,
IdentityMode: "hybrid",
JWTSecret: "test-secret",
TaskProgressCallbackEnabled: true,
TaskProgressCallbackURL: "http://callback.local/task-progress",
CORSAllowedOrigin: "*",
}, db, slog.New(slog.NewTextHandler(io.Discard, nil)))
server := httptest.NewServer(handler)
defer server.Close()
@ -117,6 +119,9 @@ func TestCoreLocalFlow(t *testing.T) {
t.Fatalf("connect test pool: %v", err)
}
defer testPool.Close()
if _, err := testPool.Exec(ctx, `UPDATE gateway_users SET roles = '["admin"]'::jsonb WHERE username = $1`, username); err != nil {
t.Fatalf("promote smoke user: %v", err)
}
inviteCode := "INVITE-" + suffixText
if _, err := testPool.Exec(ctx, `
@ -167,7 +172,7 @@ VALUES ($1, 5, '{"purpose":"core-flow"}'::jsonb)`, inviteCode); err != nil {
PlatformKey string `json:"platformKey"`
Status string `json:"status"`
}
doJSON(t, server.URL, http.MethodPost, "/api/v1/platforms", loginResponse.AccessToken, map[string]any{
doJSON(t, server.URL, http.MethodPost, "/api/v1/platforms", apiKeyResponse.Secret, map[string]any{
"provider": "openai",
"platformKey": "openai-smoke-" + suffixText,
"name": "OpenAI Smoke",
@ -180,6 +185,47 @@ VALUES ($1, 5, '{"purpose":"core-flow"}'::jsonb)`, inviteCode); err != nil {
t.Fatalf("unexpected platform response: %+v", platform)
}
var baseModels struct {
Items []struct {
ID string `json:"id"`
CanonicalModelKey string `json:"canonicalModelKey"`
ProviderModelName string `json:"providerModelName"`
ModelType string `json:"modelType"`
} `json:"items"`
}
doJSON(t, server.URL, http.MethodGet, "/api/v1/catalog/base-models", apiKeyResponse.Secret, nil, http.StatusOK, &baseModels)
if len(baseModels.Items) < 300 {
t.Fatalf("server-main seed should include the migrated base model catalog: got %d", len(baseModels.Items))
}
baseModelInput := map[string]any{
"providerKey": "openai",
"canonicalModelKey": "openai:smoke-base-" + suffixText,
"providerModelName": "smoke-base-" + suffixText,
"modelType": "text_generate",
"displayName": "Smoke Base Model",
"capabilities": map[string]any{"originalTypes": []string{"text_generate"}},
"metadata": map[string]any{"source": "test"},
}
var createdBaseModel struct {
ID string `json:"id"`
CanonicalModelKey string `json:"canonicalModelKey"`
DisplayName string `json:"displayName"`
}
doJSON(t, server.URL, http.MethodPost, "/api/v1/catalog/base-models", apiKeyResponse.Secret, baseModelInput, http.StatusCreated, &createdBaseModel)
if createdBaseModel.ID == "" || createdBaseModel.CanonicalModelKey != baseModelInput["canonicalModelKey"] {
t.Fatalf("unexpected created base model: %+v", createdBaseModel)
}
baseModelInput["displayName"] = "Smoke Base Model Updated"
var updatedBaseModel struct {
DisplayName string `json:"displayName"`
}
doJSON(t, server.URL, http.MethodPatch, "/api/v1/catalog/base-models/"+createdBaseModel.ID, apiKeyResponse.Secret, baseModelInput, http.StatusOK, &updatedBaseModel)
if updatedBaseModel.DisplayName != "Smoke Base Model Updated" {
t.Fatalf("unexpected updated base model: %+v", updatedBaseModel)
}
doJSON(t, server.URL, http.MethodDelete, "/api/v1/catalog/base-models/"+createdBaseModel.ID, apiKeyResponse.Secret, nil, http.StatusNoContent, nil)
var taskResponse struct {
Task struct {
ID string `json:"id"`
@ -198,6 +244,109 @@ VALUES ($1, 5, '{"purpose":"core-flow"}'::jsonb)`, inviteCode); err != nil {
t.Fatalf("unexpected task response: %+v", taskResponse.Task)
}
var compatChat map[string]any
doJSON(t, server.URL, http.MethodPost, "/v1/chat/completions", apiKeyResponse.Secret, map[string]any{
"model": "gpt-4o-mini",
"runMode": "simulation",
"messages": []map[string]any{{"role": "user", "content": "ping"}},
"simulation": true,
}, http.StatusOK, &compatChat)
if compatChat["object"] != "chat.completion" {
t.Fatalf("unexpected compatible chat response: %+v", compatChat)
}
var imageResponse struct {
Task struct {
ID string `json:"id"`
Status string `json:"status"`
Result map[string]any `json:"result"`
} `json:"task"`
}
doJSON(t, server.URL, http.MethodPost, "/api/v1/images/generations", apiKeyResponse.Secret, map[string]any{
"model": "gpt-image-1",
"runMode": "simulation",
"prompt": "a tiny gateway console",
"size": "1024x1024",
"quality": "medium",
"simulation": true,
}, http.StatusAccepted, &imageResponse)
if imageResponse.Task.Status != "succeeded" || imageResponse.Task.Result["id"] == "" {
t.Fatalf("unexpected image generation task: %+v", imageResponse.Task)
}
var imageEditResponse struct {
Task struct {
ID string `json:"id"`
Status string `json:"status"`
Result map[string]any `json:"result"`
} `json:"task"`
}
doJSON(t, server.URL, http.MethodPost, "/api/v1/images/edits", apiKeyResponse.Secret, map[string]any{
"model": "gpt-image-1",
"runMode": "simulation",
"prompt": "replace background with clean studio light",
"image": "https://example.com/source.png",
"mask": "https://example.com/mask.png",
"simulation": true,
}, http.StatusAccepted, &imageEditResponse)
if imageEditResponse.Task.Status != "succeeded" || imageEditResponse.Task.Result["id"] == "" {
t.Fatalf("unexpected image edit task: %+v", imageEditResponse.Task)
}
failoverModel := "phase1-failover-" + suffixText
var failedPlatform struct {
ID string `json:"id"`
}
doJSON(t, server.URL, http.MethodPost, "/api/v1/platforms", apiKeyResponse.Secret, map[string]any{
"provider": "openai",
"platformKey": "openai-fail-" + suffixText,
"name": "OpenAI Retryable Failure",
"baseUrl": "https://api.openai.com/v1",
"authType": "bearer",
"credentials": map[string]any{"mode": "simulation", "simulationFailure": "retryable_failure"},
"priority": 10,
}, http.StatusCreated, &failedPlatform)
var successPlatform struct {
ID string `json:"id"`
}
doJSON(t, server.URL, http.MethodPost, "/api/v1/platforms", apiKeyResponse.Secret, map[string]any{
"provider": "openai",
"platformKey": "openai-success-" + suffixText,
"name": "OpenAI Retry Success",
"baseUrl": "https://api.openai.com/v1",
"authType": "bearer",
"credentials": map[string]any{"mode": "simulation"},
"priority": 20,
}, http.StatusCreated, &successPlatform)
for _, platformID := range []string{failedPlatform.ID, successPlatform.ID} {
var platformModel map[string]any
doJSON(t, server.URL, http.MethodPost, "/api/v1/platforms/"+platformID+"/models", apiKeyResponse.Secret, map[string]any{
"canonicalModelKey": "openai:gpt-4o-mini",
"modelName": failoverModel,
"modelAlias": failoverModel,
"modelType": "chat",
"displayName": "Failover Smoke",
"retryPolicy": map[string]any{"enabled": true, "maxAttempts": 2},
}, http.StatusCreated, &platformModel)
if platformModel["id"] == "" {
t.Fatalf("platform model was not created: %+v", platformModel)
}
}
var failoverTask struct {
Task struct {
ID string `json:"id"`
Status string `json:"status"`
} `json:"task"`
}
doJSON(t, server.URL, http.MethodPost, "/api/v1/chat/completions", apiKeyResponse.Secret, map[string]any{
"model": failoverModel,
"runMode": "simulation",
"messages": []map[string]any{{"role": "user", "content": "retry please"}},
}, http.StatusAccepted, &failoverTask)
if failoverTask.Task.Status != "succeeded" {
t.Fatalf("failover task should succeed through second client: %+v", failoverTask.Task)
}
var taskDetail struct {
ID string `json:"id"`
Status string `json:"status"`
@ -222,6 +371,32 @@ VALUES ($1, 5, '{"purpose":"core-flow"}'::jsonb)`, inviteCode); err != nil {
if resp.StatusCode != http.StatusOK || !bytes.Contains(body, []byte("task.completed")) {
t.Fatalf("unexpected events response status=%d body=%s", resp.StatusCode, string(body))
}
if !bytes.Contains(body, []byte("task.progress")) {
t.Fatalf("events response should include progress events body=%s", string(body))
}
req, err = http.NewRequest(http.MethodGet, server.URL+"/api/v1/tasks/"+failoverTask.Task.ID+"/events", nil)
if err != nil {
t.Fatalf("build failover events request: %v", err)
}
req.Header.Set("Authorization", "Bearer "+apiKeyResponse.Secret)
resp, err = http.DefaultClient.Do(req)
if err != nil {
t.Fatalf("failover events request: %v", err)
}
defer resp.Body.Close()
body, _ = io.ReadAll(resp.Body)
if resp.StatusCode != http.StatusOK || !bytes.Contains(body, []byte("task.retrying")) {
t.Fatalf("failover events should include retrying event status=%d body=%s", resp.StatusCode, string(body))
}
var callbackRows int
if err := testPool.QueryRow(ctx, `SELECT count(*) FROM gateway_task_callback_outbox WHERE task_id = $1::uuid`, taskResponse.Task.ID).Scan(&callbackRows); err != nil {
t.Fatalf("read callback outbox: %v", err)
}
if callbackRows == 0 {
t.Fatal("task progress callback outbox should receive events")
}
}
func TestOriginAllowedSupportsCommaSeparatedOrigins(t *testing.T) {

View File

@ -164,6 +164,32 @@ func (s *Server) createPlatform(w http.ResponseWriter, r *http.Request) {
writeJSON(w, http.StatusCreated, platform)
}
func (s *Server) createPlatformModel(w http.ResponseWriter, r *http.Request) {
var input store.CreatePlatformModelInput
if err := json.NewDecoder(r.Body).Decode(&input); err != nil {
writeError(w, http.StatusBadRequest, "invalid json body")
return
}
if pathPlatformID := r.PathValue("platformID"); pathPlatformID != "" {
input.PlatformID = pathPlatformID
}
if input.PlatformID == "" {
writeError(w, http.StatusBadRequest, "platformId is required")
return
}
model, err := s.store.CreatePlatformModel(r.Context(), input)
if err != nil {
if store.IsNotFound(err) {
writeError(w, http.StatusNotFound, "base model not found")
return
}
s.logger.Error("create platform model failed", "error", err)
writeError(w, http.StatusInternalServerError, "create platform model failed")
return
}
writeJSON(w, http.StatusCreated, model)
}
func (s *Server) listModels(w http.ResponseWriter, r *http.Request) {
models, err := s.store.ListModels(r.Context())
if err != nil {
@ -174,26 +200,6 @@ func (s *Server) listModels(w http.ResponseWriter, r *http.Request) {
writeJSON(w, http.StatusOK, map[string]any{"items": models})
}
func (s *Server) listCatalogProviders(w http.ResponseWriter, r *http.Request) {
items, err := s.store.ListCatalogProviders(r.Context())
if err != nil {
s.logger.Error("list catalog providers failed", "error", err)
writeError(w, http.StatusInternalServerError, "list catalog providers failed")
return
}
writeJSON(w, http.StatusOK, map[string]any{"items": items})
}
func (s *Server) listBaseModels(w http.ResponseWriter, r *http.Request) {
items, err := s.store.ListBaseModels(r.Context())
if err != nil {
s.logger.Error("list base models failed", "error", err)
writeError(w, http.StatusInternalServerError, "list base models failed")
return
}
writeJSON(w, http.StatusOK, map[string]any{"items": items})
}
func (s *Server) listPricingRules(w http.ResponseWriter, r *http.Request) {
items, err := s.store.ListPricingRules(r.Context())
if err != nil {
@ -285,16 +291,32 @@ func (s *Server) disableAPIKey(w http.ResponseWriter, r *http.Request) {
}
func (s *Server) estimatePricing(w http.ResponseWriter, r *http.Request) {
user, _ := auth.UserFromContext(r.Context())
var body map[string]any
if err := json.NewDecoder(r.Body).Decode(&body); err != nil {
writeError(w, http.StatusBadRequest, "invalid json body")
return
}
writeJSON(w, http.StatusOK, map[string]any{
"items": []any{},
"resolver": "effective-pricing-placeholder",
"request": body,
})
model, _ := body["model"].(string)
kind, _ := body["kind"].(string)
if kind == "" {
kind = "chat.completions"
}
if model == "" {
writeError(w, http.StatusBadRequest, "model is required")
return
}
estimate, err := s.runner.Estimate(r.Context(), kind, model, body, user)
if err != nil {
if errors.Is(err, store.ErrNoModelCandidate) {
writeError(w, http.StatusNotFound, "no enabled platform model matches request")
return
}
s.logger.Error("estimate pricing failed", "error", err)
writeError(w, http.StatusInternalServerError, "estimate pricing failed")
return
}
writeJSON(w, http.StatusOK, estimate)
}
func (s *Server) listRateLimitWindows(w http.ResponseWriter, r *http.Request) {
@ -307,7 +329,7 @@ func (s *Server) listRateLimitWindows(w http.ResponseWriter, r *http.Request) {
writeJSON(w, http.StatusOK, map[string]any{"items": items})
}
func (s *Server) createTask(kind string) http.Handler {
func (s *Server) createTask(kind string, compatible bool) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
user, ok := auth.UserFromContext(r.Context())
if !ok {
@ -337,9 +359,25 @@ func (s *Server) createTask(kind string) http.Handler {
writeError(w, http.StatusInternalServerError, "create task failed")
return
}
result, runErr := s.runner.Execute(r.Context(), task, user)
if compatible {
if runErr != nil {
writeError(w, statusFromRunError(runErr), runErr.Error())
return
}
if boolValue(body, "stream") {
writeCompatibleStream(w, kind, model, result.Output)
return
}
writeJSON(w, http.StatusOK, result.Output)
return
}
if runErr != nil {
s.logger.Warn("task completed with failure", "kind", kind, "taskId", task.ID, "error", runErr)
}
writeJSON(w, http.StatusAccepted, map[string]any{
"task": task,
"task": result.Task,
"next": map[string]string{
"events": fmt.Sprintf("/api/v1/tasks/%s/events", task.ID),
"detail": fmt.Sprintf("/api/v1/tasks/%s", task.ID),
@ -348,6 +386,22 @@ func (s *Server) createTask(kind string) http.Handler {
})
}
func statusFromRunError(err error) int {
switch {
case errors.Is(err, store.ErrNoModelCandidate):
return http.StatusNotFound
case errors.Is(err, store.ErrRateLimited):
return http.StatusTooManyRequests
default:
return http.StatusBadGateway
}
}
func boolValue(body map[string]any, key string) bool {
value, _ := body[key].(bool)
return value
}
func (s *Server) getTask(w http.ResponseWriter, r *http.Request) {
task, err := s.store.GetTask(r.Context(), r.PathValue("taskID"))
if err == nil {

View File

@ -0,0 +1,94 @@
package httpapi
import (
"encoding/json"
"net/http"
"strings"
"github.com/easyai/easyai-ai-gateway/apps/api/internal/store"
)
func (s *Server) listPricingRuleSets(w http.ResponseWriter, r *http.Request) {
items, err := s.store.ListPricingRuleSets(r.Context())
if err != nil {
s.logger.Error("list pricing rule sets failed", "error", err)
writeError(w, http.StatusInternalServerError, "list pricing rule sets failed")
return
}
writeJSON(w, http.StatusOK, map[string]any{"items": items})
}
func (s *Server) createPricingRuleSet(w http.ResponseWriter, r *http.Request) {
var input store.PricingRuleSetInput
if err := json.NewDecoder(r.Body).Decode(&input); err != nil {
writeError(w, http.StatusBadRequest, "invalid json body")
return
}
if !validPricingRuleSetInput(input) {
writeError(w, http.StatusBadRequest, "ruleSetKey, name and at least one rule are required")
return
}
item, err := s.store.CreatePricingRuleSet(r.Context(), input)
if err != nil {
if store.IsUniqueViolation(err) {
writeError(w, http.StatusConflict, "pricing rule set key already exists")
return
}
s.logger.Error("create pricing rule set failed", "error", err)
writeError(w, http.StatusInternalServerError, "create pricing rule set failed")
return
}
writeJSON(w, http.StatusCreated, item)
}
func (s *Server) updatePricingRuleSet(w http.ResponseWriter, r *http.Request) {
var input store.PricingRuleSetInput
if err := json.NewDecoder(r.Body).Decode(&input); err != nil {
writeError(w, http.StatusBadRequest, "invalid json body")
return
}
if !validPricingRuleSetInput(input) {
writeError(w, http.StatusBadRequest, "ruleSetKey, name and at least one rule are required")
return
}
item, err := s.store.UpdatePricingRuleSet(r.Context(), r.PathValue("ruleSetID"), input)
if err != nil {
if store.IsNotFound(err) {
writeError(w, http.StatusNotFound, "pricing rule set not found")
return
}
if store.IsUniqueViolation(err) {
writeError(w, http.StatusConflict, "pricing rule set key already exists")
return
}
s.logger.Error("update pricing rule set failed", "error", err)
writeError(w, http.StatusInternalServerError, "update pricing rule set failed")
return
}
writeJSON(w, http.StatusOK, item)
}
func (s *Server) deletePricingRuleSet(w http.ResponseWriter, r *http.Request) {
if err := s.store.DeletePricingRuleSet(r.Context(), r.PathValue("ruleSetID")); err != nil {
if store.IsNotFound(err) {
writeError(w, http.StatusNotFound, "pricing rule set not found")
return
}
s.logger.Error("delete pricing rule set failed", "error", err)
writeError(w, http.StatusInternalServerError, "delete pricing rule set failed")
return
}
w.WriteHeader(http.StatusNoContent)
}
func validPricingRuleSetInput(input store.PricingRuleSetInput) bool {
if strings.TrimSpace(input.RuleSetKey) == "" || strings.TrimSpace(input.Name) == "" || len(input.Rules) == 0 {
return false
}
for _, rule := range input.Rules {
if strings.TrimSpace(rule.ResourceType) == "" || strings.TrimSpace(rule.Unit) == "" {
return false
}
}
return true
}

View File

@ -7,6 +7,7 @@ import (
"github.com/easyai/easyai-ai-gateway/apps/api/internal/auth"
"github.com/easyai/easyai-ai-gateway/apps/api/internal/config"
"github.com/easyai/easyai-ai-gateway/apps/api/internal/runner"
"github.com/easyai/easyai-ai-gateway/apps/api/internal/store"
)
@ -14,6 +15,7 @@ type Server struct {
cfg config.Config
store *store.Store
auth *auth.Authenticator
runner *runner.Service
logger *slog.Logger
}
@ -22,6 +24,7 @@ func NewServer(cfg config.Config, db *store.Store, logger *slog.Logger) http.Han
cfg: cfg,
store: db,
auth: auth.New(cfg.JWTSecret, cfg.ServerMainBaseURL, cfg.ServerMainInternalToken),
runner: runner.New(cfg, db, logger),
logger: logger,
}
server.auth.LocalAPIKeyVerifier = db.VerifyLocalAPIKey
@ -33,8 +36,16 @@ func NewServer(cfg config.Config, db *store.Store, logger *slog.Logger) http.Han
mux.Handle("POST /api/v1/auth/register", server.auth.Require(auth.PermissionPublic, http.HandlerFunc(server.register)))
mux.Handle("POST /api/v1/auth/login", server.auth.Require(auth.PermissionPublic, http.HandlerFunc(server.login)))
mux.Handle("GET /api/v1/me", server.auth.Require(auth.PermissionBasic, http.HandlerFunc(server.me)))
mux.Handle("GET /api/v1/public/catalog/providers", server.auth.Require(auth.PermissionPublic, http.HandlerFunc(server.listCatalogProviders)))
mux.Handle("GET /api/v1/public/catalog/base-models", server.auth.Require(auth.PermissionPublic, http.HandlerFunc(server.listBaseModels)))
mux.Handle("GET /api/v1/catalog/providers", server.auth.Require(auth.PermissionPower, http.HandlerFunc(server.listCatalogProviders)))
mux.Handle("POST /api/v1/catalog/providers", server.auth.Require(auth.PermissionManager, http.HandlerFunc(server.createCatalogProvider)))
mux.Handle("PATCH /api/v1/catalog/providers/{providerID}", server.auth.Require(auth.PermissionManager, http.HandlerFunc(server.updateCatalogProvider)))
mux.Handle("DELETE /api/v1/catalog/providers/{providerID}", server.auth.Require(auth.PermissionManager, http.HandlerFunc(server.deleteCatalogProvider)))
mux.Handle("GET /api/v1/catalog/base-models", server.auth.Require(auth.PermissionPower, http.HandlerFunc(server.listBaseModels)))
mux.Handle("POST /api/v1/catalog/base-models", server.auth.Require(auth.PermissionManager, http.HandlerFunc(server.createBaseModel)))
mux.Handle("PATCH /api/v1/catalog/base-models/{baseModelID}", server.auth.Require(auth.PermissionManager, http.HandlerFunc(server.updateBaseModel)))
mux.Handle("DELETE /api/v1/catalog/base-models/{baseModelID}", server.auth.Require(auth.PermissionManager, http.HandlerFunc(server.deleteBaseModel)))
mux.Handle("GET /api/v1/tenants", server.auth.Require(auth.PermissionPower, http.HandlerFunc(server.listTenants)))
mux.Handle("GET /api/v1/users", server.auth.Require(auth.PermissionPower, http.HandlerFunc(server.listUsers)))
mux.Handle("GET /api/v1/user-groups", server.auth.Require(auth.PermissionPower, http.HandlerFunc(server.listUserGroups)))
@ -42,16 +53,32 @@ func NewServer(cfg config.Config, db *store.Store, logger *slog.Logger) http.Han
mux.Handle("POST /api/v1/api-keys", server.auth.Require(auth.PermissionBasic, http.HandlerFunc(server.createAPIKey)))
mux.Handle("PATCH /api/v1/api-keys/{apiKeyID}/disable", server.auth.Require(auth.PermissionBasic, http.HandlerFunc(server.disableAPIKey)))
mux.Handle("GET /api/v1/pricing/rules", server.auth.Require(auth.PermissionPower, http.HandlerFunc(server.listPricingRules)))
mux.Handle("GET /api/v1/pricing/rule-sets", server.auth.Require(auth.PermissionPower, http.HandlerFunc(server.listPricingRuleSets)))
mux.Handle("POST /api/v1/pricing/rule-sets", server.auth.Require(auth.PermissionManager, http.HandlerFunc(server.createPricingRuleSet)))
mux.Handle("PATCH /api/v1/pricing/rule-sets/{ruleSetID}", server.auth.Require(auth.PermissionManager, http.HandlerFunc(server.updatePricingRuleSet)))
mux.Handle("DELETE /api/v1/pricing/rule-sets/{ruleSetID}", server.auth.Require(auth.PermissionManager, http.HandlerFunc(server.deletePricingRuleSet)))
mux.Handle("POST /api/v1/pricing/estimate", server.auth.Require(auth.PermissionBasic, http.HandlerFunc(server.estimatePricing)))
mux.Handle("GET /api/v1/platforms", server.auth.Require(auth.PermissionPower, http.HandlerFunc(server.listPlatforms)))
mux.Handle("POST /api/v1/platforms", server.auth.Require(auth.PermissionManager, http.HandlerFunc(server.createPlatform)))
mux.Handle("POST /api/v1/platforms/{platformID}/models", server.auth.Require(auth.PermissionManager, http.HandlerFunc(server.createPlatformModel)))
mux.Handle("POST /api/v1/platform-models", server.auth.Require(auth.PermissionManager, http.HandlerFunc(server.createPlatformModel)))
mux.Handle("GET /api/v1/models", server.auth.Require(auth.PermissionBasic, http.HandlerFunc(server.listModels)))
mux.Handle("GET /api/v1/runtime/rate-limit-windows", server.auth.Require(auth.PermissionPower, http.HandlerFunc(server.listRateLimitWindows)))
mux.Handle("POST /api/v1/chat/completions", server.auth.Require(auth.PermissionBasic, server.createTask("chat.completions")))
mux.Handle("POST /api/v1/images/generations", server.auth.Require(auth.PermissionBasic, server.createTask("images.generations")))
mux.Handle("POST /api/v1/videos/generations", server.auth.Require(auth.PermissionBasic, server.createTask("videos.generations")))
mux.Handle("POST /api/v1/chat/completions", server.auth.Require(auth.PermissionBasic, server.createTask("chat.completions", false)))
mux.Handle("POST /api/v1/responses", server.auth.Require(auth.PermissionBasic, server.createTask("responses", false)))
mux.Handle("POST /api/v1/images/generations", server.auth.Require(auth.PermissionBasic, server.createTask("images.generations", false)))
mux.Handle("POST /api/v1/images/edits", server.auth.Require(auth.PermissionBasic, server.createTask("images.edits", false)))
mux.Handle("POST /api/v1/videos/generations", server.auth.Require(auth.PermissionBasic, server.createTask("videos.generations", false)))
mux.Handle("GET /api/v1/tasks/{taskID}", server.auth.Require(auth.PermissionBasic, http.HandlerFunc(server.getTask)))
mux.Handle("GET /api/v1/tasks/{taskID}/events", server.auth.Require(auth.PermissionBasic, http.HandlerFunc(server.taskEvents)))
mux.Handle("POST /chat/completions", server.auth.Require(auth.PermissionBasic, server.createTask("chat.completions", true)))
mux.Handle("POST /v1/chat/completions", server.auth.Require(auth.PermissionBasic, server.createTask("chat.completions", true)))
mux.Handle("POST /responses", server.auth.Require(auth.PermissionBasic, server.createTask("responses", true)))
mux.Handle("POST /v1/responses", server.auth.Require(auth.PermissionBasic, server.createTask("responses", true)))
mux.Handle("POST /images/generations", server.auth.Require(auth.PermissionBasic, server.createTask("images.generations", true)))
mux.Handle("POST /v1/images/generations", server.auth.Require(auth.PermissionBasic, server.createTask("images.generations", true)))
mux.Handle("POST /images/edits", server.auth.Require(auth.PermissionBasic, server.createTask("images.edits", true)))
mux.Handle("POST /v1/images/edits", server.auth.Require(auth.PermissionBasic, server.createTask("images.edits", true)))
return server.recover(server.cors(mux))
}

View File

@ -0,0 +1,45 @@
package httpapi
import "net/http"
func writeCompatibleStream(w http.ResponseWriter, kind string, model string, output map[string]any) {
w.Header().Set("Content-Type", "text/event-stream")
w.Header().Set("Cache-Control", "no-cache")
w.Header().Set("Connection", "keep-alive")
content := extractOutputText(output)
if content == "" {
content = "done"
}
if kind == "responses" {
sendSSE(w, "response.output_text.delta", map[string]any{"type": "response.output_text.delta", "delta": content})
sendSSE(w, "response.completed", map[string]any{"type": "response.completed", "response": output})
return
}
sendSSE(w, "message", map[string]any{
"id": output["id"],
"object": "chat.completion.chunk",
"model": model,
"choices": []any{map[string]any{"index": 0, "delta": map[string]any{"content": content}, "finish_reason": nil}},
})
sendSSE(w, "message", map[string]any{
"id": output["id"],
"object": "chat.completion.chunk",
"model": model,
"choices": []any{map[string]any{"index": 0, "delta": map[string]any{}, "finish_reason": "stop"}},
})
}
func extractOutputText(output map[string]any) string {
if text, ok := output["output_text"].(string); ok {
return text
}
choices, _ := output["choices"].([]any)
for _, rawChoice := range choices {
choice, _ := rawChoice.(map[string]any)
message, _ := choice["message"].(map[string]any)
if content, ok := message["content"].(string); ok {
return content
}
}
return ""
}

View File

@ -0,0 +1,40 @@
package runner
import (
"math"
"strings"
)
func stringFromMap(values map[string]any, key string) string {
value, _ := values[key].(string)
return strings.TrimSpace(value)
}
func boolFromMap(values map[string]any, key string) bool {
value, _ := values[key].(bool)
return value
}
func intFromPolicy(values map[string]any, key string) int {
switch value := values[key].(type) {
case int:
return value
case float64:
return int(math.Round(value))
default:
return 0
}
}
func floatFromAny(value any) float64 {
switch typed := value.(type) {
case int:
return float64(typed)
case int64:
return float64(typed)
case float64:
return typed
default:
return 0
}
}

View File

@ -0,0 +1,89 @@
package runner
import (
"context"
"strings"
"github.com/easyai/easyai-ai-gateway/apps/api/internal/auth"
"github.com/easyai/easyai-ai-gateway/apps/api/internal/store"
)
func (s *Service) rateLimitReservations(ctx context.Context, user *auth.User, candidate store.RuntimeModelCandidate, body map[string]any) []store.RateLimitReservation {
out := make([]store.RateLimitReservation, 0)
out = append(out, reservationsFromPolicy("platform_model", candidate.PlatformModelID, effectiveRateLimitPolicy(candidate), body)...)
if group, err := s.store.ResolveUserGroupPolicy(ctx, user); err == nil && group.ID != "" {
out = append(out, reservationsFromPolicy("user_group", group.ID, group.RateLimitPolicy, body)...)
}
return out
}
func effectiveRateLimitPolicy(candidate store.RuntimeModelCandidate) map[string]any {
if hasRules(candidate.ModelRateLimitPolicy) {
return candidate.ModelRateLimitPolicy
}
if hasRules(candidate.PlatformRateLimitPolicy) {
return candidate.PlatformRateLimitPolicy
}
return nil
}
func reservationsFromPolicy(scopeType string, scopeKey string, policy map[string]any, body map[string]any) []store.RateLimitReservation {
if scopeKey == "" || !hasRules(policy) {
return nil
}
rules, _ := policy["rules"].([]any)
out := make([]store.RateLimitReservation, 0, len(rules))
estimatedTokens := estimateRequestTokens(body)
for _, rawRule := range rules {
rule, _ := rawRule.(map[string]any)
metric := strings.TrimSpace(stringFromMap(rule, "metric"))
limit := floatFromAny(rule["limit"])
amount := 1.0
if strings.HasPrefix(metric, "tpm") {
amount = float64(estimatedTokens)
}
out = append(out, store.RateLimitReservation{
ScopeType: scopeType,
ScopeKey: scopeKey,
Metric: metric,
Limit: limit,
Amount: amount,
WindowSeconds: int(floatFromAny(rule["windowSeconds"])),
LeaseTTLSeconds: int(floatFromAny(rule["leaseTtlSeconds"])),
})
}
return out
}
func hasRules(policy map[string]any) bool {
rules, _ := policy["rules"].([]any)
return len(rules) > 0
}
func estimateRequestTokens(body map[string]any) int {
text := ""
if prompt := stringFromMap(body, "prompt"); prompt != "" {
text += prompt
}
if input := stringFromMap(body, "input"); input != "" {
text += input
}
if messages, ok := body["messages"].([]any); ok {
for _, raw := range messages {
message, _ := raw.(map[string]any)
switch content := message["content"].(type) {
case string:
text += content
case []any:
for _, rawPart := range content {
part, _ := rawPart.(map[string]any)
text += stringFromMap(part, "text")
}
}
}
}
if text == "" {
return 1
}
return len([]rune(text))/4 + 1
}

View File

@ -0,0 +1,148 @@
package runner
import (
"context"
"math"
"strings"
"github.com/easyai/easyai-ai-gateway/apps/api/internal/auth"
"github.com/easyai/easyai-ai-gateway/apps/api/internal/clients"
"github.com/easyai/easyai-ai-gateway/apps/api/internal/store"
)
type EstimateResult struct {
Items []any `json:"items"`
Resolver string `json:"resolver"`
}
func (s *Service) Estimate(ctx context.Context, kind string, model string, body map[string]any, user *auth.User) (EstimateResult, error) {
candidates, err := s.store.ListModelCandidates(ctx, model, modelTypeFromKind(kind))
if err != nil {
return EstimateResult{}, err
}
candidate := candidates[0]
usage := clients.Usage{InputTokens: estimateRequestTokens(body), OutputTokens: int(floatFromAny(body["max_tokens"]))}
if usage.OutputTokens == 0 {
usage.OutputTokens = 64
}
usage.TotalTokens = usage.InputTokens + usage.OutputTokens
response := clients.Response{Usage: usage, Result: map[string]any{"usage": map[string]any{
"prompt_tokens": usage.InputTokens,
"completion_tokens": usage.OutputTokens,
"total_tokens": usage.TotalTokens,
}}}
return EstimateResult{
Items: s.billings(ctx, user, kind, body, candidate, response, true),
Resolver: "effective-pricing-v1",
}, nil
}
func (s *Service) billings(ctx context.Context, user *auth.User, kind string, body map[string]any, candidate store.RuntimeModelCandidate, response clients.Response, simulated bool) []any {
config := effectiveBillingConfig(candidate)
discount := effectiveDiscount(ctx, s.store, user, candidate)
if modelTypeFromKind(kind) == "chat" {
inputTokens := response.Usage.InputTokens
outputTokens := response.Usage.OutputTokens
if inputTokens == 0 && outputTokens == 0 {
inputTokens = estimateRequestTokens(body)
outputTokens = 1
}
inputAmount := roundPrice(float64(inputTokens) / 1000 * price(config, "textInputPer1k") * discount)
outputAmount := roundPrice(float64(outputTokens) / 1000 * price(config, "textOutputPer1k") * discount)
return []any{
billingLine(candidate, "text_input", "1k_tokens", inputTokens, inputAmount, discount, simulated),
billingLine(candidate, "text_output", "1k_tokens", outputTokens, outputAmount, discount, simulated),
}
}
count := int(floatFromAny(body["n"]))
if count <= 0 {
count = 1
}
resource := "image"
baseKey := "imageBase"
if kind == "images.edits" {
resource = "image_edit"
baseKey = "editBase"
}
amount := float64(count) * price(config, baseKey) * weighted(config, "qualityWeights", stringFromMap(body, "quality")) * weighted(config, "sizeWeights", stringFromMap(body, "size")) * discount
return []any{billingLine(candidate, resource, "image", count, roundPrice(amount), discount, simulated)}
}
func effectiveBillingConfig(candidate store.RuntimeModelCandidate) map[string]any {
base := candidate.BaseBillingConfig
if len(candidate.BillingConfig) > 0 {
base = candidate.BillingConfig
}
if len(candidate.BillingConfigOverride) > 0 {
base = mergeMap(base, candidate.BillingConfigOverride)
}
return base
}
func effectiveDiscount(ctx context.Context, db *store.Store, user *auth.User, candidate store.RuntimeModelCandidate) float64 {
discount := candidate.DefaultDiscountFactor
if candidate.DiscountFactor > 0 {
discount = candidate.DiscountFactor
}
if discount <= 0 {
discount = 1
}
if group, err := db.ResolveUserGroupPolicy(ctx, user); err == nil {
groupDiscount := floatFromAny(group.BillingDiscountPolicy["discountFactor"])
if groupDiscount > 0 {
discount *= groupDiscount
}
}
return discount
}
func billingLine(candidate store.RuntimeModelCandidate, resourceType string, unit string, quantity any, amount float64, discount float64, simulated bool) map[string]any {
return map[string]any{
"model": candidate.ModelName,
"modelAlias": candidate.ModelAlias,
"provider": candidate.Provider,
"platformId": candidate.PlatformID,
"platformModelId": candidate.PlatformModelID,
"resourceType": resourceType,
"unit": unit,
"quantity": quantity,
"amount": amount,
"currency": "resource",
"discountFactor": discount,
"simulated": simulated,
}
}
func price(config map[string]any, key string) float64 {
value := floatFromAny(config[key])
if value > 0 {
return value
}
return 0
}
func weighted(config map[string]any, key string, name string) float64 {
if strings.TrimSpace(name) == "" {
return 1
}
weights, _ := config[key].(map[string]any)
if value := floatFromAny(weights[name]); value > 0 {
return value
}
return 1
}
func roundPrice(value float64) float64 {
return math.Round(value*1000000) / 1000000
}
func mergeMap(base map[string]any, override map[string]any) map[string]any {
out := map[string]any{}
for key, value := range base {
out[key] = value
}
for key, value := range override {
out[key] = value
}
return out
}

View File

@ -0,0 +1,295 @@
package runner
import (
"context"
"errors"
"log/slog"
"net/http"
"strings"
"time"
"github.com/easyai/easyai-ai-gateway/apps/api/internal/auth"
"github.com/easyai/easyai-ai-gateway/apps/api/internal/clients"
"github.com/easyai/easyai-ai-gateway/apps/api/internal/config"
"github.com/easyai/easyai-ai-gateway/apps/api/internal/store"
)
type Service struct {
cfg config.Config
store *store.Store
logger *slog.Logger
clients map[string]clients.Client
}
type Result struct {
Task store.GatewayTask
Output map[string]any
}
func New(cfg config.Config, db *store.Store, logger *slog.Logger) *Service {
httpClient := &http.Client{Timeout: 120 * time.Second}
return &Service{
cfg: cfg,
store: db,
logger: logger,
clients: map[string]clients.Client{
"openai": clients.OpenAIClient{HTTPClient: httpClient},
"gemini": clients.GeminiClient{HTTPClient: httpClient},
"simulation": clients.SimulationClient{},
},
}
}
func (s *Service) Execute(ctx context.Context, task store.GatewayTask, user *auth.User) (Result, error) {
modelType := modelTypeFromKind(task.Kind)
body := normalizeRequest(task.Kind, task.Request)
if err := validateRequest(task.Kind, body); err != nil {
failed, finishErr := s.failTask(ctx, task.ID, "bad_request", err.Error(), task.RunMode == "simulation")
if finishErr != nil {
return Result{}, finishErr
}
return Result{Task: failed, Output: failed.Result}, err
}
candidates, err := s.store.ListModelCandidates(ctx, task.Model, modelType)
if err != nil {
failed, finishErr := s.failTask(ctx, task.ID, "no_model_candidate", err.Error(), task.RunMode == "simulation")
if finishErr != nil {
return Result{}, finishErr
}
return Result{Task: failed, Output: failed.Result}, err
}
if err := s.store.MarkTaskRunning(ctx, task.ID, modelType, body); err != nil {
return Result{}, err
}
if err := s.emit(ctx, task.ID, "task.progress", "running", "normalizing", 0.15, "request normalized", map[string]any{"modelType": modelType}, task.RunMode == "simulation"); err != nil {
return Result{}, err
}
maxAttempts := maxAttemptsForCandidates(candidates)
var lastErr error
for index, candidate := range candidates {
if index >= maxAttempts {
break
}
attemptNo := index + 1
response, err := s.runCandidate(ctx, task, user, body, candidate, attemptNo)
if err == nil {
billings := s.billings(ctx, user, task.Kind, body, candidate, response, isSimulation(task, candidate))
finished, finishErr := s.store.FinishTaskSuccess(ctx, task.ID, response.Result, billings)
if finishErr != nil {
return Result{}, finishErr
}
if err := s.emit(ctx, task.ID, "task.completed", "succeeded", "completed", 1, "task completed", map[string]any{"result": response.Result, "billings": billings}, isSimulation(task, candidate)); err != nil {
return Result{}, err
}
return Result{Task: finished, Output: response.Result}, nil
}
lastErr = err
retryable := clients.IsRetryable(err)
if !retryable || !retryEnabled(candidate) || attemptNo >= maxAttempts {
break
}
if err := s.emit(ctx, task.ID, "task.retrying", "running", "retry", 0.55, "retrying next client", map[string]any{"attempt": attemptNo, "error": err.Error()}, isSimulation(task, candidate)); err != nil {
return Result{}, err
}
}
code := clients.ErrorCode(lastErr)
message := "task failed"
if lastErr != nil {
message = lastErr.Error()
}
failed, err := s.failTask(ctx, task.ID, code, message, task.RunMode == "simulation")
if err != nil {
return Result{}, err
}
return Result{Task: failed, Output: failed.Result}, lastErr
}
func (s *Service) runCandidate(ctx context.Context, task store.GatewayTask, user *auth.User, body map[string]any, candidate store.RuntimeModelCandidate, attemptNo int) (clients.Response, error) {
simulated := isSimulation(task, candidate)
if err := s.emit(ctx, task.ID, "task.attempt.started", "running", "submitting", 0.25, "client attempt started", map[string]any{"attempt": attemptNo, "clientId": candidate.ClientID}, simulated); err != nil {
return clients.Response{}, err
}
attemptID, err := s.store.CreateTaskAttempt(ctx, store.CreateTaskAttemptInput{
TaskID: task.ID,
AttemptNo: attemptNo,
PlatformID: candidate.PlatformID,
PlatformModelID: candidate.PlatformModelID,
ClientID: candidate.ClientID,
QueueKey: candidate.QueueKey,
Status: "running",
Simulated: simulated,
RequestSnapshot: body,
})
if err != nil {
return clients.Response{}, err
}
reservations := s.rateLimitReservations(ctx, user, candidate, body)
limitResult, err := s.store.ReserveRateLimits(ctx, task.ID, reservations)
if err != nil {
_ = s.store.FinishTaskAttempt(ctx, store.FinishTaskAttemptInput{AttemptID: attemptID, Status: "failed", Retryable: false, ErrorCode: "rate_limit", ErrorMessage: err.Error()})
return clients.Response{}, &clients.ClientError{Code: "rate_limit", Message: err.Error(), Retryable: false}
}
defer s.store.ReleaseConcurrencyLeases(context.WithoutCancel(ctx), limitResult.LeaseIDs)
if err := s.store.RecordClientAssignment(ctx, candidate); err != nil {
return clients.Response{}, err
}
defer s.store.RecordClientRelease(context.WithoutCancel(ctx), candidate.ClientID, "")
client := s.clientFor(candidate, simulated)
response, err := client.Run(ctx, clients.Request{
Kind: task.Kind,
ModelType: candidate.ModelType,
Model: task.Model,
Body: body,
Candidate: candidate,
Stream: boolFromMap(body, "stream"),
})
if err != nil {
retryable := clients.IsRetryable(err)
_ = s.store.FinishTaskAttempt(ctx, store.FinishTaskAttemptInput{
AttemptID: attemptID,
Status: "failed",
Retryable: retryable,
ErrorCode: clients.ErrorCode(err),
ErrorMessage: err.Error(),
})
_ = s.emit(ctx, task.ID, "task.attempt.failed", "running", "attempt_failed", 0.45, err.Error(), map[string]any{"attempt": attemptNo, "retryable": retryable}, simulated)
return clients.Response{}, err
}
uploadedResult, err := s.uploadGeneratedAssets(ctx, response.Result)
if err != nil {
_ = s.store.FinishTaskAttempt(ctx, store.FinishTaskAttemptInput{
AttemptID: attemptID,
Status: "failed",
Retryable: clients.IsRetryable(err),
ErrorCode: clients.ErrorCode(err),
ErrorMessage: err.Error(),
})
return clients.Response{}, err
}
response.Result = uploadedResult
for _, progress := range response.Progress {
if err := s.emit(ctx, task.ID, "task.progress", "running", progress.Phase, progress.Progress, progress.Message, progress.Payload, simulated); err != nil {
return clients.Response{}, err
}
}
if err := s.store.FinishTaskAttempt(ctx, store.FinishTaskAttemptInput{
AttemptID: attemptID,
Status: "succeeded",
ResponseSnapshot: response.Result,
}); err != nil {
return clients.Response{}, err
}
return response, nil
}
func (s *Service) clientFor(candidate store.RuntimeModelCandidate, simulated bool) clients.Client {
if simulated {
return s.clients["simulation"]
}
key := strings.ToLower(candidate.Provider)
if client, ok := s.clients[key]; ok {
return client
}
return s.clients["openai"]
}
func (s *Service) failTask(ctx context.Context, taskID string, code string, message string, simulated bool) (store.GatewayTask, error) {
failed, err := s.store.FinishTaskFailure(ctx, taskID, code, message)
if err != nil {
return store.GatewayTask{}, err
}
if eventErr := s.emit(ctx, taskID, "task.failed", "failed", "failed", 1, message, map[string]any{"code": code}, simulated); eventErr != nil {
return store.GatewayTask{}, eventErr
}
return failed, nil
}
func (s *Service) emit(ctx context.Context, taskID string, eventType string, status string, phase string, progress float64, message string, payload map[string]any, simulated bool) error {
event, err := s.store.AddTaskEvent(ctx, taskID, eventType, status, phase, progress, message, payload, simulated)
if err != nil {
return err
}
if s.cfg.TaskProgressCallbackEnabled {
return s.store.QueueTaskCallback(ctx, event, s.cfg.TaskProgressCallbackURL)
}
return nil
}
func modelTypeFromKind(kind string) string {
switch kind {
case "chat.completions", "responses":
return "chat"
case "images.generations", "images.edits":
return "image"
default:
return "task"
}
}
func isSimulation(task store.GatewayTask, candidate store.RuntimeModelCandidate) bool {
if task.RunMode == "simulation" {
return true
}
return stringFromMap(candidate.Credentials, "mode") == "simulation" || boolFromMap(candidate.PlatformConfig, "testMode")
}
func retryEnabled(candidate store.RuntimeModelCandidate) bool {
if enabled, ok := candidate.ModelRetryPolicy["enabled"].(bool); ok {
return enabled
}
if enabled, ok := candidate.PlatformRetryPolicy["enabled"].(bool); ok {
return enabled
}
return true
}
func maxAttemptsForCandidates(candidates []store.RuntimeModelCandidate) int {
if len(candidates) == 0 {
return 0
}
maxAttempts := len(candidates)
for _, candidate := range candidates {
if value := intFromPolicy(candidate.ModelRetryPolicy, "maxAttempts"); value > 0 && value < maxAttempts {
maxAttempts = value
}
if value := intFromPolicy(candidate.PlatformRetryPolicy, "maxAttempts"); value > 0 && value < maxAttempts {
maxAttempts = value
}
}
if maxAttempts <= 0 {
return 1
}
return maxAttempts
}
func normalizeRequest(kind string, body map[string]any) map[string]any {
out := map[string]any{}
for key, value := range body {
out[key] = value
}
if kind == "responses" && out["messages"] == nil && out["input"] != nil {
out["messages"] = []any{map[string]any{"role": "user", "content": out["input"]}}
}
return out
}
func validateRequest(kind string, body map[string]any) error {
switch kind {
case "chat.completions":
if body["messages"] == nil {
return errors.New("messages is required")
}
case "responses":
if body["input"] == nil && body["messages"] == nil {
return errors.New("input or messages is required")
}
case "images.generations", "images.edits":
if strings.TrimSpace(stringFromMap(body, "prompt")) == "" {
return errors.New("prompt is required")
}
}
return nil
}

View File

@ -0,0 +1,104 @@
package runner
import (
"bytes"
"context"
"encoding/base64"
"encoding/json"
"fmt"
"mime/multipart"
"net/http"
"strings"
"github.com/easyai/easyai-ai-gateway/apps/api/internal/clients"
)
func (s *Service) uploadGeneratedAssets(ctx context.Context, result map[string]any) (map[string]any, error) {
if s.cfg.ServerMainBaseURL == "" || s.cfg.ServerMainInternalToken == "" {
return result, nil
}
data, _ := result["data"].([]any)
if len(data) == 0 {
return result, nil
}
next := map[string]any{}
for key, value := range result {
next[key] = value
}
nextData := make([]any, 0, len(data))
for index, rawItem := range data {
item, _ := rawItem.(map[string]any)
if item == nil {
nextData = append(nextData, rawItem)
continue
}
b64 := stringFromMap(item, "b64_json")
if b64 == "" {
nextData = append(nextData, rawItem)
continue
}
upload, err := s.uploadBase64Image(ctx, b64, index)
if err != nil {
return nil, err
}
merged := map[string]any{}
for key, value := range item {
if key != "b64_json" {
merged[key] = value
}
}
merged["upload"] = upload
if urlValue, ok := upload["url"].(string); ok && urlValue != "" {
merged["url"] = urlValue
}
nextData = append(nextData, merged)
}
next["data"] = nextData
return next, nil
}
func (s *Service) uploadBase64Image(ctx context.Context, b64 string, index int) (map[string]any, error) {
payload, err := base64.StdEncoding.DecodeString(stripDataURLPrefix(b64))
if err != nil {
return nil, &clients.ClientError{Code: "upload_decode_failed", Message: err.Error(), Retryable: false}
}
var body bytes.Buffer
writer := multipart.NewWriter(&body)
fileWriter, err := writer.CreateFormFile("file", fmt.Sprintf("gateway-result-%d.png", index+1))
if err != nil {
return nil, err
}
if _, err := fileWriter.Write(payload); err != nil {
return nil, err
}
_ = writer.WriteField("source", "ai-gateway")
if err := writer.Close(); err != nil {
return nil, err
}
req, err := http.NewRequestWithContext(ctx, http.MethodPost, strings.TrimRight(s.cfg.ServerMainBaseURL, "/")+"/v1/files/upload", &body)
if err != nil {
return nil, err
}
req.Header.Set("Content-Type", writer.FormDataContentType())
req.Header.Set("Authorization", "Bearer "+s.cfg.ServerMainInternalToken)
resp, err := http.DefaultClient.Do(req)
if err != nil {
return nil, &clients.ClientError{Code: "upload_network", Message: err.Error(), Retryable: true}
}
defer resp.Body.Close()
var decoded map[string]any
if err := json.NewDecoder(resp.Body).Decode(&decoded); err != nil {
return nil, &clients.ClientError{Code: "upload_invalid_response", Message: err.Error(), Retryable: false}
}
if resp.StatusCode < 200 || resp.StatusCode >= 300 {
return nil, &clients.ClientError{Code: "upload_failed", Message: "server-main upload failed", StatusCode: resp.StatusCode, Retryable: resp.StatusCode >= 500}
}
return decoded, nil
}
func stripDataURLPrefix(value string) string {
if index := strings.Index(value, ","); strings.HasPrefix(value, "data:") && index >= 0 {
return value[index+1:]
}
return value
}

View File

@ -0,0 +1,190 @@
package store
import (
"context"
"encoding/json"
"strings"
"github.com/jackc/pgx/v5"
)
const baseModelColumns = `
id::text, provider_key, canonical_model_key, provider_model_name, model_type, display_name,
capabilities, base_billing_config, default_rate_limit_policy, metadata, pricing_version,
status, created_at, updated_at`
type BaseModelInput struct {
ProviderKey string `json:"providerKey"`
CanonicalModelKey string `json:"canonicalModelKey"`
ProviderModelName string `json:"providerModelName"`
ModelType string `json:"modelType"`
DisplayName string `json:"displayName"`
Capabilities map[string]any `json:"capabilities"`
BaseBillingConfig map[string]any `json:"baseBillingConfig"`
DefaultRateLimitPolicy map[string]any `json:"defaultRateLimitPolicy"`
Metadata map[string]any `json:"metadata"`
PricingVersion int `json:"pricingVersion"`
Status string `json:"status"`
}
type baseModelScanner interface {
Scan(dest ...any) error
}
func (s *Store) ListBaseModels(ctx context.Context) ([]BaseModel, error) {
rows, err := s.pool.Query(ctx, `
SELECT `+baseModelColumns+`
FROM base_model_catalog
ORDER BY provider_key ASC, model_type ASC, canonical_model_key ASC`)
if err != nil {
return nil, err
}
defer rows.Close()
items := make([]BaseModel, 0)
for rows.Next() {
item, err := scanBaseModel(rows)
if err != nil {
return nil, err
}
items = append(items, item)
}
return items, rows.Err()
}
func (s *Store) CreateBaseModel(ctx context.Context, input BaseModelInput) (BaseModel, error) {
input = normalizeBaseModelInput(input)
capabilities, _ := json.Marshal(emptyObjectIfNil(input.Capabilities))
billingConfig, _ := json.Marshal(emptyObjectIfNil(input.BaseBillingConfig))
rateLimitPolicy, _ := json.Marshal(emptyObjectIfNil(input.DefaultRateLimitPolicy))
metadata, _ := json.Marshal(emptyObjectIfNil(input.Metadata))
return scanBaseModel(s.pool.QueryRow(ctx, `
INSERT INTO base_model_catalog (
provider_id, provider_key, canonical_model_key, provider_model_name, model_type, display_name,
capabilities, base_billing_config, default_rate_limit_policy, metadata, pricing_version, status
)
VALUES (
(SELECT id FROM model_catalog_providers WHERE provider_key = $1 OR provider_code = $1 LIMIT 1),
$1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11
)
RETURNING `+baseModelColumns,
input.ProviderKey,
input.CanonicalModelKey,
input.ProviderModelName,
input.ModelType,
input.DisplayName,
capabilities,
billingConfig,
rateLimitPolicy,
metadata,
input.PricingVersion,
input.Status,
))
}
func (s *Store) UpdateBaseModel(ctx context.Context, id string, input BaseModelInput) (BaseModel, error) {
input = normalizeBaseModelInput(input)
capabilities, _ := json.Marshal(emptyObjectIfNil(input.Capabilities))
billingConfig, _ := json.Marshal(emptyObjectIfNil(input.BaseBillingConfig))
rateLimitPolicy, _ := json.Marshal(emptyObjectIfNil(input.DefaultRateLimitPolicy))
metadata, _ := json.Marshal(emptyObjectIfNil(input.Metadata))
return scanBaseModel(s.pool.QueryRow(ctx, `
UPDATE base_model_catalog
SET provider_id = (SELECT id FROM model_catalog_providers WHERE provider_key = $2 OR provider_code = $2 LIMIT 1),
provider_key = $2,
canonical_model_key = $3,
provider_model_name = $4,
model_type = $5,
display_name = $6,
capabilities = $7,
base_billing_config = $8,
default_rate_limit_policy = $9,
metadata = $10,
pricing_version = $11,
status = $12,
updated_at = now()
WHERE id = $1::uuid
RETURNING `+baseModelColumns,
id,
input.ProviderKey,
input.CanonicalModelKey,
input.ProviderModelName,
input.ModelType,
input.DisplayName,
capabilities,
billingConfig,
rateLimitPolicy,
metadata,
input.PricingVersion,
input.Status,
))
}
func (s *Store) DeleteBaseModel(ctx context.Context, id string) error {
result, err := s.pool.Exec(ctx, `DELETE FROM base_model_catalog WHERE id = $1::uuid`, id)
if err != nil {
return err
}
if result.RowsAffected() == 0 {
return pgx.ErrNoRows
}
return nil
}
func scanBaseModel(scanner baseModelScanner) (BaseModel, error) {
var item BaseModel
var capabilities []byte
var billingConfig []byte
var rateLimitPolicy []byte
var metadata []byte
if err := scanner.Scan(
&item.ID,
&item.ProviderKey,
&item.CanonicalModelKey,
&item.ProviderModelName,
&item.ModelType,
&item.DisplayName,
&capabilities,
&billingConfig,
&rateLimitPolicy,
&metadata,
&item.PricingVersion,
&item.Status,
&item.CreatedAt,
&item.UpdatedAt,
); err != nil {
return BaseModel{}, err
}
item.Capabilities = decodeObject(capabilities)
item.BaseBillingConfig = decodeObject(billingConfig)
item.DefaultRateLimitPolicy = decodeObject(rateLimitPolicy)
item.Metadata = decodeObject(metadata)
return item, nil
}
func normalizeBaseModelInput(input BaseModelInput) BaseModelInput {
input.ProviderKey = strings.TrimSpace(input.ProviderKey)
input.CanonicalModelKey = strings.TrimSpace(input.CanonicalModelKey)
input.ProviderModelName = strings.TrimSpace(input.ProviderModelName)
input.ModelType = strings.TrimSpace(input.ModelType)
input.DisplayName = strings.TrimSpace(input.DisplayName)
input.Status = strings.TrimSpace(input.Status)
if input.CanonicalModelKey == "" && input.ProviderKey != "" && input.ProviderModelName != "" {
input.CanonicalModelKey = input.ProviderKey + ":" + input.ProviderModelName
}
if input.DisplayName == "" {
input.DisplayName = input.ProviderModelName
}
if input.ModelType == "" {
input.ModelType = "text_generate"
}
if input.PricingVersion <= 0 {
input.PricingVersion = 1
}
if input.Status == "" {
input.Status = "active"
}
return input
}

View File

@ -0,0 +1,120 @@
package store
import (
"context"
"fmt"
)
func (s *Store) ListModelCandidates(ctx context.Context, model string, modelType string) ([]RuntimeModelCandidate, error) {
rows, err := s.pool.Query(ctx, `
SELECT p.id::text, p.platform_key, p.name, p.provider, COALESCE(p.base_url, ''),
p.auth_type, p.credentials, p.config, p.default_pricing_mode,
p.default_discount_factor::float8, COALESCE(p.pricing_rule_set_id::text, ''),
p.retry_policy, p.rate_limit_policy,
COALESCE(p.dynamic_priority, p.priority) AS effective_priority,
m.id::text, COALESCE(m.base_model_id::text, ''), COALESCE(b.canonical_model_key, ''),
COALESCE(b.provider_model_name, ''), m.model_name, COALESCE(m.model_alias, ''),
m.model_type, m.display_name, m.capabilities, m.capability_override,
COALESCE(b.base_billing_config, '{}'::jsonb), m.billing_config, m.billing_config_override,
m.pricing_mode, COALESCE(m.discount_factor, 0)::float8, COALESCE(m.pricing_rule_set_id::text, ''),
m.retry_policy, m.rate_limit_policy
FROM platform_models m
JOIN integration_platforms p ON p.id = m.platform_id
LEFT JOIN base_model_catalog b ON b.id = m.base_model_id
LEFT JOIN runtime_client_states s
ON s.client_id = p.platform_key || ':' || m.model_type || ':' || m.model_name
WHERE p.status = 'enabled'
AND p.deleted_at IS NULL
AND m.enabled = true
AND m.model_type = $2
AND (p.cooldown_until IS NULL OR p.cooldown_until <= now())
AND (
m.model_name = $1
OR m.model_alias = $1
OR b.canonical_model_key = $1
OR b.provider_model_name = $1
)
ORDER BY effective_priority ASC,
COALESCE(s.limiter_ratio, 0) ASC,
COALESCE(s.running_count, 0) ASC,
COALESCE(s.waiting_count, 0) ASC,
COALESCE(s.last_assigned_at, to_timestamp(0)) ASC,
m.created_at ASC`, model, modelType)
if err != nil {
return nil, err
}
defer rows.Close()
items := make([]RuntimeModelCandidate, 0)
for rows.Next() {
var item RuntimeModelCandidate
var credentials []byte
var platformConfig []byte
var platformRetryPolicy []byte
var platformRateLimitPolicy []byte
var capabilities []byte
var capabilityOverride []byte
var baseBilling []byte
var billing []byte
var billingOverride []byte
var modelRetryPolicy []byte
var modelRateLimitPolicy []byte
if err := rows.Scan(
&item.PlatformID,
&item.PlatformKey,
&item.PlatformName,
&item.Provider,
&item.BaseURL,
&item.AuthType,
&credentials,
&platformConfig,
&item.DefaultPricingMode,
&item.DefaultDiscountFactor,
&item.PlatformPricingRuleSetID,
&platformRetryPolicy,
&platformRateLimitPolicy,
&item.PlatformPriority,
&item.PlatformModelID,
&item.BaseModelID,
&item.CanonicalModelKey,
&item.ProviderModelName,
&item.ModelName,
&item.ModelAlias,
&item.ModelType,
&item.DisplayName,
&capabilities,
&capabilityOverride,
&baseBilling,
&billing,
&billingOverride,
&item.PricingMode,
&item.DiscountFactor,
&item.ModelPricingRuleSetID,
&modelRetryPolicy,
&modelRateLimitPolicy,
); err != nil {
return nil, err
}
item.Credentials = decodeObject(credentials)
item.PlatformConfig = decodeObject(platformConfig)
item.PlatformRetryPolicy = decodeObject(platformRetryPolicy)
item.PlatformRateLimitPolicy = decodeObject(platformRateLimitPolicy)
item.Capabilities = decodeObject(capabilities)
item.CapabilityOverride = decodeObject(capabilityOverride)
item.BaseBillingConfig = decodeObject(baseBilling)
item.BillingConfig = decodeObject(billing)
item.BillingConfigOverride = decodeObject(billingOverride)
item.ModelRetryPolicy = decodeObject(modelRetryPolicy)
item.ModelRateLimitPolicy = decodeObject(modelRateLimitPolicy)
item.ClientID = fmt.Sprintf("%s:%s:%s", item.PlatformKey, item.ModelType, item.ModelName)
item.QueueKey = item.ClientID
items = append(items, item)
}
if err := rows.Err(); err != nil {
return nil, err
}
if len(items) == 0 {
return nil, ErrNoModelCandidate
}
return items, nil
}

View File

@ -0,0 +1,155 @@
package store
import (
"context"
"encoding/json"
"strings"
"github.com/jackc/pgx/v5"
)
const catalogProviderColumns = `
id::text, provider_key, COALESCE(NULLIF(provider_code, ''), provider_key) AS provider_code,
display_name, provider_type, COALESCE(icon_path, '') AS icon_path,
COALESCE(source, '') AS source, capability_schema, default_rate_limit_policy,
metadata, status, created_at, updated_at`
type CatalogProviderInput struct {
ProviderKey string `json:"providerKey"`
Code string `json:"code"`
DisplayName string `json:"displayName"`
ProviderType string `json:"providerType"`
IconPath string `json:"iconPath"`
Source string `json:"source"`
CapabilitySchema map[string]any `json:"capabilitySchema"`
DefaultRateLimitPolicy map[string]any `json:"defaultRateLimitPolicy"`
Metadata map[string]any `json:"metadata"`
Status string `json:"status"`
}
type catalogProviderScanner interface {
Scan(dest ...any) error
}
func (s *Store) CreateCatalogProvider(ctx context.Context, input CatalogProviderInput) (CatalogProvider, error) {
input = normalizeCatalogProviderInput(input)
capabilitySchema, _ := json.Marshal(emptyObjectIfNil(input.CapabilitySchema))
rateLimitPolicy, _ := json.Marshal(emptyObjectIfNil(input.DefaultRateLimitPolicy))
metadata, _ := json.Marshal(emptyObjectIfNil(input.Metadata))
return scanCatalogProvider(s.pool.QueryRow(ctx, `
INSERT INTO model_catalog_providers (
provider_key, provider_code, display_name, provider_type, icon_path, source,
capability_schema, default_rate_limit_policy, metadata, status
)
VALUES ($1, $2, $3, $4, NULLIF($5, ''), $6, $7, $8, $9, $10)
RETURNING `+catalogProviderColumns,
input.ProviderKey,
input.Code,
input.DisplayName,
input.ProviderType,
input.IconPath,
input.Source,
capabilitySchema,
rateLimitPolicy,
metadata,
input.Status,
))
}
func (s *Store) UpdateCatalogProvider(ctx context.Context, id string, input CatalogProviderInput) (CatalogProvider, error) {
input = normalizeCatalogProviderInput(input)
capabilitySchema, _ := json.Marshal(emptyObjectIfNil(input.CapabilitySchema))
rateLimitPolicy, _ := json.Marshal(emptyObjectIfNil(input.DefaultRateLimitPolicy))
metadata, _ := json.Marshal(emptyObjectIfNil(input.Metadata))
return scanCatalogProvider(s.pool.QueryRow(ctx, `
UPDATE model_catalog_providers
SET provider_key = $2,
provider_code = $3,
display_name = $4,
provider_type = $5,
icon_path = NULLIF($6, ''),
source = $7,
capability_schema = $8,
default_rate_limit_policy = $9,
metadata = $10,
status = $11,
updated_at = now()
WHERE id = $1::uuid
RETURNING `+catalogProviderColumns,
id,
input.ProviderKey,
input.Code,
input.DisplayName,
input.ProviderType,
input.IconPath,
input.Source,
capabilitySchema,
rateLimitPolicy,
metadata,
input.Status,
))
}
func (s *Store) DeleteCatalogProvider(ctx context.Context, id string) error {
result, err := s.pool.Exec(ctx, `DELETE FROM model_catalog_providers WHERE id = $1::uuid`, id)
if err != nil {
return err
}
if result.RowsAffected() == 0 {
return pgx.ErrNoRows
}
return nil
}
func scanCatalogProvider(scanner catalogProviderScanner) (CatalogProvider, error) {
var item CatalogProvider
var capabilitySchema []byte
var rateLimitPolicy []byte
var metadata []byte
if err := scanner.Scan(
&item.ID,
&item.ProviderKey,
&item.Code,
&item.DisplayName,
&item.ProviderType,
&item.IconPath,
&item.Source,
&capabilitySchema,
&rateLimitPolicy,
&metadata,
&item.Status,
&item.CreatedAt,
&item.UpdatedAt,
); err != nil {
return CatalogProvider{}, err
}
item.CapabilitySchema = decodeObject(capabilitySchema)
item.DefaultRateLimitPolicy = decodeObject(rateLimitPolicy)
item.Metadata = decodeObject(metadata)
return item, nil
}
func normalizeCatalogProviderInput(input CatalogProviderInput) CatalogProviderInput {
input.ProviderKey = strings.TrimSpace(input.ProviderKey)
input.Code = strings.TrimSpace(input.Code)
input.DisplayName = strings.TrimSpace(input.DisplayName)
input.ProviderType = strings.TrimSpace(input.ProviderType)
input.IconPath = strings.TrimSpace(input.IconPath)
input.Source = strings.TrimSpace(input.Source)
input.Status = strings.TrimSpace(input.Status)
if input.Code == "" {
input.Code = input.ProviderKey
}
if input.ProviderType == "" {
input.ProviderType = "openai"
}
if input.Source == "" {
input.Source = "gateway"
}
if input.Status == "" {
input.Status = "active"
}
return input
}

View File

@ -0,0 +1,206 @@
package store
import (
"context"
"encoding/json"
"strings"
"github.com/jackc/pgx/v5"
)
type modelCatalogSnapshot struct {
ID string
ProviderKey string
CanonicalModelKey string
ProviderModelName string
ModelType string
DisplayName string
Capabilities map[string]any
BaseBillingConfig map[string]any
DefaultRateLimitPolicy map[string]any
}
func (s *Store) CreatePlatformModel(ctx context.Context, input CreatePlatformModelInput) (PlatformModel, error) {
base, err := s.lookupBaseModel(ctx, input.BaseModelID, input.CanonicalModelKey, input.ModelName)
if err != nil && !IsNotFound(err) {
return PlatformModel{}, err
}
if input.ModelType == "" {
input.ModelType = base.ModelType
}
if input.ModelName == "" {
input.ModelName = base.ProviderModelName
}
if input.DisplayName == "" {
input.DisplayName = firstNonEmpty(base.DisplayName, input.ModelName)
}
if input.PricingMode == "" {
input.PricingMode = "inherit_discount"
}
capabilities := input.Capabilities
if len(capabilities) == 0 {
capabilities = mergeObjects(base.Capabilities, input.CapabilityOverride)
}
billingConfig := input.BillingConfig
if len(billingConfig) == 0 {
billingConfig = mergeObjects(base.BaseBillingConfig, input.BillingConfigOverride)
}
rateLimitPolicy := input.RateLimitPolicy
if len(rateLimitPolicy) == 0 {
rateLimitPolicy = base.DefaultRateLimitPolicy
}
capabilityOverrideJSON, _ := json.Marshal(emptyObjectIfNil(input.CapabilityOverride))
capabilitiesJSON, _ := json.Marshal(emptyObjectIfNil(capabilities))
billingOverrideJSON, _ := json.Marshal(emptyObjectIfNil(input.BillingConfigOverride))
billingJSON, _ := json.Marshal(emptyObjectIfNil(billingConfig))
permissionJSON, _ := json.Marshal(emptyObjectIfNil(input.PermissionConfig))
retryJSON, _ := json.Marshal(emptyObjectIfNil(input.RetryPolicy))
rateLimitJSON, _ := json.Marshal(emptyObjectIfNil(rateLimitPolicy))
discount := any(nil)
if input.DiscountFactor > 0 {
discount = input.DiscountFactor
}
baseID := any(nil)
if base.ID != "" {
baseID = base.ID
}
var model PlatformModel
var capabilityOverrideBytes []byte
var capabilitiesBytes []byte
var billingOverrideBytes []byte
var billingBytes []byte
err = s.pool.QueryRow(ctx, `
INSERT INTO platform_models (
platform_id, base_model_id, model_name, model_alias, model_type, display_name,
capability_override, capabilities, pricing_mode, discount_factor,
pricing_rule_set_id, billing_config_override, billing_config, permission_config, retry_policy, rate_limit_policy, enabled
)
VALUES (
$1::uuid, $2::uuid, $3, NULLIF($4, ''), $5, $6,
$7::jsonb, $8::jsonb, $9, $10::numeric,
NULLIF($11, '')::uuid, $12::jsonb, $13::jsonb, $14::jsonb, $15::jsonb, $16::jsonb, true
)
ON CONFLICT (platform_id, model_name, model_type) DO UPDATE
SET base_model_id = EXCLUDED.base_model_id,
model_alias = EXCLUDED.model_alias,
display_name = EXCLUDED.display_name,
capability_override = EXCLUDED.capability_override,
capabilities = EXCLUDED.capabilities,
pricing_mode = EXCLUDED.pricing_mode,
discount_factor = EXCLUDED.discount_factor,
pricing_rule_set_id = EXCLUDED.pricing_rule_set_id,
billing_config_override = EXCLUDED.billing_config_override,
billing_config = EXCLUDED.billing_config,
permission_config = EXCLUDED.permission_config,
retry_policy = EXCLUDED.retry_policy,
rate_limit_policy = EXCLUDED.rate_limit_policy,
enabled = true,
updated_at = now()
RETURNING id::text, platform_id::text, COALESCE(base_model_id::text, ''), model_name,
COALESCE(model_alias, ''), model_type, display_name, capability_override,
capabilities, pricing_mode, COALESCE(discount_factor, 0)::float8,
COALESCE(pricing_rule_set_id::text, ''), billing_config_override, billing_config, enabled, created_at, updated_at`,
input.PlatformID,
baseID,
input.ModelName,
input.ModelAlias,
input.ModelType,
input.DisplayName,
string(capabilityOverrideJSON),
string(capabilitiesJSON),
input.PricingMode,
discount,
input.PricingRuleSetID,
string(billingOverrideJSON),
string(billingJSON),
string(permissionJSON),
string(retryJSON),
string(rateLimitJSON),
).Scan(
&model.ID,
&model.PlatformID,
&model.BaseModelID,
&model.ModelName,
&model.ModelAlias,
&model.ModelType,
&model.DisplayName,
&capabilityOverrideBytes,
&capabilitiesBytes,
&model.PricingMode,
&model.DiscountFactor,
&model.PricingRuleSetID,
&billingOverrideBytes,
&billingBytes,
&model.Enabled,
&model.CreatedAt,
&model.UpdatedAt,
)
if err != nil {
return PlatformModel{}, err
}
model.CapabilityOverride = decodeObject(capabilityOverrideBytes)
model.Capabilities = decodeObject(capabilitiesBytes)
model.BillingConfigOverride = decodeObject(billingOverrideBytes)
model.BillingConfig = decodeObject(billingBytes)
return model, nil
}
func (s *Store) lookupBaseModel(ctx context.Context, id string, canonicalKey string, modelName string) (modelCatalogSnapshot, error) {
var item modelCatalogSnapshot
var capabilities []byte
var billingConfig []byte
var rateLimitPolicy []byte
err := s.pool.QueryRow(ctx, `
SELECT id::text, provider_key, canonical_model_key, provider_model_name, model_type, display_name,
capabilities, base_billing_config, default_rate_limit_policy
FROM base_model_catalog
WHERE ($1 <> '' AND id = NULLIF($1, '')::uuid)
OR ($2 <> '' AND canonical_model_key = $2)
OR ($3 <> '' AND provider_model_name = $3)
ORDER BY CASE WHEN id::text = $1 THEN 0 WHEN canonical_model_key = $2 THEN 1 ELSE 2 END
LIMIT 1`, strings.TrimSpace(id), strings.TrimSpace(canonicalKey), strings.TrimSpace(modelName)).Scan(
&item.ID,
&item.ProviderKey,
&item.CanonicalModelKey,
&item.ProviderModelName,
&item.ModelType,
&item.DisplayName,
&capabilities,
&billingConfig,
&rateLimitPolicy,
)
if err != nil {
if err == pgx.ErrNoRows {
return modelCatalogSnapshot{}, err
}
return modelCatalogSnapshot{}, err
}
item.Capabilities = decodeObject(capabilities)
item.BaseBillingConfig = decodeObject(billingConfig)
item.DefaultRateLimitPolicy = decodeObject(rateLimitPolicy)
return item, nil
}
func mergeObjects(base map[string]any, override map[string]any) map[string]any {
out := map[string]any{}
for key, value := range base {
out[key] = value
}
for key, value := range override {
out[key] = value
}
if len(out) == 0 {
return nil
}
return out
}
func emptyObjectIfNil(value map[string]any) map[string]any {
if value == nil {
return map[string]any{}
}
return value
}

View File

@ -60,6 +60,7 @@ type Platform struct {
Priority int `json:"priority"`
DefaultPricingMode string `json:"defaultPricingMode"`
DefaultDiscountFactor float64 `json:"defaultDiscountFactor"`
PricingRuleSetID string `json:"pricingRuleSetId,omitempty"`
Config map[string]any `json:"config,omitempty"`
CreatedAt time.Time `json:"createdAt"`
UpdatedAt time.Time `json:"updatedAt"`
@ -75,6 +76,7 @@ type CreatePlatformInput struct {
Config map[string]any `json:"config"`
DefaultPricingMode string `json:"defaultPricingMode"`
DefaultDiscountFactor float64 `json:"defaultDiscountFactor"`
PricingRuleSetID string `json:"pricingRuleSetId"`
Priority int `json:"priority"`
}
@ -123,6 +125,7 @@ type PlatformModel struct {
Capabilities map[string]any `json:"capabilities,omitempty"`
PricingMode string `json:"pricingMode"`
DiscountFactor float64 `json:"discountFactor,omitempty"`
PricingRuleSetID string `json:"pricingRuleSetId,omitempty"`
BillingConfigOverride map[string]any `json:"billingConfigOverride,omitempty"`
BillingConfig map[string]any `json:"billingConfig,omitempty"`
Enabled bool `json:"enabled"`
@ -133,10 +136,14 @@ type PlatformModel struct {
type CatalogProvider struct {
ID string `json:"id"`
ProviderKey string `json:"providerKey"`
Code string `json:"code"`
DisplayName string `json:"displayName"`
ProviderType string `json:"providerType"`
IconPath string `json:"iconPath,omitempty"`
Source string `json:"source,omitempty"`
CapabilitySchema map[string]any `json:"capabilitySchema,omitempty"`
DefaultRateLimitPolicy map[string]any `json:"defaultRateLimitPolicy,omitempty"`
Metadata map[string]any `json:"metadata,omitempty"`
Status string `json:"status"`
CreatedAt time.Time `json:"createdAt"`
UpdatedAt time.Time `json:"updatedAt"`
@ -152,6 +159,7 @@ type BaseModel struct {
Capabilities map[string]any `json:"capabilities,omitempty"`
BaseBillingConfig map[string]any `json:"baseBillingConfig,omitempty"`
DefaultRateLimitPolicy map[string]any `json:"defaultRateLimitPolicy,omitempty"`
Metadata map[string]any `json:"metadata,omitempty"`
PricingVersion int `json:"pricingVersion"`
Status string `json:"status"`
CreatedAt time.Time `json:"createdAt"`
@ -159,17 +167,40 @@ type BaseModel struct {
}
type PricingRule struct {
ID string `json:"id"`
ScopeType string `json:"scopeType"`
ScopeID string `json:"scopeId,omitempty"`
ResourceType string `json:"resourceType"`
Unit string `json:"unit"`
BasePrice float64 `json:"basePrice"`
Currency string `json:"currency"`
BaseWeight map[string]any `json:"baseWeight,omitempty"`
DynamicWeight map[string]any `json:"dynamicWeight,omitempty"`
CreatedAt time.Time `json:"createdAt"`
UpdatedAt time.Time `json:"updatedAt"`
ID string `json:"id"`
RuleSetID string `json:"ruleSetId,omitempty"`
RuleKey string `json:"ruleKey"`
DisplayName string `json:"displayName"`
ScopeType string `json:"scopeType"`
ScopeID string `json:"scopeId,omitempty"`
ResourceType string `json:"resourceType"`
Unit string `json:"unit"`
BasePrice float64 `json:"basePrice"`
Currency string `json:"currency"`
BaseWeight map[string]any `json:"baseWeight,omitempty"`
DynamicWeight map[string]any `json:"dynamicWeight,omitempty"`
CalculatorType string `json:"calculatorType"`
DimensionSchema map[string]any `json:"dimensionSchema,omitempty"`
FormulaConfig map[string]any `json:"formulaConfig,omitempty"`
Priority int `json:"priority"`
Status string `json:"status"`
Metadata map[string]any `json:"metadata,omitempty"`
CreatedAt time.Time `json:"createdAt"`
UpdatedAt time.Time `json:"updatedAt"`
}
type PricingRuleSet struct {
ID string `json:"id"`
RuleSetKey string `json:"ruleSetKey"`
Name string `json:"name"`
Description string `json:"description,omitempty"`
Category string `json:"category"`
Currency string `json:"currency"`
Status string `json:"status"`
Metadata map[string]any `json:"metadata,omitempty"`
Rules []PricingRule `json:"rules,omitempty"`
CreatedAt time.Time `json:"createdAt"`
UpdatedAt time.Time `json:"updatedAt"`
}
type GatewayTenant struct {
@ -305,7 +336,8 @@ type TaskEvent struct {
func (s *Store) ListPlatforms(ctx context.Context) ([]Platform, error) {
rows, err := s.pool.Query(ctx, `
SELECT id::text, provider, platform_key, name, COALESCE(base_url, ''), auth_type, status, priority,
default_pricing_mode, default_discount_factor::float8, config, created_at, updated_at
default_pricing_mode, default_discount_factor::float8, COALESCE(pricing_rule_set_id::text, ''),
config, created_at, updated_at
FROM integration_platforms
ORDER BY priority ASC, created_at DESC`)
if err != nil {
@ -328,6 +360,7 @@ ORDER BY priority ASC, created_at DESC`)
&platform.Priority,
&platform.DefaultPricingMode,
&platform.DefaultDiscountFactor,
&platform.PricingRuleSetID,
&configBytes,
&platform.CreatedAt,
&platform.UpdatedAt,
@ -355,11 +388,11 @@ func (s *Store) CreatePlatform(ctx context.Context, input CreatePlatformInput) (
var platform Platform
var configBytes []byte
err := s.pool.QueryRow(ctx, `
INSERT INTO integration_platforms (provider, platform_key, name, base_url, auth_type, credentials, config, default_pricing_mode, default_discount_factor, priority)
VALUES ($1, COALESCE(NULLIF($2, ''), 'platform_' || replace(gen_random_uuid()::text, '-', '')), $3, $4, $5, $6, $7, $8, $9, $10)
INSERT INTO integration_platforms (provider, platform_key, name, base_url, auth_type, credentials, config, default_pricing_mode, default_discount_factor, pricing_rule_set_id, priority)
VALUES ($1, COALESCE(NULLIF($2, ''), 'platform_' || replace(gen_random_uuid()::text, '-', '')), $3, $4, $5, $6, $7, $8, $9, NULLIF($10, '')::uuid, $11)
RETURNING id::text, provider, platform_key, name, COALESCE(base_url, ''), auth_type, status, priority,
default_pricing_mode, default_discount_factor::float8, config, created_at, updated_at`,
input.Provider, input.PlatformKey, input.Name, input.BaseURL, input.AuthType, credentials, config, input.DefaultPricingMode, input.DefaultDiscountFactor, input.Priority,
default_pricing_mode, default_discount_factor::float8, COALESCE(pricing_rule_set_id::text, ''), config, created_at, updated_at`,
input.Provider, input.PlatformKey, input.Name, input.BaseURL, input.AuthType, credentials, config, input.DefaultPricingMode, input.DefaultDiscountFactor, input.PricingRuleSetID, input.Priority,
).Scan(
&platform.ID,
&platform.Provider,
@ -371,6 +404,7 @@ RETURNING id::text, provider, platform_key, name, COALESCE(base_url, ''), auth_t
&platform.Priority,
&platform.DefaultPricingMode,
&platform.DefaultDiscountFactor,
&platform.PricingRuleSetID,
&configBytes,
&platform.CreatedAt,
&platform.UpdatedAt,
@ -387,7 +421,8 @@ func (s *Store) ListModels(ctx context.Context) ([]PlatformModel, error) {
SELECT m.id::text, m.platform_id::text, COALESCE(m.base_model_id::text, ''), p.provider, p.name,
m.model_name, COALESCE(m.model_alias, ''), m.model_type, m.display_name,
m.capability_override, m.capabilities, m.pricing_mode, COALESCE(m.discount_factor, 0)::float8,
m.billing_config_override, m.billing_config, m.enabled, m.created_at, m.updated_at
COALESCE(m.pricing_rule_set_id::text, ''), m.billing_config_override, m.billing_config,
m.enabled, m.created_at, m.updated_at
FROM platform_models m
JOIN integration_platforms p ON p.id = m.platform_id
ORDER BY m.model_type ASC, m.model_name ASC`)
@ -417,6 +452,7 @@ ORDER BY m.model_type ASC, m.model_name ASC`)
&capabilities,
&model.PricingMode,
&model.DiscountFactor,
&model.PricingRuleSetID,
&billingConfigOverride,
&billingConfig,
&model.Enabled,
@ -436,8 +472,7 @@ ORDER BY m.model_type ASC, m.model_name ASC`)
func (s *Store) ListCatalogProviders(ctx context.Context) ([]CatalogProvider, error) {
rows, err := s.pool.Query(ctx, `
SELECT id::text, provider_key, display_name, provider_type, capability_schema,
default_rate_limit_policy, status, created_at, updated_at
SELECT `+catalogProviderColumns+`
FROM model_catalog_providers
ORDER BY provider_key ASC`)
if err != nil {
@ -447,67 +482,10 @@ ORDER BY provider_key ASC`)
items := make([]CatalogProvider, 0)
for rows.Next() {
var item CatalogProvider
var capabilitySchema []byte
var rateLimitPolicy []byte
if err := rows.Scan(
&item.ID,
&item.ProviderKey,
&item.DisplayName,
&item.ProviderType,
&capabilitySchema,
&rateLimitPolicy,
&item.Status,
&item.CreatedAt,
&item.UpdatedAt,
); err != nil {
item, err := scanCatalogProvider(rows)
if err != nil {
return nil, err
}
item.CapabilitySchema = decodeObject(capabilitySchema)
item.DefaultRateLimitPolicy = decodeObject(rateLimitPolicy)
items = append(items, item)
}
return items, rows.Err()
}
func (s *Store) ListBaseModels(ctx context.Context) ([]BaseModel, error) {
rows, err := s.pool.Query(ctx, `
SELECT id::text, provider_key, canonical_model_key, provider_model_name, model_type, display_name,
capabilities, base_billing_config, default_rate_limit_policy, pricing_version,
status, created_at, updated_at
FROM base_model_catalog
ORDER BY provider_key ASC, model_type ASC, canonical_model_key ASC`)
if err != nil {
return nil, err
}
defer rows.Close()
items := make([]BaseModel, 0)
for rows.Next() {
var item BaseModel
var capabilities []byte
var billingConfig []byte
var rateLimitPolicy []byte
if err := rows.Scan(
&item.ID,
&item.ProviderKey,
&item.CanonicalModelKey,
&item.ProviderModelName,
&item.ModelType,
&item.DisplayName,
&capabilities,
&billingConfig,
&rateLimitPolicy,
&item.PricingVersion,
&item.Status,
&item.CreatedAt,
&item.UpdatedAt,
); err != nil {
return nil, err
}
item.Capabilities = decodeObject(capabilities)
item.BaseBillingConfig = decodeObject(billingConfig)
item.DefaultRateLimitPolicy = decodeObject(rateLimitPolicy)
items = append(items, item)
}
return items, rows.Err()
@ -516,9 +494,11 @@ ORDER BY provider_key ASC, model_type ASC, canonical_model_key ASC`)
func (s *Store) ListPricingRules(ctx context.Context) ([]PricingRule, error) {
rows, err := s.pool.Query(ctx, `
SELECT id::text, scope_type, COALESCE(scope_id::text, ''), resource_type, unit,
base_price::float8, currency, base_weight, dynamic_weight, created_at, updated_at
base_price::float8, currency, base_weight, dynamic_weight,
COALESCE(rule_set_id::text, ''), rule_key, display_name, calculator_type,
dimension_schema, formula_config, priority, status, metadata, created_at, updated_at
FROM model_pricing_rules
ORDER BY scope_type ASC, resource_type ASC, created_at DESC`)
ORDER BY COALESCE(rule_set_id::text, ''), priority ASC, resource_type ASC, created_at DESC`)
if err != nil {
return nil, err
}
@ -529,6 +509,9 @@ ORDER BY scope_type ASC, resource_type ASC, created_at DESC`)
var item PricingRule
var baseWeight []byte
var dynamicWeight []byte
var dimensionSchema []byte
var formulaConfig []byte
var metadata []byte
if err := rows.Scan(
&item.ID,
&item.ScopeType,
@ -539,6 +522,15 @@ ORDER BY scope_type ASC, resource_type ASC, created_at DESC`)
&item.Currency,
&baseWeight,
&dynamicWeight,
&item.RuleSetID,
&item.RuleKey,
&item.DisplayName,
&item.CalculatorType,
&dimensionSchema,
&formulaConfig,
&item.Priority,
&item.Status,
&metadata,
&item.CreatedAt,
&item.UpdatedAt,
); err != nil {
@ -546,6 +538,9 @@ ORDER BY scope_type ASC, resource_type ASC, created_at DESC`)
}
item.BaseWeight = decodeObject(baseWeight)
item.DynamicWeight = decodeObject(dynamicWeight)
item.DimensionSchema = decodeObject(dimensionSchema)
item.FormulaConfig = decodeObject(formulaConfig)
item.Metadata = decodeObject(metadata)
items = append(items, item)
}
return items, rows.Err()
@ -969,6 +964,17 @@ SELECT NOT EXISTS (
).Scan(&tenantID); err != nil {
return GatewayUser{}, err
}
_ = tx.QueryRow(ctx, `
SELECT COALESCE(default_user_group_id::text, '')
FROM gateway_tenants
WHERE id = $1::uuid`, tenantID).Scan(&userGroupID)
if userGroupID == "" {
_ = tx.QueryRow(ctx, `
SELECT id::text
FROM gateway_user_groups
WHERE group_key = 'default' AND status = 'active'
LIMIT 1`).Scan(&userGroupID)
}
if invitationCode != "" {
if err := tx.QueryRow(ctx, `
SELECT i.id::text, COALESCE(i.created_by::text, '')
@ -1182,17 +1188,8 @@ func (s *Store) CreateTask(ctx context.Context, input CreateTaskInput, user *aut
requestBody, _ := json.Marshal(input.Request)
runMode := normalizeRunMode(input.RunMode, input.Request)
status := "queued"
result := map[string]any(nil)
billings := []any(nil)
finished := false
if runMode == "simulation" {
status = "succeeded"
result = simulationResult(input.Kind, input.Model)
billings = simulationBillings(input.Kind, input.Model)
finished = true
}
resultBody, _ := json.Marshal(result)
billingsBody, _ := json.Marshal(billings)
resultBody, _ := json.Marshal(map[string]any(nil))
billingsBody, _ := json.Marshal([]any(nil))
tx, err := s.pool.Begin(ctx)
if err != nil {
@ -1213,12 +1210,12 @@ func (s *Store) CreateTask(ctx context.Context, input CreateTaskInput, user *aut
RETURNING id::text, kind, run_mode, user_id, COALESCE(gateway_user_id::text, ''), user_source,
COALESCE(gateway_tenant_id::text, ''), COALESCE(tenant_id, ''), COALESCE(tenant_key, ''),
COALESCE(user_group_id::text, ''), COALESCE(user_group_key, ''), model, request, status, result, billings, COALESCE(error, ''), created_at, updated_at`,
input.Kind, runMode, user.ID, user.GatewayUserID, user.Source, user.GatewayTenantID, user.TenantID, user.TenantKey, user.APIKeyID, user.UserGroupID, user.UserGroupKey, input.Model, requestBody, status, resultBody, billingsBody, finished,
input.Kind, runMode, user.ID, user.GatewayUserID, user.Source, user.GatewayTenantID, user.TenantID, user.TenantKey, user.APIKeyID, user.UserGroupID, user.UserGroupKey, input.Model, requestBody, status, resultBody, billingsBody, false,
).Scan(&task.ID, &task.Kind, &task.RunMode, &task.UserID, &task.GatewayUserID, &task.UserSource, &task.GatewayTenantID, &task.TenantID, &task.TenantKey, &task.UserGroupID, &task.UserGroupKey, &task.Model, &requestBytes, &task.Status, &resultBytes, &billingsBytes, &task.Error, &task.CreatedAt, &task.UpdatedAt)
if err != nil {
return GatewayTask{}, err
}
events := taskEventsForCreate(task.ID, runMode, status, result)
events := taskEventsForCreate(task.ID, runMode, status, nil)
for _, event := range events {
payload, _ := json.Marshal(event.Payload)
if _, err := tx.Exec(ctx, `
@ -1300,6 +1297,10 @@ func IsNotFound(err error) bool {
return err == pgx.ErrNoRows
}
func IsUniqueViolation(err error) bool {
return isUniqueViolation(err)
}
func isUniqueViolation(err error) bool {
var pgErr *pgconn.PgError
return errors.As(err, &pgErr) && pgErr.Code == "23505"
@ -1452,7 +1453,7 @@ func simulationBillings(kind string, model string) []any {
}
func taskEventsForCreate(taskID string, runMode string, status string, result map[string]any) []TaskEvent {
events := []TaskEvent{{
return []TaskEvent{{
TaskID: taskID,
Seq: 1,
EventType: "task.accepted",
@ -1463,33 +1464,6 @@ func taskEventsForCreate(taskID string, runMode string, status string, result ma
Payload: map[string]any{"taskId": taskID},
Simulated: runMode == "simulation",
}}
if runMode != "simulation" {
return events
}
return append(events,
TaskEvent{
TaskID: taskID,
Seq: 2,
EventType: "task.progress",
Status: "running",
Phase: "simulation",
Progress: 0.5,
Message: "simulation client running",
Payload: map[string]any{"taskId": taskID},
Simulated: true,
},
TaskEvent{
TaskID: taskID,
Seq: 3,
EventType: "task.completed",
Status: status,
Phase: "completed",
Progress: 1,
Message: "simulation completed",
Payload: map[string]any{"taskId": taskID, "result": result},
Simulated: true,
},
)
}
func decodeObject(bytes []byte) map[string]any {

View File

@ -0,0 +1,334 @@
package store
import (
"context"
"encoding/json"
"strings"
"github.com/jackc/pgx/v5"
)
const pricingRuleSetColumns = `
id::text, rule_set_key, name, COALESCE(description, ''), category, currency,
status, metadata, created_at, updated_at`
const pricingRuleColumns = `
id::text, COALESCE(rule_set_id::text, ''), rule_key, display_name, scope_type,
COALESCE(scope_id::text, ''), resource_type, unit, base_price::float8, currency,
base_weight, dynamic_weight, calculator_type, dimension_schema, formula_config,
priority, status, metadata, created_at, updated_at`
type PricingRuleInput struct {
RuleKey string `json:"ruleKey"`
DisplayName string `json:"displayName"`
ResourceType string `json:"resourceType"`
Unit string `json:"unit"`
BasePrice float64 `json:"basePrice"`
Currency string `json:"currency"`
BaseWeight map[string]any `json:"baseWeight"`
DynamicWeight map[string]any `json:"dynamicWeight"`
CalculatorType string `json:"calculatorType"`
DimensionSchema map[string]any `json:"dimensionSchema"`
FormulaConfig map[string]any `json:"formulaConfig"`
Priority int `json:"priority"`
Status string `json:"status"`
Metadata map[string]any `json:"metadata"`
}
type PricingRuleSetInput struct {
RuleSetKey string `json:"ruleSetKey"`
Name string `json:"name"`
Description string `json:"description"`
Category string `json:"category"`
Currency string `json:"currency"`
Status string `json:"status"`
Metadata map[string]any `json:"metadata"`
Rules []PricingRuleInput `json:"rules"`
}
type pricingScanner interface {
Scan(dest ...any) error
}
func (s *Store) ListPricingRuleSets(ctx context.Context) ([]PricingRuleSet, error) {
rows, err := s.pool.Query(ctx, `SELECT `+pricingRuleSetColumns+` FROM model_pricing_rule_sets ORDER BY category ASC, name ASC`)
if err != nil {
return nil, err
}
defer rows.Close()
items := make([]PricingRuleSet, 0)
byID := map[string]int{}
for rows.Next() {
item, err := scanPricingRuleSet(rows)
if err != nil {
return nil, err
}
byID[item.ID] = len(items)
items = append(items, item)
}
if err := rows.Err(); err != nil {
return nil, err
}
ruleRows, err := s.pool.Query(ctx, `
SELECT `+pricingRuleColumns+`
FROM model_pricing_rules
WHERE rule_set_id IS NOT NULL
ORDER BY rule_set_id, priority ASC, resource_type ASC, rule_key ASC`)
if err != nil {
return nil, err
}
defer ruleRows.Close()
for ruleRows.Next() {
rule, err := scanPricingRule(ruleRows)
if err != nil {
return nil, err
}
if index, ok := byID[rule.RuleSetID]; ok {
items[index].Rules = append(items[index].Rules, rule)
}
}
return items, ruleRows.Err()
}
func (s *Store) CreatePricingRuleSet(ctx context.Context, input PricingRuleSetInput) (PricingRuleSet, error) {
input = normalizePricingRuleSet(input)
tx, err := s.pool.Begin(ctx)
if err != nil {
return PricingRuleSet{}, err
}
defer tx.Rollback(ctx)
metadata, _ := json.Marshal(emptyObjectIfNil(input.Metadata))
item, err := scanPricingRuleSet(tx.QueryRow(ctx, `
INSERT INTO model_pricing_rule_sets (rule_set_key, name, description, category, currency, status, metadata)
VALUES ($1, $2, NULLIF($3, ''), $4, $5, $6, $7)
RETURNING `+pricingRuleSetColumns,
input.RuleSetKey, input.Name, input.Description, input.Category, input.Currency, input.Status, metadata,
))
if err != nil {
return PricingRuleSet{}, err
}
if err := insertPricingRules(ctx, tx, item.ID, input.Currency, input.Rules); err != nil {
return PricingRuleSet{}, err
}
if err := tx.Commit(ctx); err != nil {
return PricingRuleSet{}, err
}
item.Rules = pricingInputsToRules(item.ID, input.Currency, input.Rules)
return item, nil
}
func (s *Store) UpdatePricingRuleSet(ctx context.Context, id string, input PricingRuleSetInput) (PricingRuleSet, error) {
input = normalizePricingRuleSet(input)
tx, err := s.pool.Begin(ctx)
if err != nil {
return PricingRuleSet{}, err
}
defer tx.Rollback(ctx)
metadata, _ := json.Marshal(emptyObjectIfNil(input.Metadata))
item, err := scanPricingRuleSet(tx.QueryRow(ctx, `
UPDATE model_pricing_rule_sets
SET rule_set_key = $2,
name = $3,
description = NULLIF($4, ''),
category = $5,
currency = $6,
status = $7,
metadata = $8,
updated_at = now()
WHERE id = $1::uuid
RETURNING `+pricingRuleSetColumns,
id, input.RuleSetKey, input.Name, input.Description, input.Category, input.Currency, input.Status, metadata,
))
if err != nil {
return PricingRuleSet{}, err
}
if _, err := tx.Exec(ctx, `DELETE FROM model_pricing_rules WHERE rule_set_id = $1::uuid`, id); err != nil {
return PricingRuleSet{}, err
}
if err := insertPricingRules(ctx, tx, item.ID, input.Currency, input.Rules); err != nil {
return PricingRuleSet{}, err
}
if err := tx.Commit(ctx); err != nil {
return PricingRuleSet{}, err
}
item.Rules = pricingInputsToRules(item.ID, input.Currency, input.Rules)
return item, nil
}
func (s *Store) DeletePricingRuleSet(ctx context.Context, id string) error {
result, err := s.pool.Exec(ctx, `DELETE FROM model_pricing_rule_sets WHERE id = $1::uuid`, id)
if err != nil {
return err
}
if result.RowsAffected() == 0 {
return pgx.ErrNoRows
}
return nil
}
func insertPricingRules(ctx context.Context, tx pgx.Tx, ruleSetID string, defaultCurrency string, rules []PricingRuleInput) error {
for index, rule := range rules {
rule = normalizePricingRule(rule, index, defaultCurrency)
baseWeight, _ := json.Marshal(emptyObjectIfNil(rule.BaseWeight))
dynamicWeight, _ := json.Marshal(emptyObjectIfNil(rule.DynamicWeight))
dimensionSchema, _ := json.Marshal(emptyObjectIfNil(rule.DimensionSchema))
formulaConfig, _ := json.Marshal(emptyObjectIfNil(rule.FormulaConfig))
metadata, _ := json.Marshal(emptyObjectIfNil(rule.Metadata))
if _, err := tx.Exec(ctx, `
INSERT INTO model_pricing_rules (
rule_set_id, rule_key, display_name, scope_type, scope_id, resource_type,
unit, base_price, currency, base_weight, dynamic_weight, calculator_type,
dimension_schema, formula_config, priority, status, metadata
)
VALUES ($1::uuid, $2, $3, 'rule_set', $1::uuid, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15)`,
ruleSetID, rule.RuleKey, rule.DisplayName, rule.ResourceType, rule.Unit,
rule.BasePrice, rule.Currency, baseWeight, dynamicWeight, rule.CalculatorType,
dimensionSchema, formulaConfig, rule.Priority, rule.Status, metadata,
); err != nil {
return err
}
}
return nil
}
func scanPricingRuleSet(scanner pricingScanner) (PricingRuleSet, error) {
var item PricingRuleSet
var metadata []byte
if err := scanner.Scan(
&item.ID,
&item.RuleSetKey,
&item.Name,
&item.Description,
&item.Category,
&item.Currency,
&item.Status,
&metadata,
&item.CreatedAt,
&item.UpdatedAt,
); err != nil {
return PricingRuleSet{}, err
}
item.Metadata = decodeObject(metadata)
item.Rules = []PricingRule{}
return item, nil
}
func scanPricingRule(scanner pricingScanner) (PricingRule, error) {
var item PricingRule
var baseWeight []byte
var dynamicWeight []byte
var dimensionSchema []byte
var formulaConfig []byte
var metadata []byte
if err := scanner.Scan(
&item.ID,
&item.RuleSetID,
&item.RuleKey,
&item.DisplayName,
&item.ScopeType,
&item.ScopeID,
&item.ResourceType,
&item.Unit,
&item.BasePrice,
&item.Currency,
&baseWeight,
&dynamicWeight,
&item.CalculatorType,
&dimensionSchema,
&formulaConfig,
&item.Priority,
&item.Status,
&metadata,
&item.CreatedAt,
&item.UpdatedAt,
); err != nil {
return PricingRule{}, err
}
item.BaseWeight = decodeObject(baseWeight)
item.DynamicWeight = decodeObject(dynamicWeight)
item.DimensionSchema = decodeObject(dimensionSchema)
item.FormulaConfig = decodeObject(formulaConfig)
item.Metadata = decodeObject(metadata)
return item, nil
}
func normalizePricingRuleSet(input PricingRuleSetInput) PricingRuleSetInput {
input.RuleSetKey = strings.TrimSpace(input.RuleSetKey)
input.Name = strings.TrimSpace(input.Name)
input.Description = strings.TrimSpace(input.Description)
input.Category = strings.TrimSpace(input.Category)
input.Currency = strings.TrimSpace(input.Currency)
input.Status = strings.TrimSpace(input.Status)
if input.Category == "" {
input.Category = "custom"
}
if input.Currency == "" {
input.Currency = "resource"
}
if input.Status == "" {
input.Status = "active"
}
return input
}
func normalizePricingRule(input PricingRuleInput, index int, defaultCurrency string) PricingRuleInput {
input.RuleKey = strings.TrimSpace(input.RuleKey)
input.DisplayName = strings.TrimSpace(input.DisplayName)
input.ResourceType = strings.TrimSpace(input.ResourceType)
input.Unit = strings.TrimSpace(input.Unit)
input.Currency = strings.TrimSpace(input.Currency)
input.CalculatorType = strings.TrimSpace(input.CalculatorType)
input.Status = strings.TrimSpace(input.Status)
if input.RuleKey == "" {
input.RuleKey = "rule_" + strings.ReplaceAll(input.ResourceType+"_"+input.Unit, " ", "_")
}
if input.DisplayName == "" {
input.DisplayName = input.ResourceType
}
if input.Unit == "" {
input.Unit = "item"
}
if input.Currency == "" {
input.Currency = defaultCurrency
}
if input.CalculatorType == "" {
input.CalculatorType = "unit_weight"
}
if input.Priority == 0 {
input.Priority = (index + 1) * 10
}
if input.Status == "" {
input.Status = "active"
}
return input
}
func pricingInputsToRules(ruleSetID string, defaultCurrency string, rules []PricingRuleInput) []PricingRule {
items := make([]PricingRule, 0, len(rules))
for index, input := range rules {
input = normalizePricingRule(input, index, defaultCurrency)
items = append(items, PricingRule{
RuleSetID: ruleSetID,
RuleKey: input.RuleKey,
DisplayName: input.DisplayName,
ScopeType: "rule_set",
ScopeID: ruleSetID,
ResourceType: input.ResourceType,
Unit: input.Unit,
BasePrice: input.BasePrice,
Currency: input.Currency,
BaseWeight: emptyObjectIfNil(input.BaseWeight),
DynamicWeight: emptyObjectIfNil(input.DynamicWeight),
CalculatorType: input.CalculatorType,
DimensionSchema: emptyObjectIfNil(input.DimensionSchema),
FormulaConfig: emptyObjectIfNil(input.FormulaConfig),
Priority: input.Priority,
Status: input.Status,
Metadata: emptyObjectIfNil(input.Metadata),
})
}
return items
}

View File

@ -0,0 +1,109 @@
package store
import (
"context"
"errors"
)
func (s *Store) ReserveRateLimits(ctx context.Context, taskID string, reservations []RateLimitReservation) (RateLimitResult, error) {
tx, err := s.pool.Begin(ctx)
if err != nil {
return RateLimitResult{}, err
}
defer tx.Rollback(ctx)
result := RateLimitResult{}
for _, reservation := range reservations {
if reservation.Limit <= 0 || reservation.Amount <= 0 {
continue
}
if reservation.Metric == "" || reservation.Amount > reservation.Limit {
return RateLimitResult{}, ErrRateLimited
}
if reservation.WindowSeconds <= 0 {
reservation.WindowSeconds = 60
}
if reservation.Metric == "concurrent" {
if reservation.LeaseTTLSeconds <= 0 {
reservation.LeaseTTLSeconds = 120
}
var active float64
if err := tx.QueryRow(ctx, `
SELECT COALESCE(SUM(lease_value), 0)::float8
FROM gateway_concurrency_leases
WHERE scope_type = $1
AND scope_key = $2
AND released_at IS NULL
AND expires_at > now()`,
reservation.ScopeType,
reservation.ScopeKey,
).Scan(&active); err != nil {
return RateLimitResult{}, err
}
if active+reservation.Amount > reservation.Limit {
return RateLimitResult{}, ErrRateLimited
}
var leaseID string
if err := tx.QueryRow(ctx, `
INSERT INTO gateway_concurrency_leases (task_id, scope_type, scope_key, lease_value, expires_at)
VALUES ($1::uuid, $2, $3, $4, now() + ($5::int * interval '1 second'))
RETURNING id::text`,
taskID,
reservation.ScopeType,
reservation.ScopeKey,
reservation.Amount,
reservation.LeaseTTLSeconds,
).Scan(&leaseID); err != nil {
return RateLimitResult{}, err
}
result.LeaseIDs = append(result.LeaseIDs, leaseID)
continue
}
tag, err := tx.Exec(ctx, `
INSERT INTO gateway_rate_limit_counters (
scope_type, scope_key, metric, window_start, limit_value, used_value, reserved_value, reset_at
)
VALUES (
$1, $2, $3, date_trunc('minute', now()), $4, $5, 0,
date_trunc('minute', now()) + ($6::int * interval '1 second')
)
ON CONFLICT (scope_type, scope_key, metric, window_start) DO UPDATE
SET limit_value = EXCLUDED.limit_value,
used_value = gateway_rate_limit_counters.used_value + EXCLUDED.used_value,
reset_at = EXCLUDED.reset_at,
updated_at = now()
WHERE gateway_rate_limit_counters.used_value + EXCLUDED.used_value <= EXCLUDED.limit_value`,
reservation.ScopeType,
reservation.ScopeKey,
reservation.Metric,
reservation.Limit,
reservation.Amount,
reservation.WindowSeconds,
)
if err != nil {
return RateLimitResult{}, err
}
if tag.RowsAffected() == 0 {
return RateLimitResult{}, ErrRateLimited
}
}
return result, tx.Commit(ctx)
}
func (s *Store) ReleaseConcurrencyLeases(ctx context.Context, leaseIDs []string) error {
if len(leaseIDs) == 0 {
return nil
}
for _, leaseID := range leaseIDs {
if leaseID == "" {
continue
}
if _, err := s.pool.Exec(ctx, `
UPDATE gateway_concurrency_leases
SET released_at = now()
WHERE id = $1::uuid AND released_at IS NULL`, leaseID); err != nil && !errors.Is(err, ErrRateLimited) {
return err
}
}
return nil
}

View File

@ -0,0 +1,101 @@
package store
import "errors"
var (
ErrNoModelCandidate = errors.New("no enabled platform model matches request")
ErrRateLimited = errors.New("rate limit exceeded")
)
type CreatePlatformModelInput struct {
PlatformID string `json:"platformId"`
BaseModelID string `json:"baseModelId"`
CanonicalModelKey string `json:"canonicalModelKey"`
ModelName string `json:"modelName"`
ModelAlias string `json:"modelAlias"`
ModelType string `json:"modelType"`
DisplayName string `json:"displayName"`
CapabilityOverride map[string]any `json:"capabilityOverride"`
Capabilities map[string]any `json:"capabilities"`
PricingMode string `json:"pricingMode"`
DiscountFactor float64 `json:"discountFactor"`
PricingRuleSetID string `json:"pricingRuleSetId"`
BillingConfigOverride map[string]any `json:"billingConfigOverride"`
BillingConfig map[string]any `json:"billingConfig"`
PermissionConfig map[string]any `json:"permissionConfig"`
RetryPolicy map[string]any `json:"retryPolicy"`
RateLimitPolicy map[string]any `json:"rateLimitPolicy"`
Enabled bool `json:"enabled"`
}
type RuntimeModelCandidate struct {
PlatformID string
PlatformKey string
PlatformName string
Provider string
BaseURL string
AuthType string
Credentials map[string]any
PlatformConfig map[string]any
DefaultPricingMode string
DefaultDiscountFactor float64
PlatformRetryPolicy map[string]any
PlatformRateLimitPolicy map[string]any
PlatformPriority int
PlatformModelID string
BaseModelID string
CanonicalModelKey string
ProviderModelName string
ModelName string
ModelAlias string
ModelType string
DisplayName string
Capabilities map[string]any
CapabilityOverride map[string]any
BaseBillingConfig map[string]any
BillingConfig map[string]any
BillingConfigOverride map[string]any
PricingMode string
DiscountFactor float64
PlatformPricingRuleSetID string
ModelPricingRuleSetID string
ModelRetryPolicy map[string]any
ModelRateLimitPolicy map[string]any
ClientID string
QueueKey string
}
type RateLimitReservation struct {
ScopeType string
ScopeKey string
Metric string
Limit float64
Amount float64
WindowSeconds int
LeaseTTLSeconds int
}
type RateLimitResult struct {
LeaseIDs []string
}
type CreateTaskAttemptInput struct {
TaskID string
AttemptNo int
PlatformID string
PlatformModelID string
ClientID string
QueueKey string
Status string
Simulated bool
RequestSnapshot map[string]any
}
type FinishTaskAttemptInput struct {
AttemptID string
Status string
Retryable bool
ResponseSnapshot map[string]any
ErrorCode string
ErrorMessage string
}

View File

@ -0,0 +1,217 @@
package store
import (
"context"
"encoding/json"
)
func (s *Store) MarkTaskRunning(ctx context.Context, taskID string, modelType string, normalizedRequest map[string]any) error {
normalizedJSON, _ := json.Marshal(emptyObjectIfNil(normalizedRequest))
_, err := s.pool.Exec(ctx, `
UPDATE gateway_tasks
SET status = 'running',
model_type = NULLIF($2, ''),
normalized_request = $3::jsonb,
locked_at = now(),
heartbeat_at = now(),
updated_at = now()
WHERE id = $1::uuid`, taskID, modelType, string(normalizedJSON))
return err
}
func (s *Store) CreateTaskAttempt(ctx context.Context, input CreateTaskAttemptInput) (string, error) {
requestJSON, _ := json.Marshal(emptyObjectIfNil(input.RequestSnapshot))
tx, err := s.pool.Begin(ctx)
if err != nil {
return "", err
}
defer tx.Rollback(ctx)
var attemptID string
err = tx.QueryRow(ctx, `
INSERT INTO gateway_task_attempts (
task_id, attempt_no, platform_id, platform_model_id, client_id, queue_key,
status, simulated, request_snapshot
)
VALUES (
$1::uuid, $2, NULLIF($3, '')::uuid, NULLIF($4, '')::uuid, NULLIF($5, ''), $6,
$7, $8, $9::jsonb
)
RETURNING id::text`,
input.TaskID,
input.AttemptNo,
input.PlatformID,
input.PlatformModelID,
input.ClientID,
input.QueueKey,
firstNonEmpty(input.Status, "running"),
input.Simulated,
string(requestJSON),
).Scan(&attemptID)
if err != nil {
return "", err
}
if _, err := tx.Exec(ctx, `
UPDATE gateway_tasks
SET attempt_count = GREATEST(attempt_count, $2), updated_at = now()
WHERE id = $1::uuid`, input.TaskID, input.AttemptNo); err != nil {
return "", err
}
return attemptID, tx.Commit(ctx)
}
func (s *Store) FinishTaskAttempt(ctx context.Context, input FinishTaskAttemptInput) error {
responseJSON, _ := json.Marshal(emptyObjectIfNil(input.ResponseSnapshot))
_, err := s.pool.Exec(ctx, `
UPDATE gateway_task_attempts
SET status = $2,
retryable = $3,
response_snapshot = $4::jsonb,
error_code = NULLIF($5, ''),
error_message = NULLIF($6, ''),
finished_at = now()
WHERE id = $1::uuid`,
input.AttemptID,
input.Status,
input.Retryable,
string(responseJSON),
input.ErrorCode,
input.ErrorMessage,
)
return err
}
func (s *Store) FinishTaskSuccess(ctx context.Context, taskID string, result map[string]any, billings []any) (GatewayTask, error) {
resultJSON, _ := json.Marshal(emptyObjectIfNil(result))
billingsJSON, _ := json.Marshal(billings)
if _, err := s.pool.Exec(ctx, `
UPDATE gateway_tasks
SET status = 'succeeded',
result = $2::jsonb,
billings = $3::jsonb,
error = NULL,
error_code = NULL,
error_message = NULL,
finished_at = now(),
updated_at = now()
WHERE id = $1::uuid`, taskID, string(resultJSON), string(billingsJSON)); err != nil {
return GatewayTask{}, err
}
return s.GetTask(ctx, taskID)
}
func (s *Store) FinishTaskFailure(ctx context.Context, taskID string, code string, message string) (GatewayTask, error) {
if _, err := s.pool.Exec(ctx, `
UPDATE gateway_tasks
SET status = 'failed',
error = NULLIF($2, ''),
error_code = NULLIF($3, ''),
error_message = NULLIF($2, ''),
finished_at = now(),
updated_at = now()
WHERE id = $1::uuid`, taskID, message, code); err != nil {
return GatewayTask{}, err
}
return s.GetTask(ctx, taskID)
}
func (s *Store) AddTaskEvent(ctx context.Context, taskID string, eventType string, status string, phase string, progress float64, message string, payload map[string]any, simulated bool) (TaskEvent, error) {
payloadJSON, _ := json.Marshal(emptyObjectIfNil(payload))
var event TaskEvent
var payloadBytes []byte
err := s.pool.QueryRow(ctx, `
WITH next_seq AS (
SELECT COALESCE(MAX(seq), 0) + 1 AS seq
FROM gateway_task_events
WHERE task_id = $1::uuid
)
INSERT INTO gateway_task_events (task_id, seq, event_type, status, phase, progress, message, payload, simulated)
SELECT $1::uuid, next_seq.seq, $2, NULLIF($3, ''), NULLIF($4, ''), $5, NULLIF($6, ''), $7::jsonb, $8
FROM next_seq
RETURNING id::text, task_id::text, seq, event_type, COALESCE(status, ''), COALESCE(phase, ''),
COALESCE(progress, 0)::float8, COALESCE(message, ''), payload, simulated, created_at`,
taskID,
eventType,
status,
phase,
progress,
message,
string(payloadJSON),
simulated,
).Scan(
&event.ID,
&event.TaskID,
&event.Seq,
&event.EventType,
&event.Status,
&event.Phase,
&event.Progress,
&event.Message,
&payloadBytes,
&event.Simulated,
&event.CreatedAt,
)
if err != nil {
return TaskEvent{}, err
}
event.Payload = decodeObject(payloadBytes)
return event, nil
}
func (s *Store) QueueTaskCallback(ctx context.Context, event TaskEvent, callbackURL string) error {
if callbackURL == "" {
return nil
}
payloadJSON, _ := json.Marshal(map[string]any{
"taskId": event.TaskID,
"seq": event.Seq,
"eventType": event.EventType,
"status": event.Status,
"phase": event.Phase,
"progress": event.Progress,
"message": event.Message,
"payload": event.Payload,
"simulated": event.Simulated,
"createdAt": event.CreatedAt,
})
_, err := s.pool.Exec(ctx, `
INSERT INTO gateway_task_callback_outbox (task_id, event_id, seq, callback_url, payload)
VALUES ($1::uuid, $2::uuid, $3, $4, $5::jsonb)
ON CONFLICT (task_id, seq, callback_url) DO NOTHING`,
event.TaskID,
event.ID,
event.Seq,
callbackURL,
string(payloadJSON),
)
return err
}
func (s *Store) RecordClientAssignment(ctx context.Context, candidate RuntimeModelCandidate) error {
_, err := s.pool.Exec(ctx, `
INSERT INTO runtime_client_states (
client_id, platform_id, provider, method_name, queue_key, running_count, last_assigned_at
)
VALUES ($1, $2::uuid, $3, $4, $5, 1, now())
ON CONFLICT (client_id) DO UPDATE
SET running_count = runtime_client_states.running_count + 1,
last_assigned_at = now(),
updated_at = now()`,
candidate.ClientID,
candidate.PlatformID,
candidate.Provider,
candidate.ModelType,
candidate.QueueKey,
)
return err
}
func (s *Store) RecordClientRelease(ctx context.Context, clientID string, lastError string) error {
_, err := s.pool.Exec(ctx, `
UPDATE runtime_client_states
SET running_count = GREATEST(running_count - 1, 0),
last_error = NULLIF($2, ''),
updated_at = now()
WHERE client_id = $1`, clientID, lastError)
return err
}

View File

@ -0,0 +1,41 @@
package store
import (
"context"
"github.com/easyai/easyai-ai-gateway/apps/api/internal/auth"
"github.com/jackc/pgx/v5"
)
type UserGroupPolicy struct {
ID string
GroupKey string
RateLimitPolicy map[string]any
BillingDiscountPolicy map[string]any
}
func (s *Store) ResolveUserGroupPolicy(ctx context.Context, user *auth.User) (UserGroupPolicy, error) {
userGroupID := ""
if user != nil {
userGroupID = user.UserGroupID
}
var item UserGroupPolicy
var rateLimit []byte
var billing []byte
err := s.pool.QueryRow(ctx, `
SELECT id::text, group_key, rate_limit_policy, billing_discount_policy
FROM gateway_user_groups
WHERE status = 'active'
AND (($1 <> '' AND id = NULLIF($1, '')::uuid) OR ($1 = '' AND group_key = 'default'))
ORDER BY CASE WHEN id::text = $1 THEN 0 ELSE 1 END, priority ASC
LIMIT 1`, userGroupID).Scan(&item.ID, &item.GroupKey, &rateLimit, &billing)
if err != nil {
if err == pgx.ErrNoRows {
return UserGroupPolicy{}, nil
}
return UserGroupPolicy{}, err
}
item.RateLimitPolicy = decodeObject(rateLimit)
item.BillingDiscountPolicy = decodeObject(billing)
return item, nil
}

View File

@ -3,8 +3,11 @@ CREATE EXTENSION IF NOT EXISTS pgcrypto;
CREATE TABLE IF NOT EXISTS model_catalog_providers (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
provider_key text NOT NULL UNIQUE,
provider_code text NOT NULL,
display_name text NOT NULL,
provider_type text NOT NULL DEFAULT 'openai_compatible',
provider_type text NOT NULL DEFAULT 'openai',
icon_path text,
source text NOT NULL DEFAULT 'gateway',
capability_schema jsonb NOT NULL DEFAULT '{}'::jsonb,
default_rate_limit_policy jsonb NOT NULL DEFAULT '{}'::jsonb,
status text NOT NULL DEFAULT 'active',
@ -16,6 +19,9 @@ CREATE TABLE IF NOT EXISTS model_catalog_providers (
CREATE INDEX IF NOT EXISTS idx_model_catalog_provider_status
ON model_catalog_providers(status);
CREATE UNIQUE INDEX IF NOT EXISTS idx_model_catalog_provider_code
ON model_catalog_providers(provider_code);
CREATE TABLE IF NOT EXISTS base_model_catalog (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
provider_id uuid REFERENCES model_catalog_providers(id) ON DELETE SET NULL,
@ -54,6 +60,7 @@ CREATE TABLE IF NOT EXISTS integration_platforms (
tenant_key text,
default_pricing_mode text NOT NULL DEFAULT 'inherit_discount',
default_discount_factor numeric NOT NULL DEFAULT 1,
pricing_rule_set_id uuid,
retry_policy jsonb NOT NULL DEFAULT '{}'::jsonb,
rate_limit_policy jsonb NOT NULL DEFAULT '{}'::jsonb,
priority integer NOT NULL DEFAULT 100,
@ -78,8 +85,24 @@ CREATE INDEX IF NOT EXISTS idx_integration_platforms_cooldown
CREATE INDEX IF NOT EXISTS idx_integration_platforms_tenant_scope
ON integration_platforms(visibility_scope, tenant_id, tenant_key, status);
CREATE TABLE IF NOT EXISTS model_pricing_rule_sets (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
rule_set_key text NOT NULL UNIQUE,
name text NOT NULL,
description text,
category text NOT NULL DEFAULT 'general',
currency text NOT NULL DEFAULT 'resource',
status text NOT NULL DEFAULT 'active',
metadata jsonb NOT NULL DEFAULT '{}'::jsonb,
created_at timestamptz NOT NULL DEFAULT now(),
updated_at timestamptz NOT NULL DEFAULT now()
);
CREATE TABLE IF NOT EXISTS model_pricing_rules (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
rule_set_id uuid REFERENCES model_pricing_rule_sets(id) ON DELETE CASCADE,
rule_key text NOT NULL DEFAULT ('rule_' || replace(gen_random_uuid()::text, '-', '')),
display_name text NOT NULL DEFAULT '',
scope_type text NOT NULL,
scope_id uuid,
resource_type text NOT NULL,
@ -88,6 +111,12 @@ CREATE TABLE IF NOT EXISTS model_pricing_rules (
currency text NOT NULL DEFAULT 'resource',
base_weight jsonb NOT NULL DEFAULT '{}'::jsonb,
dynamic_weight jsonb NOT NULL DEFAULT '{}'::jsonb,
calculator_type text NOT NULL DEFAULT 'unit_weight',
dimension_schema jsonb NOT NULL DEFAULT '{}'::jsonb,
formula_config jsonb NOT NULL DEFAULT '{}'::jsonb,
priority integer NOT NULL DEFAULT 100,
status text NOT NULL DEFAULT 'active',
metadata jsonb NOT NULL DEFAULT '{}'::jsonb,
effective_from timestamptz,
effective_to timestamptz,
created_at timestamptz NOT NULL DEFAULT now(),
@ -97,6 +126,13 @@ CREATE TABLE IF NOT EXISTS model_pricing_rules (
CREATE INDEX IF NOT EXISTS idx_model_pricing_scope
ON model_pricing_rules(scope_type, scope_id, resource_type);
CREATE INDEX IF NOT EXISTS idx_model_pricing_rule_set
ON model_pricing_rules(rule_set_id, resource_type, priority);
CREATE UNIQUE INDEX IF NOT EXISTS idx_model_pricing_rule_set_key
ON model_pricing_rules(rule_set_id, rule_key)
WHERE rule_set_id IS NOT NULL;
CREATE INDEX IF NOT EXISTS idx_model_pricing_effective
ON model_pricing_rules(effective_from, effective_to);
@ -343,6 +379,7 @@ CREATE TABLE IF NOT EXISTS platform_models (
capabilities jsonb NOT NULL DEFAULT '{}'::jsonb,
pricing_mode text NOT NULL DEFAULT 'inherit_discount',
discount_factor numeric,
pricing_rule_set_id uuid REFERENCES model_pricing_rule_sets(id) ON DELETE SET NULL,
billing_config_override jsonb NOT NULL DEFAULT '{}'::jsonb,
billing_config jsonb NOT NULL DEFAULT '{}'::jsonb,
permission_config jsonb NOT NULL DEFAULT '{}'::jsonb,

View File

@ -3,8 +3,11 @@ CREATE EXTENSION IF NOT EXISTS pgcrypto;
CREATE TABLE IF NOT EXISTS model_catalog_providers (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
provider_key text NOT NULL UNIQUE,
provider_code text NOT NULL,
display_name text NOT NULL,
provider_type text NOT NULL DEFAULT 'openai_compatible',
provider_type text NOT NULL DEFAULT 'openai',
icon_path text,
source text NOT NULL DEFAULT 'gateway',
capability_schema jsonb NOT NULL DEFAULT '{}'::jsonb,
default_rate_limit_policy jsonb NOT NULL DEFAULT '{}'::jsonb,
status text NOT NULL DEFAULT 'active',
@ -45,6 +48,7 @@ CREATE TABLE IF NOT EXISTS integration_platforms (
tenant_key text,
default_pricing_mode text NOT NULL DEFAULT 'inherit_discount',
default_discount_factor numeric NOT NULL DEFAULT 1,
pricing_rule_set_id uuid,
retry_policy jsonb NOT NULL DEFAULT '{}'::jsonb,
rate_limit_policy jsonb NOT NULL DEFAULT '{}'::jsonb,
priority integer NOT NULL DEFAULT 100,
@ -64,6 +68,7 @@ ALTER TABLE IF EXISTS integration_platforms
ADD COLUMN IF NOT EXISTS tenant_key text,
ADD COLUMN IF NOT EXISTS default_pricing_mode text NOT NULL DEFAULT 'inherit_discount',
ADD COLUMN IF NOT EXISTS default_discount_factor numeric NOT NULL DEFAULT 1,
ADD COLUMN IF NOT EXISTS pricing_rule_set_id uuid,
ADD COLUMN IF NOT EXISTS retry_policy jsonb NOT NULL DEFAULT '{}'::jsonb,
ADD COLUMN IF NOT EXISTS rate_limit_policy jsonb NOT NULL DEFAULT '{}'::jsonb,
ADD COLUMN IF NOT EXISTS dynamic_priority integer,
@ -79,8 +84,24 @@ ALTER TABLE IF EXISTS integration_platforms
ALTER COLUMN platform_key SET DEFAULT ('platform_' || replace(gen_random_uuid()::text, '-', '')),
ALTER COLUMN platform_key SET NOT NULL;
CREATE TABLE IF NOT EXISTS model_pricing_rule_sets (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
rule_set_key text NOT NULL UNIQUE,
name text NOT NULL,
description text,
category text NOT NULL DEFAULT 'general',
currency text NOT NULL DEFAULT 'resource',
status text NOT NULL DEFAULT 'active',
metadata jsonb NOT NULL DEFAULT '{}'::jsonb,
created_at timestamptz NOT NULL DEFAULT now(),
updated_at timestamptz NOT NULL DEFAULT now()
);
CREATE TABLE IF NOT EXISTS model_pricing_rules (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
rule_set_id uuid REFERENCES model_pricing_rule_sets(id) ON DELETE CASCADE,
rule_key text NOT NULL DEFAULT ('rule_' || replace(gen_random_uuid()::text, '-', '')),
display_name text NOT NULL DEFAULT '',
scope_type text NOT NULL,
scope_id uuid,
resource_type text NOT NULL,
@ -89,12 +110,29 @@ CREATE TABLE IF NOT EXISTS model_pricing_rules (
currency text NOT NULL DEFAULT 'resource',
base_weight jsonb NOT NULL DEFAULT '{}'::jsonb,
dynamic_weight jsonb NOT NULL DEFAULT '{}'::jsonb,
calculator_type text NOT NULL DEFAULT 'unit_weight',
dimension_schema jsonb NOT NULL DEFAULT '{}'::jsonb,
formula_config jsonb NOT NULL DEFAULT '{}'::jsonb,
priority integer NOT NULL DEFAULT 100,
status text NOT NULL DEFAULT 'active',
metadata jsonb NOT NULL DEFAULT '{}'::jsonb,
effective_from timestamptz,
effective_to timestamptz,
created_at timestamptz NOT NULL DEFAULT now(),
updated_at timestamptz NOT NULL DEFAULT now()
);
ALTER TABLE IF EXISTS model_pricing_rules
ADD COLUMN IF NOT EXISTS rule_set_id uuid REFERENCES model_pricing_rule_sets(id) ON DELETE CASCADE,
ADD COLUMN IF NOT EXISTS rule_key text NOT NULL DEFAULT ('rule_' || replace(gen_random_uuid()::text, '-', '')),
ADD COLUMN IF NOT EXISTS display_name text NOT NULL DEFAULT '',
ADD COLUMN IF NOT EXISTS calculator_type text NOT NULL DEFAULT 'unit_weight',
ADD COLUMN IF NOT EXISTS dimension_schema jsonb NOT NULL DEFAULT '{}'::jsonb,
ADD COLUMN IF NOT EXISTS formula_config jsonb NOT NULL DEFAULT '{}'::jsonb,
ADD COLUMN IF NOT EXISTS priority integer NOT NULL DEFAULT 100,
ADD COLUMN IF NOT EXISTS status text NOT NULL DEFAULT 'active',
ADD COLUMN IF NOT EXISTS metadata jsonb NOT NULL DEFAULT '{}'::jsonb;
CREATE TABLE IF NOT EXISTS gateway_user_groups (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
group_key text NOT NULL UNIQUE,
@ -290,6 +328,7 @@ CREATE TABLE IF NOT EXISTS platform_models (
capabilities jsonb NOT NULL DEFAULT '{}'::jsonb,
pricing_mode text NOT NULL DEFAULT 'inherit_discount',
discount_factor numeric,
pricing_rule_set_id uuid REFERENCES model_pricing_rule_sets(id) ON DELETE SET NULL,
billing_config_override jsonb NOT NULL DEFAULT '{}'::jsonb,
billing_config jsonb NOT NULL DEFAULT '{}'::jsonb,
permission_config jsonb NOT NULL DEFAULT '{}'::jsonb,
@ -307,6 +346,7 @@ ALTER TABLE IF EXISTS platform_models
ADD COLUMN IF NOT EXISTS capability_override jsonb NOT NULL DEFAULT '{}'::jsonb,
ADD COLUMN IF NOT EXISTS pricing_mode text NOT NULL DEFAULT 'inherit_discount',
ADD COLUMN IF NOT EXISTS discount_factor numeric,
ADD COLUMN IF NOT EXISTS pricing_rule_set_id uuid REFERENCES model_pricing_rule_sets(id) ON DELETE SET NULL,
ADD COLUMN IF NOT EXISTS billing_config_override jsonb NOT NULL DEFAULT '{}'::jsonb,
ADD COLUMN IF NOT EXISTS permission_config jsonb NOT NULL DEFAULT '{}'::jsonb,
ADD COLUMN IF NOT EXISTS retry_policy jsonb NOT NULL DEFAULT '{}'::jsonb,
@ -553,6 +593,11 @@ CREATE INDEX IF NOT EXISTS idx_integration_platforms_tenant_scope
ON integration_platforms(visibility_scope, tenant_id, tenant_key, status);
CREATE INDEX IF NOT EXISTS idx_model_pricing_scope
ON model_pricing_rules(scope_type, scope_id, resource_type);
CREATE INDEX IF NOT EXISTS idx_model_pricing_rule_set
ON model_pricing_rules(rule_set_id, resource_type, priority);
CREATE UNIQUE INDEX IF NOT EXISTS idx_model_pricing_rule_set_key
ON model_pricing_rules(rule_set_id, rule_key)
WHERE rule_set_id IS NOT NULL;
CREATE INDEX IF NOT EXISTS idx_model_pricing_effective
ON model_pricing_rules(effective_from, effective_to);
CREATE INDEX IF NOT EXISTS idx_gateway_user_groups_status_priority

View File

@ -0,0 +1,244 @@
CREATE EXTENSION IF NOT EXISTS pgcrypto;
INSERT INTO gateway_user_groups (
group_key, name, description, priority,
recharge_discount_policy, billing_discount_policy, rate_limit_policy, quota_policy, metadata, status
)
VALUES
(
'default', 'Default Users', 'Built-in default group for local and synchronized users.', 100,
'{"discountFactor":1}'::jsonb,
'{"discountFactor":1}'::jsonb,
'{"rules":[{"metric":"rpm","limit":60,"windowSeconds":60},{"metric":"tpm_total","limit":120000,"windowSeconds":60},{"metric":"concurrent","limit":3,"leaseTtlSeconds":120}]}'::jsonb,
'{}'::jsonb,
'{"seed":"phase1"}'::jsonb,
'active'
),
(
'vip', 'VIP Users', 'Higher quota group for future recharge and concurrency policies.', 50,
'{"discountFactor":0.9}'::jsonb,
'{"discountFactor":0.95}'::jsonb,
'{"rules":[{"metric":"rpm","limit":300,"windowSeconds":60},{"metric":"tpm_total","limit":600000,"windowSeconds":60},{"metric":"concurrent","limit":10,"leaseTtlSeconds":120}]}'::jsonb,
'{}'::jsonb,
'{"seed":"phase1"}'::jsonb,
'active'
)
ON CONFLICT (group_key) DO UPDATE
SET name = EXCLUDED.name,
description = EXCLUDED.description,
priority = EXCLUDED.priority,
recharge_discount_policy = EXCLUDED.recharge_discount_policy,
billing_discount_policy = EXCLUDED.billing_discount_policy,
rate_limit_policy = EXCLUDED.rate_limit_policy,
updated_at = now();
INSERT INTO gateway_tenants (tenant_key, source, external_tenant_id, name, default_user_group_id, metadata, status)
VALUES (
'default',
'gateway',
'default',
'Default Tenant',
(SELECT id FROM gateway_user_groups WHERE group_key = 'default'),
'{"seed":"phase1"}'::jsonb,
'active'
)
ON CONFLICT (tenant_key) DO UPDATE
SET name = EXCLUDED.name,
default_user_group_id = EXCLUDED.default_user_group_id,
updated_at = now();
INSERT INTO model_catalog_providers (
provider_key, provider_code, display_name, provider_type, icon_path, source, capability_schema, default_rate_limit_policy, metadata, status
)
VALUES
(
'openai',
'openai',
'OpenAI',
'openai',
NULL,
'server-main.integration-platform',
'{"chat":true,"imageGeneration":true,"imageEdit":true,"stream":true}'::jsonb,
'{"rules":[{"metric":"rpm","limit":500,"windowSeconds":60},{"metric":"tpm_total","limit":1000000,"windowSeconds":60},{"metric":"concurrent","limit":20,"leaseTtlSeconds":120}]}'::jsonb,
'{"seed":"phase1","syncSource":"server-main.integration-platform","sourceCode":"openai"}'::jsonb,
'active'
),
(
'gemini',
'google-gemini',
'Google Gemini',
'gemini',
'https://static.51easyai.com/gemini-color.png',
'server-main.integration-platform',
'{"chat":true,"imageGeneration":true,"imageEdit":true,"stream":true}'::jsonb,
'{"rules":[{"metric":"rpm","limit":500,"windowSeconds":60},{"metric":"tpm_total","limit":1000000,"windowSeconds":60},{"metric":"concurrent","limit":20,"leaseTtlSeconds":120}]}'::jsonb,
'{"seed":"phase1","syncSource":"server-main.integration-platform","sourceCode":"google-gemini"}'::jsonb,
'active'
)
ON CONFLICT (provider_key) DO UPDATE
SET provider_code = EXCLUDED.provider_code,
display_name = EXCLUDED.display_name,
provider_type = EXCLUDED.provider_type,
icon_path = EXCLUDED.icon_path,
source = EXCLUDED.source,
capability_schema = EXCLUDED.capability_schema,
default_rate_limit_policy = EXCLUDED.default_rate_limit_policy,
metadata = model_catalog_providers.metadata || EXCLUDED.metadata,
updated_at = now();
INSERT INTO base_model_catalog (
provider_id, provider_key, canonical_model_key, provider_model_name, model_type, display_name,
capabilities, base_billing_config, default_rate_limit_policy, metadata, status
)
VALUES
(
(SELECT id FROM model_catalog_providers WHERE provider_key = 'openai'),
'openai',
'openai:gpt-4o-mini',
'gpt-4o-mini',
'chat',
'GPT-4o mini',
'{"stream":true,"vision":true,"inputModalities":["text","image"],"outputModalities":["text"],"maxInputTokens":128000}'::jsonb,
'{"textInputPer1k":0.15,"textOutputPer1k":0.6,"currency":"resource"}'::jsonb,
'{"rules":[{"metric":"rpm","limit":300,"windowSeconds":60},{"metric":"tpm_total","limit":500000,"windowSeconds":60},{"metric":"concurrent","limit":10,"leaseTtlSeconds":120}]}'::jsonb,
'{"seed":"phase1"}'::jsonb,
'active'
),
(
(SELECT id FROM model_catalog_providers WHERE provider_key = 'openai'),
'openai',
'openai:gpt-image-1',
'gpt-image-1',
'image',
'GPT Image 1',
'{"imageGeneration":true,"imageEdit":true,"inputModalities":["text","image","mask"],"outputModalities":["image"],"sizes":["1024x1024","1024x1536","1536x1024"],"qualities":["low","medium","high"]}'::jsonb,
'{"imageBase":5,"editBase":6,"currency":"resource","qualityWeights":{"low":0.7,"standard":1,"medium":1,"high":1.4},"sizeWeights":{"1024x1024":1,"1024x1536":1.35,"1536x1024":1.35}}'::jsonb,
'{"rules":[{"metric":"rpm","limit":60,"windowSeconds":60},{"metric":"concurrent","limit":4,"leaseTtlSeconds":180}]}'::jsonb,
'{"seed":"phase1"}'::jsonb,
'active'
),
(
(SELECT id FROM model_catalog_providers WHERE provider_key = 'gemini'),
'gemini',
'gemini:gemini-2.5-flash',
'gemini-2.5-flash',
'chat',
'Gemini 2.5 Flash',
'{"stream":true,"vision":true,"inputModalities":["text","image"],"outputModalities":["text"],"maxInputTokens":1048576}'::jsonb,
'{"textInputPer1k":0.1,"textOutputPer1k":0.4,"currency":"resource"}'::jsonb,
'{"rules":[{"metric":"rpm","limit":300,"windowSeconds":60},{"metric":"tpm_total","limit":500000,"windowSeconds":60},{"metric":"concurrent","limit":10,"leaseTtlSeconds":120}]}'::jsonb,
'{"seed":"phase1"}'::jsonb,
'active'
),
(
(SELECT id FROM model_catalog_providers WHERE provider_key = 'gemini'),
'gemini',
'gemini:gemini-2.5-flash-image',
'gemini-2.5-flash-image',
'image',
'Gemini 2.5 Flash Image',
'{"imageGeneration":true,"imageEdit":true,"inputModalities":["text","image","mask"],"outputModalities":["image"],"sizes":["1024x1024","1024x1536","1536x1024"],"qualities":["standard","high"]}'::jsonb,
'{"imageBase":4,"editBase":5,"currency":"resource","qualityWeights":{"standard":1,"high":1.35},"sizeWeights":{"1024x1024":1,"1024x1536":1.3,"1536x1024":1.3}}'::jsonb,
'{"rules":[{"metric":"rpm","limit":60,"windowSeconds":60},{"metric":"concurrent","limit":4,"leaseTtlSeconds":180}]}'::jsonb,
'{"seed":"phase1"}'::jsonb,
'active'
)
ON CONFLICT (canonical_model_key) DO UPDATE
SET provider_id = EXCLUDED.provider_id,
provider_key = EXCLUDED.provider_key,
provider_model_name = EXCLUDED.provider_model_name,
model_type = EXCLUDED.model_type,
display_name = EXCLUDED.display_name,
capabilities = EXCLUDED.capabilities,
base_billing_config = EXCLUDED.base_billing_config,
default_rate_limit_policy = EXCLUDED.default_rate_limit_policy,
updated_at = now();
INSERT INTO integration_platforms (
provider, platform_key, name, base_url, auth_type, credentials, config,
default_pricing_mode, default_discount_factor, retry_policy, rate_limit_policy, priority, status
)
VALUES
(
'openai', 'openai-simulation', 'OpenAI Simulation',
'https://api.openai.com/v1', 'bearer',
'{"mode":"simulation"}'::jsonb,
'{"testMode":true,"seed":"phase1"}'::jsonb,
'inherit_discount', 1,
'{"enabled":true,"maxAttempts":2,"retryOn":["rate_limit","timeout","server_error","network"]}'::jsonb,
'{"rules":[{"metric":"rpm","limit":120,"windowSeconds":60},{"metric":"tpm_total","limit":240000,"windowSeconds":60},{"metric":"concurrent","limit":6,"leaseTtlSeconds":120}]}'::jsonb,
900,
'enabled'
),
(
'gemini', 'gemini-simulation', 'Gemini Simulation',
'https://generativelanguage.googleapis.com', 'api_key',
'{"mode":"simulation"}'::jsonb,
'{"testMode":true,"seed":"phase1"}'::jsonb,
'inherit_discount', 1,
'{"enabled":true,"maxAttempts":2,"retryOn":["rate_limit","timeout","server_error","network"]}'::jsonb,
'{"rules":[{"metric":"rpm","limit":120,"windowSeconds":60},{"metric":"tpm_total","limit":240000,"windowSeconds":60},{"metric":"concurrent","limit":6,"leaseTtlSeconds":120}]}'::jsonb,
910,
'enabled'
)
ON CONFLICT (platform_key) DO UPDATE
SET name = EXCLUDED.name,
base_url = EXCLUDED.base_url,
auth_type = EXCLUDED.auth_type,
credentials = EXCLUDED.credentials,
config = EXCLUDED.config,
default_pricing_mode = EXCLUDED.default_pricing_mode,
default_discount_factor = EXCLUDED.default_discount_factor,
retry_policy = EXCLUDED.retry_policy,
rate_limit_policy = EXCLUDED.rate_limit_policy,
priority = EXCLUDED.priority,
status = EXCLUDED.status,
updated_at = now();
INSERT INTO platform_models (
platform_id, base_model_id, model_name, model_alias, model_type, display_name,
capabilities, pricing_mode, billing_config, retry_policy, rate_limit_policy, enabled
)
SELECT p.id, b.id, b.provider_model_name, b.canonical_model_key, b.model_type, b.display_name,
b.capabilities, 'inherit_discount', b.base_billing_config,
'{"enabled":true,"maxAttempts":2}'::jsonb,
b.default_rate_limit_policy,
true
FROM integration_platforms p
JOIN base_model_catalog b ON b.provider_key = p.provider
WHERE p.platform_key IN ('openai-simulation', 'gemini-simulation')
ON CONFLICT (platform_id, model_name, model_type) DO UPDATE
SET base_model_id = EXCLUDED.base_model_id,
model_alias = EXCLUDED.model_alias,
display_name = EXCLUDED.display_name,
capabilities = EXCLUDED.capabilities,
pricing_mode = EXCLUDED.pricing_mode,
billing_config = EXCLUDED.billing_config,
retry_policy = EXCLUDED.retry_policy,
rate_limit_policy = EXCLUDED.rate_limit_policy,
enabled = EXCLUDED.enabled,
updated_at = now();
INSERT INTO model_pricing_rules (scope_type, scope_id, resource_type, unit, base_price, currency, base_weight, dynamic_weight)
SELECT 'base_model', b.id, item.resource_type, item.unit, item.base_price, 'resource', item.base_weight, item.dynamic_weight
FROM base_model_catalog b
JOIN (
VALUES
('openai:gpt-4o-mini', 'text_input', '1k_tokens', 0.15::numeric, '{}'::jsonb, '{}'::jsonb),
('openai:gpt-4o-mini', 'text_output', '1k_tokens', 0.60::numeric, '{}'::jsonb, '{}'::jsonb),
('openai:gpt-image-1', 'image', 'image', 5.00::numeric, '{"mode":"generation"}'::jsonb, '{"quality":true,"size":true}'::jsonb),
('openai:gpt-image-1', 'image_edit', 'image', 6.00::numeric, '{"mode":"edit"}'::jsonb, '{"quality":true,"size":true}'::jsonb),
('gemini:gemini-2.5-flash', 'text_input', '1k_tokens', 0.10::numeric, '{}'::jsonb, '{}'::jsonb),
('gemini:gemini-2.5-flash', 'text_output', '1k_tokens', 0.40::numeric, '{}'::jsonb, '{}'::jsonb),
('gemini:gemini-2.5-flash-image', 'image', 'image', 4.00::numeric, '{"mode":"generation"}'::jsonb, '{"quality":true,"size":true}'::jsonb),
('gemini:gemini-2.5-flash-image', 'image_edit', 'image', 5.00::numeric, '{"mode":"edit"}'::jsonb, '{"quality":true,"size":true}'::jsonb)
) AS item(canonical_model_key, resource_type, unit, base_price, base_weight, dynamic_weight)
ON item.canonical_model_key = b.canonical_model_key
WHERE NOT EXISTS (
SELECT 1
FROM model_pricing_rules existing
WHERE existing.scope_type = 'base_model'
AND existing.scope_id = b.id
AND existing.resource_type = item.resource_type
AND existing.unit = item.unit
);

View File

@ -0,0 +1,30 @@
ALTER TABLE model_catalog_providers
ADD COLUMN IF NOT EXISTS provider_code text,
ADD COLUMN IF NOT EXISTS icon_path text,
ADD COLUMN IF NOT EXISTS source text NOT NULL DEFAULT 'gateway';
UPDATE model_catalog_providers
SET provider_code = provider_key
WHERE provider_code IS NULL OR provider_code = '';
UPDATE model_catalog_providers
SET provider_code = 'openai',
icon_path = NULL,
source = 'server-main.integration-platform',
metadata = metadata || '{"syncSource":"server-main.integration-platform","sourceCode":"openai"}'::jsonb,
updated_at = now()
WHERE provider_key = 'openai';
UPDATE model_catalog_providers
SET provider_code = 'google-gemini',
icon_path = 'https://static.51easyai.com/gemini-color.png',
source = 'server-main.integration-platform',
metadata = metadata || '{"syncSource":"server-main.integration-platform","sourceCode":"google-gemini"}'::jsonb,
updated_at = now()
WHERE provider_key = 'gemini';
ALTER TABLE model_catalog_providers
ALTER COLUMN provider_code SET NOT NULL;
CREATE UNIQUE INDEX IF NOT EXISTS idx_model_catalog_provider_code
ON model_catalog_providers(provider_code);

View File

@ -0,0 +1,64 @@
WITH source_providers(provider_key, provider_code, provider_type, display_name, icon_path) AS (
VALUES
('easyai', 'easyai', 'easyai', 'EasyAI', ''),
('runninghub', 'runninghub', 'runninghub', 'RunningHub', ''),
('LiblibAI', 'LiblibAI', 'LiblibAI', 'LiblibAI', ''),
('keling', 'keling', 'keling', '可灵AI', 'https://static.51easyai.com/kling-color.webp'),
('gemini', 'google-gemini', 'google-gemini', 'Google Gemini', 'https://static.51easyai.com/gemini-color.png'),
('openai', 'openai', 'openai', 'OpenAI', ''),
('aliyun-bailian-openai', 'aliyun-bailian-openai', 'openai', '阿里云百炼(OpenAI兼容', ''),
('gemini-openai', 'gemini-openai', 'openai', 'Gemini OpenAI兼容', 'https://static.51easyai.com/gemini-color.png'),
('volces-openai', 'volces-openai', 'openai', '火山引擎(OpenAI兼容)', 'https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg'),
('zhipu-openai', 'zhipu-openai', 'openai', '智谱AI', 'https://static.51easyai.com/chatglm-color.webp'),
('minimax-openai', 'minimax-openai', 'openai', 'MiniMaxOpenAI兼容', 'https://static.51easyai.com/minimax-color.png'),
('openrouter-openai', 'openrouter-openai', 'openai', 'OpenRouter', ''),
('aliyun-bailian', 'aliyun-bailian', 'aliyun-bailian', '阿里云百炼', 'https://static.51easyai.com/bailian-color.webp'),
('ollama', 'ollama', 'openai', 'Ollama', ''),
('blackforest', 'blackforest', 'blackforest', '黑森林实验室', 'https://easyai-1253343986.cos.ap-shanghai.myqcloud.com/663e19cd4fa9d8078385c7c9/upload/20250611132907371-blackforest.png'),
('dify', 'dify', 'dify', 'Dify', ''),
('volces', 'volces', 'volces', '火山引擎(豆包)', 'https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg'),
('jimeng', 'jimeng', 'jimeng', '即梦AI', 'https://static.51easyai.com/jimeng-logo.png'),
('silicon-flow-openai', 'silicon-flow-openai', 'openai', '硅基流动', ''),
('tripo3d', 'tripo3d', 'tripo3d', 'Tripo3D', 'https://static.51easyai.com/tripo-logo.png'),
('tencent-hunyuan-image', 'tencent-hunyuan-image', 'tencent-hunyuan-image', '腾讯混元生图(第三方)', 'https://static.51easyai.com/hunyuan3d-logo.svg'),
('tencent-hunyuan-video', 'tencent-hunyuan-video', 'tencent-hunyuan-video', '腾讯混元视频(第三方)', 'https://static.51easyai.com/hunyuan3d-logo.svg'),
('tencent-hunyuan', 'tencent-hunyuan', 'tencent-hunyuan', '腾讯混元3D', 'https://static.51easyai.com/hunyuan3d-logo.svg'),
('suno', 'suno', 'suno', 'Suno音乐生成', 'https://static.51easyai.com/suno-logo.png'),
('minimax', 'minimax', 'minimax', 'MiniMax', 'https://static.51easyai.com/minimax-color.png'),
('midjourney', 'midjourney', 'midjourney', 'Midjourney', 'https://static.51easyai.com/midjourney.png'),
('tencent-lke', 'tencent-lke', 'tencent-lke', '腾讯云智能体开发平台', ''),
('universal', 'universal', 'universal', '自定义平台通用平台(支持自定义方式接入任意平台)', ''),
('newapi', 'newapi', 'newapi', 'NewAPI兼容平台', ''),
('vidu', 'vidu', 'vidu', 'Vidu视频生成', 'https://static.51easyai.com/vidu-color.webp'),
('n8n', 'n8n', 'n8n', 'n8n', ''),
('mock-test', 'mock-test', 'mock-test', 'Mock测试平台', '')
)
INSERT INTO model_catalog_providers (
provider_key, provider_code, provider_type, display_name, icon_path, source,
capability_schema, default_rate_limit_policy, metadata, status
)
SELECT provider_key,
provider_code,
provider_type,
display_name,
NULLIF(icon_path, ''),
'server-main.integration-platform',
'{}'::jsonb,
'{}'::jsonb,
jsonb_build_object(
'seed', 'server-main-provider-defaults',
'syncSource', 'server-main.integration-platform',
'sourceCode', provider_code,
'sourceSpecType', provider_type
),
'active'
FROM source_providers
ON CONFLICT (provider_key) DO UPDATE
SET provider_code = EXCLUDED.provider_code,
display_name = EXCLUDED.display_name,
provider_type = EXCLUDED.provider_type,
icon_path = EXCLUDED.icon_path,
source = EXCLUDED.source,
metadata = model_catalog_providers.metadata || EXCLUDED.metadata,
status = EXCLUDED.status,
updated_at = now();

View File

@ -0,0 +1,371 @@
-- Seeded from easyai-server-main integration-platform.data.ts.
-- Includes model types and capabilities in metadata/capabilities for gateway base catalog management.
INSERT INTO base_model_catalog (
provider_id, provider_key, canonical_model_key, provider_model_name, model_type, display_name,
capabilities, base_billing_config, default_rate_limit_policy, pricing_version, status, metadata
)
VALUES
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:即梦V2.1文生图', '即梦V2.1文生图', 'image_generate', '即梦V2.1文生图', '{"image_generate":{"output_resolutions":["1K"],"output_max_size":4194304,"width_height_range":[256,768],"aspect_ratio_range":[0.5625,0.5625],"output_multiple_images":false},"originalTypes":["image_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["image_generate"],"alias":"即梦V2.1文生图","description":"","iconPath":"https://static.51easyai.com/jimeng-logo.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"即梦V2.1文生图","types":["image_generate"],"alias":"即梦V2.1文生图","icon_path":"https://static.51easyai.com/jimeng-logo.png","capabilities":{"image_generate":{"output_resolutions":["1K"],"output_max_size":4194304,"width_height_range":[256,768],"aspect_ratio_range":[0.5625,0.5625],"output_multiple_images":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:即梦V3.0文生图', '即梦V3.0文生图', 'image_generate', '即梦V3.0文生图', '{"image_generate":{"output_resolutions":["1K","2K"],"output_max_size":4194304,"width_height_range":[512,2048],"aspect_ratio_range":[0.3333333333333333,1],"output_multiple_images":false},"originalTypes":["image_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["image_generate"],"alias":"即梦V3.0文生图","description":"","iconPath":"https://static.51easyai.com/jimeng-logo.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"即梦V3.0文生图","types":["image_generate"],"alias":"即梦V3.0文生图","icon_path":"https://static.51easyai.com/jimeng-logo.png","capabilities":{"image_generate":{"output_resolutions":["1K","2K"],"output_max_size":4194304,"width_height_range":[512,2048],"aspect_ratio_range":[0.3333333333333333,1],"output_multiple_images":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:即梦V3.1文生图', '即梦V3.1文生图', 'image_generate', '即梦V3.1文生图', '{"image_generate":{"output_resolutions":["1K","2K"],"output_max_size":4194304,"width_height_range":[512,2048],"aspect_ratio_range":[0.3333333333333333,1],"output_multiple_images":false},"originalTypes":["image_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["image_generate"],"alias":"即梦V3.1文生图","description":"","iconPath":"https://static.51easyai.com/jimeng-logo.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"即梦V3.1文生图","types":["image_generate"],"alias":"即梦V3.1文生图","icon_path":"https://static.51easyai.com/jimeng-logo.png","capabilities":{"image_generate":{"output_resolutions":["1K","2K"],"output_max_size":4194304,"width_height_range":[512,2048],"aspect_ratio_range":[0.3333333333333333,1],"output_multiple_images":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:即梦V3.0图像智能参考', '即梦V3.0图像智能参考', 'image_edit', '即梦V3.0图像智能参考', '{"image_edit":{"input_multiple_images":false,"output_resolutions":["1K","2K"],"width_height_range":[512,2016],"aspect_ratio_range":[0.0625,16],"output_multiple_images":false},"originalTypes":["image_edit"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["image_edit"],"alias":"即梦V3.0图像智能参考","description":"","iconPath":"https://static.51easyai.com/jimeng-logo.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"即梦V3.0图像智能参考","types":["image_edit"],"alias":"即梦V3.0图像智能参考","icon_path":"https://static.51easyai.com/jimeng-logo.png","capabilities":{"image_edit":{"input_multiple_images":false,"output_resolutions":["1K","2K"],"width_height_range":[512,2016],"aspect_ratio_range":[0.0625,16],"output_multiple_images":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:即梦V4.0图像生成及编辑', '即梦V4.0图像生成及编辑', 'image_edit', '即梦V4.0图像生成及编辑', '{"image_edit":{"input_multiple_images":true,"input_max_images_count":10,"input_parameters":[{"type":"url","parameter":"image_urls"}],"output_resolutions":["1K","2K","4K"],"allow_custom_width_height_size":true,"output_max_size":16777216,"width_height_range":[1024,4096],"aspect_ratio_range":[0.0625,16],"output_multiple_images":false},"image_generate":{"output_multiple_images":true,"output_resolutions":["1K","2K","4K"],"output_max_size":16777216,"allow_custom_width_height_size":true,"aspect_ratio_range":[0.0625,16],"width_height_range":[1024,6198]},"originalTypes":["image_edit","image_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":1}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["image_edit","image_generate"],"alias":"即梦V4.0图像生成及编辑","description":"","iconPath":"https://static.51easyai.com/jimeng-logo.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"即梦V4.0图像生成及编辑","types":["image_edit","image_generate"],"alias":"即梦V4.0图像生成及编辑","icon_path":"https://static.51easyai.com/jimeng-logo.png","model_limits":{"max_concurrent_requests":1},"capabilities":{"image_edit":{"input_multiple_images":true,"input_max_images_count":10,"input_parameters":[{"type":"url","parameter":"image_urls"}],"output_resolutions":["1K","2K","4K"],"allow_custom_width_height_size":true,"output_max_size":16777216,"width_height_range":[1024,4096],"aspect_ratio_range":[0.0625,16],"output_multiple_images":false},"image_generate":{"output_multiple_images":true,"output_resolutions":["1K","2K","4K"],"output_max_size":16777216,"allow_custom_width_height_size":true,"aspect_ratio_range":[0.0625,16],"width_height_range":[1024,6198]}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:即梦文生视频V3.0', '即梦文生视频V3.0', 'video_generate', '即梦文生视频V3.0', '{"video_generate":{"output_resolutions":["720p"],"duration_range":[5,10],"aspect_ratio_allowed":["16:9","4:3","1:1","3:4","9:16","21:9"]},"originalTypes":["video_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":1}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["video_generate"],"alias":"即梦文生视频V3.0","description":"","iconPath":"https://static.51easyai.com/jimeng-logo.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"即梦文生视频V3.0","types":["video_generate"],"alias":"即梦文生视频V3.0","icon_path":"https://static.51easyai.com/jimeng-logo.png","model_limits":{"max_concurrent_requests":1},"capabilities":{"video_generate":{"output_resolutions":["720p"],"duration_range":[5,10],"aspect_ratio_allowed":["16:9","4:3","1:1","3:4","9:16","21:9"]}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:即梦视频生成V3.0_Pro', '即梦视频生成V3.0_Pro', 'video_generate', '即梦视频生成V3.0_Pro', '{"video_generate":{"output_resolutions":["1080p"],"duration_range":[5,10],"aspect_ratio_allowed":["16:9","4:3","1:1","3:4","9:16","21:9"]},"image_to_video":{"output_resolutions":["1080p"],"duration_range":[5,10],"input_width_height_range":[320,4096],"input_size_limit":4928307.2,"input_first_frame":true,"aspect_ratio_allowed":[],"input_last_frame":false,"input_first_last_frame":false,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false},"originalTypes":["video_generate","image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":1}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["video_generate","image_to_video"],"alias":"即梦视频生成V3.0_Pro","description":"","iconPath":"https://static.51easyai.com/jimeng-logo.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"即梦视频生成V3.0_Pro","types":["video_generate","image_to_video"],"alias":"即梦视频生成V3.0_Pro","icon_path":"https://static.51easyai.com/jimeng-logo.png","model_limits":{"max_concurrent_requests":1},"capabilities":{"video_generate":{"output_resolutions":["1080p"],"duration_range":[5,10],"aspect_ratio_allowed":["16:9","4:3","1:1","3:4","9:16","21:9"]},"image_to_video":{"output_resolutions":["1080p"],"duration_range":[5,10],"input_width_height_range":[320,4096],"input_size_limit":4928307.2,"input_first_frame":true,"aspect_ratio_allowed":[],"input_last_frame":false,"input_first_last_frame":false,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:即梦图生视频V3.0', '即梦图生视频V3.0', 'image_to_video', '即梦图生视频V3.0', '{"image_to_video":{"output_resolutions":["720p"],"duration_range":[5,10],"input_width_height_range":[320,4096],"input_size_limit":4928307.2,"input_first_frame":true,"aspect_ratio_allowed":[],"input_last_frame":false,"input_first_last_frame":false,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false},"originalTypes":["image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":1}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["image_to_video"],"alias":"即梦图生视频V3.0","description":"","iconPath":"https://static.51easyai.com/jimeng-logo.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"即梦图生视频V3.0","types":["image_to_video"],"alias":"即梦图生视频V3.0","icon_path":"https://static.51easyai.com/jimeng-logo.png","model_limits":{"max_concurrent_requests":1},"capabilities":{"image_to_video":{"output_resolutions":["720p"],"duration_range":[5,10],"input_width_height_range":[320,4096],"input_size_limit":4928307.2,"input_first_frame":true,"aspect_ratio_allowed":[],"input_last_frame":false,"input_first_last_frame":false,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:即梦首尾帧视频生成V3.0', '即梦首尾帧视频生成V3.0', 'image_to_video', '即梦首尾帧视频生成V3.0', '{"image_to_video":{"input_smart_multi_frame":true,"smart_multi_frame_range":[2,5],"smart_multi_frame_mode":"stitch","output_resolutions":["720p"],"duration_range":[5,10],"input_width_height_range":[320,4096],"input_size_limit":4928307.2,"input_first_frame":false,"input_first_last_frame":true,"aspect_ratio_allowed":[],"input_last_frame":false,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false},"originalTypes":["image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":1}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["image_to_video"],"alias":"即梦首尾帧视频生成V3.0","description":"","iconPath":"https://static.51easyai.com/jimeng-logo.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"即梦首尾帧视频生成V3.0","types":["image_to_video"],"alias":"即梦首尾帧视频生成V3.0","icon_path":"https://static.51easyai.com/jimeng-logo.png","model_limits":{"max_concurrent_requests":1},"capabilities":{"image_to_video":{"input_smart_multi_frame":true,"smart_multi_frame_range":[2,5],"smart_multi_frame_mode":"stitch","output_resolutions":["720p"],"duration_range":[5,10],"input_width_height_range":[320,4096],"input_size_limit":4928307.2,"input_first_frame":false,"input_first_last_frame":true,"aspect_ratio_allowed":[],"input_last_frame":false,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:即梦文生视频V3.0_1080p', '即梦文生视频V3.0_1080p', 'video_generate', '即梦文生视频V3.0_1080p', '{"video_generate":{"output_resolutions":["1080p"],"duration_range":[5,10],"aspect_ratio_allowed":["16:9","4:3","1:1","3:4","9:16","21:9"]},"originalTypes":["video_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":1}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["video_generate"],"alias":"即梦文生视频V3.0_1080p","description":"","iconPath":"https://static.51easyai.com/jimeng-logo.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"即梦文生视频V3.0_1080p","types":["video_generate"],"alias":"即梦文生视频V3.0_1080p","icon_path":"https://static.51easyai.com/jimeng-logo.png","model_limits":{"max_concurrent_requests":1},"capabilities":{"video_generate":{"output_resolutions":["1080p"],"duration_range":[5,10],"aspect_ratio_allowed":["16:9","4:3","1:1","3:4","9:16","21:9"]}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:即梦图生视频V3.0_1080p', '即梦图生视频V3.0_1080p', 'image_to_video', '即梦图生视频V3.0_1080p', '{"image_to_video":{"output_resolutions":["1080p"],"duration_range":[5,10],"input_width_height_range":[320,4096],"input_size_limit":4928307.2,"input_first_frame":true,"aspect_ratio_allowed":[],"input_last_frame":false,"input_first_last_frame":false,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false},"originalTypes":["image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":1}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["image_to_video"],"alias":"即梦图生视频V3.0_1080p","description":"","iconPath":"https://static.51easyai.com/jimeng-logo.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"即梦图生视频V3.0_1080p","types":["image_to_video"],"alias":"即梦图生视频V3.0_1080p","icon_path":"https://static.51easyai.com/jimeng-logo.png","model_limits":{"max_concurrent_requests":1},"capabilities":{"image_to_video":{"output_resolutions":["1080p"],"duration_range":[5,10],"input_width_height_range":[320,4096],"input_size_limit":4928307.2,"input_first_frame":true,"aspect_ratio_allowed":[],"input_last_frame":false,"input_first_last_frame":false,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:即梦图生视频V3.0_1080p_首尾帧', '即梦图生视频V3.0_1080p_首尾帧', 'image_to_video', '即梦图生视频V3.0_1080p_首尾帧', '{"image_to_video":{"input_smart_multi_frame":true,"smart_multi_frame_range":[2,5],"smart_multi_frame_mode":"stitch","output_resolutions":["1080p"],"duration_range":[5,10],"input_width_height_range":[320,4096],"input_size_limit":4928307.2,"input_first_frame":false,"input_first_last_frame":true,"aspect_ratio_allowed":[],"input_last_frame":false,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false},"originalTypes":["image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":1}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["image_to_video"],"alias":"即梦图生视频V3.0_1080p_首尾帧","description":"","iconPath":"https://static.51easyai.com/jimeng-logo.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"即梦图生视频V3.0_1080p_首尾帧","types":["image_to_video"],"alias":"即梦图生视频V3.0_1080p_首尾帧","icon_path":"https://static.51easyai.com/jimeng-logo.png","model_limits":{"max_concurrent_requests":1},"capabilities":{"image_to_video":{"input_smart_multi_frame":true,"smart_multi_frame_range":[2,5],"smart_multi_frame_mode":"stitch","output_resolutions":["1080p"],"duration_range":[5,10],"input_width_height_range":[320,4096],"input_size_limit":4928307.2,"input_first_frame":false,"input_first_last_frame":true,"aspect_ratio_allowed":[],"input_last_frame":false,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:即梦数字人V1', '即梦数字人V1', 'digital_human_generate', '即梦数字人V1', '{"originalTypes":["digital_human_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":1}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["digital_human_generate"],"alias":"即梦数字人V1","description":"","iconPath":"https://static.51easyai.com/jimeng-logo.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"即梦数字人V1","types":["digital_human_generate"],"alias":"即梦数字人V1","icon_path":"https://static.51easyai.com/jimeng-logo.png","model_limits":{"max_concurrent_requests":1}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:即梦单图音频驱动-普通模式', '即梦单图音频驱动-普通模式', 'digital_human_generate', '即梦单图音频驱动-普通模式', '{"originalTypes":["digital_human_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":1}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["digital_human_generate"],"alias":"即梦单图音频驱动-普通模式","description":"","iconPath":"https://static.51easyai.com/jimeng-logo.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"即梦单图音频驱动-普通模式","types":["digital_human_generate"],"alias":"即梦单图音频驱动-普通模式","icon_path":"https://static.51easyai.com/jimeng-logo.png","model_limits":{"max_concurrent_requests":1}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:即梦单图音频驱动-灵动模式', '即梦单图音频驱动-灵动模式', 'digital_human_generate', '即梦单图音频驱动-灵动模式', '{"originalTypes":["digital_human_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":1}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["digital_human_generate"],"alias":"即梦单图音频驱动-灵动模式","description":"","iconPath":"https://static.51easyai.com/jimeng-logo.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"即梦单图音频驱动-灵动模式","types":["digital_human_generate"],"alias":"即梦单图音频驱动-灵动模式","icon_path":"https://static.51easyai.com/jimeng-logo.png","model_limits":{"max_concurrent_requests":1}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:即梦视频改口型Lite模式', '即梦视频改口型Lite模式', 'digital_human_generate', '即梦视频改口型Lite模式', '{"originalTypes":["digital_human_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":1}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["digital_human_generate"],"alias":"即梦视频改口型Lite模式","description":"","iconPath":"https://static.51easyai.com/jimeng-logo.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"即梦视频改口型Lite模式","types":["digital_human_generate"],"alias":"即梦视频改口型Lite模式","icon_path":"https://static.51easyai.com/jimeng-logo.png","model_limits":{"max_concurrent_requests":1}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:即梦单图音频驱动-大画幅灵动模式', '即梦单图音频驱动-大画幅灵动模式', 'digital_human_generate', '即梦单图音频驱动-大画幅灵动模式', '{"originalTypes":["digital_human_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":1}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["digital_human_generate"],"alias":"即梦单图音频驱动-大画幅灵动模式","description":"","iconPath":"https://static.51easyai.com/jimeng-logo.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"即梦单图音频驱动-大画幅灵动模式","types":["digital_human_generate"],"alias":"即梦单图音频驱动-大画幅灵动模式","icon_path":"https://static.51easyai.com/jimeng-logo.png","model_limits":{"max_concurrent_requests":1}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:即梦动作模仿', '即梦动作模仿', 'digital_human_generate', '即梦动作模仿', '{"originalTypes":["digital_human_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":1}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["digital_human_generate"],"alias":"即梦动作模仿","description":"","iconPath":"https://static.51easyai.com/jimeng-logo.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"即梦动作模仿","types":["digital_human_generate"],"alias":"即梦动作模仿","icon_path":"https://static.51easyai.com/jimeng-logo.png","model_limits":{"max_concurrent_requests":1}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:即梦动作模仿2.0', '即梦动作模仿2.0', 'digital_human_generate', '即梦动作模仿2.0', '{"originalTypes":["digital_human_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":1}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["digital_human_generate"],"alias":"即梦动作模仿2.0","description":"","iconPath":"https://static.51easyai.com/jimeng-logo.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"即梦动作模仿2.0","types":["digital_human_generate"],"alias":"即梦动作模仿2.0","icon_path":"https://static.51easyai.com/jimeng-logo.png","model_limits":{"max_concurrent_requests":1}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:即梦数字人快速模式1.0', '即梦数字人快速模式1.0', 'digital_human_generate', '即梦数字人快速模式1.0', '{"originalTypes":["digital_human_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":1}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["digital_human_generate"],"alias":"即梦数字人快速模式1.0","description":"","iconPath":"https://static.51easyai.com/jimeng-logo.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"即梦数字人快速模式1.0","types":["digital_human_generate"],"alias":"即梦数字人快速模式1.0","icon_path":"https://static.51easyai.com/jimeng-logo.png","model_limits":{"max_concurrent_requests":1}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:即梦数字人快速模式1.5', '即梦数字人快速模式1.5', 'digital_human_generate', '即梦数字人快速模式1.5', '{"originalTypes":["digital_human_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":1}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["digital_human_generate"],"alias":"即梦数字人快速模式1.5","description":"","iconPath":"https://static.51easyai.com/jimeng-logo.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"即梦数字人快速模式1.5","types":["digital_human_generate"],"alias":"即梦数字人快速模式1.5","icon_path":"https://static.51easyai.com/jimeng-logo.png","model_limits":{"max_concurrent_requests":1}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:doubao-3.0图像编辑', 'doubao-3.0图像编辑', 'image_edit', 'doubao-3.0图像编辑', '{"image_edit":{"output_resolutions":["1K","2K"],"aspect_ratio_allowed":["adaptive"],"input_multiple_images":false,"output_multiple_images":false},"originalTypes":["image_edit"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["image_edit"],"alias":"doubao-3.0图像编辑","description":"","iconPath":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"doubao-3.0图像编辑","types":["image_edit"],"alias":"doubao-3.0图像编辑","icon_path":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","capabilities":{"image_edit":{"output_resolutions":["1K","2K"],"aspect_ratio_allowed":["adaptive"],"input_multiple_images":false,"output_multiple_images":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:doubao-4.0图像编辑', 'doubao-4.0图像编辑', 'image_edit', 'doubao-4.0图像编辑', '{"image_edit":{"input_multiple_images":true,"input_max_images_count":10,"output_resolutions":["1K","2K","4K"],"output_max_size":16777216,"output_size_range":[921600,16777216],"aspect_ratio_range":[0.0625,16],"output_multiple_images":true},"image_generate":{"output_resolutions":["1K","2K","4K"],"output_max_size":16777216,"aspect_ratio_range":[0.0625,16],"output_size_range":[921600,16777216],"output_multiple_images":true},"originalTypes":["image_edit","image_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["image_edit","image_generate"],"alias":"doubao-4.0图像编辑","description":"","iconPath":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"doubao-4.0图像编辑","types":["image_edit","image_generate"],"alias":"doubao-4.0图像编辑","icon_path":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","capabilities":{"image_edit":{"input_multiple_images":true,"input_max_images_count":10,"output_resolutions":["1K","2K","4K"],"output_max_size":16777216,"output_size_range":[921600,16777216],"aspect_ratio_range":[0.0625,16],"output_multiple_images":true},"image_generate":{"output_resolutions":["1K","2K","4K"],"output_max_size":16777216,"aspect_ratio_range":[0.0625,16],"output_size_range":[921600,16777216],"output_multiple_images":true}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:doubao-5.0图像编辑', 'doubao-5.0图像编辑', 'image_edit', 'doubao-5.0图像编辑', '{"image_edit":{"input_multiple_images":true,"input_max_images_count":10,"output_resolutions":["2K","3K"],"output_max_size":10404496,"output_size_range":[3686400,10404496],"aspect_ratio_range":[0.0625,16],"output_multiple_images":true},"image_generate":{"output_resolutions":["2K","3K"],"output_max_size":10404496,"aspect_ratio_range":[0.0625,16],"output_size_range":[3686400,10404496],"output_multiple_images":true},"originalTypes":["image_edit","image_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["image_edit","image_generate"],"alias":"doubao-5.0图像编辑","description":"支持 2K 和 3K 分辨率","iconPath":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"doubao-5.0图像编辑","types":["image_edit","image_generate"],"alias":"doubao-5.0图像编辑","description":"支持 2K 和 3K 分辨率","icon_path":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","capabilities":{"image_edit":{"input_multiple_images":true,"input_max_images_count":10,"output_resolutions":["2K","3K"],"output_max_size":10404496,"output_size_range":[3686400,10404496],"aspect_ratio_range":[0.0625,16],"output_multiple_images":true},"image_generate":{"output_resolutions":["2K","3K"],"output_max_size":10404496,"aspect_ratio_range":[0.0625,16],"output_size_range":[3686400,10404496],"output_multiple_images":true}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:doubao-5.0-lite图像编辑', 'doubao-5.0-lite图像编辑', 'image_edit', 'doubao-5.0-lite图像编辑', '{"image_edit":{"input_multiple_images":true,"input_max_images_count":10,"output_resolutions":["2K","3K"],"output_max_size":10404496,"output_size_range":[3686400,10404496],"aspect_ratio_range":[0.0625,16],"output_multiple_images":true},"image_generate":{"output_resolutions":["2K","3K"],"output_max_size":10404496,"aspect_ratio_range":[0.0625,16],"output_size_range":[3686400,10404496],"output_multiple_images":true},"originalTypes":["image_edit","image_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["image_edit","image_generate"],"alias":"doubao-5.0-lite图像编辑","description":"轻量版,支持 2K 和 3K 分辨率","iconPath":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"doubao-5.0-lite图像编辑","types":["image_edit","image_generate"],"alias":"doubao-5.0-lite图像编辑","description":"轻量版,支持 2K 和 3K 分辨率","icon_path":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","capabilities":{"image_edit":{"input_multiple_images":true,"input_max_images_count":10,"output_resolutions":["2K","3K"],"output_max_size":10404496,"output_size_range":[3686400,10404496],"aspect_ratio_range":[0.0625,16],"output_multiple_images":true},"image_generate":{"output_resolutions":["2K","3K"],"output_max_size":10404496,"aspect_ratio_range":[0.0625,16],"output_size_range":[3686400,10404496],"output_multiple_images":true}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:doubao-4.5图像编辑', 'doubao-4.5图像编辑', 'image_generate', 'doubao-4.5图像编辑', '{"image_generate":{"output_resolutions":["2K","4K"],"output_max_size":16777216,"aspect_ratio_range":[0.0625,16],"output_size_range":[3686400,16777216],"output_multiple_images":true},"image_edit":{"input_size_range":["14x14","6000x6000"],"input_format_allowed":["png","jpg","jpeg","webp","gif","bmp","tiff"],"input_multiple_images":true,"input_aspect_ratio_range":[0.0625,16],"input_max_images_count":14,"output_resolutions":["2K","4K"],"output_max_size":16777216,"aspect_ratio_range":[0.0625,16],"output_size_range":[3686400,16777216],"output_multiple_images":true},"originalTypes":["image_generate","image_edit"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["image_generate","image_edit"],"alias":"doubao-4.5图像编辑","description":"多图稳定融合超强编辑一致性小字清晰4k超高清","iconPath":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"doubao-4.5图像编辑","types":["image_generate","image_edit"],"alias":"doubao-4.5图像编辑","description":"多图稳定融合超强编辑一致性小字清晰4k超高清","icon_path":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","capabilities":{"image_generate":{"output_resolutions":["2K","4K"],"output_max_size":16777216,"aspect_ratio_range":[0.0625,16],"output_size_range":[3686400,16777216],"output_multiple_images":true},"image_edit":{"input_size_range":["14x14","6000x6000"],"input_format_allowed":["png","jpg","jpeg","webp","gif","bmp","tiff"],"input_multiple_images":true,"input_aspect_ratio_range":[0.0625,16],"input_max_images_count":14,"output_resolutions":["2K","4K"],"output_max_size":16777216,"aspect_ratio_range":[0.0625,16],"output_size_range":[3686400,16777216],"output_multiple_images":true}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:doubao-3.0文生图', 'doubao-3.0文生图', 'image_generate', 'doubao-3.0文生图', '{"image_generate":{"output_resolutions":["2K","1K"],"output_max_size":4194304,"aspect_ratio_range":[0.42857142857142855,2.3333333333333335],"output_multiple_images":false},"originalTypes":["image_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["image_generate"],"alias":"doubao-3.0文生图","description":"","iconPath":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"doubao-3.0文生图","types":["image_generate"],"alias":"doubao-3.0文生图","icon_path":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","capabilities":{"image_generate":{"output_resolutions":["2K","1K"],"output_max_size":4194304,"aspect_ratio_range":[0.42857142857142855,2.3333333333333335],"output_multiple_images":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:doubao-1.0-lite-文生视频', 'doubao-1.0-lite-文生视频', 'video_generate', 'doubao-1.0-lite-文生视频', '{"video_generate":{"output_resolutions":["720p","480p","1080p"],"aspect_ratio_allowed":["16:9","4:3","1:1","3:4","9:16","21:9"],"duration_range":[3,12]},"originalTypes":["video_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_request_per_minute":300,"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["video_generate"],"alias":"doubao-1.0-lite-文生视频","description":"","iconPath":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"doubao-1.0-lite-文生视频","types":["video_generate"],"alias":"doubao-1.0-lite-文生视频","icon_path":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","model_limits":{"max_request_per_minute":300,"max_concurrent_requests":5},"capabilities":{"video_generate":{"output_resolutions":["720p","480p","1080p"],"aspect_ratio_allowed":["16:9","4:3","1:1","3:4","9:16","21:9"],"duration_range":[3,12]}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:doubao-1.0-lite-i2v-图生视频', 'doubao-1.0-lite-i2v-图生视频', 'image_to_video', 'doubao-1.0-lite-i2v-图生视频', '{"image_to_video":{"input_smart_multi_frame":true,"smart_multi_frame_range":[2,5],"smart_multi_frame_mode":"stitch","output_resolutions":["720p","480p","1080p"],"input_first_frame":true,"input_first_last_frame":true,"aspect_ratio_allowed":["16:9","4:3","1:1","3:4","9:16","21:9","adaptive"],"duration_range":[3,12],"input_last_frame":false,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false},"originalTypes":["image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_request_per_minute":300,"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["image_to_video"],"alias":"doubao-1.0-lite-i2v-图生视频","description":"","iconPath":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"doubao-1.0-lite-i2v-图生视频","types":["image_to_video"],"alias":"doubao-1.0-lite-i2v-图生视频","icon_path":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","model_limits":{"max_request_per_minute":300,"max_concurrent_requests":5},"capabilities":{"image_to_video":{"input_smart_multi_frame":true,"smart_multi_frame_range":[2,5],"smart_multi_frame_mode":"stitch","output_resolutions":["720p","480p","1080p"],"input_first_frame":true,"input_first_last_frame":true,"aspect_ratio_allowed":["16:9","4:3","1:1","3:4","9:16","21:9","adaptive"],"duration_range":[3,12],"input_last_frame":false,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:豆包Seedance-pro', '豆包Seedance-pro', 'video_generate', '豆包Seedance-pro', '{"video_generate":{"output_resolutions":["720p","480p","1080p"],"aspect_ratio_allowed":["16:9","4:3","1:1","3:4","9:16","21:9","adaptive"],"duration_range":[3,12]},"image_to_video":{"input_smart_multi_frame":true,"smart_multi_frame_range":[2,5],"smart_multi_frame_mode":"stitch","output_resolutions":["720p","480p","1080p"],"input_first_frame":true,"input_first_last_frame":true,"aspect_ratio_allowed":["16:9","4:3","1:1","3:4","9:16","21:9","adaptive"],"duration_range":[3,12],"input_last_frame":false,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false},"originalTypes":["video_generate","image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_request_per_minute":600,"max_concurrent_requests":10}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["video_generate","image_to_video"],"alias":"豆包Seedance-pro","description":"","iconPath":"https://static.51easyai.com/minimax-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"豆包Seedance-pro","types":["video_generate","image_to_video"],"alias":"豆包Seedance-pro","model_limits":{"max_request_per_minute":600,"max_concurrent_requests":10},"icon_path":"https://static.51easyai.com/minimax-color.png","capabilities":{"video_generate":{"output_resolutions":["720p","480p","1080p"],"aspect_ratio_allowed":["16:9","4:3","1:1","3:4","9:16","21:9","adaptive"],"duration_range":[3,12]},"image_to_video":{"input_smart_multi_frame":true,"smart_multi_frame_range":[2,5],"smart_multi_frame_mode":"stitch","output_resolutions":["720p","480p","1080p"],"input_first_frame":true,"input_first_last_frame":true,"aspect_ratio_allowed":["16:9","4:3","1:1","3:4","9:16","21:9","adaptive"],"duration_range":[3,12],"input_last_frame":false,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:豆包Seedance-1.5-pro', '豆包Seedance-1.5-pro', 'video_generate', '豆包Seedance-1.5-pro', '{"video_generate":{"output_resolutions":["720p","480p","1080p"],"aspect_ratio_allowed":["16:9","4:3","1:1","3:4","9:16","21:9","adaptive"],"duration_range":[3,12],"output_audio":true},"image_to_video":{"input_smart_multi_frame":true,"smart_multi_frame_range":[2,5],"smart_multi_frame_mode":"stitch","output_resolutions":["720p","480p","1080p"],"input_first_frame":true,"input_first_last_frame":true,"aspect_ratio_allowed":["16:9","4:3","1:1","3:4","9:16","21:9","adaptive"],"duration_range":[4,12],"input_last_frame":false,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"output_audio":true},"originalTypes":["video_generate","image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_request_per_minute":600,"max_concurrent_requests":10}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["video_generate","image_to_video"],"alias":"豆包Seedance-1.5-pro","description":"","iconPath":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"豆包Seedance-1.5-pro","types":["video_generate","image_to_video"],"alias":"豆包Seedance-1.5-pro","icon_path":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","model_limits":{"max_request_per_minute":600,"max_concurrent_requests":10},"capabilities":{"video_generate":{"output_resolutions":["720p","480p","1080p"],"aspect_ratio_allowed":["16:9","4:3","1:1","3:4","9:16","21:9","adaptive"],"duration_range":[3,12],"output_audio":true},"image_to_video":{"input_smart_multi_frame":true,"smart_multi_frame_range":[2,5],"smart_multi_frame_mode":"stitch","output_resolutions":["720p","480p","1080p"],"input_first_frame":true,"input_first_last_frame":true,"aspect_ratio_allowed":["16:9","4:3","1:1","3:4","9:16","21:9","adaptive"],"duration_range":[4,12],"input_last_frame":false,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"output_audio":true}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:豆包Seedance-pro-fast', '豆包Seedance-pro-fast', 'video_generate', '豆包Seedance-pro-fast', '{"video_generate":{"output_resolutions":["720p","480p","1080p"],"aspect_ratio_allowed":["16:9","4:3","1:1","3:4","9:16","21:9","adaptive"],"duration_range":[3,12]},"image_to_video":{"output_resolutions":["720p","480p","1080p"],"input_first_frame":true,"input_first_last_frame":false,"aspect_ratio_allowed":["16:9","4:3","1:1","3:4","9:16","21:9","adaptive"],"duration_range":[3,12],"input_last_frame":false,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false},"originalTypes":["video_generate","image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_request_per_minute":600,"max_concurrent_requests":10}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["video_generate","image_to_video"],"alias":"豆包Seedance-pro-fast","description":"","iconPath":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"豆包Seedance-pro-fast","types":["video_generate","image_to_video"],"model_limits":{"max_request_per_minute":600,"max_concurrent_requests":10},"alias":"豆包Seedance-pro-fast","icon_path":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","capabilities":{"video_generate":{"output_resolutions":["720p","480p","1080p"],"aspect_ratio_allowed":["16:9","4:3","1:1","3:4","9:16","21:9","adaptive"],"duration_range":[3,12]},"image_to_video":{"output_resolutions":["720p","480p","1080p"],"input_first_frame":true,"input_first_last_frame":false,"aspect_ratio_allowed":["16:9","4:3","1:1","3:4","9:16","21:9","adaptive"],"duration_range":[3,12],"input_last_frame":false,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:豆包Seedance-2.0', '豆包Seedance-2.0', 'video_generate', '豆包Seedance-2.0', '{"video_generate":{"output_resolutions":["720p","480p","1080p"],"aspect_ratio_allowed":["16:9","4:3","1:1","3:4","9:16","21:9","adaptive"],"duration_range":[4,15],"input_audio":true,"output_audio":true,"output_support_return_last_frame":true,"output_video_continuation":true,"max_images":9,"max_videos":3},"image_to_video":{"output_resolutions":["720p","480p","1080p"],"input_first_frame":true,"input_first_last_frame":true,"input_last_frame":false,"input_reference_generate_single":true,"input_reference_generate_multiple":true,"aspect_ratio_allowed":["16:9","4:3","1:1","3:4","9:16","21:9","adaptive"],"duration_range":[4,15],"input_audio":true,"support_video_effect_template":false,"output_audio":true,"output_support_return_last_frame":true,"output_video_continuation":true,"max_images":9,"max_videos":3,"max_images_for_last_frame":2},"omni_video":{"supported_modes":["element_reference","text_to_video","image_reference","first_last_frame","video_reference","video_edit","multi_shot"],"output_resolutions":["720p","480p","1080p"],"aspect_ratio_allowed":["16:9","4:3","1:1","3:4","9:16","21:9","adaptive"],"duration_options":[4,5,6,7,8,9,10,11,12,13,14,15],"output_audio":true,"max_videos":3,"max_images":9,"max_elements":9,"max_images_and_elements":9,"max_images_for_last_frame":2,"support_instruction_edit":true},"originalTypes":["video_generate","image_to_video","omni_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_request_per_minute":600,"max_concurrent_requests":10}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["video_generate","image_to_video","omni_video"],"alias":"豆包Seedance-2.0","description":"","iconPath":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"豆包Seedance-2.0","types":["video_generate","image_to_video","omni_video"],"alias":"豆包Seedance-2.0","icon_path":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","model_limits":{"max_request_per_minute":600,"max_concurrent_requests":10},"capabilities":{"video_generate":{"output_resolutions":["720p","480p","1080p"],"aspect_ratio_allowed":["16:9","4:3","1:1","3:4","9:16","21:9","adaptive"],"duration_range":[4,15],"input_audio":true,"output_audio":true,"output_support_return_last_frame":true,"output_video_continuation":true,"max_images":9,"max_videos":3},"image_to_video":{"output_resolutions":["720p","480p","1080p"],"input_first_frame":true,"input_first_last_frame":true,"input_last_frame":false,"input_reference_generate_single":true,"input_reference_generate_multiple":true,"aspect_ratio_allowed":["16:9","4:3","1:1","3:4","9:16","21:9","adaptive"],"duration_range":[4,15],"input_audio":true,"support_video_effect_template":false,"output_audio":true,"output_support_return_last_frame":true,"output_video_continuation":true,"max_images":9,"max_videos":3,"max_images_for_last_frame":2},"omni_video":{"supported_modes":["element_reference","text_to_video","image_reference","first_last_frame","video_reference","video_edit","multi_shot"],"output_resolutions":["720p","480p","1080p"],"aspect_ratio_allowed":["16:9","4:3","1:1","3:4","9:16","21:9","adaptive"],"duration_options":[4,5,6,7,8,9,10,11,12,13,14,15],"output_audio":true,"max_videos":3,"max_images":9,"max_elements":9,"max_images_and_elements":9,"max_images_for_last_frame":2,"support_instruction_edit":true}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:豆包Seedance-2.0-fast', '豆包Seedance-2.0-fast', 'video_generate', '豆包Seedance-2.0-fast', '{"video_generate":{"output_resolutions":["720p","480p"],"aspect_ratio_allowed":["16:9","4:3","1:1","3:4","9:16","21:9","adaptive"],"duration_range":[4,15],"input_audio":true,"output_audio":true,"output_support_return_last_frame":true,"output_video_continuation":true,"max_images":9,"max_videos":3},"image_to_video":{"output_resolutions":["720p","480p"],"input_first_frame":true,"input_first_last_frame":true,"input_last_frame":false,"input_reference_generate_single":true,"input_reference_generate_multiple":true,"aspect_ratio_allowed":["16:9","4:3","1:1","3:4","9:16","21:9","adaptive"],"duration_range":[4,15],"input_audio":true,"support_video_effect_template":false,"output_audio":true,"output_support_return_last_frame":true,"output_video_continuation":true,"max_images":9,"max_videos":3,"max_images_for_last_frame":2},"omni_video":{"supported_modes":["element_reference","text_to_video","image_reference","first_last_frame","video_reference","video_edit","multi_shot"],"output_resolutions":["720p","480p"],"aspect_ratio_allowed":["16:9","4:3","1:1","3:4","9:16","21:9","adaptive"],"duration_options":[4,5,6,7,8,9,10,11,12,13,14,15],"output_audio":true,"max_videos":3,"max_images":9,"max_elements":9,"max_images_and_elements":9,"max_images_for_last_frame":2,"support_instruction_edit":true},"originalTypes":["video_generate","image_to_video","omni_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_request_per_minute":600,"max_concurrent_requests":10}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["video_generate","image_to_video","omni_video"],"alias":"豆包Seedance-2.0-fast","description":"","iconPath":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"豆包Seedance-2.0-fast","types":["video_generate","image_to_video","omni_video"],"alias":"豆包Seedance-2.0-fast","icon_path":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","model_limits":{"max_request_per_minute":600,"max_concurrent_requests":10},"capabilities":{"video_generate":{"output_resolutions":["720p","480p"],"aspect_ratio_allowed":["16:9","4:3","1:1","3:4","9:16","21:9","adaptive"],"duration_range":[4,15],"input_audio":true,"output_audio":true,"output_support_return_last_frame":true,"output_video_continuation":true,"max_images":9,"max_videos":3},"image_to_video":{"output_resolutions":["720p","480p"],"input_first_frame":true,"input_first_last_frame":true,"input_last_frame":false,"input_reference_generate_single":true,"input_reference_generate_multiple":true,"aspect_ratio_allowed":["16:9","4:3","1:1","3:4","9:16","21:9","adaptive"],"duration_range":[4,15],"input_audio":true,"support_video_effect_template":false,"output_audio":true,"output_support_return_last_frame":true,"output_video_continuation":true,"max_images":9,"max_videos":3,"max_images_for_last_frame":2},"omni_video":{"supported_modes":["element_reference","text_to_video","image_reference","first_last_frame","video_reference","video_edit","multi_shot"],"output_resolutions":["720p","480p"],"aspect_ratio_allowed":["16:9","4:3","1:1","3:4","9:16","21:9","adaptive"],"duration_options":[4,5,6,7,8,9,10,11,12,13,14,15],"output_audio":true,"max_videos":3,"max_images":9,"max_elements":9,"max_images_and_elements":9,"max_images_for_last_frame":2,"support_instruction_edit":true}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:Midjourney_v7', 'Midjourney_v7', 'image_generate', 'Midjourney_v7', '{"image_generate":{"output_resolutions":["1K","2K"]},"image_edit":{"input_multiple_images":true,"input_max_images_count":16,"output_resolutions":["1K","2K"]},"originalTypes":["image_generate","image_edit"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["image_generate","image_edit"],"alias":"Midjourney_v7","description":"","iconPath":"https://static.51easyai.com/midjourney.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"Midjourney_v7","types":["image_generate","image_edit"],"alias":"Midjourney_v7","icon_path":"https://static.51easyai.com/midjourney.png","capabilities":{"image_generate":{"output_resolutions":["1K","2K"]},"image_edit":{"input_multiple_images":true,"input_max_images_count":16,"output_resolutions":["1K","2K"]}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:Midjourney_v6', 'Midjourney_v6', 'image_generate', 'Midjourney_v6', '{"image_generate":{"output_resolutions":["1K","2K"]},"image_edit":{"input_multiple_images":true,"input_max_images_count":16,"output_resolutions":["1K","2K"]},"originalTypes":["image_generate","image_edit"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["image_generate","image_edit"],"alias":"Midjourney_v6","description":"","iconPath":"https://static.51easyai.com/midjourney.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"Midjourney_v6","types":["image_generate","image_edit"],"alias":"Midjourney_v6","icon_path":"https://static.51easyai.com/midjourney.png","capabilities":{"image_generate":{"output_resolutions":["1K","2K"]},"image_edit":{"input_multiple_images":true,"input_max_images_count":16,"output_resolutions":["1K","2K"]}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:Midjourney_v6.1', 'Midjourney_v6.1', 'image_generate', 'Midjourney_v6.1', '{"image_generate":{"output_resolutions":["1K","2K"]},"image_edit":{"input_multiple_images":true,"input_max_images_count":16,"output_resolutions":["1K","2K"]},"originalTypes":["image_generate","image_edit"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["image_generate","image_edit"],"alias":"Midjourney_v6.1","description":"","iconPath":"https://static.51easyai.com/midjourney.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"Midjourney_v6.1","types":["image_generate","image_edit"],"alias":"Midjourney_v6.1","icon_path":"https://static.51easyai.com/midjourney.png","capabilities":{"image_generate":{"output_resolutions":["1K","2K"]},"image_edit":{"input_multiple_images":true,"input_max_images_count":16,"output_resolutions":["1K","2K"]}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:Midjourney_Niji_v7', 'Midjourney_Niji_v7', 'image_generate', 'Midjourney_Niji_v7', '{"image_generate":{"output_resolutions":["1K","2K"]},"image_edit":{"input_multiple_images":true,"input_max_images_count":16,"output_resolutions":["1K","2K"]},"originalTypes":["image_generate","image_edit"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["image_generate","image_edit"],"alias":"Midjourney_Niji_v7","description":"","iconPath":"https://static.51easyai.com/midjourney.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"Midjourney_Niji_v7","types":["image_generate","image_edit"],"alias":"Midjourney_Niji_v7","icon_path":"https://static.51easyai.com/midjourney.png","capabilities":{"image_generate":{"output_resolutions":["1K","2K"]},"image_edit":{"input_multiple_images":true,"input_max_images_count":16,"output_resolutions":["1K","2K"]}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:Midjourney_Niji_v6', 'Midjourney_Niji_v6', 'image_generate', 'Midjourney_Niji_v6', '{"image_generate":{"output_resolutions":["1K","2K"]},"image_edit":{"input_multiple_images":true,"input_max_images_count":16,"output_resolutions":["1K","2K"]},"originalTypes":["image_generate","image_edit"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["image_generate","image_edit"],"alias":"Midjourney_Niji_v6","description":"","iconPath":"https://static.51easyai.com/midjourney.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"Midjourney_Niji_v6","types":["image_generate","image_edit"],"alias":"Midjourney_Niji_v6","icon_path":"https://static.51easyai.com/midjourney.png","capabilities":{"image_generate":{"output_resolutions":["1K","2K"]},"image_edit":{"input_multiple_images":true,"input_max_images_count":16,"output_resolutions":["1K","2K"]}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:gemini-2.0', 'gemini-2.0', 'image_generate', 'gemini-2.0', '{"image_generate":{"output_multiple_images":false,"aspect_ratio_allowed":[],"output_resolutions":[]},"image_edit":{"output_multiple_images":false,"aspect_ratio_allowed":[],"input_multiple_images":true,"output_resolutions":[]},"originalTypes":["image_generate","image_edit"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["image_generate","image_edit"],"alias":"gemini-2.0","description":"","iconPath":"https://static.51easyai.com/gemini-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"gemini-2.0","types":["image_generate","image_edit"],"alias":"gemini-2.0","icon_path":"https://static.51easyai.com/gemini-color.png","capabilities":{"image_generate":{"output_multiple_images":false,"aspect_ratio_allowed":[],"output_resolutions":[]},"image_edit":{"output_multiple_images":false,"aspect_ratio_allowed":[],"input_multiple_images":true,"output_resolutions":[]}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:Nano Banana', 'Nano Banana', 'image_generate', 'Nano Banana', '{"image_generate":{"output_multiple_images":true,"output_max_images_count":4,"output_resolutions":[],"aspect_ratio_allowed":["1:1","16:9","4:3","3:4","9:16","21:9","3:2","2:3"]},"image_edit":{"output_multiple_images":true,"output_max_images_count":4,"input_max_images_count":4,"output_resolutions":[],"aspect_ratio_allowed":["1:1","16:9","4:3","3:4","9:16","21:9","3:2","2:3"],"input_multiple_images":true},"originalTypes":["image_generate","image_edit"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["image_generate","image_edit"],"alias":"Nano Banana","description":"","iconPath":"https://static.51easyai.com/gemini-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"Nano Banana","types":["image_generate","image_edit"],"alias":"Nano Banana","icon_path":"https://static.51easyai.com/gemini-color.png","capabilities":{"image_generate":{"output_multiple_images":true,"output_max_images_count":4,"output_resolutions":[],"aspect_ratio_allowed":["1:1","16:9","4:3","3:4","9:16","21:9","3:2","2:3"]},"image_edit":{"output_multiple_images":true,"output_max_images_count":4,"input_max_images_count":4,"output_resolutions":[],"aspect_ratio_allowed":["1:1","16:9","4:3","3:4","9:16","21:9","3:2","2:3"],"input_multiple_images":true}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:Nano Banana Pro 预览版', 'Nano Banana Pro 预览版', 'image_generate', 'Nano Banana Pro 预览版', '{"image_generate":{"output_multiple_images":true,"output_max_images_count":4,"output_resolutions":["1K","2K","4K"],"aspect_ratio_allowed":["1:1","16:9","4:3","3:4","5:4","4:5","9:16","21:9","3:2","2:3"]},"image_edit":{"output_multiple_images":true,"input_multiple_images":true,"output_resolutions":["1K","2K","4K"],"input_max_images_count":14,"aspect_ratio_allowed":["1:1","16:9","4:3","3:4","5:4","4:5","9:16","21:9","3:2","2:3"]},"originalTypes":["image_generate","image_edit"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["image_generate","image_edit"],"alias":"Nano Banana Pro 预览版","description":"","iconPath":"https://static.51easyai.com/gemini-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"Nano Banana Pro 预览版","types":["image_generate","image_edit"],"alias":"Nano Banana Pro 预览版","icon_path":"https://static.51easyai.com/gemini-color.png","capabilities":{"image_generate":{"output_multiple_images":true,"output_max_images_count":4,"output_resolutions":["1K","2K","4K"],"aspect_ratio_allowed":["1:1","16:9","4:3","3:4","5:4","4:5","9:16","21:9","3:2","2:3"]},"image_edit":{"output_multiple_images":true,"input_multiple_images":true,"output_resolutions":["1K","2K","4K"],"input_max_images_count":14,"aspect_ratio_allowed":["1:1","16:9","4:3","3:4","5:4","4:5","9:16","21:9","3:2","2:3"]}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:Nano Banana 2', 'Nano Banana 2', 'image_generate', 'Nano Banana 2', '{"image_generate":{"output_multiple_images":true,"output_max_images_count":4,"output_resolutions":["1K","2K","4K"],"aspect_ratio_allowed":["1:1","16:9","4:3","3:4","5:4","4:5","9:16","21:9","3:2","2:3","1:4","4:1","1:8","8:1"]},"image_edit":{"output_multiple_images":true,"input_multiple_images":true,"output_resolutions":["1K","2K","4K"],"input_max_images_count":14,"aspect_ratio_allowed":["1:1","16:9","4:3","3:4","5:4","4:5","9:16","21:9","3:2","2:3","1:4","4:1","1:8","8:1"]},"originalTypes":["image_generate","image_edit"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["image_generate","image_edit"],"alias":"Nano Banana 2","description":"","iconPath":"https://static.51easyai.com/gemini-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"Nano Banana 2","types":["image_generate","image_edit"],"alias":"Nano Banana 2","icon_path":"https://static.51easyai.com/gemini-color.png","capabilities":{"image_generate":{"output_multiple_images":true,"output_max_images_count":4,"output_resolutions":["1K","2K","4K"],"aspect_ratio_allowed":["1:1","16:9","4:3","3:4","5:4","4:5","9:16","21:9","3:2","2:3","1:4","4:1","1:8","8:1"]},"image_edit":{"output_multiple_images":true,"input_multiple_images":true,"output_resolutions":["1K","2K","4K"],"input_max_images_count":14,"aspect_ratio_allowed":["1:1","16:9","4:3","3:4","5:4","4:5","9:16","21:9","3:2","2:3","1:4","4:1","1:8","8:1"]}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:Gemini-3 Pro 预览版', 'Gemini-3 Pro 预览版', 'text_generate', 'Gemini-3 Pro 预览版', '{"text_generate":{"supportTool":true,"supportStructuredOutput":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000},"image_analysis":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"video_understanding":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"audio_understanding":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"tools_call":{"supportTool":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000},"omni":{"supportTool":true,"supportStructuredOutput":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000},"originalTypes":["text_generate","image_analysis","video_understanding","audio_understanding","tools_call","omni"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["text_generate","image_analysis","video_understanding","audio_understanding","tools_call","omni"],"alias":"Gemini-3 Pro 预览版","description":"","iconPath":"https://static.51easyai.com/gemini-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"Gemini-3 Pro 预览版","types":["text_generate","image_analysis","video_understanding","audio_understanding","tools_call","omni"],"alias":"Gemini-3 Pro 预览版","icon_path":"https://static.51easyai.com/gemini-color.png","capabilities":{"text_generate":{"supportTool":true,"supportStructuredOutput":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000},"image_analysis":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"video_understanding":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"audio_understanding":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"tools_call":{"supportTool":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000},"omni":{"supportTool":true,"supportStructuredOutput":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:Gemini-3 Flash 预览版', 'Gemini-3 Flash 预览版', 'text_generate', 'Gemini-3 Flash 预览版', '{"text_generate":{"supportTool":true,"supportStructuredOutput":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000},"image_analysis":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"video_understanding":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"audio_understanding":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"tools_call":{"supportTool":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000},"omni":{"supportTool":true,"supportStructuredOutput":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000},"originalTypes":["text_generate","image_analysis","video_understanding","audio_understanding","tools_call","omni"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["text_generate","image_analysis","video_understanding","audio_understanding","tools_call","omni"],"alias":"Gemini-3 Flash 预览版","description":"","iconPath":"https://static.51easyai.com/gemini-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"Gemini-3 Flash 预览版","types":["text_generate","image_analysis","video_understanding","audio_understanding","tools_call","omni"],"alias":"Gemini-3 Flash 预览版","icon_path":"https://static.51easyai.com/gemini-color.png","capabilities":{"text_generate":{"supportTool":true,"supportStructuredOutput":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000},"image_analysis":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"video_understanding":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"audio_understanding":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"tools_call":{"supportTool":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000},"omni":{"supportTool":true,"supportStructuredOutput":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:Gemini-3.1 Flash Lite 预览版', 'Gemini-3.1 Flash Lite 预览版', 'text_generate', 'Gemini-3.1 Flash Lite 预览版', '{"text_generate":{"supportTool":true,"supportStructuredOutput":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000},"image_analysis":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"video_understanding":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"audio_understanding":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"tools_call":{"supportTool":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000},"omni":{"supportTool":true,"supportStructuredOutput":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000},"originalTypes":["text_generate","image_analysis","video_understanding","audio_understanding","tools_call","omni"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["text_generate","image_analysis","video_understanding","audio_understanding","tools_call","omni"],"alias":"Gemini-3.1 Flash Lite 预览版","description":"全模态预览模型,知识截点 2025 年 1 月;上下文窗口 100 万输入 / 6.4 万输出 tokens官方定价输入 $0.25/百万 tokens文本、图片、视频、$0.50/百万 tokens音频输出 $1.50/百万 tokens。","iconPath":"https://static.51easyai.com/gemini-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"Gemini-3.1 Flash Lite 预览版","types":["text_generate","image_analysis","video_understanding","audio_understanding","tools_call","omni"],"alias":"Gemini-3.1 Flash Lite 预览版","icon_path":"https://static.51easyai.com/gemini-color.png","description":"全模态预览模型,知识截点 2025 年 1 月;上下文窗口 100 万输入 / 6.4 万输出 tokens官方定价输入 $0.25/百万 tokens文本、图片、视频、$0.50/百万 tokens音频输出 $1.50/百万 tokens。","capabilities":{"text_generate":{"supportTool":true,"supportStructuredOutput":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000},"image_analysis":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"video_understanding":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"audio_understanding":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"tools_call":{"supportTool":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000},"omni":{"supportTool":true,"supportStructuredOutput":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:Gemini-3.1 Pro 预览版', 'Gemini-3.1 Pro 预览版', 'text_generate', 'Gemini-3.1 Pro 预览版', '{"text_generate":{"supportTool":true,"supportStructuredOutput":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000},"image_analysis":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"video_understanding":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"audio_understanding":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"tools_call":{"supportTool":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000},"omni":{"supportTool":true,"supportStructuredOutput":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000},"originalTypes":["text_generate","image_analysis","video_understanding","audio_understanding","tools_call","omni"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["text_generate","image_analysis","video_understanding","audio_understanding","tools_call","omni"],"alias":"Gemini-3.1 Pro 预览版","description":"全模态预览模型,知识截点 2025 年 1 月;上下文窗口 100 万输入 / 6.4 万输出 tokens官方定价<20 万 tokens 输入 $2/百万、输出 $12/百万,>20 万 tokens 输入 $4/百万、输出 $18/百万。","iconPath":"https://static.51easyai.com/gemini-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"Gemini-3.1 Pro 预览版","types":["text_generate","image_analysis","video_understanding","audio_understanding","tools_call","omni"],"alias":"Gemini-3.1 Pro 预览版","icon_path":"https://static.51easyai.com/gemini-color.png","description":"全模态预览模型,知识截点 2025 年 1 月;上下文窗口 100 万输入 / 6.4 万输出 tokens官方定价<20 万 tokens 输入 $2/百万、输出 $12/百万,>20 万 tokens 输入 $4/百万、输出 $18/百万。","capabilities":{"text_generate":{"supportTool":true,"supportStructuredOutput":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000},"image_analysis":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"video_understanding":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"audio_understanding":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"tools_call":{"supportTool":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000},"omni":{"supportTool":true,"supportStructuredOutput":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:Gemini 2.5 Flash', 'Gemini 2.5 Flash', 'text_generate', 'Gemini 2.5 Flash', '{"originalTypes":["text_generate","image_analysis"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["text_generate","image_analysis"],"alias":"Gemini 2.5 Flash","description":"","iconPath":"https://static.51easyai.com/gemini-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"Gemini 2.5 Flash","types":["text_generate","image_analysis"],"icon_path":"https://static.51easyai.com/gemini-color.png","alias":"Gemini 2.5 Flash"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:Gemini 2.5 Pro', 'Gemini 2.5 Pro', 'text_generate', 'Gemini 2.5 Pro', '{"originalTypes":["text_generate","image_analysis"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["text_generate","image_analysis"],"alias":"Gemini 2.5 Pro","description":"","iconPath":"https://static.51easyai.com/gemini-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"Gemini 2.5 Pro","types":["text_generate","image_analysis"],"icon_path":"https://static.51easyai.com/gemini-color.png","alias":"Gemini 2.5 Pro"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:Doubao Seed 2.0 Pro', 'Doubao Seed 2.0 Pro', 'text_generate', 'Doubao Seed 2.0 Pro', '{"originalTypes":["text_generate","image_analysis","tools_call"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_request_per_minute":30000,"max_token_per_minute":5000000}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["text_generate","image_analysis","tools_call"],"alias":"Doubao Seed 2.0 Pro","description":"深度思考/文本生成/多模态理解/工具调用256K 上下文;最大输入 256K最大回答 128K最大思维链 128K","iconPath":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"Doubao Seed 2.0 Pro","types":["text_generate","image_analysis","tools_call"],"alias":"Doubao Seed 2.0 Pro","icon_path":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","description":"深度思考/文本生成/多模态理解/工具调用256K 上下文;最大输入 256K最大回答 128K最大思维链 128K","model_limits":{"max_request_per_minute":30000,"max_token_per_minute":5000000}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:Doubao Seed 2.0 Lite', 'Doubao Seed 2.0 Lite', 'text_generate', 'Doubao Seed 2.0 Lite', '{"originalTypes":["text_generate","image_analysis","tools_call"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_request_per_minute":30000,"max_token_per_minute":5000000}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["text_generate","image_analysis","tools_call"],"alias":"Doubao Seed 2.0 Lite","description":"深度思考/文本生成/多模态理解/工具调用256K 上下文;最大输入 256K最大回答 128K最大思维链 128K","iconPath":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"Doubao Seed 2.0 Lite","types":["text_generate","image_analysis","tools_call"],"alias":"Doubao Seed 2.0 Lite","icon_path":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","description":"深度思考/文本生成/多模态理解/工具调用256K 上下文;最大输入 256K最大回答 128K最大思维链 128K","model_limits":{"max_request_per_minute":30000,"max_token_per_minute":5000000}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:Doubao Seed 2.0 Mini', 'Doubao Seed 2.0 Mini', 'text_generate', 'Doubao Seed 2.0 Mini', '{"originalTypes":["text_generate","image_analysis","tools_call"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_request_per_minute":30000,"max_token_per_minute":5000000}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["text_generate","image_analysis","tools_call"],"alias":"Doubao Seed 2.0 Mini","description":"深度思考/文本生成/多模态理解/工具调用256K 上下文;最大输入 256K最大回答 128K最大思维链 128K","iconPath":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"Doubao Seed 2.0 Mini","types":["text_generate","image_analysis","tools_call"],"alias":"Doubao Seed 2.0 Mini","icon_path":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","description":"深度思考/文本生成/多模态理解/工具调用256K 上下文;最大输入 256K最大回答 128K最大思维链 128K","model_limits":{"max_request_per_minute":30000,"max_token_per_minute":5000000}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:Doubao Seed 2.0 Code Preview', 'Doubao Seed 2.0 Code Preview', 'text_generate', 'Doubao Seed 2.0 Code Preview', '{"originalTypes":["text_generate","image_analysis","tools_call"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_request_per_minute":30000,"max_token_per_minute":5000000}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["text_generate","image_analysis","tools_call"],"alias":"Doubao Seed 2.0 Code Preview","description":"深度思考/文本生成/多模态理解/工具调用256K 上下文;最大输入 256K最大回答 128K最大思维链 128K","iconPath":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"Doubao Seed 2.0 Code Preview","types":["text_generate","image_analysis","tools_call"],"alias":"Doubao Seed 2.0 Code Preview","icon_path":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","description":"深度思考/文本生成/多模态理解/工具调用256K 上下文;最大输入 256K最大回答 128K最大思维链 128K","model_limits":{"max_request_per_minute":30000,"max_token_per_minute":5000000}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:Doubao Seed 1.8', 'Doubao Seed 1.8', 'text_generate', 'Doubao Seed 1.8', '{"originalTypes":["text_generate","image_analysis","tools_call"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_request_per_minute":30000,"max_token_per_minute":5000000}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["text_generate","image_analysis","tools_call"],"alias":"Doubao Seed 1.8","description":"深度思考/文本生成/多模态理解/工具调用/结构化输出256K 上下文;最大输入 224K最大回答 32K最大思维链 32K","iconPath":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"Doubao Seed 1.8","types":["text_generate","image_analysis","tools_call"],"alias":"Doubao Seed 1.8","icon_path":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","description":"深度思考/文本生成/多模态理解/工具调用/结构化输出256K 上下文;最大输入 224K最大回答 32K最大思维链 32K","model_limits":{"max_request_per_minute":30000,"max_token_per_minute":5000000}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:GLM-4.7', 'GLM-4.7', 'text_generate', 'GLM-4.7', '{"originalTypes":["text_generate","image_analysis","tools_call"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_request_per_minute":15000,"max_token_per_minute":1500000}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["text_generate","image_analysis","tools_call"],"alias":"GLM-4.7","description":"深度思考/文本生成/工具调用200K 上下文;最大输入 200K最大回答 128K最大思维链 128K","iconPath":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"GLM-4.7","types":["text_generate","image_analysis","tools_call"],"alias":"GLM-4.7","icon_path":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","description":"深度思考/文本生成/工具调用200K 上下文;最大输入 200K最大回答 128K最大思维链 128K","model_limits":{"max_request_per_minute":15000,"max_token_per_minute":1500000}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:GLM-4.7-Flash', 'GLM-4.7-Flash', 'text_generate', 'GLM-4.7-Flash', '{"originalTypes":["text_generate","tools_call"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["text_generate","tools_call"],"alias":"GLM-4.7-Flash","description":"","iconPath":"https://static.51easyai.com/chatglm-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"GLM-4.7-Flash","types":["text_generate","tools_call"],"alias":"GLM-4.7-Flash","icon_path":"https://static.51easyai.com/chatglm-color.webp"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:GLM-4.7-FlashX', 'GLM-4.7-FlashX', 'text_generate', 'GLM-4.7-FlashX', '{"originalTypes":["text_generate","tools_call"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["text_generate","tools_call"],"alias":"GLM-4.7-FlashX","description":"","iconPath":"https://static.51easyai.com/chatglm-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"GLM-4.7-FlashX","types":["text_generate","tools_call"],"alias":"GLM-4.7-FlashX","icon_path":"https://static.51easyai.com/chatglm-color.webp"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:MiniMax M2.7', 'MiniMax M2.7', 'text_generate', 'MiniMax M2.7', '{"text_generate":{"max_context_tokens":204800,"supportTool":true},"tools_call":{"max_context_tokens":204800,"supportTool":true},"originalTypes":["text_generate","tools_call"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["text_generate","tools_call"],"alias":"MiniMax M2.7","description":"开启模型的自我迭代(输出速度约 60 TPS。","iconPath":"https://static.51easyai.com/minimax-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"MiniMax M2.7","types":["text_generate","tools_call"],"alias":"MiniMax M2.7","icon_path":"https://static.51easyai.com/minimax-color.png","description":"开启模型的自我迭代(输出速度约 60 TPS。","capabilities":{"text_generate":{"max_context_tokens":204800,"supportTool":true},"tools_call":{"max_context_tokens":204800,"supportTool":true}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:MiniMax M2.7 极速版', 'MiniMax M2.7 极速版', 'text_generate', 'MiniMax M2.7 极速版', '{"text_generate":{"max_context_tokens":204800,"supportTool":true},"tools_call":{"max_context_tokens":204800,"supportTool":true},"originalTypes":["text_generate","tools_call"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["text_generate","tools_call"],"alias":"MiniMax M2.7 极速版","description":"M2.7 极速版:效果不变,更快、更敏捷(输出速度约 100 TPS。","iconPath":"https://static.51easyai.com/minimax-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"MiniMax M2.7 极速版","types":["text_generate","tools_call"],"alias":"MiniMax M2.7 极速版","icon_path":"https://static.51easyai.com/minimax-color.png","description":"M2.7 极速版:效果不变,更快、更敏捷(输出速度约 100 TPS。","capabilities":{"text_generate":{"max_context_tokens":204800,"supportTool":true},"tools_call":{"max_context_tokens":204800,"supportTool":true}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:MiniMax M2.5', 'MiniMax M2.5', 'text_generate', 'MiniMax M2.5', '{"text_generate":{"max_context_tokens":204800,"supportTool":true},"tools_call":{"max_context_tokens":204800,"supportTool":true},"originalTypes":["text_generate","tools_call"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["text_generate","tools_call"],"alias":"MiniMax M2.5","description":"顶尖性能与极致性价比,轻松驾驭复杂任务(输出速度约 60 TPS。","iconPath":"https://static.51easyai.com/minimax-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"MiniMax M2.5","types":["text_generate","tools_call"],"alias":"MiniMax M2.5","icon_path":"https://static.51easyai.com/minimax-color.png","description":"顶尖性能与极致性价比,轻松驾驭复杂任务(输出速度约 60 TPS。","capabilities":{"text_generate":{"max_context_tokens":204800,"supportTool":true},"tools_call":{"max_context_tokens":204800,"supportTool":true}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:MiniMax M2.5 极速版', 'MiniMax M2.5 极速版', 'text_generate', 'MiniMax M2.5 极速版', '{"text_generate":{"max_context_tokens":204800,"supportTool":true},"tools_call":{"max_context_tokens":204800,"supportTool":true},"originalTypes":["text_generate","tools_call"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["text_generate","tools_call"],"alias":"MiniMax M2.5 极速版","description":"M2.5 极速版:效果不变,更快、更敏捷(输出速度约 100 TPS。","iconPath":"https://static.51easyai.com/minimax-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"MiniMax M2.5 极速版","types":["text_generate","tools_call"],"alias":"MiniMax M2.5 极速版","icon_path":"https://static.51easyai.com/minimax-color.png","description":"M2.5 极速版:效果不变,更快、更敏捷(输出速度约 100 TPS。","capabilities":{"text_generate":{"max_context_tokens":204800,"supportTool":true},"tools_call":{"max_context_tokens":204800,"supportTool":true}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:MiniMax M2.1', 'MiniMax M2.1', 'text_generate', 'MiniMax M2.1', '{"text_generate":{"max_context_tokens":204800,"supportTool":true},"tools_call":{"max_context_tokens":204800,"supportTool":true},"originalTypes":["text_generate","tools_call"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["text_generate","tools_call"],"alias":"MiniMax M2.1","description":"强大多语言编程能力,全面升级编程体验(输出速度约 60 TPS。","iconPath":"https://static.51easyai.com/minimax-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"MiniMax M2.1","types":["text_generate","tools_call"],"alias":"MiniMax M2.1","icon_path":"https://static.51easyai.com/minimax-color.png","description":"强大多语言编程能力,全面升级编程体验(输出速度约 60 TPS。","capabilities":{"text_generate":{"max_context_tokens":204800,"supportTool":true},"tools_call":{"max_context_tokens":204800,"supportTool":true}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:MiniMax M2.1 极速版', 'MiniMax M2.1 极速版', 'text_generate', 'MiniMax M2.1 极速版', '{"text_generate":{"max_context_tokens":204800,"supportTool":true},"tools_call":{"max_context_tokens":204800,"supportTool":true},"originalTypes":["text_generate","tools_call"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["text_generate","tools_call"],"alias":"MiniMax M2.1 极速版","description":"M2.1 极速版:效果不变,更快、更敏捷(输出速度约 100 TPS。","iconPath":"https://static.51easyai.com/minimax-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"MiniMax M2.1 极速版","types":["text_generate","tools_call"],"alias":"MiniMax M2.1 极速版","icon_path":"https://static.51easyai.com/minimax-color.png","description":"M2.1 极速版:效果不变,更快、更敏捷(输出速度约 100 TPS。","capabilities":{"text_generate":{"max_context_tokens":204800,"supportTool":true},"tools_call":{"max_context_tokens":204800,"supportTool":true}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:MiniMax M2', 'MiniMax M2', 'text_generate', 'MiniMax M2', '{"text_generate":{"max_context_tokens":204800,"supportTool":true},"tools_call":{"max_context_tokens":204800,"supportTool":true},"originalTypes":["text_generate","tools_call"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["text_generate","tools_call"],"alias":"MiniMax M2","description":"专为高效编码与 Agent 工作流而生。","iconPath":"https://static.51easyai.com/minimax-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"MiniMax M2","types":["text_generate","tools_call"],"alias":"MiniMax M2","icon_path":"https://static.51easyai.com/minimax-color.png","description":"专为高效编码与 Agent 工作流而生。","capabilities":{"text_generate":{"max_context_tokens":204800,"supportTool":true},"tools_call":{"max_context_tokens":204800,"supportTool":true}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:MiniMax Speech 2.5 HD Preview', 'MiniMax Speech 2.5 HD Preview', 'text_to_speech', 'MiniMax Speech 2.5 HD Preview', '{"originalTypes":["text_to_speech"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["text_to_speech"],"alias":"MiniMax Speech 2.5 HD Preview","description":"","iconPath":"https://static.51easyai.com/minimax-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"MiniMax Speech 2.5 HD Preview","types":["text_to_speech"],"alias":"MiniMax Speech 2.5 HD Preview","icon_path":"https://static.51easyai.com/minimax-color.png"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:MiniMax Speech 2.5 Turbo Preview', 'MiniMax Speech 2.5 Turbo Preview', 'text_to_speech', 'MiniMax Speech 2.5 Turbo Preview', '{"originalTypes":["text_to_speech"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["text_to_speech"],"alias":"MiniMax Speech 2.5 Turbo Preview","description":"","iconPath":"https://static.51easyai.com/minimax-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"MiniMax Speech 2.5 Turbo Preview","types":["text_to_speech"],"alias":"MiniMax Speech 2.5 Turbo Preview","icon_path":"https://static.51easyai.com/minimax-color.png"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:MiniMax Speech 2.6 HD', 'MiniMax Speech 2.6 HD', 'text_to_speech', 'MiniMax Speech 2.6 HD', '{"originalTypes":["text_to_speech"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["text_to_speech"],"alias":"MiniMax Speech 2.6 HD","description":"","iconPath":"https://static.51easyai.com/minimax-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"MiniMax Speech 2.6 HD","types":["text_to_speech"],"alias":"MiniMax Speech 2.6 HD","icon_path":"https://static.51easyai.com/minimax-color.png"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:MiniMax Speech 2.6 Turbo', 'MiniMax Speech 2.6 Turbo', 'text_to_speech', 'MiniMax Speech 2.6 Turbo', '{"originalTypes":["text_to_speech"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["text_to_speech"],"alias":"MiniMax Speech 2.6 Turbo","description":"","iconPath":"https://static.51easyai.com/minimax-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"MiniMax Speech 2.6 Turbo","types":["text_to_speech"],"alias":"MiniMax Speech 2.6 Turbo","icon_path":"https://static.51easyai.com/minimax-color.png"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:海螺02', '海螺02', 'video_generate', '海螺02', '{"video_generate":{"output_resolutions":["720p","1080p"],"duration_range":{"720p":[6,10],"1080p":[6,6]},"duration_options":{"720p":[6,10],"1080p":[6]},"aspect_ratio_allowed":[]},"image_to_video":{"output_resolutions":{"input_first_frame":["480p","720p","1080p"],"input_first_last_frame":["720p","1080p"]},"duration_range":{"480p":[6,10],"720p":[6,10],"1080p":[6,6]},"duration_options":{"480p":[6,10],"720p":[6,10],"1080p":[6]},"input_reference_generate_single":false,"input_reference_generate_multiple":false,"input_first_frame":true,"input_last_frame":false,"input_first_last_frame":true,"aspect_ratio_allowed":[],"support_video_effect_template":false},"originalTypes":["video_generate","image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["video_generate","image_to_video"],"alias":"海螺02","description":"","iconPath":"https://static.51easyai.com/minimax-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"海螺02","types":["video_generate","image_to_video"],"alias":"海螺02","icon_path":"https://static.51easyai.com/minimax-color.png","capabilities":{"video_generate":{"output_resolutions":["720p","1080p"],"duration_range":{"720p":[6,10],"1080p":[6,6]},"duration_options":{"720p":[6,10],"1080p":[6]},"aspect_ratio_allowed":[]},"image_to_video":{"output_resolutions":{"input_first_frame":["480p","720p","1080p"],"input_first_last_frame":["720p","1080p"]},"duration_range":{"480p":[6,10],"720p":[6,10],"1080p":[6,6]},"duration_options":{"480p":[6,10],"720p":[6,10],"1080p":[6]},"input_reference_generate_single":false,"input_reference_generate_multiple":false,"input_first_frame":true,"input_last_frame":false,"input_first_last_frame":true,"aspect_ratio_allowed":[],"support_video_effect_template":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:海螺2.3', '海螺2.3', 'video_generate', '海螺2.3', '{"video_generate":{"output_resolutions":["720p","1080p"],"duration_range":{"720p":[6,10],"1080p":[6,6]},"duration_options":{"720p":[6,10],"1080p":[6]},"aspect_ratio_allowed":[]},"image_to_video":{"output_resolutions":["720p","1080p"],"duration_range":{"720p":[6,10],"1080p":[6,6]},"duration_options":{"720p":[6,10],"1080p":[6]},"input_first_frame":true,"input_first_last_frame":false,"input_last_frame":false,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"aspect_ratio_allowed":[],"support_video_effect_template":false},"originalTypes":["video_generate","image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["video_generate","image_to_video"],"alias":"海螺2.3","description":"","iconPath":"https://static.51easyai.com/minimax-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"海螺2.3","types":["video_generate","image_to_video"],"alias":"海螺2.3","icon_path":"https://static.51easyai.com/minimax-color.png","capabilities":{"video_generate":{"output_resolutions":["720p","1080p"],"duration_range":{"720p":[6,10],"1080p":[6,6]},"duration_options":{"720p":[6,10],"1080p":[6]},"aspect_ratio_allowed":[]},"image_to_video":{"output_resolutions":["720p","1080p"],"duration_range":{"720p":[6,10],"1080p":[6,6]},"duration_options":{"720p":[6,10],"1080p":[6]},"input_first_frame":true,"input_first_last_frame":false,"input_last_frame":false,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"aspect_ratio_allowed":[],"support_video_effect_template":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:MiniMax-Hailuo-2.3-Fast', 'MiniMax-Hailuo-2.3-Fast', 'image_to_video', 'MiniMax-Hailuo-2.3-Fast', '{"image_to_video":{"output_resolutions":["720p","1080p"],"duration_range":{"720p":[6,10],"1080p":[6,6]},"duration_options":{"720p":[6,10],"1080p":[6]},"input_first_frame":true,"input_first_last_frame":false,"input_last_frame":false,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"aspect_ratio_allowed":[],"support_video_effect_template":false},"originalTypes":["image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["image_to_video"],"alias":"MiniMax-Hailuo-2.3-Fast","description":"","iconPath":"https://static.51easyai.com/minimax-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"MiniMax-Hailuo-2.3-Fast","types":["image_to_video"],"alias":"MiniMax-Hailuo-2.3-Fast","icon_path":"https://static.51easyai.com/minimax-color.png","capabilities":{"image_to_video":{"output_resolutions":["720p","1080p"],"duration_range":{"720p":[6,10],"1080p":[6,6]},"duration_options":{"720p":[6,10],"1080p":[6]},"input_first_frame":true,"input_first_last_frame":false,"input_last_frame":false,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"aspect_ratio_allowed":[],"support_video_effect_template":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:flux-2-pro', 'flux-2-pro', 'image_generate', 'flux-2-pro', '{"image_generate":{"output_multiple_images":false,"output_resolutions":["2K","1K"],"output_size_range":[4096,4194304]},"image_edit":{"output_multiple_images":false,"output_resolutions":["2K","1K"],"output_size_range":[4096,4194304],"input_max_images_count":8,"input_multiple_images":true},"originalTypes":["image_generate","image_edit"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["image_generate","image_edit"],"alias":"flux-2-pro","description":"","iconPath":"https://easyai-1253343986.cos.ap-shanghai.myqcloud.com/663e19cd4fa9d8078385c7c9/upload/20250611132907371-blackforest.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"flux-2-pro","types":["image_generate","image_edit"],"alias":"flux-2-pro","icon_path":"https://easyai-1253343986.cos.ap-shanghai.myqcloud.com/663e19cd4fa9d8078385c7c9/upload/20250611132907371-blackforest.png","capabilities":{"image_generate":{"output_multiple_images":false,"output_resolutions":["2K","1K"],"output_size_range":[4096,4194304]},"image_edit":{"output_multiple_images":false,"output_resolutions":["2K","1K"],"output_size_range":[4096,4194304],"input_max_images_count":8,"input_multiple_images":true}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:flux-2-flex', 'flux-2-flex', 'image_generate', 'flux-2-flex', '{"image_generate":{"output_multiple_images":false,"output_resolutions":["2K","1K"],"output_size_range":[4096,4194304]},"image_edit":{"output_multiple_images":false,"output_resolutions":["2K","1K"],"output_size_range":[4096,4194304],"input_max_images_count":10,"input_multiple_images":true},"originalTypes":["image_generate","image_edit"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["image_generate","image_edit"],"alias":"flux-2-flex","description":"","iconPath":"https://easyai-1253343986.cos.ap-shanghai.myqcloud.com/663e19cd4fa9d8078385c7c9/upload/20250611132907371-blackforest.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"flux-2-flex","types":["image_generate","image_edit"],"alias":"flux-2-flex","icon_path":"https://easyai-1253343986.cos.ap-shanghai.myqcloud.com/663e19cd4fa9d8078385c7c9/upload/20250611132907371-blackforest.png","capabilities":{"image_generate":{"output_multiple_images":false,"output_resolutions":["2K","1K"],"output_size_range":[4096,4194304]},"image_edit":{"output_multiple_images":false,"output_resolutions":["2K","1K"],"output_size_range":[4096,4194304],"input_max_images_count":10,"input_multiple_images":true}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:flux-kontext-pro', 'flux-kontext-pro', 'image_generate', 'flux-kontext-pro', '{"originalTypes":["image_generate","image_edit"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["image_generate","image_edit"],"alias":"flux-kontext-pro","description":"","iconPath":"https://easyai-1253343986.cos.ap-shanghai.myqcloud.com/663e19cd4fa9d8078385c7c9/upload/20250611132907371-blackforest.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"flux-kontext-pro","types":["image_generate","image_edit"],"alias":"flux-kontext-pro","icon_path":"https://easyai-1253343986.cos.ap-shanghai.myqcloud.com/663e19cd4fa9d8078385c7c9/upload/20250611132907371-blackforest.png"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:flux-kontext-max', 'flux-kontext-max', 'image_generate', 'flux-kontext-max', '{"originalTypes":["image_generate","image_edit"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["image_generate","image_edit"],"alias":"flux-kontext-max","description":"","iconPath":"https://easyai-1253343986.cos.ap-shanghai.myqcloud.com/663e19cd4fa9d8078385c7c9/upload/20250611132907371-blackforest.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"flux-kontext-max","types":["image_generate","image_edit"],"alias":"flux-kontext-max","icon_path":"https://easyai-1253343986.cos.ap-shanghai.myqcloud.com/663e19cd4fa9d8078385c7c9/upload/20250611132907371-blackforest.png"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:flux-pro-1.1', 'flux-pro-1.1', 'image_generate', 'flux-pro-1.1', '{"image_generate":{"output_multiple_images":false,"width_height_range":[256,1440],"output_resolutions":["2K","1K"]},"originalTypes":["image_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["image_generate"],"alias":"flux-pro-1.1","description":"","iconPath":"https://easyai-1253343986.cos.ap-shanghai.myqcloud.com/663e19cd4fa9d8078385c7c9/upload/20250611132907371-blackforest.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"flux-pro-1.1","types":["image_generate"],"alias":"flux-pro-1.1","icon_path":"https://easyai-1253343986.cos.ap-shanghai.myqcloud.com/663e19cd4fa9d8078385c7c9/upload/20250611132907371-blackforest.png","capabilities":{"image_generate":{"output_multiple_images":false,"width_height_range":[256,1440],"output_resolutions":["2K","1K"]}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:flux-dev', 'flux-dev', 'image_generate', 'flux-dev', '{"image_generate":{"output_multiple_images":false,"width_height_range":[256,1440],"output_resolutions":["2K","1K"]},"originalTypes":["image_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["image_generate"],"alias":"flux-dev","description":"","iconPath":"https://easyai-1253343986.cos.ap-shanghai.myqcloud.com/663e19cd4fa9d8078385c7c9/upload/20250611132907371-blackforest.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"flux-dev","types":["image_generate"],"alias":"flux-dev","icon_path":"https://easyai-1253343986.cos.ap-shanghai.myqcloud.com/663e19cd4fa9d8078385c7c9/upload/20250611132907371-blackforest.png","capabilities":{"image_generate":{"output_multiple_images":false,"width_height_range":[256,1440],"output_resolutions":["2K","1K"]}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:可灵V1', '可灵V1', 'video_generate', '可灵V1', '{"video_generate":{"output_resolutions":["720p"],"duration_range":[5,10],"aspect_ratio_allowed":["16:9","1:1","9:16"]},"image_to_video":{"output_resolutions":["720p"],"duration_range":{"input_first_last_frame":[5,5],"input_first_frame":[5,10]},"input_first_frame":true,"input_first_last_frame":true,"input_last_frame":false,"output_video_continuation":true,"aspect_ratio_allowed":[],"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false},"originalTypes":["video_generate","image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["video_generate","image_to_video"],"alias":"可灵V1","description":"","iconPath":"https://static.51easyai.com/kling-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"可灵V1","types":["video_generate","image_to_video"],"alias":"可灵V1","icon_path":"https://static.51easyai.com/kling-color.webp","capabilities":{"video_generate":{"output_resolutions":["720p"],"duration_range":[5,10],"aspect_ratio_allowed":["16:9","1:1","9:16"]},"image_to_video":{"output_resolutions":["720p"],"duration_range":{"input_first_last_frame":[5,5],"input_first_frame":[5,10]},"input_first_frame":true,"input_first_last_frame":true,"input_last_frame":false,"output_video_continuation":true,"aspect_ratio_allowed":[],"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:可灵V1.5', '可灵V1.5', 'image_to_video', '可灵V1.5', '{"image_to_video":{"output_resolutions":{"input_first_frame":["720p","1080p"],"input_first_last_frame":["1080p"],"input_last_frame":["1080p"]},"duration_range":{"input_first_last_frame":[5,10],"input_first_frame":[5,10],"input_last_frame":[5,10]},"input_first_frame":true,"input_first_last_frame":true,"input_last_frame":true,"output_video_continuation":true,"aspect_ratio_allowed":[],"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false},"originalTypes":["image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["image_to_video"],"alias":"可灵V1.5","description":"","iconPath":"https://static.51easyai.com/kling-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"可灵V1.5","types":["image_to_video"],"alias":"可灵V1.5","icon_path":"https://static.51easyai.com/kling-color.webp","capabilities":{"image_to_video":{"output_resolutions":{"input_first_frame":["720p","1080p"],"input_first_last_frame":["1080p"],"input_last_frame":["1080p"]},"duration_range":{"input_first_last_frame":[5,10],"input_first_frame":[5,10],"input_last_frame":[5,10]},"input_first_frame":true,"input_first_last_frame":true,"input_last_frame":true,"output_video_continuation":true,"aspect_ratio_allowed":[],"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:可灵V1.6', '可灵V1.6', 'video_generate', '可灵V1.6', '{"video_generate":{"aspect_ratio_allowed":["16:9","1:1","9:16"],"output_resolutions":["720p","1080p"],"duration_range":[5,10]},"image_to_video":{"output_resolutions":{"input_first_frame":["720p","1080p"],"input_first_last_frame":["1080p"],"input_last_frame":["1080p"],"input_reference_generate_multiple":["720p","1080p"],"output_video_continuation":["720p","1080p"]},"duration_range":{"input_first_last_frame":[5,10],"input_first_frame":[5,10],"input_last_frame":[5,10]},"input_first_frame":true,"input_first_last_frame":true,"input_last_frame":true,"input_reference_generate_multiple":true,"output_video_continuation":true,"aspect_ratio_allowed":[],"input_reference_generate_single":false,"support_video_effect_template":true,"support_video_effect_template_list":[]},"originalTypes":["video_generate","image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["video_generate","image_to_video"],"alias":"可灵V1.6","description":"","iconPath":"https://static.51easyai.com/kling-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"可灵V1.6","types":["video_generate","image_to_video"],"alias":"可灵V1.6","icon_path":"https://static.51easyai.com/kling-color.webp","capabilities":{"video_generate":{"aspect_ratio_allowed":["16:9","1:1","9:16"],"output_resolutions":["720p","1080p"],"duration_range":[5,10]},"image_to_video":{"output_resolutions":{"input_first_frame":["720p","1080p"],"input_first_last_frame":["1080p"],"input_last_frame":["1080p"],"input_reference_generate_multiple":["720p","1080p"],"output_video_continuation":["720p","1080p"]},"duration_range":{"input_first_last_frame":[5,10],"input_first_frame":[5,10],"input_last_frame":[5,10]},"input_first_frame":true,"input_first_last_frame":true,"input_last_frame":true,"input_reference_generate_multiple":true,"output_video_continuation":true,"aspect_ratio_allowed":[],"input_reference_generate_single":false,"support_video_effect_template":true,"support_video_effect_template_list":[]}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:可灵V2-大师级', '可灵V2-大师级', 'video_generate', '可灵V2-大师级', '{"video_generate":{"aspect_ratio_allowed":["16:9","1:1","9:16"],"output_resolutions":["720p"],"duration_range":[5,10]},"image_to_video":{"output_resolutions":{"input_first_frame":["720p"]},"duration_range":{"input_first_frame":[5,10]},"input_first_frame":true,"input_last_frame":false,"input_first_last_frame":false,"aspect_ratio_allowed":[],"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false},"originalTypes":["video_generate","image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["video_generate","image_to_video"],"alias":"可灵V2-大师级","description":"","iconPath":"https://static.51easyai.com/kling-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"可灵V2-大师级","types":["video_generate","image_to_video"],"alias":"可灵V2-大师级","icon_path":"https://static.51easyai.com/kling-color.webp","capabilities":{"video_generate":{"aspect_ratio_allowed":["16:9","1:1","9:16"],"output_resolutions":["720p"],"duration_range":[5,10]},"image_to_video":{"output_resolutions":{"input_first_frame":["720p"]},"duration_range":{"input_first_frame":[5,10]},"input_first_frame":true,"input_last_frame":false,"input_first_last_frame":false,"aspect_ratio_allowed":[],"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:可灵V2.1图生视频', '可灵V2.1图生视频', 'image_to_video', '可灵V2.1图生视频', '{"image_to_video":{"output_resolutions":{"input_first_frame":["720p","1080p"],"input_first_last_frame":["1080p"]},"duration_range":{"input_first_frame":[5,10],"input_first_last_frame":[5,10]},"aspect_ratio_allowed":[],"input_last_frame":false,"input_first_last_frame":true,"input_first_frame":true,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false},"originalTypes":["image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["image_to_video"],"alias":"可灵V2.1图生视频","description":"","iconPath":"https://static.51easyai.com/kling-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"可灵V2.1图生视频","types":["image_to_video"],"alias":"可灵V2.1图生视频","icon_path":"https://static.51easyai.com/kling-color.webp","capabilities":{"image_to_video":{"output_resolutions":{"input_first_frame":["720p","1080p"],"input_first_last_frame":["1080p"]},"duration_range":{"input_first_frame":[5,10],"input_first_last_frame":[5,10]},"aspect_ratio_allowed":[],"input_last_frame":false,"input_first_last_frame":true,"input_first_frame":true,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:可灵V2.1-大师级', '可灵V2.1-大师级', 'video_generate', '可灵V2.1-大师级', '{"video_generate":{"aspect_ratio_allowed":["16:9","1:1","9:16"],"output_resolutions":["1080p"],"duration_range":[5,10]},"image_to_video":{"output_resolutions":{"input_first_frame":["1080p"]},"duration_range":{"input_first_frame":[5,10]},"input_first_frame":true,"input_last_frame":false,"input_first_last_frame":false,"aspect_ratio_allowed":[],"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false},"originalTypes":["video_generate","image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["video_generate","image_to_video"],"alias":"可灵V2.1-大师级","description":"","iconPath":"https://static.51easyai.com/kling-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"可灵V2.1-大师级","types":["video_generate","image_to_video"],"alias":"可灵V2.1-大师级","icon_path":"https://static.51easyai.com/kling-color.webp","capabilities":{"video_generate":{"aspect_ratio_allowed":["16:9","1:1","9:16"],"output_resolutions":["1080p"],"duration_range":[5,10]},"image_to_video":{"output_resolutions":{"input_first_frame":["1080p"]},"duration_range":{"input_first_frame":[5,10]},"input_first_frame":true,"input_last_frame":false,"input_first_last_frame":false,"aspect_ratio_allowed":[],"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:可灵V2.5-turbo', '可灵V2.5-turbo', 'video_generate', '可灵V2.5-turbo', '{"video_generate":{"aspect_ratio_allowed":["16:9","1:1","9:16"],"output_resolutions":["720p","1080p"],"duration_range":[5,10]},"image_to_video":{"output_resolutions":{"input_first_frame":["720p","1080p"],"input_first_last_frame":["1080p"]},"duration_range":{"input_first_frame":[5,10]},"input_first_frame":true,"input_last_frame":false,"input_first_last_frame":true,"aspect_ratio_allowed":[],"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false},"originalTypes":["video_generate","image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["video_generate","image_to_video"],"alias":"可灵V2.5-turbo","description":"","iconPath":"https://static.51easyai.com/kling-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"可灵V2.5-turbo","types":["video_generate","image_to_video"],"alias":"可灵V2.5-turbo","icon_path":"https://static.51easyai.com/kling-color.webp","capabilities":{"video_generate":{"aspect_ratio_allowed":["16:9","1:1","9:16"],"output_resolutions":["720p","1080p"],"duration_range":[5,10]},"image_to_video":{"output_resolutions":{"input_first_frame":["720p","1080p"],"input_first_last_frame":["1080p"]},"duration_range":{"input_first_frame":[5,10]},"input_first_frame":true,"input_last_frame":false,"input_first_last_frame":true,"aspect_ratio_allowed":[],"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:可灵V2.6', '可灵V2.6', 'video_generate', '可灵V2.6', '{"video_generate":{"aspect_ratio_allowed":["16:9","1:1","9:16"],"output_resolutions":["1080p"],"duration_range":[5,10],"output_audio":true},"image_to_video":{"output_resolutions":["1080p"],"duration_range":[5,10],"input_first_frame":true,"input_last_frame":false,"input_first_last_frame":true,"aspect_ratio_allowed":[],"output_audio":true,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false},"originalTypes":["video_generate","image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["video_generate","image_to_video"],"alias":"可灵V2.6","description":"","iconPath":"https://static.51easyai.com/kling-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"可灵V2.6","types":["video_generate","image_to_video"],"alias":"可灵V2.6","icon_path":"https://static.51easyai.com/kling-color.webp","capabilities":{"video_generate":{"aspect_ratio_allowed":["16:9","1:1","9:16"],"output_resolutions":["1080p"],"duration_range":[5,10],"output_audio":true},"image_to_video":{"output_resolutions":["1080p"],"duration_range":[5,10],"input_first_frame":true,"input_last_frame":false,"input_first_last_frame":true,"aspect_ratio_allowed":[],"output_audio":true,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:可灵V3', '可灵V3', 'video_generate', '可灵V3', '{"video_generate":{"aspect_ratio_allowed":["16:9","1:1","9:16"],"output_resolutions":["720p","1080p","2160p"],"duration_range":[3,15],"output_audio":true,"prompt_length_limit":{"max":2500,"count_mode":"non_ascii_weighted","label":"可灵口径"}},"image_to_video":{"output_resolutions":["720p","1080p","2160p"],"duration_range":[3,15],"input_first_frame":true,"input_last_frame":false,"input_first_last_frame":true,"aspect_ratio_allowed":["16:9","1:1","9:16"],"output_audio":true,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"prompt_length_limit":{"max":2500,"count_mode":"non_ascii_weighted","label":"可灵口径"}},"originalTypes":["video_generate","image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["video_generate","image_to_video"],"alias":"可灵V3","description":"","iconPath":"https://static.51easyai.com/kling-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"可灵V3","types":["video_generate","image_to_video"],"alias":"可灵V3","icon_path":"https://static.51easyai.com/kling-color.webp","capabilities":{"video_generate":{"aspect_ratio_allowed":["16:9","1:1","9:16"],"output_resolutions":["720p","1080p","2160p"],"duration_range":[3,15],"output_audio":true,"prompt_length_limit":{"max":2500,"count_mode":"non_ascii_weighted","label":"可灵口径"}},"image_to_video":{"output_resolutions":["720p","1080p","2160p"],"duration_range":[3,15],"input_first_frame":true,"input_last_frame":false,"input_first_last_frame":true,"aspect_ratio_allowed":["16:9","1:1","9:16"],"output_audio":true,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"prompt_length_limit":{"max":2500,"count_mode":"non_ascii_weighted","label":"可灵口径"}}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:可灵V3多模态', '可灵V3多模态', 'omni_video', '可灵V3多模态', '{"omni_video":{"supported_modes":["text_to_video","image_reference","element_reference","first_last_frame","video_reference","video_edit","multi_shot"],"output_resolutions":["720p","1080p","2160p"],"aspect_ratio_allowed":["16:9","1:1","9:16"],"duration_options":[3,4,5,6,7,8,9,10,11,12,13,14,15],"output_audio":true,"max_videos":1,"max_images":7,"max_elements":7,"max_images_and_elements":7,"limits_with_video":{"max_images_and_elements":4,"duration_options":[3,4,5,6,7,8,9,10]},"max_images_for_last_frame":2,"support_instruction_edit":true,"prompt_length_limit":{"max":2500,"count_mode":"non_ascii_weighted","label":"可灵口径"}},"originalTypes":["omni_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["omni_video"],"alias":"可灵V3多模态","description":"","iconPath":"https://static.51easyai.com/kling-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"可灵V3多模态","types":["omni_video"],"alias":"可灵V3多模态","icon_path":"https://static.51easyai.com/kling-color.webp","capabilities":{"omni_video":{"supported_modes":["text_to_video","image_reference","element_reference","first_last_frame","video_reference","video_edit","multi_shot"],"output_resolutions":["720p","1080p","2160p"],"aspect_ratio_allowed":["16:9","1:1","9:16"],"duration_options":[3,4,5,6,7,8,9,10,11,12,13,14,15],"output_audio":true,"max_videos":1,"max_images":7,"max_elements":7,"max_images_and_elements":7,"limits_with_video":{"max_images_and_elements":4,"duration_options":[3,4,5,6,7,8,9,10]},"max_images_for_last_frame":2,"support_instruction_edit":true,"prompt_length_limit":{"max":2500,"count_mode":"non_ascii_weighted","label":"可灵口径"}}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:可灵O1', '可灵O1', 'omni_video', '可灵O1', '{"omni_video":{"supported_modes":["text_to_video","image_reference","element_reference","first_last_frame","video_reference","video_edit"],"output_resolutions":["720p","1080p"],"aspect_ratio_allowed":["16:9","1:1","9:16"],"duration_options":[3,4,5,6,7,8,9,10],"output_audio":true,"max_videos":1,"max_images":7,"max_elements":7,"prompt_length_limit":{"max":2500,"count_mode":"non_ascii_weighted","label":"可灵口径"},"max_images_and_elements":7,"limits_with_video":{"max_images_and_elements":4},"max_images_for_last_frame":2,"support_instruction_edit":true},"originalTypes":["omni_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["omni_video"],"alias":"可灵O1","description":"","iconPath":"https://static.51easyai.com/kling-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"可灵O1","types":["omni_video"],"alias":"可灵O1","icon_path":"https://static.51easyai.com/kling-color.webp","capabilities":{"omni_video":{"supported_modes":["text_to_video","image_reference","element_reference","first_last_frame","video_reference","video_edit"],"output_resolutions":["720p","1080p"],"aspect_ratio_allowed":["16:9","1:1","9:16"],"duration_options":[3,4,5,6,7,8,9,10],"output_audio":true,"max_videos":1,"max_images":7,"max_elements":7,"prompt_length_limit":{"max":2500,"count_mode":"non_ascii_weighted","label":"可灵口径"},"max_images_and_elements":7,"limits_with_video":{"max_images_and_elements":4},"max_images_for_last_frame":2,"support_instruction_edit":true}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:可灵动作控制', '可灵动作控制', 'digital_human_generate', '可灵动作控制', '{"originalTypes":["digital_human_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":10}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["digital_human_generate"],"alias":"可灵动作控制","description":"","iconPath":"https://static.51easyai.com/kling-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"可灵动作控制","types":["digital_human_generate"],"alias":"可灵动作控制","icon_path":"https://static.51easyai.com/kling-color.webp","model_limits":{"max_concurrent_requests":10}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:可灵对口型', '可灵对口型', 'digital_human_generate', '可灵对口型', '{"originalTypes":["digital_human_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":10}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["digital_human_generate"],"alias":"可灵对口型","description":"","iconPath":"https://static.51easyai.com/kling-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"可灵对口型","types":["digital_human_generate"],"alias":"可灵对口型","icon_path":"https://static.51easyai.com/kling-color.webp","model_limits":{"max_concurrent_requests":10}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:可灵数字人', '可灵数字人', 'digital_human_generate', '可灵数字人', '{"originalTypes":["digital_human_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":10}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["digital_human_generate"],"alias":"可灵数字人","description":"","iconPath":"https://static.51easyai.com/kling-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"可灵数字人","types":["digital_human_generate"],"alias":"可灵数字人","icon_path":"https://static.51easyai.com/kling-color.webp","model_limits":{"max_concurrent_requests":10}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:Qwen3-Embedding-v4', 'Qwen3-Embedding-v4', 'text_embedding', 'Qwen3-Embedding-v4', '{"text_embedding":{"dimensions":[2048,1536,1024,768,512,256,128,64]},"originalTypes":["text_embedding"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_request_per_second":10}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["text_embedding"],"alias":"Qwen3-Embedding-v4","description":"Qwen3-Embedding 系列,默认维度 1024最长输入 8192 tokens支持 100+ 语种与多种编程语言。","iconPath":"https://static.51easyai.com/qwen-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"Qwen3-Embedding-v4","types":["text_embedding"],"icon_path":"https://static.51easyai.com/qwen-color.webp","alias":"Qwen3-Embedding-v4","model_limits":{"max_request_per_second":10},"capabilities":{"text_embedding":{"dimensions":[2048,1536,1024,768,512,256,128,64]}},"description":"Qwen3-Embedding 系列,默认维度 1024最长输入 8192 tokens支持 100+ 语种与多种编程语言。"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:Qwen3-Embedding-v3', 'Qwen3-Embedding-v3', 'text_embedding', 'Qwen3-Embedding-v3', '{"text_embedding":{"dimensions":[1024,768,512,256,128,64]},"originalTypes":["text_embedding"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["text_embedding"],"alias":"Qwen3-Embedding-v3","description":"Qwen3-Embedding 系列,默认维度 1024支持中文、英文及 50+ 主流语种。","iconPath":"https://static.51easyai.com/qwen-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"Qwen3-Embedding-v3","types":["text_embedding"],"icon_path":"https://static.51easyai.com/qwen-color.webp","alias":"Qwen3-Embedding-v3","capabilities":{"text_embedding":{"dimensions":[1024,768,512,256,128,64]}},"description":"Qwen3-Embedding 系列,默认维度 1024支持中文、英文及 50+ 主流语种。"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:Text-Embedding-v2', 'Text-Embedding-v2', 'text_embedding', 'Text-Embedding-v2', '{"text_embedding":{"dimensions":[1536]},"originalTypes":["text_embedding"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_request_per_second":25}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["text_embedding"],"alias":"Text-Embedding-v2","description":"固定维度 1536最长输入 2048 tokens支持中英西法葡印尼日韩德俄等语种。","iconPath":"https://static.51easyai.com/qwen-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"Text-Embedding-v2","types":["text_embedding"],"icon_path":"https://static.51easyai.com/qwen-color.webp","alias":"Text-Embedding-v2","model_limits":{"max_request_per_second":25},"capabilities":{"text_embedding":{"dimensions":[1536]}},"description":"固定维度 1536最长输入 2048 tokens支持中英西法葡印尼日韩德俄等语种。"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:Text-Embedding-v1', 'Text-Embedding-v1', 'text_embedding', 'Text-Embedding-v1', '{"originalTypes":["text_embedding"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["text_embedding"],"alias":"Text-Embedding-v1","description":"百炼 OpenAI 兼容渠道 embedding 基础模型。","iconPath":"https://static.51easyai.com/qwen-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"Text-Embedding-v1","types":["text_embedding"],"icon_path":"https://static.51easyai.com/qwen-color.webp","alias":"Text-Embedding-v1","description":"百炼 OpenAI 兼容渠道 embedding 基础模型。"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:qwen-turbo', 'qwen-turbo', 'text_generate', 'qwen-turbo', '{"originalTypes":["text_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["text_generate"],"alias":"","description":"","iconPath":"https://static.51easyai.com/qwen-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"qwen-turbo","types":["text_generate"],"icon_path":"https://static.51easyai.com/qwen-color.webp"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:qwen3-235b-a22b', 'qwen3-235b-a22b', 'text_generate', 'qwen3-235b-a22b', '{"originalTypes":["text_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["text_generate"],"alias":"","description":"","iconPath":"https://static.51easyai.com/qwen-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"qwen3-235b-a22b","types":["text_generate"],"icon_path":"https://static.51easyai.com/qwen-color.webp"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:qwen-max', 'qwen-max', 'text_generate', 'qwen-max', '{"originalTypes":["text_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["text_generate"],"alias":"","description":"","iconPath":"https://static.51easyai.com/qwen-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"qwen-max","types":["text_generate"],"icon_path":"https://static.51easyai.com/qwen-color.webp"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:qwen-plus', 'qwen-plus', 'text_generate', 'qwen-plus', '{"originalTypes":["text_generate","tools_call"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["text_generate","tools_call"],"alias":"","description":"","iconPath":"https://static.51easyai.com/qwen-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"qwen-plus","types":["text_generate","tools_call"],"icon_path":"https://static.51easyai.com/qwen-color.webp"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:qwen3-max', 'qwen3-max', 'text_generate', 'qwen3-max', '{"originalTypes":["text_generate","tools_call"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["text_generate","tools_call"],"alias":"","description":"","iconPath":"https://static.51easyai.com/qwen-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"qwen3-max","types":["text_generate","tools_call"],"icon_path":"https://static.51easyai.com/qwen-color.webp"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:qwen-vl-plus', 'qwen-vl-plus', 'image_analysis', 'qwen-vl-plus', '{"originalTypes":["image_analysis"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["image_analysis"],"alias":"","description":"","iconPath":"https://static.51easyai.com/qwen-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"qwen-vl-plus","types":["image_analysis"],"icon_path":"https://static.51easyai.com/qwen-color.webp"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:qwen-vl-max', 'qwen-vl-max', 'image_analysis', 'qwen-vl-max', '{"originalTypes":["image_analysis"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["image_analysis"],"alias":"","description":"","iconPath":"https://static.51easyai.com/qwen-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"qwen-vl-max","types":["image_analysis"],"icon_path":"https://static.51easyai.com/qwen-color.webp"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:Qwen3.5-Plus', 'Qwen3.5-Plus', 'text_generate', 'Qwen3.5-Plus', '{"originalTypes":["text_generate","image_analysis","video_understanding","tools_call"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["text_generate","image_analysis","video_understanding","tools_call"],"alias":"Qwen3.5-Plus","description":"千问性能最强的视觉理解模型,推荐优先使用","iconPath":"https://static.51easyai.com/qwen-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"Qwen3.5-Plus","types":["text_generate","image_analysis","video_understanding","tools_call"],"icon_path":"https://static.51easyai.com/qwen-color.webp","alias":"Qwen3.5-Plus","description":"千问性能最强的视觉理解模型,推荐优先使用"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:Qwen3.5-Flash', 'Qwen3.5-Flash', 'text_generate', 'Qwen3.5-Flash', '{"originalTypes":["text_generate","image_analysis","video_understanding","tools_call"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["text_generate","image_analysis","video_understanding","tools_call"],"alias":"Qwen3.5-Flash","description":"速度更快,成本更低,兼顾性能与成本的高性价比选择","iconPath":"https://static.51easyai.com/qwen-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"Qwen3.5-Flash","types":["text_generate","image_analysis","video_understanding","tools_call"],"icon_path":"https://static.51easyai.com/qwen-color.webp","alias":"Qwen3.5-Flash","description":"速度更快,成本更低,兼顾性能与成本的高性价比选择"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:Qwen3.5-Omni-Plus', 'Qwen3.5-Omni-Plus', 'text_generate', 'Qwen3.5-Omni-Plus', '{"text_generate":{"max_context_tokens":262144,"max_input_tokens":196608,"max_output_tokens":65536},"image_analysis":{"max_context_tokens":262144,"max_input_tokens":196608,"max_output_tokens":65536},"video_understanding":{"max_context_tokens":262144,"max_input_tokens":196608,"max_output_tokens":65536},"audio_understanding":{"max_context_tokens":262144,"max_input_tokens":196608,"max_output_tokens":65536},"tools_call":{"supportTool":true,"max_context_tokens":262144,"max_input_tokens":196608,"max_output_tokens":65536},"omni":{"supportTool":true,"max_context_tokens":262144,"max_input_tokens":196608,"max_output_tokens":65536},"originalTypes":["text_generate","image_analysis","video_understanding","audio_understanding","tools_call","omni"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["text_generate","image_analysis","video_understanding","audio_understanding","tools_call","omni"],"alias":"Qwen3.5-Omni-Plus","description":"Qwen3.5 全模态稳定版,非思考模式,当前与 qwen3.5-omni-plus-2026-03-15 能力相同。","iconPath":"https://static.51easyai.com/qwen-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"Qwen3.5-Omni-Plus","types":["text_generate","image_analysis","video_understanding","audio_understanding","tools_call","omni"],"icon_path":"https://static.51easyai.com/qwen-color.webp","alias":"Qwen3.5-Omni-Plus","description":"Qwen3.5 全模态稳定版,非思考模式,当前与 qwen3.5-omni-plus-2026-03-15 能力相同。","capabilities":{"text_generate":{"max_context_tokens":262144,"max_input_tokens":196608,"max_output_tokens":65536},"image_analysis":{"max_context_tokens":262144,"max_input_tokens":196608,"max_output_tokens":65536},"video_understanding":{"max_context_tokens":262144,"max_input_tokens":196608,"max_output_tokens":65536},"audio_understanding":{"max_context_tokens":262144,"max_input_tokens":196608,"max_output_tokens":65536},"tools_call":{"supportTool":true,"max_context_tokens":262144,"max_input_tokens":196608,"max_output_tokens":65536},"omni":{"supportTool":true,"max_context_tokens":262144,"max_input_tokens":196608,"max_output_tokens":65536}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:Qwen3.5-Omni-Flash', 'Qwen3.5-Omni-Flash', 'text_generate', 'Qwen3.5-Omni-Flash', '{"text_generate":{"max_context_tokens":262144,"max_input_tokens":196608,"max_output_tokens":65536},"image_analysis":{"max_context_tokens":262144,"max_input_tokens":196608,"max_output_tokens":65536},"video_understanding":{"max_context_tokens":262144,"max_input_tokens":196608,"max_output_tokens":65536},"audio_understanding":{"max_context_tokens":262144,"max_input_tokens":196608,"max_output_tokens":65536},"tools_call":{"supportTool":true,"max_context_tokens":262144,"max_input_tokens":196608,"max_output_tokens":65536},"omni":{"supportTool":true,"max_context_tokens":262144,"max_input_tokens":196608,"max_output_tokens":65536},"originalTypes":["text_generate","image_analysis","video_understanding","audio_understanding","tools_call","omni"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["text_generate","image_analysis","video_understanding","audio_understanding","tools_call","omni"],"alias":"Qwen3.5-Omni-Flash","description":"Qwen3.5 全模态稳定版,非思考模式,当前与 qwen3.5-omni-flash-2026-03-15 能力相同。","iconPath":"https://static.51easyai.com/qwen-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"Qwen3.5-Omni-Flash","types":["text_generate","image_analysis","video_understanding","audio_understanding","tools_call","omni"],"icon_path":"https://static.51easyai.com/qwen-color.webp","alias":"Qwen3.5-Omni-Flash","description":"Qwen3.5 全模态稳定版,非思考模式,当前与 qwen3.5-omni-flash-2026-03-15 能力相同。","capabilities":{"text_generate":{"max_context_tokens":262144,"max_input_tokens":196608,"max_output_tokens":65536},"image_analysis":{"max_context_tokens":262144,"max_input_tokens":196608,"max_output_tokens":65536},"video_understanding":{"max_context_tokens":262144,"max_input_tokens":196608,"max_output_tokens":65536},"audio_understanding":{"max_context_tokens":262144,"max_input_tokens":196608,"max_output_tokens":65536},"tools_call":{"supportTool":true,"max_context_tokens":262144,"max_input_tokens":196608,"max_output_tokens":65536},"omni":{"supportTool":true,"max_context_tokens":262144,"max_input_tokens":196608,"max_output_tokens":65536}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:Qwen3.5-397B-A17B', 'Qwen3.5-397B-A17B', 'text_generate', 'Qwen3.5-397B-A17B', '{"originalTypes":["text_generate","image_analysis","video_understanding","tools_call"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["text_generate","image_analysis","video_understanding","tools_call"],"alias":"Qwen3.5-397B-A17B","description":"Qwen3.5 开源系列模型","iconPath":"https://static.51easyai.com/qwen-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"Qwen3.5-397B-A17B","types":["text_generate","image_analysis","video_understanding","tools_call"],"icon_path":"https://static.51easyai.com/qwen-color.webp","alias":"Qwen3.5-397B-A17B","description":"Qwen3.5 开源系列模型"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:Qwen3.5-122B-A10B', 'Qwen3.5-122B-A10B', 'text_generate', 'Qwen3.5-122B-A10B', '{"originalTypes":["text_generate","image_analysis","video_understanding","tools_call"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["text_generate","image_analysis","video_understanding","tools_call"],"alias":"Qwen3.5-122B-A10B","description":"Qwen3.5 开源系列模型","iconPath":"https://static.51easyai.com/qwen-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"Qwen3.5-122B-A10B","types":["text_generate","image_analysis","video_understanding","tools_call"],"icon_path":"https://static.51easyai.com/qwen-color.webp","alias":"Qwen3.5-122B-A10B","description":"Qwen3.5 开源系列模型"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:Qwen3.5-27B', 'Qwen3.5-27B', 'text_generate', 'Qwen3.5-27B', '{"originalTypes":["text_generate","image_analysis","video_understanding","tools_call"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["text_generate","image_analysis","video_understanding","tools_call"],"alias":"Qwen3.5-27B","description":"Qwen3.5 开源系列模型","iconPath":"https://static.51easyai.com/qwen-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"Qwen3.5-27B","types":["text_generate","image_analysis","video_understanding","tools_call"],"icon_path":"https://static.51easyai.com/qwen-color.webp","alias":"Qwen3.5-27B","description":"Qwen3.5 开源系列模型"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:Qwen3.5-35B-A3B', 'Qwen3.5-35B-A3B', 'text_generate', 'Qwen3.5-35B-A3B', '{"originalTypes":["text_generate","image_analysis","video_understanding","tools_call"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["text_generate","image_analysis","video_understanding","tools_call"],"alias":"Qwen3.5-35B-A3B","description":"Qwen3.5 开源系列模型","iconPath":"https://static.51easyai.com/qwen-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"Qwen3.5-35B-A3B","types":["text_generate","image_analysis","video_understanding","tools_call"],"icon_path":"https://static.51easyai.com/qwen-color.webp","alias":"Qwen3.5-35B-A3B","description":"Qwen3.5 开源系列模型"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:Qwen3.6-Plus', 'Qwen3.6-Plus', 'text_generate', 'Qwen3.6-Plus', '{"originalTypes":["text_generate","tools_call"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["text_generate","tools_call"],"alias":"Qwen3.6-Plus","description":"Qwen3.6 文本模型","iconPath":"https://static.51easyai.com/qwen-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"Qwen3.6-Plus","types":["text_generate","tools_call"],"icon_path":"https://static.51easyai.com/qwen-color.webp","alias":"Qwen3.6-Plus","description":"Qwen3.6 文本模型"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:DeepSeek-V4-Pro', 'DeepSeek-V4-Pro', 'text_generate', 'DeepSeek-V4-Pro', '{"text_generate":{"max_context_tokens":1000000,"supportTool":true,"supportStructuredOutput":false,"supportThinking":true,"supportThinkingModeSwitch":true,"supportWebSearch":true},"tools_call":{"max_context_tokens":1000000,"supportTool":true,"supportStructuredOutput":false,"supportThinking":true,"supportThinkingModeSwitch":true,"supportWebSearch":true},"originalTypes":["text_generate","tools_call"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["text_generate","tools_call"],"alias":"DeepSeek-V4-Pro","description":"DeepSeek V4 Pro 文本模型,支持工具调用,最大上下文 100 万 tokens。","iconPath":"https://static.51easyai.com/deepseek-color%20%281%29.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"DeepSeek-V4-Pro","types":["text_generate","tools_call"],"icon_path":"https://static.51easyai.com/deepseek-color%20%281%29.webp","alias":"DeepSeek-V4-Pro","description":"DeepSeek V4 Pro 文本模型,支持工具调用,最大上下文 100 万 tokens。","capabilities":{"text_generate":{"max_context_tokens":1000000,"supportTool":true,"supportStructuredOutput":false,"supportThinking":true,"supportThinkingModeSwitch":true,"supportWebSearch":true},"tools_call":{"max_context_tokens":1000000,"supportTool":true,"supportStructuredOutput":false,"supportThinking":true,"supportThinkingModeSwitch":true,"supportWebSearch":true}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:DeepSeek-V4-Flash', 'DeepSeek-V4-Flash', 'text_generate', 'DeepSeek-V4-Flash', '{"text_generate":{"max_context_tokens":1000000,"supportTool":true,"supportStructuredOutput":false,"supportThinking":true,"supportThinkingModeSwitch":true,"supportWebSearch":true},"tools_call":{"max_context_tokens":1000000,"supportTool":true,"supportStructuredOutput":false,"supportThinking":true,"supportThinkingModeSwitch":true,"supportWebSearch":true},"originalTypes":["text_generate","tools_call"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["text_generate","tools_call"],"alias":"DeepSeek-V4-Flash","description":"DeepSeek V4 Flash 文本模型,支持工具调用,最大上下文 100 万 tokens。","iconPath":"https://static.51easyai.com/deepseek-color%20%281%29.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"DeepSeek-V4-Flash","types":["text_generate","tools_call"],"icon_path":"https://static.51easyai.com/deepseek-color%20%281%29.webp","alias":"DeepSeek-V4-Flash","description":"DeepSeek V4 Flash 文本模型,支持工具调用,最大上下文 100 万 tokens。","capabilities":{"text_generate":{"max_context_tokens":1000000,"supportTool":true,"supportStructuredOutput":false,"supportThinking":true,"supportThinkingModeSwitch":true,"supportWebSearch":true},"tools_call":{"max_context_tokens":1000000,"supportTool":true,"supportStructuredOutput":false,"supportThinking":true,"supportThinkingModeSwitch":true,"supportWebSearch":true}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:Wan2.5-T2V-Preview', 'Wan2.5-T2V-Preview', 'video_generate', 'Wan2.5-T2V-Preview', '{"video_generate":{"aspect_ratio_allowed":{"480p":["16:9","1:1","9:16"],"720p":["16:9","1:1","9:16","4:3","3:4"],"1080p":["16:9","1:1","9:16","4:3","3:4"]},"size_allowed":{"480p":["832x480","480x832","624x624"],"720p":["1280x720","720x1280","960x960","1088x832","832x1088"],"1080p":["1920x1080","1080x1920","1440x1440","1632x1248","1248*1632"]},"output_resolutions":["1080p","720p","480p"],"duration_range":[5,10],"input_audio":true,"output_audio":true},"originalTypes":["video_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":5,"max_request_per_second":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["video_generate"],"alias":"Wan2.5-T2V-Preview","description":"","iconPath":"https://static.51easyai.com/qwen-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"Wan2.5-T2V-Preview","types":["video_generate"],"icon_path":"https://static.51easyai.com/qwen-color.webp","alias":"Wan2.5-T2V-Preview","model_limits":{"max_concurrent_requests":5,"max_request_per_second":5},"capabilities":{"video_generate":{"aspect_ratio_allowed":{"480p":["16:9","1:1","9:16"],"720p":["16:9","1:1","9:16","4:3","3:4"],"1080p":["16:9","1:1","9:16","4:3","3:4"]},"size_allowed":{"480p":["832x480","480x832","624x624"],"720p":["1280x720","720x1280","960x960","1088x832","832x1088"],"1080p":["1920x1080","1080x1920","1440x1440","1632x1248","1248*1632"]},"output_resolutions":["1080p","720p","480p"],"duration_range":[5,10],"input_audio":true,"output_audio":true}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:Wan2.5-I2V-Preview', 'Wan2.5-I2V-Preview', 'image_to_video', 'Wan2.5-I2V-Preview', '{"image_to_video":{"output_resolutions":["1080p","720p","480p"],"duration_range":{"input_first_frame":[5,10]},"input_first_frame":true,"input_last_frame":false,"input_first_last_frame":false,"aspect_ratio_allowed":["adaptive"],"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"input_audio":true,"output_audio":true},"originalTypes":["image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["image_to_video"],"alias":"Wan2.5-I2V-Preview","description":"","iconPath":"https://static.51easyai.com/qwen-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"Wan2.5-I2V-Preview","types":["image_to_video"],"icon_path":"https://static.51easyai.com/qwen-color.webp","alias":"Wan2.5-I2V-Preview","model_limits":{"max_concurrent_requests":5},"capabilities":{"image_to_video":{"output_resolutions":["1080p","720p","480p"],"duration_range":{"input_first_frame":[5,10]},"input_first_frame":true,"input_last_frame":false,"input_first_last_frame":false,"aspect_ratio_allowed":["adaptive"],"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"input_audio":true,"output_audio":true}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:Wan2.6-文生视频', 'Wan2.6-文生视频', 'video_generate', 'Wan2.6-文生视频', '{"video_generate":{"aspect_ratio_allowed":{"720p":["16:9","1:1","9:16","4:3","3:4"],"1080p":["16:9","1:1","9:16","4:3","3:4"]},"output_resolutions":["1080p","720p"],"duration_range":[5,15],"duration_options":[5,10,15],"input_audio":true,"output_audio":true},"originalTypes":["video_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":10,"max_request_per_minute":300}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["video_generate"],"alias":"Wan2.6-文生视频","description":"","iconPath":"https://static.51easyai.com/qwen-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"Wan2.6-文生视频","types":["video_generate"],"icon_path":"https://static.51easyai.com/qwen-color.webp","alias":"Wan2.6-文生视频","model_limits":{"max_concurrent_requests":10,"max_request_per_minute":300},"capabilities":{"video_generate":{"aspect_ratio_allowed":{"720p":["16:9","1:1","9:16","4:3","3:4"],"1080p":["16:9","1:1","9:16","4:3","3:4"]},"output_resolutions":["1080p","720p"],"duration_range":[5,15],"duration_options":[5,10,15],"input_audio":true,"output_audio":true}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:Wan2.6-图生视频', 'Wan2.6-图生视频', 'image_to_video', 'Wan2.6-图生视频', '{"image_to_video":{"output_resolutions":["1080p","720p"],"duration_range":{"input_first_frame":[5,10]},"duration_options":{"input_first_frame":[5,10,15]},"input_first_frame":true,"input_last_frame":false,"input_first_last_frame":false,"aspect_ratio_allowed":[],"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"input_audio":true},"originalTypes":["image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":10,"max_request_per_minute":300}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["image_to_video"],"alias":"Wan2.6-图生视频","description":"","iconPath":"https://static.51easyai.com/qwen-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"Wan2.6-图生视频","types":["image_to_video"],"icon_path":"https://static.51easyai.com/qwen-color.webp","alias":"Wan2.6-图生视频","model_limits":{"max_concurrent_requests":10,"max_request_per_minute":300},"capabilities":{"image_to_video":{"output_resolutions":["1080p","720p"],"duration_range":{"input_first_frame":[5,10]},"duration_options":{"input_first_frame":[5,10,15]},"input_first_frame":true,"input_last_frame":false,"input_first_last_frame":false,"aspect_ratio_allowed":[],"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"input_audio":true}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:Wan2.6-图生视频-Flash', 'Wan2.6-图生视频-Flash', 'image_to_video', 'Wan2.6-图生视频-Flash', '{"image_to_video":{"output_resolutions":["1080p","720p"],"duration_range":{"input_first_frame":[2,15]},"duration_options":{"input_first_frame":[2,5,10,15]},"input_first_frame":true,"input_last_frame":false,"input_first_last_frame":false,"aspect_ratio_allowed":[],"input_reference_generate_single":false,"output_audio":true,"input_audio":true,"input_reference_generate_multiple":false,"support_video_effect_template":false},"originalTypes":["image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":10,"max_request_per_minute":300}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["image_to_video"],"alias":"Wan2.6-图生视频-Flash","description":"","iconPath":"https://static.51easyai.com/qwen-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"Wan2.6-图生视频-Flash","types":["image_to_video"],"icon_path":"https://static.51easyai.com/qwen-color.webp","alias":"Wan2.6-图生视频-Flash","model_limits":{"max_concurrent_requests":10,"max_request_per_minute":300},"capabilities":{"image_to_video":{"output_resolutions":["1080p","720p"],"duration_range":{"input_first_frame":[2,15]},"duration_options":{"input_first_frame":[2,5,10,15]},"input_first_frame":true,"input_last_frame":false,"input_first_last_frame":false,"aspect_ratio_allowed":[],"input_reference_generate_single":false,"output_audio":true,"input_audio":true,"input_reference_generate_multiple":false,"support_video_effect_template":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:Suno音频生成V3.0', 'Suno音频生成V3.0', 'audio_generate', 'Suno音频生成V3.0', '{"originalTypes":["audio_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["audio_generate"],"alias":"Suno音频生成V3.0","description":"","iconPath":"https://static.51easyai.com/suno-logo.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"Suno音频生成V3.0","types":["audio_generate"],"alias":"Suno音频生成V3.0","icon_path":"https://static.51easyai.com/suno-logo.png"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:Suno音频生成V3.5', 'Suno音频生成V3.5', 'audio_generate', 'Suno音频生成V3.5', '{"originalTypes":["audio_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["audio_generate"],"alias":"Suno音频生成V3.5","description":"","iconPath":"https://static.51easyai.com/suno-logo.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"Suno音频生成V3.5","types":["audio_generate"],"alias":"Suno音频生成V3.5","icon_path":"https://static.51easyai.com/suno-logo.png"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:Suno音频生成V4.0', 'Suno音频生成V4.0', 'audio_generate', 'Suno音频生成V4.0', '{"originalTypes":["audio_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["audio_generate"],"alias":"Suno音频生成V4.0","description":"","iconPath":"https://static.51easyai.com/suno-logo.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"Suno音频生成V4.0","types":["audio_generate"],"alias":"Suno音频生成V4.0","icon_path":"https://static.51easyai.com/suno-logo.png"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:Suno音频生成V4.5', 'Suno音频生成V4.5', 'audio_generate', 'Suno音频生成V4.5', '{"originalTypes":["audio_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["audio_generate"],"alias":"Suno音频生成V4.5","description":"","iconPath":"https://static.51easyai.com/suno-logo.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"Suno音频生成V4.5","types":["audio_generate"],"alias":"Suno音频生成V4.5","icon_path":"https://static.51easyai.com/suno-logo.png"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:Suno音频生成V5.0', 'Suno音频生成V5.0', 'audio_generate', 'Suno音频生成V5.0', '{"originalTypes":["audio_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["audio_generate"],"alias":"Suno音频生成V5.0","description":"","iconPath":"https://static.51easyai.com/suno-logo.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"Suno音频生成V5.0","types":["audio_generate"],"alias":"Suno音频生成V5.0","icon_path":"https://static.51easyai.com/suno-logo.png"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:Sora-2', 'Sora-2', 'video_generate', 'Sora-2', '{"video_generate":{"duration_range":[10,15],"output_resolutions":[],"aspect_ratio_allowed":["16:9","9:16"]},"image_to_video":{"input_first_frame":true,"input_last_frame":false,"input_first_last_frame":false,"duration_range":[10,15],"output_resolutions":[],"aspect_ratio_allowed":["16:9","9:16"],"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false},"originalTypes":["video_generate","image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":15}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["video_generate","image_to_video"],"alias":"Sora-2","description":"","iconPath":"https://static.51easyai.com/sora-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"Sora-2","types":["video_generate","image_to_video"],"icon_path":"https://static.51easyai.com/sora-color.webp","alias":"Sora-2","model_limits":{"max_concurrent_requests":15},"capabilities":{"video_generate":{"duration_range":[10,15],"output_resolutions":[],"aspect_ratio_allowed":["16:9","9:16"]},"image_to_video":{"input_first_frame":true,"input_last_frame":false,"input_first_last_frame":false,"duration_range":[10,15],"output_resolutions":[],"aspect_ratio_allowed":["16:9","9:16"],"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:Sora-2-Pro', 'Sora-2-Pro', 'video_generate', 'Sora-2-Pro', '{"video_generate":{"duration_range":[10,25],"output_resolutions":[],"aspect_ratio_allowed":["16:9","9:16"]},"image_to_video":{"input_first_frame":true,"input_last_frame":false,"input_first_last_frame":false,"duration_range":[10,25],"output_resolutions":[],"aspect_ratio_allowed":["16:9","9:16"],"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false},"originalTypes":["video_generate","image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":15}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["video_generate","image_to_video"],"alias":"Sora-2-Pro","description":"","iconPath":"https://static.51easyai.com/sora-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"Sora-2-Pro","types":["video_generate","image_to_video"],"icon_path":"https://static.51easyai.com/sora-color.webp","alias":"Sora-2-Pro","model_limits":{"max_concurrent_requests":15},"capabilities":{"video_generate":{"duration_range":[10,25],"output_resolutions":[],"aspect_ratio_allowed":["16:9","9:16"]},"image_to_video":{"input_first_frame":true,"input_last_frame":false,"input_first_last_frame":false,"duration_range":[10,25],"output_resolutions":[],"aspect_ratio_allowed":["16:9","9:16"],"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:VEO-3-Fast', 'VEO-3-Fast', 'video_generate', 'VEO-3-Fast', '{"video_generate":{"aspect_ratio_allowed":["16:9","9:16","1:1","4:3","3:4"],"output_resolutions":[],"duration_range":[8,8]},"image_to_video":{"output_resolutions":[],"duration_range":[8,8],"aspect_ratio_allowed":["16:9","9:16","1:1","4:3","3:4"],"input_first_last_frame":true,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"input_first_frame":true,"input_last_frame":false},"originalTypes":["video_generate","image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["video_generate","image_to_video"],"alias":"VEO-3-Fast","description":"","iconPath":"https://static.51easyai.com/gemini-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"VEO-3-Fast","types":["video_generate","image_to_video"],"icon_path":"https://static.51easyai.com/gemini-color.png","alias":"VEO-3-Fast","model_limits":{"max_concurrent_requests":5},"capabilities":{"video_generate":{"aspect_ratio_allowed":["16:9","9:16","1:1","4:3","3:4"],"output_resolutions":[],"duration_range":[8,8]},"image_to_video":{"output_resolutions":[],"duration_range":[8,8],"aspect_ratio_allowed":["16:9","9:16","1:1","4:3","3:4"],"input_first_last_frame":true,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"input_first_frame":true,"input_last_frame":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:VEO-3.1-Fast', 'VEO-3.1-Fast', 'video_generate', 'VEO-3.1-Fast', '{"video_generate":{"aspect_ratio_allowed":["16:9","9:16","1:1","4:3","3:4"],"output_resolutions":[],"duration_range":[8,8]},"image_to_video":{"output_resolutions":[],"duration_range":[8,8],"aspect_ratio_allowed":["16:9","9:16","1:1","4:3","3:4"],"input_first_last_frame":true,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"input_first_frame":true,"input_last_frame":false},"originalTypes":["video_generate","image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["video_generate","image_to_video"],"alias":"VEO-3.1-Fast","description":"","iconPath":"https://static.51easyai.com/gemini-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"VEO-3.1-Fast","types":["video_generate","image_to_video"],"icon_path":"https://static.51easyai.com/gemini-color.png","alias":"VEO-3.1-Fast","model_limits":{"max_concurrent_requests":5},"capabilities":{"video_generate":{"aspect_ratio_allowed":["16:9","9:16","1:1","4:3","3:4"],"output_resolutions":[],"duration_range":[8,8]},"image_to_video":{"output_resolutions":[],"duration_range":[8,8],"aspect_ratio_allowed":["16:9","9:16","1:1","4:3","3:4"],"input_first_last_frame":true,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"input_first_frame":true,"input_last_frame":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:VEO-3', 'VEO-3', 'video_generate', 'VEO-3', '{"video_generate":{"aspect_ratio_allowed":["16:9","9:16","1:1","4:3","3:4"],"output_resolutions":[],"duration_range":[8,8]},"image_to_video":{"output_resolutions":[],"duration_range":[8,8],"aspect_ratio_allowed":["16:9","9:16","1:1","4:3","3:4"],"input_first_last_frame":true,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"input_first_frame":true,"input_last_frame":false},"originalTypes":["video_generate","image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["video_generate","image_to_video"],"alias":"VEO-3","description":"","iconPath":"https://static.51easyai.com/gemini-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"VEO-3","types":["video_generate","image_to_video"],"icon_path":"https://static.51easyai.com/gemini-color.png","alias":"VEO-3","model_limits":{"max_concurrent_requests":5},"capabilities":{"video_generate":{"aspect_ratio_allowed":["16:9","9:16","1:1","4:3","3:4"],"output_resolutions":[],"duration_range":[8,8]},"image_to_video":{"output_resolutions":[],"duration_range":[8,8],"aspect_ratio_allowed":["16:9","9:16","1:1","4:3","3:4"],"input_first_last_frame":true,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"input_first_frame":true,"input_last_frame":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:VEO-3.1', 'VEO-3.1', 'video_generate', 'VEO-3.1', '{"video_generate":{"aspect_ratio_allowed":["16:9","9:16","1:1","4:3","3:4"],"output_resolutions":[],"duration_range":[8,8]},"image_to_video":{"output_resolutions":[],"duration_range":[8,8],"aspect_ratio_allowed":["16:9","9:16","1:1","4:3","3:4"],"input_first_last_frame":true,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"input_first_frame":true,"input_last_frame":false},"originalTypes":["video_generate","image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["video_generate","image_to_video"],"alias":"VEO-3.1","description":"","iconPath":"https://static.51easyai.com/gemini-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"VEO-3.1","types":["video_generate","image_to_video"],"icon_path":"https://static.51easyai.com/gemini-color.png","alias":"VEO-3.1","model_limits":{"max_concurrent_requests":5},"capabilities":{"video_generate":{"aspect_ratio_allowed":["16:9","9:16","1:1","4:3","3:4"],"output_resolutions":[],"duration_range":[8,8]},"image_to_video":{"output_resolutions":[],"duration_range":[8,8],"aspect_ratio_allowed":["16:9","9:16","1:1","4:3","3:4"],"input_first_last_frame":true,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"input_first_frame":true,"input_last_frame":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:VEO-3.1-Pro', 'VEO-3.1-Pro', 'video_generate', 'VEO-3.1-Pro', '{"video_generate":{"aspect_ratio_allowed":["16:9","9:16","1:1","4:3","3:4"],"output_resolutions":[],"duration_range":[8,8]},"image_to_video":{"output_resolutions":[],"duration_range":[8,8],"aspect_ratio_allowed":["16:9","9:16","1:1","4:3","3:4"],"input_first_last_frame":true,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"input_first_frame":true,"input_last_frame":false},"originalTypes":["video_generate","image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["video_generate","image_to_video"],"alias":"VEO-3.1-Pro","description":"","iconPath":"https://static.51easyai.com/gemini-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"VEO-3.1-Pro","types":["video_generate","image_to_video"],"icon_path":"https://static.51easyai.com/gemini-color.png","alias":"VEO-3.1-Pro","model_limits":{"max_concurrent_requests":5},"capabilities":{"video_generate":{"aspect_ratio_allowed":["16:9","9:16","1:1","4:3","3:4"],"output_resolutions":[],"duration_range":[8,8]},"image_to_video":{"output_resolutions":[],"duration_range":[8,8],"aspect_ratio_allowed":["16:9","9:16","1:1","4:3","3:4"],"input_first_last_frame":true,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"input_first_frame":true,"input_last_frame":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:Vidu-Q2', 'Vidu-Q2', 'video_generate', 'Vidu-Q2', '{"video_generate":{"output_resolutions":["720p","480p","1080p"],"aspect_ratio_allowed":["16:9","9:16","4:3","3:4","1:1"],"duration_range":[1,10],"output_bgm":true},"originalTypes":["video_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["video_generate"],"alias":"Vidu-Q2","description":"","iconPath":"https://static.51easyai.com/vidu-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"Vidu-Q2","types":["video_generate"],"alias":"Vidu-Q2","icon_path":"https://static.51easyai.com/vidu-color.webp","capabilities":{"video_generate":{"output_resolutions":["720p","480p","1080p"],"aspect_ratio_allowed":["16:9","9:16","4:3","3:4","1:1"],"duration_range":[1,10],"output_bgm":true}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:Vidu-Q1', 'Vidu-Q1', 'video_generate', 'Vidu-Q1', '{"video_generate":{"output_resolutions":["1080p"],"aspect_ratio_allowed":["16:9","9:16","1:1"],"duration_range":[5,5],"output_bgm":true},"originalTypes":["video_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["video_generate"],"alias":"Vidu-Q1","description":"","iconPath":"https://static.51easyai.com/vidu-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"Vidu-Q1","types":["video_generate"],"alias":"Vidu-Q1","icon_path":"https://static.51easyai.com/vidu-color.webp","capabilities":{"video_generate":{"output_resolutions":["1080p"],"aspect_ratio_allowed":["16:9","9:16","1:1"],"duration_range":[5,5],"output_bgm":true}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:Vidu-Q2-Pro-Fast', 'Vidu-Q2-Pro-Fast', 'image_to_video', 'Vidu-Q2-Pro-Fast', '{"image_to_video":{"output_resolutions":["720p","1080p"],"input_first_frame":true,"input_first_last_frame":true,"duration_range":[1,10],"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"input_last_frame":false,"output_bgm":true,"output_audio":true,"aspect_ratio_allowed":[]},"originalTypes":["image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["image_to_video"],"alias":"Vidu-Q2-Pro-Fast","description":"","iconPath":"https://static.51easyai.com/vidu-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"Vidu-Q2-Pro-Fast","types":["image_to_video"],"alias":"Vidu-Q2-Pro-Fast","icon_path":"https://static.51easyai.com/vidu-color.webp","capabilities":{"image_to_video":{"output_resolutions":["720p","1080p"],"input_first_frame":true,"input_first_last_frame":true,"duration_range":[1,10],"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"input_last_frame":false,"output_bgm":true,"output_audio":true,"aspect_ratio_allowed":[]}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:Vidu-Q2-Pro', 'Vidu-Q2-Pro', 'image_to_video', 'Vidu-Q2-Pro', '{"image_to_video":{"output_resolutions":["720p","480p","1080p"],"input_first_frame":true,"input_first_last_frame":true,"duration_range":[1,10],"input_last_frame":false,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"output_bgm":true,"output_audio":true,"aspect_ratio_allowed":[],"input_smart_multi_frame":true,"smart_multi_frame_range":[2,9],"smart_multi_frame_mode":"native","smart_multi_frame_duration_range":[2,7]},"originalTypes":["image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["image_to_video"],"alias":"Vidu-Q2-Pro","description":"","iconPath":"https://static.51easyai.com/vidu-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"Vidu-Q2-Pro","types":["image_to_video"],"alias":"Vidu-Q2-Pro","icon_path":"https://static.51easyai.com/vidu-color.webp","capabilities":{"image_to_video":{"output_resolutions":["720p","480p","1080p"],"input_first_frame":true,"input_first_last_frame":true,"duration_range":[1,10],"input_last_frame":false,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"output_bgm":true,"output_audio":true,"aspect_ratio_allowed":[],"input_smart_multi_frame":true,"smart_multi_frame_range":[2,9],"smart_multi_frame_mode":"native","smart_multi_frame_duration_range":[2,7]}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:Vidu-Q2-Turbo', 'Vidu-Q2-Turbo', 'image_to_video', 'Vidu-Q2-Turbo', '{"image_to_video":{"output_resolutions":["720p","480p","1080p"],"input_first_frame":true,"input_first_last_frame":true,"duration_range":[1,10],"input_last_frame":false,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"output_bgm":true,"output_audio":true,"aspect_ratio_allowed":[],"input_smart_multi_frame":true,"smart_multi_frame_range":[2,9],"smart_multi_frame_mode":"native","smart_multi_frame_duration_range":[2,7]},"originalTypes":["image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["image_to_video"],"alias":"Vidu-Q2-Turbo","description":"","iconPath":"https://static.51easyai.com/vidu-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"Vidu-Q2-Turbo","types":["image_to_video"],"alias":"Vidu-Q2-Turbo","icon_path":"https://static.51easyai.com/vidu-color.webp","capabilities":{"image_to_video":{"output_resolutions":["720p","480p","1080p"],"input_first_frame":true,"input_first_last_frame":true,"duration_range":[1,10],"input_last_frame":false,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"output_bgm":true,"output_audio":true,"aspect_ratio_allowed":[],"input_smart_multi_frame":true,"smart_multi_frame_range":[2,9],"smart_multi_frame_mode":"native","smart_multi_frame_duration_range":[2,7]}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:Vidu-Q3-Pro', 'Vidu-Q3-Pro', 'video_generate', 'Vidu-Q3-Pro', '{"video_generate":{"output_resolutions":["720p","480p","1080p"],"aspect_ratio_allowed":["16:9","9:16","4:3","3:4","1:1"],"duration_range":[1,16],"output_audio":true},"image_to_video":{"output_resolutions":["720p","480p","1080p"],"input_first_frame":true,"input_first_last_frame":false,"duration_range":[1,16],"input_last_frame":false,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"output_audio":true,"aspect_ratio_allowed":[]},"originalTypes":["video_generate","image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["video_generate","image_to_video"],"alias":"Vidu-Q3-Pro","description":"高效生成优质音视频内容,让视频内容更生动、更形象、更立体","iconPath":"https://static.51easyai.com/vidu-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"Vidu-Q3-Pro","types":["video_generate","image_to_video"],"alias":"Vidu-Q3-Pro","description":"高效生成优质音视频内容,让视频内容更生动、更形象、更立体","icon_path":"https://static.51easyai.com/vidu-color.webp","capabilities":{"video_generate":{"output_resolutions":["720p","480p","1080p"],"aspect_ratio_allowed":["16:9","9:16","4:3","3:4","1:1"],"duration_range":[1,16],"output_audio":true},"image_to_video":{"output_resolutions":["720p","480p","1080p"],"input_first_frame":true,"input_first_last_frame":false,"duration_range":[1,16],"input_last_frame":false,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"output_audio":true,"aspect_ratio_allowed":[]}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:Vidu-Q1-Classic', 'Vidu-Q1-Classic', 'image_to_video', 'Vidu-Q1-Classic', '{"image_to_video":{"output_resolutions":["1080p"],"input_first_frame":true,"input_first_last_frame":true,"duration_range":[5,5],"input_last_frame":false,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"output_bgm":true,"output_audio":true,"aspect_ratio_allowed":[]},"originalTypes":["image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["image_to_video"],"alias":"Vidu-Q1-Classic","description":"","iconPath":"https://static.51easyai.com/vidu-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"Vidu-Q1-Classic","types":["image_to_video"],"alias":"Vidu-Q1-Classic","icon_path":"https://static.51easyai.com/vidu-color.webp","capabilities":{"image_to_video":{"output_resolutions":["1080p"],"input_first_frame":true,"input_first_last_frame":true,"duration_range":[5,5],"input_last_frame":false,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"output_bgm":true,"output_audio":true,"aspect_ratio_allowed":[]}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:Vidu-2.0', 'Vidu-2.0', 'image_to_video', 'Vidu-2.0', '{"image_to_video":{"output_resolutions":["720p","1080p"],"input_first_frame":true,"input_first_last_frame":true,"duration_range":{"720p":[4,8],"1080p":[4,4]},"input_last_frame":false,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"output_bgm":true,"output_audio":true,"aspect_ratio_allowed":[]},"originalTypes":["image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["image_to_video"],"alias":"Vidu-2.0","description":"","iconPath":"https://static.51easyai.com/vidu-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"Vidu-2.0","types":["image_to_video"],"alias":"Vidu-2.0","icon_path":"https://static.51easyai.com/vidu-color.webp","capabilities":{"image_to_video":{"output_resolutions":["720p","1080p"],"input_first_frame":true,"input_first_last_frame":true,"duration_range":{"720p":[4,8],"1080p":[4,4]},"input_last_frame":false,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"output_bgm":true,"output_audio":true,"aspect_ratio_allowed":[]}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:Claude-Opus-4.6', 'Claude-Opus-4.6', 'text_generate', 'Claude-Opus-4.6', '{"originalTypes":["text_generate","tools_call"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["text_generate","tools_call"],"alias":"Claude-Opus-4.6","description":"","iconPath":"https://static.51easyai.com/claude-color%20%281%29.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"Claude-Opus-4.6","types":["text_generate","tools_call"],"alias":"Claude-Opus-4.6","icon_path":"https://static.51easyai.com/claude-color%20%281%29.webp"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:Claude-Opus-4.5', 'Claude-Opus-4.5', 'text_generate', 'Claude-Opus-4.5', '{"originalTypes":["text_generate","tools_call"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["text_generate","tools_call"],"alias":"Claude-Opus-4.5","description":"","iconPath":"https://static.51easyai.com/claude-color%20%281%29.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"Claude-Opus-4.5","types":["text_generate","tools_call"],"alias":"Claude-Opus-4.5","icon_path":"https://static.51easyai.com/claude-color%20%281%29.webp"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:gpt-image-1', 'gpt-image-1', 'image_generate', 'gpt-image-1', '{"image_generate":{"aspect_ratio_allowed":["21:9","16:9","4:3","3:2","1:1","2:3","3:4","9:16","9:21"]},"image_edit":{"aspect_ratio_allowed":["21:9","16:9","4:3","3:2","1:1","2:3","3:4","9:16","9:21"],"input_multiple_images":true},"originalTypes":["image_generate","image_edit"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["image_generate","image_edit"],"alias":"gpt-image-1","description":"","iconPath":"","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"gpt-image-1","types":["image_generate","image_edit"],"alias":"gpt-image-1","capabilities":{"image_generate":{"aspect_ratio_allowed":["21:9","16:9","4:3","3:2","1:1","2:3","3:4","9:16","9:21"]},"image_edit":{"aspect_ratio_allowed":["21:9","16:9","4:3","3:2","1:1","2:3","3:4","9:16","9:21"],"input_multiple_images":true}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:gpt-image-1.5', 'gpt-image-1.5', 'image_generate', 'gpt-image-1.5', '{"image_generate":{"aspect_ratio_allowed":["21:9","16:9","4:3","3:2","1:1","2:3","3:4","9:16","9:21"]},"image_edit":{"aspect_ratio_allowed":["21:9","16:9","4:3","3:2","1:1","2:3","3:4","9:16","9:21"],"input_multiple_images":true},"originalTypes":["image_generate","image_edit"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["image_generate","image_edit"],"alias":"gpt-image-1.5","description":"","iconPath":"","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"gpt-image-1.5","types":["image_generate","image_edit"],"alias":"gpt-image-1.5","capabilities":{"image_generate":{"aspect_ratio_allowed":["21:9","16:9","4:3","3:2","1:1","2:3","3:4","9:16","9:21"]},"image_edit":{"aspect_ratio_allowed":["21:9","16:9","4:3","3:2","1:1","2:3","3:4","9:16","9:21"],"input_multiple_images":true}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:gpt-image-2', 'gpt-image-2', 'image_generate', 'gpt-image-2', '{"image_generate":{"aspect_ratio_allowed":["21:9","16:9","4:3","3:2","1:1","2:3","3:4","9:16","9:21"],"aspect_ratio_range":[0.3333333333333333,3],"output_size_range":[655360,8294400],"width_height_range":[1,3840],"width_height_multiple":16},"image_edit":{"aspect_ratio_allowed":["21:9","16:9","4:3","3:2","1:1","2:3","3:4","9:16","9:21"],"aspect_ratio_range":[0.3333333333333333,3],"output_size_range":[655360,8294400],"width_height_range":[1,3840],"width_height_multiple":16,"input_multiple_images":true},"originalTypes":["image_generate","image_edit"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["image_generate","image_edit"],"alias":"gpt-image-2","description":"","iconPath":"","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"gpt-image-2","types":["image_generate","image_edit"],"alias":"gpt-image-2","capabilities":{"image_generate":{"aspect_ratio_allowed":["21:9","16:9","4:3","3:2","1:1","2:3","3:4","9:16","9:21"],"aspect_ratio_range":[0.3333333333333333,3],"output_size_range":[655360,8294400],"width_height_range":[1,3840],"width_height_multiple":16},"image_edit":{"aspect_ratio_allowed":["21:9","16:9","4:3","3:2","1:1","2:3","3:4","9:16","9:21"],"aspect_ratio_range":[0.3333333333333333,3],"output_size_range":[655360,8294400],"width_height_range":[1,3840],"width_height_multiple":16,"input_multiple_images":true}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'easyai' OR provider_code = 'easyai' LIMIT 1), 'easyai', 'easyai:gpt-4o', 'gpt-4o', 'text_generate', 'gpt-4o', '{"originalTypes":["text_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"easyai","sourceProviderName":"EasyAI","sourceSpecType":"easyai","originalTypes":["text_generate"],"alias":"","description":"","iconPath":"","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"gpt-4o","types":["text_generate"]}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'keling' OR provider_code = 'keling' LIMIT 1), 'keling', 'keling:kling-v1', 'kling-v1', 'video_generate', '可灵V1', '{"video_generate":{"output_resolutions":["720p"],"duration_range":[5,10],"aspect_ratio_allowed":["16:9","1:1","9:16"]},"image_to_video":{"output_resolutions":["720p"],"duration_range":{"input_first_last_frame":[5,5],"input_first_frame":[5,10]},"input_first_frame":true,"input_first_last_frame":true,"input_last_frame":false,"output_video_continuation":true,"aspect_ratio_allowed":[],"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false},"originalTypes":["video_generate","image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"keling","sourceProviderName":"可灵AI","sourceSpecType":"keling","originalTypes":["video_generate","image_to_video"],"alias":"可灵V1","description":"","iconPath":"https://static.51easyai.com/kling-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"kling-v1","types":["video_generate","image_to_video"],"alias":"可灵V1","icon_path":"https://static.51easyai.com/kling-color.webp","capabilities":{"video_generate":{"output_resolutions":["720p"],"duration_range":[5,10],"aspect_ratio_allowed":["16:9","1:1","9:16"]},"image_to_video":{"output_resolutions":["720p"],"duration_range":{"input_first_last_frame":[5,5],"input_first_frame":[5,10]},"input_first_frame":true,"input_first_last_frame":true,"input_last_frame":false,"output_video_continuation":true,"aspect_ratio_allowed":[],"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'keling' OR provider_code = 'keling' LIMIT 1), 'keling', 'keling:kling-v1-5', 'kling-v1-5', 'image_to_video', '可灵V1.5', '{"image_to_video":{"output_resolutions":{"input_first_frame":["720p","1080p"],"input_first_last_frame":["1080p"],"input_last_frame":["1080p"]},"duration_range":{"input_first_last_frame":[5,10],"input_first_frame":[5,10],"input_last_frame":[5,10]},"input_first_frame":true,"input_first_last_frame":true,"input_last_frame":true,"output_video_continuation":true,"aspect_ratio_allowed":[],"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false},"originalTypes":["image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"keling","sourceProviderName":"可灵AI","sourceSpecType":"keling","originalTypes":["image_to_video"],"alias":"可灵V1.5","description":"","iconPath":"https://static.51easyai.com/kling-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"kling-v1-5","types":["image_to_video"],"alias":"可灵V1.5","icon_path":"https://static.51easyai.com/kling-color.webp","capabilities":{"image_to_video":{"output_resolutions":{"input_first_frame":["720p","1080p"],"input_first_last_frame":["1080p"],"input_last_frame":["1080p"]},"duration_range":{"input_first_last_frame":[5,10],"input_first_frame":[5,10],"input_last_frame":[5,10]},"input_first_frame":true,"input_first_last_frame":true,"input_last_frame":true,"output_video_continuation":true,"aspect_ratio_allowed":[],"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'keling' OR provider_code = 'keling' LIMIT 1), 'keling', 'keling:kling-v1-6', 'kling-v1-6', 'video_generate', '可灵V1.6', '{"video_generate":{"aspect_ratio_allowed":["16:9","1:1","9:16"],"output_resolutions":["720p","1080p"],"duration_range":[5,10]},"image_to_video":{"output_resolutions":{"input_first_frame":["720p","1080p"],"input_first_last_frame":["1080p"],"input_last_frame":["1080p"],"input_reference_generate_multiple":["720p","1080p"],"output_video_continuation":["720p","1080p"]},"duration_range":{"input_first_last_frame":[5,10],"input_first_frame":[5,10],"input_last_frame":[5,10]},"input_first_frame":true,"input_first_last_frame":true,"input_last_frame":true,"input_reference_generate_multiple":true,"output_video_continuation":true,"aspect_ratio_allowed":[],"input_reference_generate_single":false,"support_video_effect_template":true,"support_video_effect_template_list":[]},"originalTypes":["video_generate","image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"keling","sourceProviderName":"可灵AI","sourceSpecType":"keling","originalTypes":["video_generate","image_to_video"],"alias":"可灵V1.6","description":"","iconPath":"https://static.51easyai.com/kling-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"kling-v1-6","types":["video_generate","image_to_video"],"alias":"可灵V1.6","icon_path":"https://static.51easyai.com/kling-color.webp","capabilities":{"video_generate":{"aspect_ratio_allowed":["16:9","1:1","9:16"],"output_resolutions":["720p","1080p"],"duration_range":[5,10]},"image_to_video":{"output_resolutions":{"input_first_frame":["720p","1080p"],"input_first_last_frame":["1080p"],"input_last_frame":["1080p"],"input_reference_generate_multiple":["720p","1080p"],"output_video_continuation":["720p","1080p"]},"duration_range":{"input_first_last_frame":[5,10],"input_first_frame":[5,10],"input_last_frame":[5,10]},"input_first_frame":true,"input_first_last_frame":true,"input_last_frame":true,"input_reference_generate_multiple":true,"output_video_continuation":true,"aspect_ratio_allowed":[],"input_reference_generate_single":false,"support_video_effect_template":true,"support_video_effect_template_list":[]}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'keling' OR provider_code = 'keling' LIMIT 1), 'keling', 'keling:kling-v2-master', 'kling-v2-master', 'video_generate', '可灵V2-大师级', '{"video_generate":{"aspect_ratio_allowed":["16:9","1:1","9:16"],"output_resolutions":["720p"],"duration_range":[5,10]},"image_to_video":{"output_resolutions":{"input_first_frame":["720p"]},"duration_range":{"input_first_frame":[5,10]},"input_first_frame":true,"input_last_frame":false,"input_first_last_frame":false,"aspect_ratio_allowed":[],"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false},"originalTypes":["video_generate","image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"keling","sourceProviderName":"可灵AI","sourceSpecType":"keling","originalTypes":["video_generate","image_to_video"],"alias":"可灵V2-大师级","description":"","iconPath":"https://static.51easyai.com/kling-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"kling-v2-master","types":["video_generate","image_to_video"],"alias":"可灵V2-大师级","icon_path":"https://static.51easyai.com/kling-color.webp","capabilities":{"video_generate":{"aspect_ratio_allowed":["16:9","1:1","9:16"],"output_resolutions":["720p"],"duration_range":[5,10]},"image_to_video":{"output_resolutions":{"input_first_frame":["720p"]},"duration_range":{"input_first_frame":[5,10]},"input_first_frame":true,"input_last_frame":false,"input_first_last_frame":false,"aspect_ratio_allowed":[],"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'keling' OR provider_code = 'keling' LIMIT 1), 'keling', 'keling:kling-v2-1', 'kling-v2-1', 'image_to_video', '可灵V2.1图生视频', '{"image_to_video":{"output_resolutions":{"input_first_frame":["720p","1080p"],"input_first_last_frame":["1080p"]},"duration_range":{"input_first_frame":[5,10],"input_first_last_frame":[5,10]},"aspect_ratio_allowed":[],"input_last_frame":false,"input_first_last_frame":true,"input_first_frame":true,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false},"originalTypes":["image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"keling","sourceProviderName":"可灵AI","sourceSpecType":"keling","originalTypes":["image_to_video"],"alias":"可灵V2.1图生视频","description":"","iconPath":"https://static.51easyai.com/kling-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"kling-v2-1","types":["image_to_video"],"alias":"可灵V2.1图生视频","icon_path":"https://static.51easyai.com/kling-color.webp","capabilities":{"image_to_video":{"output_resolutions":{"input_first_frame":["720p","1080p"],"input_first_last_frame":["1080p"]},"duration_range":{"input_first_frame":[5,10],"input_first_last_frame":[5,10]},"aspect_ratio_allowed":[],"input_last_frame":false,"input_first_last_frame":true,"input_first_frame":true,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'keling' OR provider_code = 'keling' LIMIT 1), 'keling', 'keling:kling-v2-1-master', 'kling-v2-1-master', 'video_generate', '可灵V2.1-大师级', '{"video_generate":{"aspect_ratio_allowed":["16:9","1:1","9:16"],"output_resolutions":["1080p"],"duration_range":[5,10]},"image_to_video":{"output_resolutions":{"input_first_frame":["1080p"]},"duration_range":{"input_first_frame":[5,10]},"input_first_frame":true,"input_last_frame":false,"input_first_last_frame":false,"aspect_ratio_allowed":[],"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false},"originalTypes":["video_generate","image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"keling","sourceProviderName":"可灵AI","sourceSpecType":"keling","originalTypes":["video_generate","image_to_video"],"alias":"可灵V2.1-大师级","description":"","iconPath":"https://static.51easyai.com/kling-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"kling-v2-1-master","types":["video_generate","image_to_video"],"alias":"可灵V2.1-大师级","icon_path":"https://static.51easyai.com/kling-color.webp","capabilities":{"video_generate":{"aspect_ratio_allowed":["16:9","1:1","9:16"],"output_resolutions":["1080p"],"duration_range":[5,10]},"image_to_video":{"output_resolutions":{"input_first_frame":["1080p"]},"duration_range":{"input_first_frame":[5,10]},"input_first_frame":true,"input_last_frame":false,"input_first_last_frame":false,"aspect_ratio_allowed":[],"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'keling' OR provider_code = 'keling' LIMIT 1), 'keling', 'keling:kling-v2-5-turbo', 'kling-v2-5-turbo', 'video_generate', '可灵V2.5-turbo', '{"video_generate":{"aspect_ratio_allowed":["16:9","1:1","9:16"],"output_resolutions":["720p","1080p"],"duration_range":[5,10]},"image_to_video":{"output_resolutions":{"input_first_frame":["720p","1080p"],"input_first_last_frame":["1080p"]},"duration_range":{"input_first_frame":[5,10]},"input_first_frame":true,"input_last_frame":false,"input_first_last_frame":true,"aspect_ratio_allowed":[],"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false},"originalTypes":["video_generate","image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"keling","sourceProviderName":"可灵AI","sourceSpecType":"keling","originalTypes":["video_generate","image_to_video"],"alias":"可灵V2.5-turbo","description":"","iconPath":"https://static.51easyai.com/kling-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"kling-v2-5-turbo","types":["video_generate","image_to_video"],"alias":"可灵V2.5-turbo","icon_path":"https://static.51easyai.com/kling-color.webp","capabilities":{"video_generate":{"aspect_ratio_allowed":["16:9","1:1","9:16"],"output_resolutions":["720p","1080p"],"duration_range":[5,10]},"image_to_video":{"output_resolutions":{"input_first_frame":["720p","1080p"],"input_first_last_frame":["1080p"]},"duration_range":{"input_first_frame":[5,10]},"input_first_frame":true,"input_last_frame":false,"input_first_last_frame":true,"aspect_ratio_allowed":[],"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'keling' OR provider_code = 'keling' LIMIT 1), 'keling', 'keling:kling-v2-6', 'kling-v2-6', 'video_generate', '可灵V2.6', '{"video_generate":{"aspect_ratio_allowed":["16:9","1:1","9:16"],"output_resolutions":["1080p"],"duration_range":[5,10],"output_audio":true},"image_to_video":{"output_resolutions":["1080p"],"duration_range":[5,10],"input_first_frame":true,"input_last_frame":false,"input_first_last_frame":true,"aspect_ratio_allowed":[],"output_audio":true,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false},"originalTypes":["video_generate","image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"keling","sourceProviderName":"可灵AI","sourceSpecType":"keling","originalTypes":["video_generate","image_to_video"],"alias":"可灵V2.6","description":"","iconPath":"https://static.51easyai.com/kling-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"kling-v2-6","types":["video_generate","image_to_video"],"alias":"可灵V2.6","icon_path":"https://static.51easyai.com/kling-color.webp","capabilities":{"video_generate":{"aspect_ratio_allowed":["16:9","1:1","9:16"],"output_resolutions":["1080p"],"duration_range":[5,10],"output_audio":true},"image_to_video":{"output_resolutions":["1080p"],"duration_range":[5,10],"input_first_frame":true,"input_last_frame":false,"input_first_last_frame":true,"aspect_ratio_allowed":[],"output_audio":true,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'keling' OR provider_code = 'keling' LIMIT 1), 'keling', 'keling:kling-v3', 'kling-v3', 'video_generate', '可灵V3', '{"video_generate":{"aspect_ratio_allowed":["16:9","1:1","9:16"],"output_resolutions":["720p","1080p","2160p"],"duration_range":[3,15],"output_audio":true,"prompt_length_limit":{"max":2500,"count_mode":"non_ascii_weighted","label":"可灵口径"}},"image_to_video":{"output_resolutions":["720p","1080p","2160p"],"duration_range":[3,15],"input_first_frame":true,"input_last_frame":false,"input_first_last_frame":true,"aspect_ratio_allowed":["16:9","1:1","9:16"],"output_audio":true,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"prompt_length_limit":{"max":2500,"count_mode":"non_ascii_weighted","label":"可灵口径"}},"originalTypes":["video_generate","image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"keling","sourceProviderName":"可灵AI","sourceSpecType":"keling","originalTypes":["video_generate","image_to_video"],"alias":"可灵V3","description":"","iconPath":"https://static.51easyai.com/kling-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"kling-v3","types":["video_generate","image_to_video"],"alias":"可灵V3","icon_path":"https://static.51easyai.com/kling-color.webp","capabilities":{"video_generate":{"aspect_ratio_allowed":["16:9","1:1","9:16"],"output_resolutions":["720p","1080p","2160p"],"duration_range":[3,15],"output_audio":true,"prompt_length_limit":{"max":2500,"count_mode":"non_ascii_weighted","label":"可灵口径"}},"image_to_video":{"output_resolutions":["720p","1080p","2160p"],"duration_range":[3,15],"input_first_frame":true,"input_last_frame":false,"input_first_last_frame":true,"aspect_ratio_allowed":["16:9","1:1","9:16"],"output_audio":true,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"prompt_length_limit":{"max":2500,"count_mode":"non_ascii_weighted","label":"可灵口径"}}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'keling' OR provider_code = 'keling' LIMIT 1), 'keling', 'keling:kling-v3-omni', 'kling-v3-omni', 'omni_video', '可灵V3多模态', '{"omni_video":{"supported_modes":["text_to_video","image_reference","element_reference","first_last_frame","video_reference","video_edit","multi_shot"],"output_resolutions":["720p","1080p","2160p"],"aspect_ratio_allowed":["16:9","1:1","9:16"],"duration_options":[3,4,5,6,7,8,9,10,11,12,13,14,15],"output_audio":true,"max_videos":1,"max_images":7,"max_elements":7,"max_images_and_elements":7,"limits_with_video":{"max_images_and_elements":4,"duration_options":[3,4,5,6,7,8,9,10]},"max_images_for_last_frame":2,"support_instruction_edit":true,"prompt_length_limit":{"max":2500,"count_mode":"non_ascii_weighted","label":"可灵口径"}},"originalTypes":["omni_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"keling","sourceProviderName":"可灵AI","sourceSpecType":"keling","originalTypes":["omni_video"],"alias":"可灵V3多模态","description":"","iconPath":"https://static.51easyai.com/kling-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"kling-v3-omni","types":["omni_video"],"alias":"可灵V3多模态","icon_path":"https://static.51easyai.com/kling-color.webp","capabilities":{"omni_video":{"supported_modes":["text_to_video","image_reference","element_reference","first_last_frame","video_reference","video_edit","multi_shot"],"output_resolutions":["720p","1080p","2160p"],"aspect_ratio_allowed":["16:9","1:1","9:16"],"duration_options":[3,4,5,6,7,8,9,10,11,12,13,14,15],"output_audio":true,"max_videos":1,"max_images":7,"max_elements":7,"max_images_and_elements":7,"limits_with_video":{"max_images_and_elements":4,"duration_options":[3,4,5,6,7,8,9,10]},"max_images_for_last_frame":2,"support_instruction_edit":true,"prompt_length_limit":{"max":2500,"count_mode":"non_ascii_weighted","label":"可灵口径"}}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'keling' OR provider_code = 'keling' LIMIT 1), 'keling', 'keling:kling-video-o1', 'kling-video-o1', 'omni_video', '可灵O1', '{"omni_video":{"supported_modes":["text_to_video","image_reference","element_reference","first_last_frame","video_reference","video_edit"],"output_resolutions":["720p","1080p"],"aspect_ratio_allowed":["16:9","1:1","9:16"],"duration_options":[3,4,5,6,7,8,9,10],"output_audio":true,"max_videos":1,"max_images":7,"max_elements":7,"prompt_length_limit":{"max":2500,"count_mode":"non_ascii_weighted","label":"可灵口径"},"max_images_and_elements":7,"limits_with_video":{"max_images_and_elements":4},"max_images_for_last_frame":2,"support_instruction_edit":true},"originalTypes":["omni_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"keling","sourceProviderName":"可灵AI","sourceSpecType":"keling","originalTypes":["omni_video"],"alias":"可灵O1","description":"","iconPath":"https://static.51easyai.com/kling-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"kling-video-o1","types":["omni_video"],"alias":"可灵O1","icon_path":"https://static.51easyai.com/kling-color.webp","capabilities":{"omni_video":{"supported_modes":["text_to_video","image_reference","element_reference","first_last_frame","video_reference","video_edit"],"output_resolutions":["720p","1080p"],"aspect_ratio_allowed":["16:9","1:1","9:16"],"duration_options":[3,4,5,6,7,8,9,10],"output_audio":true,"max_videos":1,"max_images":7,"max_elements":7,"prompt_length_limit":{"max":2500,"count_mode":"non_ascii_weighted","label":"可灵口径"},"max_images_and_elements":7,"limits_with_video":{"max_images_and_elements":4},"max_images_for_last_frame":2,"support_instruction_edit":true}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'keling' OR provider_code = 'keling' LIMIT 1), 'keling', 'keling:keling_motion_control', 'keling_motion_control', 'digital_human_generate', '可灵动作控制', '{"originalTypes":["digital_human_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":10}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"keling","sourceProviderName":"可灵AI","sourceSpecType":"keling","originalTypes":["digital_human_generate"],"alias":"可灵动作控制","description":"","iconPath":"https://static.51easyai.com/kling-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"keling_motion_control","types":["digital_human_generate"],"alias":"可灵动作控制","icon_path":"https://static.51easyai.com/kling-color.webp","model_limits":{"max_concurrent_requests":10}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'keling' OR provider_code = 'keling' LIMIT 1), 'keling', 'keling:keling_lip_sync', 'keling_lip_sync', 'digital_human_generate', '可灵对口型', '{"originalTypes":["digital_human_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":10}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"keling","sourceProviderName":"可灵AI","sourceSpecType":"keling","originalTypes":["digital_human_generate"],"alias":"可灵对口型","description":"","iconPath":"https://static.51easyai.com/kling-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"keling_lip_sync","types":["digital_human_generate"],"alias":"可灵对口型","icon_path":"https://static.51easyai.com/kling-color.webp","model_limits":{"max_concurrent_requests":10}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'keling' OR provider_code = 'keling' LIMIT 1), 'keling', 'keling:keling_avatar_image2video', 'keling_avatar_image2video', 'digital_human_generate', '可灵数字人', '{"originalTypes":["digital_human_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":10}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"keling","sourceProviderName":"可灵AI","sourceSpecType":"keling","originalTypes":["digital_human_generate"],"alias":"可灵数字人","description":"","iconPath":"https://static.51easyai.com/kling-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"keling_avatar_image2video","types":["digital_human_generate"],"alias":"可灵数字人","icon_path":"https://static.51easyai.com/kling-color.webp","model_limits":{"max_concurrent_requests":10}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'gemini' OR provider_code = 'gemini' LIMIT 1), 'gemini', 'gemini:gemini-2.0-flash-exp-image-generation', 'gemini-2.0-flash-exp-image-generation', 'image_generate', 'gemini-2.0', '{"image_generate":{"output_multiple_images":false,"aspect_ratio_allowed":[],"output_resolutions":[]},"image_edit":{"output_multiple_images":false,"aspect_ratio_allowed":[],"input_multiple_images":true,"output_resolutions":[]},"originalTypes":["image_generate","image_edit"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"google-gemini","sourceProviderName":"Google Gemini","sourceSpecType":"google-gemini","originalTypes":["image_generate","image_edit"],"alias":"gemini-2.0","description":"","iconPath":"https://static.51easyai.com/gemini-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"gemini-2.0-flash-exp-image-generation","types":["image_generate","image_edit"],"alias":"gemini-2.0","icon_path":"https://static.51easyai.com/gemini-color.png","capabilities":{"image_generate":{"output_multiple_images":false,"aspect_ratio_allowed":[],"output_resolutions":[]},"image_edit":{"output_multiple_images":false,"aspect_ratio_allowed":[],"input_multiple_images":true,"output_resolutions":[]}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'gemini' OR provider_code = 'gemini' LIMIT 1), 'gemini', 'gemini:gemini-2.5-flash-image', 'gemini-2.5-flash-image', 'image_generate', 'Nano Banana', '{"image_generate":{"output_multiple_images":true,"output_max_images_count":4,"output_resolutions":[],"aspect_ratio_allowed":["1:1","16:9","4:3","3:4","9:16","21:9","3:2","2:3"]},"image_edit":{"output_multiple_images":true,"output_max_images_count":4,"input_max_images_count":4,"output_resolutions":[],"aspect_ratio_allowed":["1:1","16:9","4:3","3:4","9:16","21:9","3:2","2:3"],"input_multiple_images":true},"originalTypes":["image_generate","image_edit"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"google-gemini","sourceProviderName":"Google Gemini","sourceSpecType":"google-gemini","originalTypes":["image_generate","image_edit"],"alias":"Nano Banana","description":"","iconPath":"https://static.51easyai.com/gemini-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"gemini-2.5-flash-image","types":["image_generate","image_edit"],"alias":"Nano Banana","icon_path":"https://static.51easyai.com/gemini-color.png","capabilities":{"image_generate":{"output_multiple_images":true,"output_max_images_count":4,"output_resolutions":[],"aspect_ratio_allowed":["1:1","16:9","4:3","3:4","9:16","21:9","3:2","2:3"]},"image_edit":{"output_multiple_images":true,"output_max_images_count":4,"input_max_images_count":4,"output_resolutions":[],"aspect_ratio_allowed":["1:1","16:9","4:3","3:4","9:16","21:9","3:2","2:3"],"input_multiple_images":true}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'gemini' OR provider_code = 'gemini' LIMIT 1), 'gemini', 'gemini:gemini-3-pro-image-preview', 'gemini-3-pro-image-preview', 'image_generate', 'Nano Banana Pro 预览版', '{"image_generate":{"output_multiple_images":true,"output_max_images_count":4,"output_resolutions":["1K","2K","4K"],"aspect_ratio_allowed":["1:1","16:9","4:3","3:4","5:4","4:5","9:16","21:9","3:2","2:3"]},"image_edit":{"output_multiple_images":true,"input_multiple_images":true,"output_resolutions":["1K","2K","4K"],"input_max_images_count":14,"aspect_ratio_allowed":["1:1","16:9","4:3","3:4","5:4","4:5","9:16","21:9","3:2","2:3"]},"originalTypes":["image_generate","image_edit"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"google-gemini","sourceProviderName":"Google Gemini","sourceSpecType":"google-gemini","originalTypes":["image_generate","image_edit"],"alias":"Nano Banana Pro 预览版","description":"","iconPath":"https://static.51easyai.com/gemini-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"gemini-3-pro-image-preview","types":["image_generate","image_edit"],"alias":"Nano Banana Pro 预览版","icon_path":"https://static.51easyai.com/gemini-color.png","capabilities":{"image_generate":{"output_multiple_images":true,"output_max_images_count":4,"output_resolutions":["1K","2K","4K"],"aspect_ratio_allowed":["1:1","16:9","4:3","3:4","5:4","4:5","9:16","21:9","3:2","2:3"]},"image_edit":{"output_multiple_images":true,"input_multiple_images":true,"output_resolutions":["1K","2K","4K"],"input_max_images_count":14,"aspect_ratio_allowed":["1:1","16:9","4:3","3:4","5:4","4:5","9:16","21:9","3:2","2:3"]}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'gemini' OR provider_code = 'gemini' LIMIT 1), 'gemini', 'gemini:gemini-3.1-flash-image-preview', 'gemini-3.1-flash-image-preview', 'image_generate', 'Nano Banana 2', '{"image_generate":{"output_multiple_images":true,"output_max_images_count":4,"output_resolutions":["1K","2K","4K"],"aspect_ratio_allowed":["1:1","16:9","4:3","3:4","5:4","4:5","9:16","21:9","3:2","2:3","1:4","4:1","1:8","8:1"]},"image_edit":{"output_multiple_images":true,"input_multiple_images":true,"output_resolutions":["1K","2K","4K"],"input_max_images_count":14,"aspect_ratio_allowed":["1:1","16:9","4:3","3:4","5:4","4:5","9:16","21:9","3:2","2:3","1:4","4:1","1:8","8:1"]},"originalTypes":["image_generate","image_edit"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"google-gemini","sourceProviderName":"Google Gemini","sourceSpecType":"google-gemini","originalTypes":["image_generate","image_edit"],"alias":"Nano Banana 2","description":"","iconPath":"https://static.51easyai.com/gemini-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"gemini-3.1-flash-image-preview","types":["image_generate","image_edit"],"alias":"Nano Banana 2","icon_path":"https://static.51easyai.com/gemini-color.png","capabilities":{"image_generate":{"output_multiple_images":true,"output_max_images_count":4,"output_resolutions":["1K","2K","4K"],"aspect_ratio_allowed":["1:1","16:9","4:3","3:4","5:4","4:5","9:16","21:9","3:2","2:3","1:4","4:1","1:8","8:1"]},"image_edit":{"output_multiple_images":true,"input_multiple_images":true,"output_resolutions":["1K","2K","4K"],"input_max_images_count":14,"aspect_ratio_allowed":["1:1","16:9","4:3","3:4","5:4","4:5","9:16","21:9","3:2","2:3","1:4","4:1","1:8","8:1"]}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'gemini' OR provider_code = 'gemini' LIMIT 1), 'gemini', 'gemini:gemini-3-pro-preview', 'gemini-3-pro-preview', 'text_generate', 'Gemini-3 Pro 预览版', '{"text_generate":{"supportTool":true,"supportStructuredOutput":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000},"image_analysis":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"video_understanding":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"audio_understanding":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"tools_call":{"supportTool":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000},"omni":{"supportTool":true,"supportStructuredOutput":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000},"originalTypes":["text_generate","image_analysis","video_understanding","audio_understanding","tools_call","omni"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"google-gemini","sourceProviderName":"Google Gemini","sourceSpecType":"google-gemini","originalTypes":["text_generate","image_analysis","video_understanding","audio_understanding","tools_call","omni"],"alias":"Gemini-3 Pro 预览版","description":"","iconPath":"https://static.51easyai.com/gemini-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"gemini-3-pro-preview","types":["text_generate","image_analysis","video_understanding","audio_understanding","tools_call","omni"],"alias":"Gemini-3 Pro 预览版","icon_path":"https://static.51easyai.com/gemini-color.png","capabilities":{"text_generate":{"supportTool":true,"supportStructuredOutput":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000},"image_analysis":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"video_understanding":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"audio_understanding":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"tools_call":{"supportTool":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000},"omni":{"supportTool":true,"supportStructuredOutput":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'gemini' OR provider_code = 'gemini' LIMIT 1), 'gemini', 'gemini:gemini-3-flash-preview', 'gemini-3-flash-preview', 'text_generate', 'Gemini-3 Flash 预览版', '{"text_generate":{"supportTool":true,"supportStructuredOutput":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000},"image_analysis":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"video_understanding":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"audio_understanding":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"tools_call":{"supportTool":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000},"omni":{"supportTool":true,"supportStructuredOutput":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000},"originalTypes":["text_generate","image_analysis","video_understanding","audio_understanding","tools_call","omni"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"google-gemini","sourceProviderName":"Google Gemini","sourceSpecType":"google-gemini","originalTypes":["text_generate","image_analysis","video_understanding","audio_understanding","tools_call","omni"],"alias":"Gemini-3 Flash 预览版","description":"","iconPath":"https://static.51easyai.com/gemini-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"gemini-3-flash-preview","types":["text_generate","image_analysis","video_understanding","audio_understanding","tools_call","omni"],"alias":"Gemini-3 Flash 预览版","icon_path":"https://static.51easyai.com/gemini-color.png","capabilities":{"text_generate":{"supportTool":true,"supportStructuredOutput":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000},"image_analysis":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"video_understanding":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"audio_understanding":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"tools_call":{"supportTool":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000},"omni":{"supportTool":true,"supportStructuredOutput":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'gemini' OR provider_code = 'gemini' LIMIT 1), 'gemini', 'gemini:gemini-3.1-flash-lite-preview', 'gemini-3.1-flash-lite-preview', 'text_generate', 'Gemini-3.1 Flash Lite 预览版', '{"text_generate":{"supportTool":true,"supportStructuredOutput":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000},"image_analysis":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"video_understanding":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"audio_understanding":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"tools_call":{"supportTool":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000},"omni":{"supportTool":true,"supportStructuredOutput":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000},"originalTypes":["text_generate","image_analysis","video_understanding","audio_understanding","tools_call","omni"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"google-gemini","sourceProviderName":"Google Gemini","sourceSpecType":"google-gemini","originalTypes":["text_generate","image_analysis","video_understanding","audio_understanding","tools_call","omni"],"alias":"Gemini-3.1 Flash Lite 预览版","description":"全模态预览模型,知识截点 2025 年 1 月;上下文窗口 100 万输入 / 6.4 万输出 tokens官方定价输入 $0.25/百万 tokens文本、图片、视频、$0.50/百万 tokens音频输出 $1.50/百万 tokens。","iconPath":"https://static.51easyai.com/gemini-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"gemini-3.1-flash-lite-preview","types":["text_generate","image_analysis","video_understanding","audio_understanding","tools_call","omni"],"alias":"Gemini-3.1 Flash Lite 预览版","icon_path":"https://static.51easyai.com/gemini-color.png","description":"全模态预览模型,知识截点 2025 年 1 月;上下文窗口 100 万输入 / 6.4 万输出 tokens官方定价输入 $0.25/百万 tokens文本、图片、视频、$0.50/百万 tokens音频输出 $1.50/百万 tokens。","capabilities":{"text_generate":{"supportTool":true,"supportStructuredOutput":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000},"image_analysis":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"video_understanding":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"audio_understanding":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"tools_call":{"supportTool":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000},"omni":{"supportTool":true,"supportStructuredOutput":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'gemini' OR provider_code = 'gemini' LIMIT 1), 'gemini', 'gemini:gemini-3.1-pro-preview', 'gemini-3.1-pro-preview', 'text_generate', 'Gemini-3.1 Pro 预览版', '{"text_generate":{"supportTool":true,"supportStructuredOutput":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000},"image_analysis":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"video_understanding":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"audio_understanding":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"tools_call":{"supportTool":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000},"omni":{"supportTool":true,"supportStructuredOutput":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000},"originalTypes":["text_generate","image_analysis","video_understanding","audio_understanding","tools_call","omni"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"google-gemini","sourceProviderName":"Google Gemini","sourceSpecType":"google-gemini","originalTypes":["text_generate","image_analysis","video_understanding","audio_understanding","tools_call","omni"],"alias":"Gemini-3.1 Pro 预览版","description":"全模态预览模型,知识截点 2025 年 1 月;上下文窗口 100 万输入 / 6.4 万输出 tokens官方定价<20 万 tokens 输入 $2/百万、输出 $12/百万,>20 万 tokens 输入 $4/百万、输出 $18/百万。","iconPath":"https://static.51easyai.com/gemini-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"gemini-3.1-pro-preview","types":["text_generate","image_analysis","video_understanding","audio_understanding","tools_call","omni"],"alias":"Gemini-3.1 Pro 预览版","icon_path":"https://static.51easyai.com/gemini-color.png","description":"全模态预览模型,知识截点 2025 年 1 月;上下文窗口 100 万输入 / 6.4 万输出 tokens官方定价<20 万 tokens 输入 $2/百万、输出 $12/百万,>20 万 tokens 输入 $4/百万、输出 $18/百万。","capabilities":{"text_generate":{"supportTool":true,"supportStructuredOutput":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000},"image_analysis":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"video_understanding":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"audio_understanding":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"tools_call":{"supportTool":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000},"omni":{"supportTool":true,"supportStructuredOutput":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'gemini' OR provider_code = 'gemini' LIMIT 1), 'gemini', 'gemini:gemini-2.5-flash', 'gemini-2.5-flash', 'text_generate', 'Gemini 2.5 Flash', '{"originalTypes":["text_generate","image_analysis"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"google-gemini","sourceProviderName":"Google Gemini","sourceSpecType":"google-gemini","originalTypes":["text_generate","image_analysis"],"alias":"Gemini 2.5 Flash","description":"","iconPath":"https://static.51easyai.com/gemini-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"gemini-2.5-flash","types":["text_generate","image_analysis"],"icon_path":"https://static.51easyai.com/gemini-color.png","alias":"Gemini 2.5 Flash"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'gemini' OR provider_code = 'gemini' LIMIT 1), 'gemini', 'gemini:gemini-2.5-pro', 'gemini-2.5-pro', 'text_generate', 'Gemini 2.5 Pro', '{"originalTypes":["text_generate","image_analysis"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"google-gemini","sourceProviderName":"Google Gemini","sourceSpecType":"google-gemini","originalTypes":["text_generate","image_analysis"],"alias":"Gemini 2.5 Pro","description":"","iconPath":"https://static.51easyai.com/gemini-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"gemini-2.5-pro","types":["text_generate","image_analysis"],"icon_path":"https://static.51easyai.com/gemini-color.png","alias":"Gemini 2.5 Pro"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'openai' OR provider_code = 'openai' LIMIT 1), 'openai', 'openai:gpt-image-1', 'gpt-image-1', 'image_generate', 'gpt-image-1', '{"image_generate":{"aspect_ratio_allowed":["21:9","16:9","4:3","3:2","1:1","2:3","3:4","9:16","9:21"]},"image_edit":{"aspect_ratio_allowed":["21:9","16:9","4:3","3:2","1:1","2:3","3:4","9:16","9:21"],"input_multiple_images":true},"originalTypes":["image_generate","image_edit"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"openai","sourceProviderName":"OpenAI","sourceSpecType":"openai","originalTypes":["image_generate","image_edit"],"alias":"gpt-image-1","description":"","iconPath":"","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"gpt-image-1","types":["image_generate","image_edit"],"alias":"gpt-image-1","capabilities":{"image_generate":{"aspect_ratio_allowed":["21:9","16:9","4:3","3:2","1:1","2:3","3:4","9:16","9:21"]},"image_edit":{"aspect_ratio_allowed":["21:9","16:9","4:3","3:2","1:1","2:3","3:4","9:16","9:21"],"input_multiple_images":true}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'openai' OR provider_code = 'openai' LIMIT 1), 'openai', 'openai:gpt-image-1.5', 'gpt-image-1.5', 'image_generate', 'gpt-image-1.5', '{"image_generate":{"aspect_ratio_allowed":["21:9","16:9","4:3","3:2","1:1","2:3","3:4","9:16","9:21"]},"image_edit":{"aspect_ratio_allowed":["21:9","16:9","4:3","3:2","1:1","2:3","3:4","9:16","9:21"],"input_multiple_images":true},"originalTypes":["image_generate","image_edit"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"openai","sourceProviderName":"OpenAI","sourceSpecType":"openai","originalTypes":["image_generate","image_edit"],"alias":"gpt-image-1.5","description":"","iconPath":"","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"gpt-image-1.5","types":["image_generate","image_edit"],"alias":"gpt-image-1.5","capabilities":{"image_generate":{"aspect_ratio_allowed":["21:9","16:9","4:3","3:2","1:1","2:3","3:4","9:16","9:21"]},"image_edit":{"aspect_ratio_allowed":["21:9","16:9","4:3","3:2","1:1","2:3","3:4","9:16","9:21"],"input_multiple_images":true}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'openai' OR provider_code = 'openai' LIMIT 1), 'openai', 'openai:gpt-image-2', 'gpt-image-2', 'image_generate', 'gpt-image-2', '{"image_generate":{"aspect_ratio_allowed":["21:9","16:9","4:3","3:2","1:1","2:3","3:4","9:16","9:21"],"aspect_ratio_range":[0.3333333333333333,3],"output_size_range":[655360,8294400],"width_height_range":[1,3840],"width_height_multiple":16},"image_edit":{"aspect_ratio_allowed":["21:9","16:9","4:3","3:2","1:1","2:3","3:4","9:16","9:21"],"aspect_ratio_range":[0.3333333333333333,3],"output_size_range":[655360,8294400],"width_height_range":[1,3840],"width_height_multiple":16,"input_multiple_images":true},"originalTypes":["image_generate","image_edit"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"openai","sourceProviderName":"OpenAI","sourceSpecType":"openai","originalTypes":["image_generate","image_edit"],"alias":"gpt-image-2","description":"","iconPath":"","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"gpt-image-2","types":["image_generate","image_edit"],"alias":"gpt-image-2","capabilities":{"image_generate":{"aspect_ratio_allowed":["21:9","16:9","4:3","3:2","1:1","2:3","3:4","9:16","9:21"],"aspect_ratio_range":[0.3333333333333333,3],"output_size_range":[655360,8294400],"width_height_range":[1,3840],"width_height_multiple":16},"image_edit":{"aspect_ratio_allowed":["21:9","16:9","4:3","3:2","1:1","2:3","3:4","9:16","9:21"],"aspect_ratio_range":[0.3333333333333333,3],"output_size_range":[655360,8294400],"width_height_range":[1,3840],"width_height_multiple":16,"input_multiple_images":true}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'openai' OR provider_code = 'openai' LIMIT 1), 'openai', 'openai:gpt-4o', 'gpt-4o', 'text_generate', 'gpt-4o', '{"originalTypes":["text_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"openai","sourceProviderName":"OpenAI","sourceSpecType":"openai","originalTypes":["text_generate"],"alias":"","description":"","iconPath":"","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"gpt-4o","types":["text_generate"]}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'aliyun-bailian-openai' OR provider_code = 'aliyun-bailian-openai' LIMIT 1), 'aliyun-bailian-openai', 'aliyun-bailian-openai:text-embedding-v4', 'text-embedding-v4', 'text_embedding', 'Qwen3-Embedding-v4', '{"text_embedding":{"dimensions":[2048,1536,1024,768,512,256,128,64]},"originalTypes":["text_embedding"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_request_per_second":10}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"aliyun-bailian-openai","sourceProviderName":"阿里云百炼(OpenAI兼容","sourceSpecType":"openai","originalTypes":["text_embedding"],"alias":"Qwen3-Embedding-v4","description":"Qwen3-Embedding 系列,默认维度 1024最长输入 8192 tokens支持 100+ 语种与多种编程语言。","iconPath":"https://static.51easyai.com/qwen-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"text-embedding-v4","types":["text_embedding"],"icon_path":"https://static.51easyai.com/qwen-color.webp","alias":"Qwen3-Embedding-v4","model_limits":{"max_request_per_second":10},"capabilities":{"text_embedding":{"dimensions":[2048,1536,1024,768,512,256,128,64]}},"description":"Qwen3-Embedding 系列,默认维度 1024最长输入 8192 tokens支持 100+ 语种与多种编程语言。"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'aliyun-bailian-openai' OR provider_code = 'aliyun-bailian-openai' LIMIT 1), 'aliyun-bailian-openai', 'aliyun-bailian-openai:text-embedding-v3', 'text-embedding-v3', 'text_embedding', 'Qwen3-Embedding-v3', '{"text_embedding":{"dimensions":[1024,768,512,256,128,64]},"originalTypes":["text_embedding"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"aliyun-bailian-openai","sourceProviderName":"阿里云百炼(OpenAI兼容","sourceSpecType":"openai","originalTypes":["text_embedding"],"alias":"Qwen3-Embedding-v3","description":"Qwen3-Embedding 系列,默认维度 1024支持中文、英文及 50+ 主流语种。","iconPath":"https://static.51easyai.com/qwen-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"text-embedding-v3","types":["text_embedding"],"icon_path":"https://static.51easyai.com/qwen-color.webp","alias":"Qwen3-Embedding-v3","capabilities":{"text_embedding":{"dimensions":[1024,768,512,256,128,64]}},"description":"Qwen3-Embedding 系列,默认维度 1024支持中文、英文及 50+ 主流语种。"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'aliyun-bailian-openai' OR provider_code = 'aliyun-bailian-openai' LIMIT 1), 'aliyun-bailian-openai', 'aliyun-bailian-openai:text-embedding-v2', 'text-embedding-v2', 'text_embedding', 'Text-Embedding-v2', '{"text_embedding":{"dimensions":[1536]},"originalTypes":["text_embedding"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_request_per_second":25}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"aliyun-bailian-openai","sourceProviderName":"阿里云百炼(OpenAI兼容","sourceSpecType":"openai","originalTypes":["text_embedding"],"alias":"Text-Embedding-v2","description":"固定维度 1536最长输入 2048 tokens支持中英西法葡印尼日韩德俄等语种。","iconPath":"https://static.51easyai.com/qwen-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"text-embedding-v2","types":["text_embedding"],"icon_path":"https://static.51easyai.com/qwen-color.webp","alias":"Text-Embedding-v2","model_limits":{"max_request_per_second":25},"capabilities":{"text_embedding":{"dimensions":[1536]}},"description":"固定维度 1536最长输入 2048 tokens支持中英西法葡印尼日韩德俄等语种。"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'aliyun-bailian-openai' OR provider_code = 'aliyun-bailian-openai' LIMIT 1), 'aliyun-bailian-openai', 'aliyun-bailian-openai:text-embedding-v1', 'text-embedding-v1', 'text_embedding', 'Text-Embedding-v1', '{"originalTypes":["text_embedding"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"aliyun-bailian-openai","sourceProviderName":"阿里云百炼(OpenAI兼容","sourceSpecType":"openai","originalTypes":["text_embedding"],"alias":"Text-Embedding-v1","description":"百炼 OpenAI 兼容渠道 embedding 基础模型。","iconPath":"https://static.51easyai.com/qwen-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"text-embedding-v1","types":["text_embedding"],"icon_path":"https://static.51easyai.com/qwen-color.webp","alias":"Text-Embedding-v1","description":"百炼 OpenAI 兼容渠道 embedding 基础模型。"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'aliyun-bailian-openai' OR provider_code = 'aliyun-bailian-openai' LIMIT 1), 'aliyun-bailian-openai', 'aliyun-bailian-openai:qwen-turbo', 'qwen-turbo', 'text_generate', 'qwen-turbo', '{"originalTypes":["text_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"aliyun-bailian-openai","sourceProviderName":"阿里云百炼(OpenAI兼容","sourceSpecType":"openai","originalTypes":["text_generate"],"alias":"","description":"","iconPath":"https://static.51easyai.com/qwen-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"qwen-turbo","types":["text_generate"],"icon_path":"https://static.51easyai.com/qwen-color.webp"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'aliyun-bailian-openai' OR provider_code = 'aliyun-bailian-openai' LIMIT 1), 'aliyun-bailian-openai', 'aliyun-bailian-openai:qwen3-235b-a22b', 'qwen3-235b-a22b', 'text_generate', 'qwen3-235b-a22b', '{"originalTypes":["text_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"aliyun-bailian-openai","sourceProviderName":"阿里云百炼(OpenAI兼容","sourceSpecType":"openai","originalTypes":["text_generate"],"alias":"","description":"","iconPath":"https://static.51easyai.com/qwen-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"qwen3-235b-a22b","types":["text_generate"],"icon_path":"https://static.51easyai.com/qwen-color.webp"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'aliyun-bailian-openai' OR provider_code = 'aliyun-bailian-openai' LIMIT 1), 'aliyun-bailian-openai', 'aliyun-bailian-openai:qwen-max', 'qwen-max', 'text_generate', 'qwen-max', '{"originalTypes":["text_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"aliyun-bailian-openai","sourceProviderName":"阿里云百炼(OpenAI兼容","sourceSpecType":"openai","originalTypes":["text_generate"],"alias":"","description":"","iconPath":"https://static.51easyai.com/qwen-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"qwen-max","types":["text_generate"],"icon_path":"https://static.51easyai.com/qwen-color.webp"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'aliyun-bailian-openai' OR provider_code = 'aliyun-bailian-openai' LIMIT 1), 'aliyun-bailian-openai', 'aliyun-bailian-openai:qwen-plus', 'qwen-plus', 'text_generate', 'qwen-plus', '{"originalTypes":["text_generate","tools_call"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"aliyun-bailian-openai","sourceProviderName":"阿里云百炼(OpenAI兼容","sourceSpecType":"openai","originalTypes":["text_generate","tools_call"],"alias":"","description":"","iconPath":"https://static.51easyai.com/qwen-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"qwen-plus","types":["text_generate","tools_call"],"icon_path":"https://static.51easyai.com/qwen-color.webp"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'aliyun-bailian-openai' OR provider_code = 'aliyun-bailian-openai' LIMIT 1), 'aliyun-bailian-openai', 'aliyun-bailian-openai:qwen-max:2', 'qwen-max', 'text_generate', 'qwen-max', '{"originalTypes":["text_generate","tools_call"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"aliyun-bailian-openai","sourceProviderName":"阿里云百炼(OpenAI兼容","sourceSpecType":"openai","originalTypes":["text_generate","tools_call"],"alias":"","description":"","iconPath":"https://static.51easyai.com/qwen-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"qwen-max","types":["text_generate","tools_call"],"icon_path":"https://static.51easyai.com/qwen-color.webp"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'aliyun-bailian-openai' OR provider_code = 'aliyun-bailian-openai' LIMIT 1), 'aliyun-bailian-openai', 'aliyun-bailian-openai:qwen3-max', 'qwen3-max', 'text_generate', 'qwen3-max', '{"originalTypes":["text_generate","tools_call"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"aliyun-bailian-openai","sourceProviderName":"阿里云百炼(OpenAI兼容","sourceSpecType":"openai","originalTypes":["text_generate","tools_call"],"alias":"","description":"","iconPath":"https://static.51easyai.com/qwen-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"qwen3-max","types":["text_generate","tools_call"],"icon_path":"https://static.51easyai.com/qwen-color.webp"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'aliyun-bailian-openai' OR provider_code = 'aliyun-bailian-openai' LIMIT 1), 'aliyun-bailian-openai', 'aliyun-bailian-openai:qwen-vl-plus', 'qwen-vl-plus', 'image_analysis', 'qwen-vl-plus', '{"originalTypes":["image_analysis"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"aliyun-bailian-openai","sourceProviderName":"阿里云百炼(OpenAI兼容","sourceSpecType":"openai","originalTypes":["image_analysis"],"alias":"","description":"","iconPath":"https://static.51easyai.com/qwen-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"qwen-vl-plus","types":["image_analysis"],"icon_path":"https://static.51easyai.com/qwen-color.webp"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'aliyun-bailian-openai' OR provider_code = 'aliyun-bailian-openai' LIMIT 1), 'aliyun-bailian-openai', 'aliyun-bailian-openai:qwen-vl-max', 'qwen-vl-max', 'image_analysis', 'qwen-vl-max', '{"originalTypes":["image_analysis"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"aliyun-bailian-openai","sourceProviderName":"阿里云百炼(OpenAI兼容","sourceSpecType":"openai","originalTypes":["image_analysis"],"alias":"","description":"","iconPath":"https://static.51easyai.com/qwen-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"qwen-vl-max","types":["image_analysis"],"icon_path":"https://static.51easyai.com/qwen-color.webp"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'aliyun-bailian-openai' OR provider_code = 'aliyun-bailian-openai' LIMIT 1), 'aliyun-bailian-openai', 'aliyun-bailian-openai:qwen3.5-plus', 'qwen3.5-plus', 'text_generate', 'Qwen3.5-Plus', '{"originalTypes":["text_generate","image_analysis","video_understanding","tools_call"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"aliyun-bailian-openai","sourceProviderName":"阿里云百炼(OpenAI兼容","sourceSpecType":"openai","originalTypes":["text_generate","image_analysis","video_understanding","tools_call"],"alias":"Qwen3.5-Plus","description":"千问性能最强的视觉理解模型,推荐优先使用","iconPath":"https://static.51easyai.com/qwen-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"qwen3.5-plus","types":["text_generate","image_analysis","video_understanding","tools_call"],"icon_path":"https://static.51easyai.com/qwen-color.webp","alias":"Qwen3.5-Plus","description":"千问性能最强的视觉理解模型,推荐优先使用"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'aliyun-bailian-openai' OR provider_code = 'aliyun-bailian-openai' LIMIT 1), 'aliyun-bailian-openai', 'aliyun-bailian-openai:qwen3.5-flash', 'qwen3.5-flash', 'text_generate', 'Qwen3.5-Flash', '{"originalTypes":["text_generate","image_analysis","video_understanding","tools_call"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"aliyun-bailian-openai","sourceProviderName":"阿里云百炼(OpenAI兼容","sourceSpecType":"openai","originalTypes":["text_generate","image_analysis","video_understanding","tools_call"],"alias":"Qwen3.5-Flash","description":"速度更快,成本更低,兼顾性能与成本的高性价比选择","iconPath":"https://static.51easyai.com/qwen-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"qwen3.5-flash","types":["text_generate","image_analysis","video_understanding","tools_call"],"icon_path":"https://static.51easyai.com/qwen-color.webp","alias":"Qwen3.5-Flash","description":"速度更快,成本更低,兼顾性能与成本的高性价比选择"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'aliyun-bailian-openai' OR provider_code = 'aliyun-bailian-openai' LIMIT 1), 'aliyun-bailian-openai', 'aliyun-bailian-openai:qwen3.5-omni-plus', 'qwen3.5-omni-plus', 'text_generate', 'Qwen3.5-Omni-Plus', '{"text_generate":{"max_context_tokens":262144,"max_input_tokens":196608,"max_output_tokens":65536},"image_analysis":{"max_context_tokens":262144,"max_input_tokens":196608,"max_output_tokens":65536},"video_understanding":{"max_context_tokens":262144,"max_input_tokens":196608,"max_output_tokens":65536},"audio_understanding":{"max_context_tokens":262144,"max_input_tokens":196608,"max_output_tokens":65536},"tools_call":{"supportTool":true,"max_context_tokens":262144,"max_input_tokens":196608,"max_output_tokens":65536},"omni":{"supportTool":true,"max_context_tokens":262144,"max_input_tokens":196608,"max_output_tokens":65536},"originalTypes":["text_generate","image_analysis","video_understanding","audio_understanding","tools_call","omni"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"aliyun-bailian-openai","sourceProviderName":"阿里云百炼(OpenAI兼容","sourceSpecType":"openai","originalTypes":["text_generate","image_analysis","video_understanding","audio_understanding","tools_call","omni"],"alias":"Qwen3.5-Omni-Plus","description":"Qwen3.5 全模态稳定版,非思考模式,当前与 qwen3.5-omni-plus-2026-03-15 能力相同。","iconPath":"https://static.51easyai.com/qwen-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"qwen3.5-omni-plus","types":["text_generate","image_analysis","video_understanding","audio_understanding","tools_call","omni"],"icon_path":"https://static.51easyai.com/qwen-color.webp","alias":"Qwen3.5-Omni-Plus","description":"Qwen3.5 全模态稳定版,非思考模式,当前与 qwen3.5-omni-plus-2026-03-15 能力相同。","capabilities":{"text_generate":{"max_context_tokens":262144,"max_input_tokens":196608,"max_output_tokens":65536},"image_analysis":{"max_context_tokens":262144,"max_input_tokens":196608,"max_output_tokens":65536},"video_understanding":{"max_context_tokens":262144,"max_input_tokens":196608,"max_output_tokens":65536},"audio_understanding":{"max_context_tokens":262144,"max_input_tokens":196608,"max_output_tokens":65536},"tools_call":{"supportTool":true,"max_context_tokens":262144,"max_input_tokens":196608,"max_output_tokens":65536},"omni":{"supportTool":true,"max_context_tokens":262144,"max_input_tokens":196608,"max_output_tokens":65536}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'aliyun-bailian-openai' OR provider_code = 'aliyun-bailian-openai' LIMIT 1), 'aliyun-bailian-openai', 'aliyun-bailian-openai:qwen3.5-omni-flash', 'qwen3.5-omni-flash', 'text_generate', 'Qwen3.5-Omni-Flash', '{"text_generate":{"max_context_tokens":262144,"max_input_tokens":196608,"max_output_tokens":65536},"image_analysis":{"max_context_tokens":262144,"max_input_tokens":196608,"max_output_tokens":65536},"video_understanding":{"max_context_tokens":262144,"max_input_tokens":196608,"max_output_tokens":65536},"audio_understanding":{"max_context_tokens":262144,"max_input_tokens":196608,"max_output_tokens":65536},"tools_call":{"supportTool":true,"max_context_tokens":262144,"max_input_tokens":196608,"max_output_tokens":65536},"omni":{"supportTool":true,"max_context_tokens":262144,"max_input_tokens":196608,"max_output_tokens":65536},"originalTypes":["text_generate","image_analysis","video_understanding","audio_understanding","tools_call","omni"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"aliyun-bailian-openai","sourceProviderName":"阿里云百炼(OpenAI兼容","sourceSpecType":"openai","originalTypes":["text_generate","image_analysis","video_understanding","audio_understanding","tools_call","omni"],"alias":"Qwen3.5-Omni-Flash","description":"Qwen3.5 全模态稳定版,非思考模式,当前与 qwen3.5-omni-flash-2026-03-15 能力相同。","iconPath":"https://static.51easyai.com/qwen-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"qwen3.5-omni-flash","types":["text_generate","image_analysis","video_understanding","audio_understanding","tools_call","omni"],"icon_path":"https://static.51easyai.com/qwen-color.webp","alias":"Qwen3.5-Omni-Flash","description":"Qwen3.5 全模态稳定版,非思考模式,当前与 qwen3.5-omni-flash-2026-03-15 能力相同。","capabilities":{"text_generate":{"max_context_tokens":262144,"max_input_tokens":196608,"max_output_tokens":65536},"image_analysis":{"max_context_tokens":262144,"max_input_tokens":196608,"max_output_tokens":65536},"video_understanding":{"max_context_tokens":262144,"max_input_tokens":196608,"max_output_tokens":65536},"audio_understanding":{"max_context_tokens":262144,"max_input_tokens":196608,"max_output_tokens":65536},"tools_call":{"supportTool":true,"max_context_tokens":262144,"max_input_tokens":196608,"max_output_tokens":65536},"omni":{"supportTool":true,"max_context_tokens":262144,"max_input_tokens":196608,"max_output_tokens":65536}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'aliyun-bailian-openai' OR provider_code = 'aliyun-bailian-openai' LIMIT 1), 'aliyun-bailian-openai', 'aliyun-bailian-openai:qwen3.5-397b-a17b', 'qwen3.5-397b-a17b', 'text_generate', 'Qwen3.5-397B-A17B', '{"originalTypes":["text_generate","image_analysis","video_understanding","tools_call"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"aliyun-bailian-openai","sourceProviderName":"阿里云百炼(OpenAI兼容","sourceSpecType":"openai","originalTypes":["text_generate","image_analysis","video_understanding","tools_call"],"alias":"Qwen3.5-397B-A17B","description":"Qwen3.5 开源系列模型","iconPath":"https://static.51easyai.com/qwen-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"qwen3.5-397b-a17b","types":["text_generate","image_analysis","video_understanding","tools_call"],"icon_path":"https://static.51easyai.com/qwen-color.webp","alias":"Qwen3.5-397B-A17B","description":"Qwen3.5 开源系列模型"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'aliyun-bailian-openai' OR provider_code = 'aliyun-bailian-openai' LIMIT 1), 'aliyun-bailian-openai', 'aliyun-bailian-openai:qwen3.5-122b-a10b', 'qwen3.5-122b-a10b', 'text_generate', 'Qwen3.5-122B-A10B', '{"originalTypes":["text_generate","image_analysis","video_understanding","tools_call"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"aliyun-bailian-openai","sourceProviderName":"阿里云百炼(OpenAI兼容","sourceSpecType":"openai","originalTypes":["text_generate","image_analysis","video_understanding","tools_call"],"alias":"Qwen3.5-122B-A10B","description":"Qwen3.5 开源系列模型","iconPath":"https://static.51easyai.com/qwen-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"qwen3.5-122b-a10b","types":["text_generate","image_analysis","video_understanding","tools_call"],"icon_path":"https://static.51easyai.com/qwen-color.webp","alias":"Qwen3.5-122B-A10B","description":"Qwen3.5 开源系列模型"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'aliyun-bailian-openai' OR provider_code = 'aliyun-bailian-openai' LIMIT 1), 'aliyun-bailian-openai', 'aliyun-bailian-openai:qwen3.5-27b', 'qwen3.5-27b', 'text_generate', 'Qwen3.5-27B', '{"originalTypes":["text_generate","image_analysis","video_understanding","tools_call"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"aliyun-bailian-openai","sourceProviderName":"阿里云百炼(OpenAI兼容","sourceSpecType":"openai","originalTypes":["text_generate","image_analysis","video_understanding","tools_call"],"alias":"Qwen3.5-27B","description":"Qwen3.5 开源系列模型","iconPath":"https://static.51easyai.com/qwen-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"qwen3.5-27b","types":["text_generate","image_analysis","video_understanding","tools_call"],"icon_path":"https://static.51easyai.com/qwen-color.webp","alias":"Qwen3.5-27B","description":"Qwen3.5 开源系列模型"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'aliyun-bailian-openai' OR provider_code = 'aliyun-bailian-openai' LIMIT 1), 'aliyun-bailian-openai', 'aliyun-bailian-openai:qwen3.5-35b-a3b', 'qwen3.5-35b-a3b', 'text_generate', 'Qwen3.5-35B-A3B', '{"originalTypes":["text_generate","image_analysis","video_understanding","tools_call"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"aliyun-bailian-openai","sourceProviderName":"阿里云百炼(OpenAI兼容","sourceSpecType":"openai","originalTypes":["text_generate","image_analysis","video_understanding","tools_call"],"alias":"Qwen3.5-35B-A3B","description":"Qwen3.5 开源系列模型","iconPath":"https://static.51easyai.com/qwen-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"qwen3.5-35b-a3b","types":["text_generate","image_analysis","video_understanding","tools_call"],"icon_path":"https://static.51easyai.com/qwen-color.webp","alias":"Qwen3.5-35B-A3B","description":"Qwen3.5 开源系列模型"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'aliyun-bailian-openai' OR provider_code = 'aliyun-bailian-openai' LIMIT 1), 'aliyun-bailian-openai', 'aliyun-bailian-openai:qwen3.6-plus', 'qwen3.6-plus', 'text_generate', 'Qwen3.6-Plus', '{"originalTypes":["text_generate","tools_call"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"aliyun-bailian-openai","sourceProviderName":"阿里云百炼(OpenAI兼容","sourceSpecType":"openai","originalTypes":["text_generate","tools_call"],"alias":"Qwen3.6-Plus","description":"Qwen3.6 文本模型","iconPath":"https://static.51easyai.com/qwen-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"qwen3.6-plus","types":["text_generate","tools_call"],"icon_path":"https://static.51easyai.com/qwen-color.webp","alias":"Qwen3.6-Plus","description":"Qwen3.6 文本模型"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'aliyun-bailian-openai' OR provider_code = 'aliyun-bailian-openai' LIMIT 1), 'aliyun-bailian-openai', 'aliyun-bailian-openai:deepseek-v4-pro', 'deepseek-v4-pro', 'text_generate', 'DeepSeek-V4-Pro', '{"text_generate":{"max_context_tokens":1000000,"supportTool":true,"supportStructuredOutput":false,"supportThinking":true,"supportThinkingModeSwitch":true,"supportWebSearch":true},"tools_call":{"max_context_tokens":1000000,"supportTool":true,"supportStructuredOutput":false,"supportThinking":true,"supportThinkingModeSwitch":true,"supportWebSearch":true},"originalTypes":["text_generate","tools_call"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"aliyun-bailian-openai","sourceProviderName":"阿里云百炼(OpenAI兼容","sourceSpecType":"openai","originalTypes":["text_generate","tools_call"],"alias":"DeepSeek-V4-Pro","description":"DeepSeek V4 Pro 文本模型,支持工具调用,最大上下文 100 万 tokens。","iconPath":"https://static.51easyai.com/deepseek-color%20%281%29.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"deepseek-v4-pro","types":["text_generate","tools_call"],"icon_path":"https://static.51easyai.com/deepseek-color%20%281%29.webp","alias":"DeepSeek-V4-Pro","description":"DeepSeek V4 Pro 文本模型,支持工具调用,最大上下文 100 万 tokens。","capabilities":{"text_generate":{"max_context_tokens":1000000,"supportTool":true,"supportStructuredOutput":false,"supportThinking":true,"supportThinkingModeSwitch":true,"supportWebSearch":true},"tools_call":{"max_context_tokens":1000000,"supportTool":true,"supportStructuredOutput":false,"supportThinking":true,"supportThinkingModeSwitch":true,"supportWebSearch":true}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'aliyun-bailian-openai' OR provider_code = 'aliyun-bailian-openai' LIMIT 1), 'aliyun-bailian-openai', 'aliyun-bailian-openai:deepseek-v4-flash', 'deepseek-v4-flash', 'text_generate', 'DeepSeek-V4-Flash', '{"text_generate":{"max_context_tokens":1000000,"supportTool":true,"supportStructuredOutput":false,"supportThinking":true,"supportThinkingModeSwitch":true,"supportWebSearch":true},"tools_call":{"max_context_tokens":1000000,"supportTool":true,"supportStructuredOutput":false,"supportThinking":true,"supportThinkingModeSwitch":true,"supportWebSearch":true},"originalTypes":["text_generate","tools_call"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"aliyun-bailian-openai","sourceProviderName":"阿里云百炼(OpenAI兼容","sourceSpecType":"openai","originalTypes":["text_generate","tools_call"],"alias":"DeepSeek-V4-Flash","description":"DeepSeek V4 Flash 文本模型,支持工具调用,最大上下文 100 万 tokens。","iconPath":"https://static.51easyai.com/deepseek-color%20%281%29.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"deepseek-v4-flash","types":["text_generate","tools_call"],"icon_path":"https://static.51easyai.com/deepseek-color%20%281%29.webp","alias":"DeepSeek-V4-Flash","description":"DeepSeek V4 Flash 文本模型,支持工具调用,最大上下文 100 万 tokens。","capabilities":{"text_generate":{"max_context_tokens":1000000,"supportTool":true,"supportStructuredOutput":false,"supportThinking":true,"supportThinkingModeSwitch":true,"supportWebSearch":true},"tools_call":{"max_context_tokens":1000000,"supportTool":true,"supportStructuredOutput":false,"supportThinking":true,"supportThinkingModeSwitch":true,"supportWebSearch":true}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'gemini-openai' OR provider_code = 'gemini-openai' LIMIT 1), 'gemini-openai', 'gemini-openai:gemini-3-pro-preview', 'gemini-3-pro-preview', 'text_generate', 'Gemini-3 Pro 预览版', '{"text_generate":{"supportTool":true,"supportStructuredOutput":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000},"image_analysis":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"video_understanding":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"audio_understanding":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"tools_call":{"supportTool":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000},"omni":{"supportTool":true,"supportStructuredOutput":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000},"originalTypes":["text_generate","image_analysis","video_understanding","audio_understanding","tools_call","omni"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"gemini-openai","sourceProviderName":"Gemini OpenAI兼容","sourceSpecType":"openai","originalTypes":["text_generate","image_analysis","video_understanding","audio_understanding","tools_call","omni"],"alias":"Gemini-3 Pro 预览版","description":"","iconPath":"https://static.51easyai.com/gemini-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"gemini-3-pro-preview","types":["text_generate","image_analysis","video_understanding","audio_understanding","tools_call","omni"],"alias":"Gemini-3 Pro 预览版","icon_path":"https://static.51easyai.com/gemini-color.png","capabilities":{"text_generate":{"supportTool":true,"supportStructuredOutput":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000},"image_analysis":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"video_understanding":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"audio_understanding":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"tools_call":{"supportTool":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000},"omni":{"supportTool":true,"supportStructuredOutput":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'gemini-openai' OR provider_code = 'gemini-openai' LIMIT 1), 'gemini-openai', 'gemini-openai:gemini-3-flash-preview', 'gemini-3-flash-preview', 'text_generate', 'Gemini-3 Flash 预览版', '{"text_generate":{"supportTool":true,"supportStructuredOutput":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000},"image_analysis":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"video_understanding":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"audio_understanding":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"tools_call":{"supportTool":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000},"omni":{"supportTool":true,"supportStructuredOutput":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000},"originalTypes":["text_generate","image_analysis","video_understanding","audio_understanding","tools_call","omni"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"gemini-openai","sourceProviderName":"Gemini OpenAI兼容","sourceSpecType":"openai","originalTypes":["text_generate","image_analysis","video_understanding","audio_understanding","tools_call","omni"],"alias":"Gemini-3 Flash 预览版","description":"","iconPath":"https://static.51easyai.com/gemini-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"gemini-3-flash-preview","types":["text_generate","image_analysis","video_understanding","audio_understanding","tools_call","omni"],"alias":"Gemini-3 Flash 预览版","icon_path":"https://static.51easyai.com/gemini-color.png","capabilities":{"text_generate":{"supportTool":true,"supportStructuredOutput":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000},"image_analysis":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"video_understanding":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"audio_understanding":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"tools_call":{"supportTool":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000},"omni":{"supportTool":true,"supportStructuredOutput":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'gemini-openai' OR provider_code = 'gemini-openai' LIMIT 1), 'gemini-openai', 'gemini-openai:gemini-3.1-flash-lite-preview', 'gemini-3.1-flash-lite-preview', 'text_generate', 'Gemini-3.1 Flash Lite 预览版', '{"text_generate":{"supportTool":true,"supportStructuredOutput":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000},"image_analysis":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"video_understanding":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"audio_understanding":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"tools_call":{"supportTool":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000},"omni":{"supportTool":true,"supportStructuredOutput":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000},"originalTypes":["text_generate","image_analysis","video_understanding","audio_understanding","tools_call","omni"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"gemini-openai","sourceProviderName":"Gemini OpenAI兼容","sourceSpecType":"openai","originalTypes":["text_generate","image_analysis","video_understanding","audio_understanding","tools_call","omni"],"alias":"Gemini-3.1 Flash Lite 预览版","description":"全模态预览模型,知识截点 2025 年 1 月;上下文窗口 100 万输入 / 6.4 万输出 tokens官方定价输入 $0.25/百万 tokens文本、图片、视频、$0.50/百万 tokens音频输出 $1.50/百万 tokens。","iconPath":"https://static.51easyai.com/gemini-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"gemini-3.1-flash-lite-preview","types":["text_generate","image_analysis","video_understanding","audio_understanding","tools_call","omni"],"alias":"Gemini-3.1 Flash Lite 预览版","icon_path":"https://static.51easyai.com/gemini-color.png","description":"全模态预览模型,知识截点 2025 年 1 月;上下文窗口 100 万输入 / 6.4 万输出 tokens官方定价输入 $0.25/百万 tokens文本、图片、视频、$0.50/百万 tokens音频输出 $1.50/百万 tokens。","capabilities":{"text_generate":{"supportTool":true,"supportStructuredOutput":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000},"image_analysis":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"video_understanding":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"audio_understanding":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"tools_call":{"supportTool":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000},"omni":{"supportTool":true,"supportStructuredOutput":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'gemini-openai' OR provider_code = 'gemini-openai' LIMIT 1), 'gemini-openai', 'gemini-openai:gemini-3.1-pro-preview', 'gemini-3.1-pro-preview', 'text_generate', 'Gemini-3.1 Pro 预览版', '{"text_generate":{"supportTool":true,"supportStructuredOutput":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000},"image_analysis":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"video_understanding":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"audio_understanding":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"tools_call":{"supportTool":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000},"omni":{"supportTool":true,"supportStructuredOutput":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000},"originalTypes":["text_generate","image_analysis","video_understanding","audio_understanding","tools_call","omni"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"gemini-openai","sourceProviderName":"Gemini OpenAI兼容","sourceSpecType":"openai","originalTypes":["text_generate","image_analysis","video_understanding","audio_understanding","tools_call","omni"],"alias":"Gemini-3.1 Pro 预览版","description":"全模态预览模型,知识截点 2025 年 1 月;上下文窗口 100 万输入 / 6.4 万输出 tokens官方定价<20 万 tokens 输入 $2/百万、输出 $12/百万,>20 万 tokens 输入 $4/百万、输出 $18/百万。","iconPath":"https://static.51easyai.com/gemini-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"gemini-3.1-pro-preview","types":["text_generate","image_analysis","video_understanding","audio_understanding","tools_call","omni"],"alias":"Gemini-3.1 Pro 预览版","icon_path":"https://static.51easyai.com/gemini-color.png","description":"全模态预览模型,知识截点 2025 年 1 月;上下文窗口 100 万输入 / 6.4 万输出 tokens官方定价<20 万 tokens 输入 $2/百万、输出 $12/百万,>20 万 tokens 输入 $4/百万、输出 $18/百万。","capabilities":{"text_generate":{"supportTool":true,"supportStructuredOutput":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000},"image_analysis":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"video_understanding":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"audio_understanding":{"supportStructuredOutput":true,"max_context_tokens":1000000,"max_output_tokens":64000},"tools_call":{"supportTool":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000},"omni":{"supportTool":true,"supportStructuredOutput":true,"supportThinking":true,"supportThinkingModeSwitch":true,"max_context_tokens":1000000,"max_output_tokens":64000}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'gemini-openai' OR provider_code = 'gemini-openai' LIMIT 1), 'gemini-openai', 'gemini-openai:gemini-2.5-flash', 'gemini-2.5-flash', 'text_generate', 'Gemini 2.5 Flash', '{"originalTypes":["text_generate","image_analysis"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"gemini-openai","sourceProviderName":"Gemini OpenAI兼容","sourceSpecType":"openai","originalTypes":["text_generate","image_analysis"],"alias":"Gemini 2.5 Flash","description":"","iconPath":"https://static.51easyai.com/gemini-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"gemini-2.5-flash","types":["text_generate","image_analysis"],"icon_path":"https://static.51easyai.com/gemini-color.png","alias":"Gemini 2.5 Flash"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'gemini-openai' OR provider_code = 'gemini-openai' LIMIT 1), 'gemini-openai', 'gemini-openai:gemini-2.5-pro', 'gemini-2.5-pro', 'text_generate', 'Gemini 2.5 Pro', '{"originalTypes":["text_generate","image_analysis"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"gemini-openai","sourceProviderName":"Gemini OpenAI兼容","sourceSpecType":"openai","originalTypes":["text_generate","image_analysis"],"alias":"Gemini 2.5 Pro","description":"","iconPath":"https://static.51easyai.com/gemini-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"gemini-2.5-pro","types":["text_generate","image_analysis"],"icon_path":"https://static.51easyai.com/gemini-color.png","alias":"Gemini 2.5 Pro"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'volces-openai' OR provider_code = 'volces-openai' LIMIT 1), 'volces-openai', 'volces-openai:doubao-seed-2-0-pro-260215', 'doubao-seed-2-0-pro-260215', 'text_generate', 'Doubao Seed 2.0 Pro', '{"originalTypes":["text_generate","image_analysis","tools_call"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_request_per_minute":30000,"max_token_per_minute":5000000}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"volces-openai","sourceProviderName":"火山引擎(OpenAI兼容)","sourceSpecType":"openai","originalTypes":["text_generate","image_analysis","tools_call"],"alias":"Doubao Seed 2.0 Pro","description":"深度思考/文本生成/多模态理解/工具调用256K 上下文;最大输入 256K最大回答 128K最大思维链 128K","iconPath":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"doubao-seed-2-0-pro-260215","types":["text_generate","image_analysis","tools_call"],"alias":"Doubao Seed 2.0 Pro","icon_path":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","description":"深度思考/文本生成/多模态理解/工具调用256K 上下文;最大输入 256K最大回答 128K最大思维链 128K","model_limits":{"max_request_per_minute":30000,"max_token_per_minute":5000000}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'volces-openai' OR provider_code = 'volces-openai' LIMIT 1), 'volces-openai', 'volces-openai:doubao-seed-2-0-lite-260215', 'doubao-seed-2-0-lite-260215', 'text_generate', 'Doubao Seed 2.0 Lite', '{"originalTypes":["text_generate","image_analysis","tools_call"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_request_per_minute":30000,"max_token_per_minute":5000000}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"volces-openai","sourceProviderName":"火山引擎(OpenAI兼容)","sourceSpecType":"openai","originalTypes":["text_generate","image_analysis","tools_call"],"alias":"Doubao Seed 2.0 Lite","description":"深度思考/文本生成/多模态理解/工具调用256K 上下文;最大输入 256K最大回答 128K最大思维链 128K","iconPath":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"doubao-seed-2-0-lite-260215","types":["text_generate","image_analysis","tools_call"],"alias":"Doubao Seed 2.0 Lite","icon_path":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","description":"深度思考/文本生成/多模态理解/工具调用256K 上下文;最大输入 256K最大回答 128K最大思维链 128K","model_limits":{"max_request_per_minute":30000,"max_token_per_minute":5000000}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'volces-openai' OR provider_code = 'volces-openai' LIMIT 1), 'volces-openai', 'volces-openai:doubao-seed-2-0-mini-260215', 'doubao-seed-2-0-mini-260215', 'text_generate', 'Doubao Seed 2.0 Mini', '{"originalTypes":["text_generate","image_analysis","tools_call"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_request_per_minute":30000,"max_token_per_minute":5000000}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"volces-openai","sourceProviderName":"火山引擎(OpenAI兼容)","sourceSpecType":"openai","originalTypes":["text_generate","image_analysis","tools_call"],"alias":"Doubao Seed 2.0 Mini","description":"深度思考/文本生成/多模态理解/工具调用256K 上下文;最大输入 256K最大回答 128K最大思维链 128K","iconPath":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"doubao-seed-2-0-mini-260215","types":["text_generate","image_analysis","tools_call"],"alias":"Doubao Seed 2.0 Mini","icon_path":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","description":"深度思考/文本生成/多模态理解/工具调用256K 上下文;最大输入 256K最大回答 128K最大思维链 128K","model_limits":{"max_request_per_minute":30000,"max_token_per_minute":5000000}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'volces-openai' OR provider_code = 'volces-openai' LIMIT 1), 'volces-openai', 'volces-openai:doubao-seed-2-0-code-preview-260215', 'doubao-seed-2-0-code-preview-260215', 'text_generate', 'Doubao Seed 2.0 Code Preview', '{"originalTypes":["text_generate","image_analysis","tools_call"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_request_per_minute":30000,"max_token_per_minute":5000000}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"volces-openai","sourceProviderName":"火山引擎(OpenAI兼容)","sourceSpecType":"openai","originalTypes":["text_generate","image_analysis","tools_call"],"alias":"Doubao Seed 2.0 Code Preview","description":"深度思考/文本生成/多模态理解/工具调用256K 上下文;最大输入 256K最大回答 128K最大思维链 128K","iconPath":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"doubao-seed-2-0-code-preview-260215","types":["text_generate","image_analysis","tools_call"],"alias":"Doubao Seed 2.0 Code Preview","icon_path":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","description":"深度思考/文本生成/多模态理解/工具调用256K 上下文;最大输入 256K最大回答 128K最大思维链 128K","model_limits":{"max_request_per_minute":30000,"max_token_per_minute":5000000}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'volces-openai' OR provider_code = 'volces-openai' LIMIT 1), 'volces-openai', 'volces-openai:doubao-seed-1-8-251228', 'doubao-seed-1-8-251228', 'text_generate', 'Doubao Seed 1.8', '{"originalTypes":["text_generate","image_analysis","tools_call"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_request_per_minute":30000,"max_token_per_minute":5000000}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"volces-openai","sourceProviderName":"火山引擎(OpenAI兼容)","sourceSpecType":"openai","originalTypes":["text_generate","image_analysis","tools_call"],"alias":"Doubao Seed 1.8","description":"深度思考/文本生成/多模态理解/工具调用/结构化输出256K 上下文;最大输入 224K最大回答 32K最大思维链 32K","iconPath":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"doubao-seed-1-8-251228","types":["text_generate","image_analysis","tools_call"],"alias":"Doubao Seed 1.8","icon_path":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","description":"深度思考/文本生成/多模态理解/工具调用/结构化输出256K 上下文;最大输入 224K最大回答 32K最大思维链 32K","model_limits":{"max_request_per_minute":30000,"max_token_per_minute":5000000}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'volces-openai' OR provider_code = 'volces-openai' LIMIT 1), 'volces-openai', 'volces-openai:glm-4-7-251222', 'glm-4-7-251222', 'text_generate', 'GLM-4.7', '{"originalTypes":["text_generate","image_analysis","tools_call"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_request_per_minute":15000,"max_token_per_minute":1500000}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"volces-openai","sourceProviderName":"火山引擎(OpenAI兼容)","sourceSpecType":"openai","originalTypes":["text_generate","image_analysis","tools_call"],"alias":"GLM-4.7","description":"深度思考/文本生成/工具调用200K 上下文;最大输入 200K最大回答 128K最大思维链 128K","iconPath":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"glm-4-7-251222","types":["text_generate","image_analysis","tools_call"],"alias":"GLM-4.7","icon_path":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","description":"深度思考/文本生成/工具调用200K 上下文;最大输入 200K最大回答 128K最大思维链 128K","model_limits":{"max_request_per_minute":15000,"max_token_per_minute":1500000}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'zhipu-openai' OR provider_code = 'zhipu-openai' LIMIT 1), 'zhipu-openai', 'zhipu-openai:glm-4.7', 'glm-4.7', 'text_generate', 'GLM-4.7', '{"originalTypes":["text_generate","tools_call"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"zhipu-openai","sourceProviderName":"智谱AI","sourceSpecType":"openai","originalTypes":["text_generate","tools_call"],"alias":"GLM-4.7","description":"","iconPath":"https://static.51easyai.com/chatglm-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"glm-4.7","types":["text_generate","tools_call"],"alias":"GLM-4.7","icon_path":"https://static.51easyai.com/chatglm-color.webp"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'zhipu-openai' OR provider_code = 'zhipu-openai' LIMIT 1), 'zhipu-openai', 'zhipu-openai:glm-4.7-flash', 'glm-4.7-flash', 'text_generate', 'GLM-4.7-Flash', '{"originalTypes":["text_generate","tools_call"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"zhipu-openai","sourceProviderName":"智谱AI","sourceSpecType":"openai","originalTypes":["text_generate","tools_call"],"alias":"GLM-4.7-Flash","description":"","iconPath":"https://static.51easyai.com/chatglm-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"glm-4.7-flash","types":["text_generate","tools_call"],"alias":"GLM-4.7-Flash","icon_path":"https://static.51easyai.com/chatglm-color.webp"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'zhipu-openai' OR provider_code = 'zhipu-openai' LIMIT 1), 'zhipu-openai', 'zhipu-openai:glm-4.7-flashx', 'glm-4.7-flashx', 'text_generate', 'GLM-4.7-FlashX', '{"originalTypes":["text_generate","tools_call"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"zhipu-openai","sourceProviderName":"智谱AI","sourceSpecType":"openai","originalTypes":["text_generate","tools_call"],"alias":"GLM-4.7-FlashX","description":"","iconPath":"https://static.51easyai.com/chatglm-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"glm-4.7-flashx","types":["text_generate","tools_call"],"alias":"GLM-4.7-FlashX","icon_path":"https://static.51easyai.com/chatglm-color.webp"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'minimax-openai' OR provider_code = 'minimax-openai' LIMIT 1), 'minimax-openai', 'minimax-openai:MiniMax-M2.7', 'MiniMax-M2.7', 'text_generate', 'MiniMax M2.7', '{"text_generate":{"max_context_tokens":204800,"supportTool":true},"tools_call":{"max_context_tokens":204800,"supportTool":true},"originalTypes":["text_generate","tools_call"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"minimax-openai","sourceProviderName":"MiniMaxOpenAI兼容","sourceSpecType":"openai","originalTypes":["text_generate","tools_call"],"alias":"MiniMax M2.7","description":"开启模型的自我迭代(输出速度约 60 TPS。","iconPath":"https://static.51easyai.com/minimax-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"MiniMax-M2.7","types":["text_generate","tools_call"],"alias":"MiniMax M2.7","icon_path":"https://static.51easyai.com/minimax-color.png","description":"开启模型的自我迭代(输出速度约 60 TPS。","capabilities":{"text_generate":{"max_context_tokens":204800,"supportTool":true},"tools_call":{"max_context_tokens":204800,"supportTool":true}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'minimax-openai' OR provider_code = 'minimax-openai' LIMIT 1), 'minimax-openai', 'minimax-openai:MiniMax-M2.7-highspeed', 'MiniMax-M2.7-highspeed', 'text_generate', 'MiniMax M2.7 极速版', '{"text_generate":{"max_context_tokens":204800,"supportTool":true},"tools_call":{"max_context_tokens":204800,"supportTool":true},"originalTypes":["text_generate","tools_call"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"minimax-openai","sourceProviderName":"MiniMaxOpenAI兼容","sourceSpecType":"openai","originalTypes":["text_generate","tools_call"],"alias":"MiniMax M2.7 极速版","description":"M2.7 极速版:效果不变,更快、更敏捷(输出速度约 100 TPS。","iconPath":"https://static.51easyai.com/minimax-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"MiniMax-M2.7-highspeed","types":["text_generate","tools_call"],"alias":"MiniMax M2.7 极速版","icon_path":"https://static.51easyai.com/minimax-color.png","description":"M2.7 极速版:效果不变,更快、更敏捷(输出速度约 100 TPS。","capabilities":{"text_generate":{"max_context_tokens":204800,"supportTool":true},"tools_call":{"max_context_tokens":204800,"supportTool":true}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'minimax-openai' OR provider_code = 'minimax-openai' LIMIT 1), 'minimax-openai', 'minimax-openai:MiniMax-M2.5', 'MiniMax-M2.5', 'text_generate', 'MiniMax M2.5', '{"text_generate":{"max_context_tokens":204800,"supportTool":true},"tools_call":{"max_context_tokens":204800,"supportTool":true},"originalTypes":["text_generate","tools_call"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"minimax-openai","sourceProviderName":"MiniMaxOpenAI兼容","sourceSpecType":"openai","originalTypes":["text_generate","tools_call"],"alias":"MiniMax M2.5","description":"顶尖性能与极致性价比,轻松驾驭复杂任务(输出速度约 60 TPS。","iconPath":"https://static.51easyai.com/minimax-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"MiniMax-M2.5","types":["text_generate","tools_call"],"alias":"MiniMax M2.5","icon_path":"https://static.51easyai.com/minimax-color.png","description":"顶尖性能与极致性价比,轻松驾驭复杂任务(输出速度约 60 TPS。","capabilities":{"text_generate":{"max_context_tokens":204800,"supportTool":true},"tools_call":{"max_context_tokens":204800,"supportTool":true}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'minimax-openai' OR provider_code = 'minimax-openai' LIMIT 1), 'minimax-openai', 'minimax-openai:MiniMax-M2.5-highspeed', 'MiniMax-M2.5-highspeed', 'text_generate', 'MiniMax M2.5 极速版', '{"text_generate":{"max_context_tokens":204800,"supportTool":true},"tools_call":{"max_context_tokens":204800,"supportTool":true},"originalTypes":["text_generate","tools_call"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"minimax-openai","sourceProviderName":"MiniMaxOpenAI兼容","sourceSpecType":"openai","originalTypes":["text_generate","tools_call"],"alias":"MiniMax M2.5 极速版","description":"M2.5 极速版:效果不变,更快、更敏捷(输出速度约 100 TPS。","iconPath":"https://static.51easyai.com/minimax-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"MiniMax-M2.5-highspeed","types":["text_generate","tools_call"],"alias":"MiniMax M2.5 极速版","icon_path":"https://static.51easyai.com/minimax-color.png","description":"M2.5 极速版:效果不变,更快、更敏捷(输出速度约 100 TPS。","capabilities":{"text_generate":{"max_context_tokens":204800,"supportTool":true},"tools_call":{"max_context_tokens":204800,"supportTool":true}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'minimax-openai' OR provider_code = 'minimax-openai' LIMIT 1), 'minimax-openai', 'minimax-openai:MiniMax-M2.1', 'MiniMax-M2.1', 'text_generate', 'MiniMax M2.1', '{"text_generate":{"max_context_tokens":204800,"supportTool":true},"tools_call":{"max_context_tokens":204800,"supportTool":true},"originalTypes":["text_generate","tools_call"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"minimax-openai","sourceProviderName":"MiniMaxOpenAI兼容","sourceSpecType":"openai","originalTypes":["text_generate","tools_call"],"alias":"MiniMax M2.1","description":"强大多语言编程能力,全面升级编程体验(输出速度约 60 TPS。","iconPath":"https://static.51easyai.com/minimax-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"MiniMax-M2.1","types":["text_generate","tools_call"],"alias":"MiniMax M2.1","icon_path":"https://static.51easyai.com/minimax-color.png","description":"强大多语言编程能力,全面升级编程体验(输出速度约 60 TPS。","capabilities":{"text_generate":{"max_context_tokens":204800,"supportTool":true},"tools_call":{"max_context_tokens":204800,"supportTool":true}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'minimax-openai' OR provider_code = 'minimax-openai' LIMIT 1), 'minimax-openai', 'minimax-openai:MiniMax-M2.1-highspeed', 'MiniMax-M2.1-highspeed', 'text_generate', 'MiniMax M2.1 极速版', '{"text_generate":{"max_context_tokens":204800,"supportTool":true},"tools_call":{"max_context_tokens":204800,"supportTool":true},"originalTypes":["text_generate","tools_call"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"minimax-openai","sourceProviderName":"MiniMaxOpenAI兼容","sourceSpecType":"openai","originalTypes":["text_generate","tools_call"],"alias":"MiniMax M2.1 极速版","description":"M2.1 极速版:效果不变,更快、更敏捷(输出速度约 100 TPS。","iconPath":"https://static.51easyai.com/minimax-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"MiniMax-M2.1-highspeed","types":["text_generate","tools_call"],"alias":"MiniMax M2.1 极速版","icon_path":"https://static.51easyai.com/minimax-color.png","description":"M2.1 极速版:效果不变,更快、更敏捷(输出速度约 100 TPS。","capabilities":{"text_generate":{"max_context_tokens":204800,"supportTool":true},"tools_call":{"max_context_tokens":204800,"supportTool":true}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'minimax-openai' OR provider_code = 'minimax-openai' LIMIT 1), 'minimax-openai', 'minimax-openai:MiniMax-M2', 'MiniMax-M2', 'text_generate', 'MiniMax M2', '{"text_generate":{"max_context_tokens":204800,"supportTool":true},"tools_call":{"max_context_tokens":204800,"supportTool":true},"originalTypes":["text_generate","tools_call"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"minimax-openai","sourceProviderName":"MiniMaxOpenAI兼容","sourceSpecType":"openai","originalTypes":["text_generate","tools_call"],"alias":"MiniMax M2","description":"专为高效编码与 Agent 工作流而生。","iconPath":"https://static.51easyai.com/minimax-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"MiniMax-M2","types":["text_generate","tools_call"],"alias":"MiniMax M2","icon_path":"https://static.51easyai.com/minimax-color.png","description":"专为高效编码与 Agent 工作流而生。","capabilities":{"text_generate":{"max_context_tokens":204800,"supportTool":true},"tools_call":{"max_context_tokens":204800,"supportTool":true}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'openrouter-openai' OR provider_code = 'openrouter-openai' LIMIT 1), 'openrouter-openai', 'openrouter-openai:anthropic/claude-opus-4.6', 'anthropic/claude-opus-4.6', 'text_generate', 'Claude-Opus-4.6', '{"originalTypes":["text_generate","tools_call"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"openrouter-openai","sourceProviderName":"OpenRouter","sourceSpecType":"openai","originalTypes":["text_generate","tools_call"],"alias":"Claude-Opus-4.6","description":"","iconPath":"https://static.51easyai.com/claude-color%20%281%29.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"anthropic/claude-opus-4.6","types":["text_generate","tools_call"],"alias":"Claude-Opus-4.6","icon_path":"https://static.51easyai.com/claude-color%20%281%29.webp"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'openrouter-openai' OR provider_code = 'openrouter-openai' LIMIT 1), 'openrouter-openai', 'openrouter-openai:anthropic/claude-opus-4.5', 'anthropic/claude-opus-4.5', 'text_generate', 'Claude-Opus-4.5', '{"originalTypes":["text_generate","tools_call"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"openrouter-openai","sourceProviderName":"OpenRouter","sourceSpecType":"openai","originalTypes":["text_generate","tools_call"],"alias":"Claude-Opus-4.5","description":"","iconPath":"https://static.51easyai.com/claude-color%20%281%29.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"anthropic/claude-opus-4.5","types":["text_generate","tools_call"],"alias":"Claude-Opus-4.5","icon_path":"https://static.51easyai.com/claude-color%20%281%29.webp"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'aliyun-bailian' OR provider_code = 'aliyun-bailian' LIMIT 1), 'aliyun-bailian', 'aliyun-bailian:wan2.5-t2v-preview', 'wan2.5-t2v-preview', 'video_generate', 'Wan2.5-T2V-Preview', '{"video_generate":{"aspect_ratio_allowed":{"480p":["16:9","1:1","9:16"],"720p":["16:9","1:1","9:16","4:3","3:4"],"1080p":["16:9","1:1","9:16","4:3","3:4"]},"size_allowed":{"480p":["832x480","480x832","624x624"],"720p":["1280x720","720x1280","960x960","1088x832","832x1088"],"1080p":["1920x1080","1080x1920","1440x1440","1632x1248","1248*1632"]},"output_resolutions":["1080p","720p","480p"],"duration_range":[5,10],"input_audio":true,"output_audio":true},"originalTypes":["video_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":5,"max_request_per_second":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"aliyun-bailian","sourceProviderName":"阿里云百炼","sourceSpecType":"aliyun-bailian","originalTypes":["video_generate"],"alias":"Wan2.5-T2V-Preview","description":"","iconPath":"https://static.51easyai.com/qwen-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"wan2.5-t2v-preview","types":["video_generate"],"icon_path":"https://static.51easyai.com/qwen-color.webp","alias":"Wan2.5-T2V-Preview","model_limits":{"max_concurrent_requests":5,"max_request_per_second":5},"capabilities":{"video_generate":{"aspect_ratio_allowed":{"480p":["16:9","1:1","9:16"],"720p":["16:9","1:1","9:16","4:3","3:4"],"1080p":["16:9","1:1","9:16","4:3","3:4"]},"size_allowed":{"480p":["832x480","480x832","624x624"],"720p":["1280x720","720x1280","960x960","1088x832","832x1088"],"1080p":["1920x1080","1080x1920","1440x1440","1632x1248","1248*1632"]},"output_resolutions":["1080p","720p","480p"],"duration_range":[5,10],"input_audio":true,"output_audio":true}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'aliyun-bailian' OR provider_code = 'aliyun-bailian' LIMIT 1), 'aliyun-bailian', 'aliyun-bailian:wan2.5-i2v-preview', 'wan2.5-i2v-preview', 'image_to_video', 'Wan2.5-I2V-Preview', '{"image_to_video":{"output_resolutions":["1080p","720p","480p"],"duration_range":{"input_first_frame":[5,10]},"input_first_frame":true,"input_last_frame":false,"input_first_last_frame":false,"aspect_ratio_allowed":["adaptive"],"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"input_audio":true,"output_audio":true},"originalTypes":["image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"aliyun-bailian","sourceProviderName":"阿里云百炼","sourceSpecType":"aliyun-bailian","originalTypes":["image_to_video"],"alias":"Wan2.5-I2V-Preview","description":"","iconPath":"https://static.51easyai.com/qwen-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"wan2.5-i2v-preview","types":["image_to_video"],"icon_path":"https://static.51easyai.com/qwen-color.webp","alias":"Wan2.5-I2V-Preview","model_limits":{"max_concurrent_requests":5},"capabilities":{"image_to_video":{"output_resolutions":["1080p","720p","480p"],"duration_range":{"input_first_frame":[5,10]},"input_first_frame":true,"input_last_frame":false,"input_first_last_frame":false,"aspect_ratio_allowed":["adaptive"],"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"input_audio":true,"output_audio":true}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'aliyun-bailian' OR provider_code = 'aliyun-bailian' LIMIT 1), 'aliyun-bailian', 'aliyun-bailian:wan2.6-t2v', 'wan2.6-t2v', 'video_generate', 'Wan2.6-文生视频', '{"video_generate":{"aspect_ratio_allowed":{"720p":["16:9","1:1","9:16","4:3","3:4"],"1080p":["16:9","1:1","9:16","4:3","3:4"]},"output_resolutions":["1080p","720p"],"duration_range":[5,15],"duration_options":[5,10,15],"input_audio":true,"output_audio":true},"originalTypes":["video_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":10,"max_request_per_minute":300}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"aliyun-bailian","sourceProviderName":"阿里云百炼","sourceSpecType":"aliyun-bailian","originalTypes":["video_generate"],"alias":"Wan2.6-文生视频","description":"","iconPath":"https://static.51easyai.com/qwen-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"wan2.6-t2v","types":["video_generate"],"icon_path":"https://static.51easyai.com/qwen-color.webp","alias":"Wan2.6-文生视频","model_limits":{"max_concurrent_requests":10,"max_request_per_minute":300},"capabilities":{"video_generate":{"aspect_ratio_allowed":{"720p":["16:9","1:1","9:16","4:3","3:4"],"1080p":["16:9","1:1","9:16","4:3","3:4"]},"output_resolutions":["1080p","720p"],"duration_range":[5,15],"duration_options":[5,10,15],"input_audio":true,"output_audio":true}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'aliyun-bailian' OR provider_code = 'aliyun-bailian' LIMIT 1), 'aliyun-bailian', 'aliyun-bailian:wan2.6-i2v', 'wan2.6-i2v', 'image_to_video', 'Wan2.6-图生视频', '{"image_to_video":{"output_resolutions":["1080p","720p"],"duration_range":{"input_first_frame":[5,10]},"duration_options":{"input_first_frame":[5,10,15]},"input_first_frame":true,"input_last_frame":false,"input_first_last_frame":false,"aspect_ratio_allowed":[],"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"input_audio":true},"originalTypes":["image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":10,"max_request_per_minute":300}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"aliyun-bailian","sourceProviderName":"阿里云百炼","sourceSpecType":"aliyun-bailian","originalTypes":["image_to_video"],"alias":"Wan2.6-图生视频","description":"","iconPath":"https://static.51easyai.com/qwen-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"wan2.6-i2v","types":["image_to_video"],"icon_path":"https://static.51easyai.com/qwen-color.webp","alias":"Wan2.6-图生视频","model_limits":{"max_concurrent_requests":10,"max_request_per_minute":300},"capabilities":{"image_to_video":{"output_resolutions":["1080p","720p"],"duration_range":{"input_first_frame":[5,10]},"duration_options":{"input_first_frame":[5,10,15]},"input_first_frame":true,"input_last_frame":false,"input_first_last_frame":false,"aspect_ratio_allowed":[],"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"input_audio":true}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'aliyun-bailian' OR provider_code = 'aliyun-bailian' LIMIT 1), 'aliyun-bailian', 'aliyun-bailian:wan2.6-i2v-flash', 'wan2.6-i2v-flash', 'image_to_video', 'Wan2.6-图生视频-Flash', '{"image_to_video":{"output_resolutions":["1080p","720p"],"duration_range":{"input_first_frame":[2,15]},"duration_options":{"input_first_frame":[2,5,10,15]},"input_first_frame":true,"input_last_frame":false,"input_first_last_frame":false,"aspect_ratio_allowed":[],"input_reference_generate_single":false,"output_audio":true,"input_audio":true,"input_reference_generate_multiple":false,"support_video_effect_template":false},"originalTypes":["image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":10,"max_request_per_minute":300}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"aliyun-bailian","sourceProviderName":"阿里云百炼","sourceSpecType":"aliyun-bailian","originalTypes":["image_to_video"],"alias":"Wan2.6-图生视频-Flash","description":"","iconPath":"https://static.51easyai.com/qwen-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"wan2.6-i2v-flash","types":["image_to_video"],"icon_path":"https://static.51easyai.com/qwen-color.webp","alias":"Wan2.6-图生视频-Flash","model_limits":{"max_concurrent_requests":10,"max_request_per_minute":300},"capabilities":{"image_to_video":{"output_resolutions":["1080p","720p"],"duration_range":{"input_first_frame":[2,15]},"duration_options":{"input_first_frame":[2,5,10,15]},"input_first_frame":true,"input_last_frame":false,"input_first_last_frame":false,"aspect_ratio_allowed":[],"input_reference_generate_single":false,"output_audio":true,"input_audio":true,"input_reference_generate_multiple":false,"support_video_effect_template":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'blackforest' OR provider_code = 'blackforest' LIMIT 1), 'blackforest', 'blackforest:flux-2-pro', 'flux-2-pro', 'image_generate', 'flux-2-pro', '{"image_generate":{"output_multiple_images":false,"output_resolutions":["2K","1K"],"output_size_range":[4096,4194304]},"image_edit":{"output_multiple_images":false,"output_resolutions":["2K","1K"],"output_size_range":[4096,4194304],"input_max_images_count":8,"input_multiple_images":true},"originalTypes":["image_generate","image_edit"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"blackforest","sourceProviderName":"黑森林实验室","sourceSpecType":"blackforest","originalTypes":["image_generate","image_edit"],"alias":"flux-2-pro","description":"","iconPath":"https://easyai-1253343986.cos.ap-shanghai.myqcloud.com/663e19cd4fa9d8078385c7c9/upload/20250611132907371-blackforest.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"flux-2-pro","types":["image_generate","image_edit"],"alias":"flux-2-pro","icon_path":"https://easyai-1253343986.cos.ap-shanghai.myqcloud.com/663e19cd4fa9d8078385c7c9/upload/20250611132907371-blackforest.png","capabilities":{"image_generate":{"output_multiple_images":false,"output_resolutions":["2K","1K"],"output_size_range":[4096,4194304]},"image_edit":{"output_multiple_images":false,"output_resolutions":["2K","1K"],"output_size_range":[4096,4194304],"input_max_images_count":8,"input_multiple_images":true}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'blackforest' OR provider_code = 'blackforest' LIMIT 1), 'blackforest', 'blackforest:flux-2-flex', 'flux-2-flex', 'image_generate', 'flux-2-flex', '{"image_generate":{"output_multiple_images":false,"output_resolutions":["2K","1K"],"output_size_range":[4096,4194304]},"image_edit":{"output_multiple_images":false,"output_resolutions":["2K","1K"],"output_size_range":[4096,4194304],"input_max_images_count":10,"input_multiple_images":true},"originalTypes":["image_generate","image_edit"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"blackforest","sourceProviderName":"黑森林实验室","sourceSpecType":"blackforest","originalTypes":["image_generate","image_edit"],"alias":"flux-2-flex","description":"","iconPath":"https://easyai-1253343986.cos.ap-shanghai.myqcloud.com/663e19cd4fa9d8078385c7c9/upload/20250611132907371-blackforest.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"flux-2-flex","types":["image_generate","image_edit"],"alias":"flux-2-flex","icon_path":"https://easyai-1253343986.cos.ap-shanghai.myqcloud.com/663e19cd4fa9d8078385c7c9/upload/20250611132907371-blackforest.png","capabilities":{"image_generate":{"output_multiple_images":false,"output_resolutions":["2K","1K"],"output_size_range":[4096,4194304]},"image_edit":{"output_multiple_images":false,"output_resolutions":["2K","1K"],"output_size_range":[4096,4194304],"input_max_images_count":10,"input_multiple_images":true}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'blackforest' OR provider_code = 'blackforest' LIMIT 1), 'blackforest', 'blackforest:flux-kontext-pro', 'flux-kontext-pro', 'image_generate', 'flux-kontext-pro', '{"originalTypes":["image_generate","image_edit"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"blackforest","sourceProviderName":"黑森林实验室","sourceSpecType":"blackforest","originalTypes":["image_generate","image_edit"],"alias":"flux-kontext-pro","description":"","iconPath":"https://easyai-1253343986.cos.ap-shanghai.myqcloud.com/663e19cd4fa9d8078385c7c9/upload/20250611132907371-blackforest.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"flux-kontext-pro","types":["image_generate","image_edit"],"alias":"flux-kontext-pro","icon_path":"https://easyai-1253343986.cos.ap-shanghai.myqcloud.com/663e19cd4fa9d8078385c7c9/upload/20250611132907371-blackforest.png"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'blackforest' OR provider_code = 'blackforest' LIMIT 1), 'blackforest', 'blackforest:flux-kontext-max', 'flux-kontext-max', 'image_generate', 'flux-kontext-max', '{"originalTypes":["image_generate","image_edit"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"blackforest","sourceProviderName":"黑森林实验室","sourceSpecType":"blackforest","originalTypes":["image_generate","image_edit"],"alias":"flux-kontext-max","description":"","iconPath":"https://easyai-1253343986.cos.ap-shanghai.myqcloud.com/663e19cd4fa9d8078385c7c9/upload/20250611132907371-blackforest.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"flux-kontext-max","types":["image_generate","image_edit"],"alias":"flux-kontext-max","icon_path":"https://easyai-1253343986.cos.ap-shanghai.myqcloud.com/663e19cd4fa9d8078385c7c9/upload/20250611132907371-blackforest.png"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'blackforest' OR provider_code = 'blackforest' LIMIT 1), 'blackforest', 'blackforest:flux-pro-1.1', 'flux-pro-1.1', 'image_generate', 'flux-pro-1.1', '{"image_generate":{"output_multiple_images":false,"width_height_range":[256,1440],"output_resolutions":["2K","1K"]},"originalTypes":["image_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"blackforest","sourceProviderName":"黑森林实验室","sourceSpecType":"blackforest","originalTypes":["image_generate"],"alias":"flux-pro-1.1","description":"","iconPath":"https://easyai-1253343986.cos.ap-shanghai.myqcloud.com/663e19cd4fa9d8078385c7c9/upload/20250611132907371-blackforest.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"flux-pro-1.1","types":["image_generate"],"alias":"flux-pro-1.1","icon_path":"https://easyai-1253343986.cos.ap-shanghai.myqcloud.com/663e19cd4fa9d8078385c7c9/upload/20250611132907371-blackforest.png","capabilities":{"image_generate":{"output_multiple_images":false,"width_height_range":[256,1440],"output_resolutions":["2K","1K"]}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'blackforest' OR provider_code = 'blackforest' LIMIT 1), 'blackforest', 'blackforest:flux-dev', 'flux-dev', 'image_generate', 'flux-dev', '{"image_generate":{"output_multiple_images":false,"width_height_range":[256,1440],"output_resolutions":["2K","1K"]},"originalTypes":["image_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"blackforest","sourceProviderName":"黑森林实验室","sourceSpecType":"blackforest","originalTypes":["image_generate"],"alias":"flux-dev","description":"","iconPath":"https://easyai-1253343986.cos.ap-shanghai.myqcloud.com/663e19cd4fa9d8078385c7c9/upload/20250611132907371-blackforest.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"flux-dev","types":["image_generate"],"alias":"flux-dev","icon_path":"https://easyai-1253343986.cos.ap-shanghai.myqcloud.com/663e19cd4fa9d8078385c7c9/upload/20250611132907371-blackforest.png","capabilities":{"image_generate":{"output_multiple_images":false,"width_height_range":[256,1440],"output_resolutions":["2K","1K"]}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'dify' OR provider_code = 'dify' LIMIT 1), 'dify', 'dify:dify-app-[name]', 'dify-app-[name]', 'text_generate', 'dify-app-[name]', '{"originalTypes":["text_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":-1}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"dify","sourceProviderName":"Dify","sourceSpecType":"dify","originalTypes":["text_generate"],"alias":"","description":"","iconPath":"","billingType":"internal-compute","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"dify-app-[name]","types":["text_generate"]}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'volces' OR provider_code = 'volces' LIMIT 1), 'volces', 'volces:doubao-seededit-3-0-i2i-250628', 'doubao-seededit-3-0-i2i-250628', 'image_edit', 'doubao-3.0图像编辑', '{"image_edit":{"output_resolutions":["1K","2K"],"aspect_ratio_allowed":["adaptive"],"input_multiple_images":false,"output_multiple_images":false},"originalTypes":["image_edit"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_request_per_minute":500}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"volces","sourceProviderName":"火山引擎(豆包)","sourceSpecType":"volces","originalTypes":["image_edit"],"alias":"doubao-3.0图像编辑","description":"","iconPath":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"doubao-seededit-3-0-i2i-250628","types":["image_edit"],"alias":"doubao-3.0图像编辑","icon_path":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","capabilities":{"image_edit":{"output_resolutions":["1K","2K"],"aspect_ratio_allowed":["adaptive"],"input_multiple_images":false,"output_multiple_images":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'volces' OR provider_code = 'volces' LIMIT 1), 'volces', 'volces:doubao-seedream-4-0-250828', 'doubao-seedream-4-0-250828', 'image_edit', 'doubao-4.0图像编辑', '{"image_edit":{"input_multiple_images":true,"input_max_images_count":10,"output_resolutions":["1K","2K","4K"],"output_max_size":16777216,"output_size_range":[921600,16777216],"aspect_ratio_range":[0.0625,16],"output_multiple_images":true},"image_generate":{"output_resolutions":["1K","2K","4K"],"output_max_size":16777216,"aspect_ratio_range":[0.0625,16],"output_size_range":[921600,16777216],"output_multiple_images":true},"originalTypes":["image_edit","image_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_request_per_minute":500}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"volces","sourceProviderName":"火山引擎(豆包)","sourceSpecType":"volces","originalTypes":["image_edit","image_generate"],"alias":"doubao-4.0图像编辑","description":"","iconPath":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"doubao-seedream-4-0-250828","types":["image_edit","image_generate"],"alias":"doubao-4.0图像编辑","icon_path":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","capabilities":{"image_edit":{"input_multiple_images":true,"input_max_images_count":10,"output_resolutions":["1K","2K","4K"],"output_max_size":16777216,"output_size_range":[921600,16777216],"aspect_ratio_range":[0.0625,16],"output_multiple_images":true},"image_generate":{"output_resolutions":["1K","2K","4K"],"output_max_size":16777216,"aspect_ratio_range":[0.0625,16],"output_size_range":[921600,16777216],"output_multiple_images":true}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'volces' OR provider_code = 'volces' LIMIT 1), 'volces', 'volces:doubao-seedream-5-0-260128', 'doubao-seedream-5-0-260128', 'image_edit', 'doubao-5.0图像编辑', '{"image_edit":{"input_multiple_images":true,"input_max_images_count":10,"output_resolutions":["2K","3K"],"output_max_size":10404496,"output_size_range":[3686400,10404496],"aspect_ratio_range":[0.0625,16],"output_multiple_images":true},"image_generate":{"output_resolutions":["2K","3K"],"output_max_size":10404496,"aspect_ratio_range":[0.0625,16],"output_size_range":[3686400,10404496],"output_multiple_images":true},"originalTypes":["image_edit","image_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_request_per_minute":500}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"volces","sourceProviderName":"火山引擎(豆包)","sourceSpecType":"volces","originalTypes":["image_edit","image_generate"],"alias":"doubao-5.0图像编辑","description":"支持 2K 和 3K 分辨率","iconPath":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"doubao-seedream-5-0-260128","types":["image_edit","image_generate"],"alias":"doubao-5.0图像编辑","description":"支持 2K 和 3K 分辨率","icon_path":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","capabilities":{"image_edit":{"input_multiple_images":true,"input_max_images_count":10,"output_resolutions":["2K","3K"],"output_max_size":10404496,"output_size_range":[3686400,10404496],"aspect_ratio_range":[0.0625,16],"output_multiple_images":true},"image_generate":{"output_resolutions":["2K","3K"],"output_max_size":10404496,"aspect_ratio_range":[0.0625,16],"output_size_range":[3686400,10404496],"output_multiple_images":true}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'volces' OR provider_code = 'volces' LIMIT 1), 'volces', 'volces:doubao-seedream-5-0-lite-260128', 'doubao-seedream-5-0-lite-260128', 'image_edit', 'doubao-5.0-lite图像编辑', '{"image_edit":{"input_multiple_images":true,"input_max_images_count":10,"output_resolutions":["2K","3K"],"output_max_size":10404496,"output_size_range":[3686400,10404496],"aspect_ratio_range":[0.0625,16],"output_multiple_images":true},"image_generate":{"output_resolutions":["2K","3K"],"output_max_size":10404496,"aspect_ratio_range":[0.0625,16],"output_size_range":[3686400,10404496],"output_multiple_images":true},"originalTypes":["image_edit","image_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_request_per_minute":500}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"volces","sourceProviderName":"火山引擎(豆包)","sourceSpecType":"volces","originalTypes":["image_edit","image_generate"],"alias":"doubao-5.0-lite图像编辑","description":"轻量版,支持 2K 和 3K 分辨率","iconPath":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"doubao-seedream-5-0-lite-260128","types":["image_edit","image_generate"],"alias":"doubao-5.0-lite图像编辑","description":"轻量版,支持 2K 和 3K 分辨率","icon_path":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","capabilities":{"image_edit":{"input_multiple_images":true,"input_max_images_count":10,"output_resolutions":["2K","3K"],"output_max_size":10404496,"output_size_range":[3686400,10404496],"aspect_ratio_range":[0.0625,16],"output_multiple_images":true},"image_generate":{"output_resolutions":["2K","3K"],"output_max_size":10404496,"aspect_ratio_range":[0.0625,16],"output_size_range":[3686400,10404496],"output_multiple_images":true}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'volces' OR provider_code = 'volces' LIMIT 1), 'volces', 'volces:doubao-seedream-4-5-251128', 'doubao-seedream-4-5-251128', 'image_generate', 'doubao-4.5图像编辑', '{"image_generate":{"output_resolutions":["2K","4K"],"output_max_size":16777216,"aspect_ratio_range":[0.0625,16],"output_size_range":[3686400,16777216],"output_multiple_images":true},"image_edit":{"input_size_range":["14x14","6000x6000"],"input_format_allowed":["png","jpg","jpeg","webp","gif","bmp","tiff"],"input_multiple_images":true,"input_aspect_ratio_range":[0.0625,16],"input_max_images_count":14,"output_resolutions":["2K","4K"],"output_max_size":16777216,"aspect_ratio_range":[0.0625,16],"output_size_range":[3686400,16777216],"output_multiple_images":true},"originalTypes":["image_generate","image_edit"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_request_per_minute":500}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"volces","sourceProviderName":"火山引擎(豆包)","sourceSpecType":"volces","originalTypes":["image_generate","image_edit"],"alias":"doubao-4.5图像编辑","description":"多图稳定融合超强编辑一致性小字清晰4k超高清","iconPath":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"doubao-seedream-4-5-251128","types":["image_generate","image_edit"],"alias":"doubao-4.5图像编辑","description":"多图稳定融合超强编辑一致性小字清晰4k超高清","icon_path":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","capabilities":{"image_generate":{"output_resolutions":["2K","4K"],"output_max_size":16777216,"aspect_ratio_range":[0.0625,16],"output_size_range":[3686400,16777216],"output_multiple_images":true},"image_edit":{"input_size_range":["14x14","6000x6000"],"input_format_allowed":["png","jpg","jpeg","webp","gif","bmp","tiff"],"input_multiple_images":true,"input_aspect_ratio_range":[0.0625,16],"input_max_images_count":14,"output_resolutions":["2K","4K"],"output_max_size":16777216,"aspect_ratio_range":[0.0625,16],"output_size_range":[3686400,16777216],"output_multiple_images":true}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'volces' OR provider_code = 'volces' LIMIT 1), 'volces', 'volces:doubao-seedream-3-0-t2i-250415', 'doubao-seedream-3-0-t2i-250415', 'image_generate', 'doubao-3.0文生图', '{"image_generate":{"output_resolutions":["2K","1K"],"output_max_size":4194304,"aspect_ratio_range":[0.42857142857142855,2.3333333333333335],"output_multiple_images":false},"originalTypes":["image_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_request_per_minute":500}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"volces","sourceProviderName":"火山引擎(豆包)","sourceSpecType":"volces","originalTypes":["image_generate"],"alias":"doubao-3.0文生图","description":"","iconPath":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"doubao-seedream-3-0-t2i-250415","types":["image_generate"],"alias":"doubao-3.0文生图","icon_path":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","capabilities":{"image_generate":{"output_resolutions":["2K","1K"],"output_max_size":4194304,"aspect_ratio_range":[0.42857142857142855,2.3333333333333335],"output_multiple_images":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'volces' OR provider_code = 'volces' LIMIT 1), 'volces', 'volces:doubao-seedance-1-0-lite-t2v-250428', 'doubao-seedance-1-0-lite-t2v-250428', 'video_generate', 'doubao-1.0-lite-文生视频', '{"video_generate":{"output_resolutions":["720p","480p","1080p"],"aspect_ratio_allowed":["16:9","4:3","1:1","3:4","9:16","21:9"],"duration_range":[3,12]},"originalTypes":["video_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_request_per_minute":300,"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"volces","sourceProviderName":"火山引擎(豆包)","sourceSpecType":"volces","originalTypes":["video_generate"],"alias":"doubao-1.0-lite-文生视频","description":"","iconPath":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"doubao-seedance-1-0-lite-t2v-250428","types":["video_generate"],"alias":"doubao-1.0-lite-文生视频","icon_path":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","model_limits":{"max_request_per_minute":300,"max_concurrent_requests":5},"capabilities":{"video_generate":{"output_resolutions":["720p","480p","1080p"],"aspect_ratio_allowed":["16:9","4:3","1:1","3:4","9:16","21:9"],"duration_range":[3,12]}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'volces' OR provider_code = 'volces' LIMIT 1), 'volces', 'volces:doubao-seedance-1-0-lite-i2v-250428', 'doubao-seedance-1-0-lite-i2v-250428', 'image_to_video', 'doubao-1.0-lite-i2v-图生视频', '{"image_to_video":{"input_smart_multi_frame":true,"smart_multi_frame_range":[2,5],"smart_multi_frame_mode":"stitch","output_resolutions":["720p","480p","1080p"],"input_first_frame":true,"input_first_last_frame":true,"aspect_ratio_allowed":["16:9","4:3","1:1","3:4","9:16","21:9","adaptive"],"duration_range":[3,12],"input_last_frame":false,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false},"originalTypes":["image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_request_per_minute":300,"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"volces","sourceProviderName":"火山引擎(豆包)","sourceSpecType":"volces","originalTypes":["image_to_video"],"alias":"doubao-1.0-lite-i2v-图生视频","description":"","iconPath":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"doubao-seedance-1-0-lite-i2v-250428","types":["image_to_video"],"alias":"doubao-1.0-lite-i2v-图生视频","icon_path":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","model_limits":{"max_request_per_minute":300,"max_concurrent_requests":5},"capabilities":{"image_to_video":{"input_smart_multi_frame":true,"smart_multi_frame_range":[2,5],"smart_multi_frame_mode":"stitch","output_resolutions":["720p","480p","1080p"],"input_first_frame":true,"input_first_last_frame":true,"aspect_ratio_allowed":["16:9","4:3","1:1","3:4","9:16","21:9","adaptive"],"duration_range":[3,12],"input_last_frame":false,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'volces' OR provider_code = 'volces' LIMIT 1), 'volces', 'volces:doubao-seedance-1-0-pro-250528', 'doubao-seedance-1-0-pro-250528', 'video_generate', '豆包Seedance-pro', '{"video_generate":{"output_resolutions":["720p","480p","1080p"],"aspect_ratio_allowed":["16:9","4:3","1:1","3:4","9:16","21:9","adaptive"],"duration_range":[3,12]},"image_to_video":{"input_smart_multi_frame":true,"smart_multi_frame_range":[2,5],"smart_multi_frame_mode":"stitch","output_resolutions":["720p","480p","1080p"],"input_first_frame":true,"input_first_last_frame":true,"aspect_ratio_allowed":["16:9","4:3","1:1","3:4","9:16","21:9","adaptive"],"duration_range":[3,12],"input_last_frame":false,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false},"originalTypes":["video_generate","image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_request_per_minute":600,"max_concurrent_requests":10}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"volces","sourceProviderName":"火山引擎(豆包)","sourceSpecType":"volces","originalTypes":["video_generate","image_to_video"],"alias":"豆包Seedance-pro","description":"","iconPath":"https://static.51easyai.com/minimax-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"doubao-seedance-1-0-pro-250528","types":["video_generate","image_to_video"],"alias":"豆包Seedance-pro","model_limits":{"max_request_per_minute":600,"max_concurrent_requests":10},"icon_path":"https://static.51easyai.com/minimax-color.png","capabilities":{"video_generate":{"output_resolutions":["720p","480p","1080p"],"aspect_ratio_allowed":["16:9","4:3","1:1","3:4","9:16","21:9","adaptive"],"duration_range":[3,12]},"image_to_video":{"input_smart_multi_frame":true,"smart_multi_frame_range":[2,5],"smart_multi_frame_mode":"stitch","output_resolutions":["720p","480p","1080p"],"input_first_frame":true,"input_first_last_frame":true,"aspect_ratio_allowed":["16:9","4:3","1:1","3:4","9:16","21:9","adaptive"],"duration_range":[3,12],"input_last_frame":false,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'volces' OR provider_code = 'volces' LIMIT 1), 'volces', 'volces:doubao-seedance-1-5-pro-251215', 'doubao-seedance-1-5-pro-251215', 'video_generate', '豆包Seedance-1.5-pro', '{"video_generate":{"output_resolutions":["720p","480p","1080p"],"aspect_ratio_allowed":["16:9","4:3","1:1","3:4","9:16","21:9","adaptive"],"duration_range":[3,12],"output_audio":true},"image_to_video":{"input_smart_multi_frame":true,"smart_multi_frame_range":[2,5],"smart_multi_frame_mode":"stitch","output_resolutions":["720p","480p","1080p"],"input_first_frame":true,"input_first_last_frame":true,"aspect_ratio_allowed":["16:9","4:3","1:1","3:4","9:16","21:9","adaptive"],"duration_range":[4,12],"input_last_frame":false,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"output_audio":true},"originalTypes":["video_generate","image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_request_per_minute":600,"max_concurrent_requests":10}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"volces","sourceProviderName":"火山引擎(豆包)","sourceSpecType":"volces","originalTypes":["video_generate","image_to_video"],"alias":"豆包Seedance-1.5-pro","description":"","iconPath":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"doubao-seedance-1-5-pro-251215","types":["video_generate","image_to_video"],"alias":"豆包Seedance-1.5-pro","icon_path":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","model_limits":{"max_request_per_minute":600,"max_concurrent_requests":10},"capabilities":{"video_generate":{"output_resolutions":["720p","480p","1080p"],"aspect_ratio_allowed":["16:9","4:3","1:1","3:4","9:16","21:9","adaptive"],"duration_range":[3,12],"output_audio":true},"image_to_video":{"input_smart_multi_frame":true,"smart_multi_frame_range":[2,5],"smart_multi_frame_mode":"stitch","output_resolutions":["720p","480p","1080p"],"input_first_frame":true,"input_first_last_frame":true,"aspect_ratio_allowed":["16:9","4:3","1:1","3:4","9:16","21:9","adaptive"],"duration_range":[4,12],"input_last_frame":false,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"output_audio":true}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'volces' OR provider_code = 'volces' LIMIT 1), 'volces', 'volces:doubao-seedance-1-0-pro-fast-251015', 'doubao-seedance-1-0-pro-fast-251015', 'video_generate', '豆包Seedance-pro-fast', '{"video_generate":{"output_resolutions":["720p","480p","1080p"],"aspect_ratio_allowed":["16:9","4:3","1:1","3:4","9:16","21:9","adaptive"],"duration_range":[3,12]},"image_to_video":{"output_resolutions":["720p","480p","1080p"],"input_first_frame":true,"input_first_last_frame":false,"aspect_ratio_allowed":["16:9","4:3","1:1","3:4","9:16","21:9","adaptive"],"duration_range":[3,12],"input_last_frame":false,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false},"originalTypes":["video_generate","image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_request_per_minute":600,"max_concurrent_requests":10}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"volces","sourceProviderName":"火山引擎(豆包)","sourceSpecType":"volces","originalTypes":["video_generate","image_to_video"],"alias":"豆包Seedance-pro-fast","description":"","iconPath":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"doubao-seedance-1-0-pro-fast-251015","types":["video_generate","image_to_video"],"model_limits":{"max_request_per_minute":600,"max_concurrent_requests":10},"alias":"豆包Seedance-pro-fast","icon_path":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","capabilities":{"video_generate":{"output_resolutions":["720p","480p","1080p"],"aspect_ratio_allowed":["16:9","4:3","1:1","3:4","9:16","21:9","adaptive"],"duration_range":[3,12]},"image_to_video":{"output_resolutions":["720p","480p","1080p"],"input_first_frame":true,"input_first_last_frame":false,"aspect_ratio_allowed":["16:9","4:3","1:1","3:4","9:16","21:9","adaptive"],"duration_range":[3,12],"input_last_frame":false,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'volces' OR provider_code = 'volces' LIMIT 1), 'volces', 'volces:doubao-seedance-2-0-260128', 'doubao-seedance-2-0-260128', 'video_generate', '豆包Seedance-2.0', '{"video_generate":{"output_resolutions":["720p","480p","1080p"],"aspect_ratio_allowed":["16:9","4:3","1:1","3:4","9:16","21:9","adaptive"],"duration_range":[4,15],"input_audio":true,"output_audio":true,"output_support_return_last_frame":true,"output_video_continuation":true,"max_images":9,"max_videos":3},"image_to_video":{"output_resolutions":["720p","480p","1080p"],"input_first_frame":true,"input_first_last_frame":true,"input_last_frame":false,"input_reference_generate_single":true,"input_reference_generate_multiple":true,"aspect_ratio_allowed":["16:9","4:3","1:1","3:4","9:16","21:9","adaptive"],"duration_range":[4,15],"input_audio":true,"support_video_effect_template":false,"output_audio":true,"output_support_return_last_frame":true,"output_video_continuation":true,"max_images":9,"max_videos":3,"max_images_for_last_frame":2},"omni_video":{"supported_modes":["element_reference","text_to_video","image_reference","first_last_frame","video_reference","video_edit","multi_shot"],"output_resolutions":["720p","480p","1080p"],"aspect_ratio_allowed":["16:9","4:3","1:1","3:4","9:16","21:9","adaptive"],"duration_options":[4,5,6,7,8,9,10,11,12,13,14,15],"output_audio":true,"max_videos":3,"max_images":9,"max_elements":9,"max_images_and_elements":9,"max_images_for_last_frame":2,"support_instruction_edit":true},"originalTypes":["video_generate","image_to_video","omni_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_request_per_minute":600,"max_concurrent_requests":10}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"volces","sourceProviderName":"火山引擎(豆包)","sourceSpecType":"volces","originalTypes":["video_generate","image_to_video","omni_video"],"alias":"豆包Seedance-2.0","description":"","iconPath":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"doubao-seedance-2-0-260128","types":["video_generate","image_to_video","omni_video"],"alias":"豆包Seedance-2.0","icon_path":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","model_limits":{"max_request_per_minute":600,"max_concurrent_requests":10},"capabilities":{"video_generate":{"output_resolutions":["720p","480p","1080p"],"aspect_ratio_allowed":["16:9","4:3","1:1","3:4","9:16","21:9","adaptive"],"duration_range":[4,15],"input_audio":true,"output_audio":true,"output_support_return_last_frame":true,"output_video_continuation":true,"max_images":9,"max_videos":3},"image_to_video":{"output_resolutions":["720p","480p","1080p"],"input_first_frame":true,"input_first_last_frame":true,"input_last_frame":false,"input_reference_generate_single":true,"input_reference_generate_multiple":true,"aspect_ratio_allowed":["16:9","4:3","1:1","3:4","9:16","21:9","adaptive"],"duration_range":[4,15],"input_audio":true,"support_video_effect_template":false,"output_audio":true,"output_support_return_last_frame":true,"output_video_continuation":true,"max_images":9,"max_videos":3,"max_images_for_last_frame":2},"omni_video":{"supported_modes":["element_reference","text_to_video","image_reference","first_last_frame","video_reference","video_edit","multi_shot"],"output_resolutions":["720p","480p","1080p"],"aspect_ratio_allowed":["16:9","4:3","1:1","3:4","9:16","21:9","adaptive"],"duration_options":[4,5,6,7,8,9,10,11,12,13,14,15],"output_audio":true,"max_videos":3,"max_images":9,"max_elements":9,"max_images_and_elements":9,"max_images_for_last_frame":2,"support_instruction_edit":true}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'volces' OR provider_code = 'volces' LIMIT 1), 'volces', 'volces:doubao-seedance-2-0-fast-260128', 'doubao-seedance-2-0-fast-260128', 'video_generate', '豆包Seedance-2.0-fast', '{"video_generate":{"output_resolutions":["720p","480p"],"aspect_ratio_allowed":["16:9","4:3","1:1","3:4","9:16","21:9","adaptive"],"duration_range":[4,15],"input_audio":true,"output_audio":true,"output_support_return_last_frame":true,"output_video_continuation":true,"max_images":9,"max_videos":3},"image_to_video":{"output_resolutions":["720p","480p"],"input_first_frame":true,"input_first_last_frame":true,"input_last_frame":false,"input_reference_generate_single":true,"input_reference_generate_multiple":true,"aspect_ratio_allowed":["16:9","4:3","1:1","3:4","9:16","21:9","adaptive"],"duration_range":[4,15],"input_audio":true,"support_video_effect_template":false,"output_audio":true,"output_support_return_last_frame":true,"output_video_continuation":true,"max_images":9,"max_videos":3,"max_images_for_last_frame":2},"omni_video":{"supported_modes":["element_reference","text_to_video","image_reference","first_last_frame","video_reference","video_edit","multi_shot"],"output_resolutions":["720p","480p"],"aspect_ratio_allowed":["16:9","4:3","1:1","3:4","9:16","21:9","adaptive"],"duration_options":[4,5,6,7,8,9,10,11,12,13,14,15],"output_audio":true,"max_videos":3,"max_images":9,"max_elements":9,"max_images_and_elements":9,"max_images_for_last_frame":2,"support_instruction_edit":true},"originalTypes":["video_generate","image_to_video","omni_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_request_per_minute":600,"max_concurrent_requests":10}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"volces","sourceProviderName":"火山引擎(豆包)","sourceSpecType":"volces","originalTypes":["video_generate","image_to_video","omni_video"],"alias":"豆包Seedance-2.0-fast","description":"","iconPath":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"doubao-seedance-2-0-fast-260128","types":["video_generate","image_to_video","omni_video"],"alias":"豆包Seedance-2.0-fast","icon_path":"https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg","model_limits":{"max_request_per_minute":600,"max_concurrent_requests":10},"capabilities":{"video_generate":{"output_resolutions":["720p","480p"],"aspect_ratio_allowed":["16:9","4:3","1:1","3:4","9:16","21:9","adaptive"],"duration_range":[4,15],"input_audio":true,"output_audio":true,"output_support_return_last_frame":true,"output_video_continuation":true,"max_images":9,"max_videos":3},"image_to_video":{"output_resolutions":["720p","480p"],"input_first_frame":true,"input_first_last_frame":true,"input_last_frame":false,"input_reference_generate_single":true,"input_reference_generate_multiple":true,"aspect_ratio_allowed":["16:9","4:3","1:1","3:4","9:16","21:9","adaptive"],"duration_range":[4,15],"input_audio":true,"support_video_effect_template":false,"output_audio":true,"output_support_return_last_frame":true,"output_video_continuation":true,"max_images":9,"max_videos":3,"max_images_for_last_frame":2},"omni_video":{"supported_modes":["element_reference","text_to_video","image_reference","first_last_frame","video_reference","video_edit","multi_shot"],"output_resolutions":["720p","480p"],"aspect_ratio_allowed":["16:9","4:3","1:1","3:4","9:16","21:9","adaptive"],"duration_options":[4,5,6,7,8,9,10,11,12,13,14,15],"output_audio":true,"max_videos":3,"max_images":9,"max_elements":9,"max_images_and_elements":9,"max_images_for_last_frame":2,"support_instruction_edit":true}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'jimeng' OR provider_code = 'jimeng' LIMIT 1), 'jimeng', 'jimeng:jimeng_high_aes_general_v21_L', 'jimeng_high_aes_general_v21_L', 'image_generate', '即梦V2.1文生图', '{"image_generate":{"output_resolutions":["1K"],"output_max_size":4194304,"width_height_range":[256,768],"aspect_ratio_range":[0.5625,0.5625],"output_multiple_images":false},"originalTypes":["image_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":2}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"jimeng","sourceProviderName":"即梦AI","sourceSpecType":"jimeng","originalTypes":["image_generate"],"alias":"即梦V2.1文生图","description":"","iconPath":"https://static.51easyai.com/jimeng-logo.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"jimeng_high_aes_general_v21_L","types":["image_generate"],"alias":"即梦V2.1文生图","icon_path":"https://static.51easyai.com/jimeng-logo.png","capabilities":{"image_generate":{"output_resolutions":["1K"],"output_max_size":4194304,"width_height_range":[256,768],"aspect_ratio_range":[0.5625,0.5625],"output_multiple_images":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'jimeng' OR provider_code = 'jimeng' LIMIT 1), 'jimeng', 'jimeng:jimeng_t2i_v30', 'jimeng_t2i_v30', 'image_generate', '即梦V3.0文生图', '{"image_generate":{"output_resolutions":["1K","2K"],"output_max_size":4194304,"width_height_range":[512,2048],"aspect_ratio_range":[0.3333333333333333,1],"output_multiple_images":false},"originalTypes":["image_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":2}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"jimeng","sourceProviderName":"即梦AI","sourceSpecType":"jimeng","originalTypes":["image_generate"],"alias":"即梦V3.0文生图","description":"","iconPath":"https://static.51easyai.com/jimeng-logo.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"jimeng_t2i_v30","types":["image_generate"],"alias":"即梦V3.0文生图","icon_path":"https://static.51easyai.com/jimeng-logo.png","capabilities":{"image_generate":{"output_resolutions":["1K","2K"],"output_max_size":4194304,"width_height_range":[512,2048],"aspect_ratio_range":[0.3333333333333333,1],"output_multiple_images":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'jimeng' OR provider_code = 'jimeng' LIMIT 1), 'jimeng', 'jimeng:jimeng_t2i_v31', 'jimeng_t2i_v31', 'image_generate', '即梦V3.1文生图', '{"image_generate":{"output_resolutions":["1K","2K"],"output_max_size":4194304,"width_height_range":[512,2048],"aspect_ratio_range":[0.3333333333333333,1],"output_multiple_images":false},"originalTypes":["image_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":2}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"jimeng","sourceProviderName":"即梦AI","sourceSpecType":"jimeng","originalTypes":["image_generate"],"alias":"即梦V3.1文生图","description":"","iconPath":"https://static.51easyai.com/jimeng-logo.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"jimeng_t2i_v31","types":["image_generate"],"alias":"即梦V3.1文生图","icon_path":"https://static.51easyai.com/jimeng-logo.png","capabilities":{"image_generate":{"output_resolutions":["1K","2K"],"output_max_size":4194304,"width_height_range":[512,2048],"aspect_ratio_range":[0.3333333333333333,1],"output_multiple_images":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'jimeng' OR provider_code = 'jimeng' LIMIT 1), 'jimeng', 'jimeng:jimeng_i2i_v30', 'jimeng_i2i_v30', 'image_edit', '即梦V3.0图像智能参考', '{"image_edit":{"input_multiple_images":false,"output_resolutions":["1K","2K"],"width_height_range":[512,2016],"aspect_ratio_range":[0.0625,16],"output_multiple_images":false},"originalTypes":["image_edit"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":2}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"jimeng","sourceProviderName":"即梦AI","sourceSpecType":"jimeng","originalTypes":["image_edit"],"alias":"即梦V3.0图像智能参考","description":"","iconPath":"https://static.51easyai.com/jimeng-logo.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"jimeng_i2i_v30","types":["image_edit"],"alias":"即梦V3.0图像智能参考","icon_path":"https://static.51easyai.com/jimeng-logo.png","capabilities":{"image_edit":{"input_multiple_images":false,"output_resolutions":["1K","2K"],"width_height_range":[512,2016],"aspect_ratio_range":[0.0625,16],"output_multiple_images":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'jimeng' OR provider_code = 'jimeng' LIMIT 1), 'jimeng', 'jimeng:jimeng_t2i_v40', 'jimeng_t2i_v40', 'image_edit', '即梦V4.0图像生成及编辑', '{"image_edit":{"input_multiple_images":true,"input_max_images_count":10,"input_parameters":[{"type":"url","parameter":"image_urls"}],"output_resolutions":["1K","2K","4K"],"allow_custom_width_height_size":true,"output_max_size":16777216,"width_height_range":[1024,4096],"aspect_ratio_range":[0.0625,16],"output_multiple_images":false},"image_generate":{"output_multiple_images":true,"output_resolutions":["1K","2K","4K"],"output_max_size":16777216,"allow_custom_width_height_size":true,"aspect_ratio_range":[0.0625,16],"width_height_range":[1024,6198]},"originalTypes":["image_edit","image_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":1}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"jimeng","sourceProviderName":"即梦AI","sourceSpecType":"jimeng","originalTypes":["image_edit","image_generate"],"alias":"即梦V4.0图像生成及编辑","description":"","iconPath":"https://static.51easyai.com/jimeng-logo.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"jimeng_t2i_v40","types":["image_edit","image_generate"],"alias":"即梦V4.0图像生成及编辑","icon_path":"https://static.51easyai.com/jimeng-logo.png","model_limits":{"max_concurrent_requests":1},"capabilities":{"image_edit":{"input_multiple_images":true,"input_max_images_count":10,"input_parameters":[{"type":"url","parameter":"image_urls"}],"output_resolutions":["1K","2K","4K"],"allow_custom_width_height_size":true,"output_max_size":16777216,"width_height_range":[1024,4096],"aspect_ratio_range":[0.0625,16],"output_multiple_images":false},"image_generate":{"output_multiple_images":true,"output_resolutions":["1K","2K","4K"],"output_max_size":16777216,"allow_custom_width_height_size":true,"aspect_ratio_range":[0.0625,16],"width_height_range":[1024,6198]}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'jimeng' OR provider_code = 'jimeng' LIMIT 1), 'jimeng', 'jimeng:jimeng_t2v_v30', 'jimeng_t2v_v30', 'video_generate', '即梦文生视频V3.0', '{"video_generate":{"output_resolutions":["720p"],"duration_range":[5,10],"aspect_ratio_allowed":["16:9","4:3","1:1","3:4","9:16","21:9"]},"originalTypes":["video_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":1}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"jimeng","sourceProviderName":"即梦AI","sourceSpecType":"jimeng","originalTypes":["video_generate"],"alias":"即梦文生视频V3.0","description":"","iconPath":"https://static.51easyai.com/jimeng-logo.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"jimeng_t2v_v30","types":["video_generate"],"alias":"即梦文生视频V3.0","icon_path":"https://static.51easyai.com/jimeng-logo.png","model_limits":{"max_concurrent_requests":1},"capabilities":{"video_generate":{"output_resolutions":["720p"],"duration_range":[5,10],"aspect_ratio_allowed":["16:9","4:3","1:1","3:4","9:16","21:9"]}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'jimeng' OR provider_code = 'jimeng' LIMIT 1), 'jimeng', 'jimeng:jimeng_ti2v_v30_pro', 'jimeng_ti2v_v30_pro', 'video_generate', '即梦视频生成V3.0_Pro', '{"video_generate":{"output_resolutions":["1080p"],"duration_range":[5,10],"aspect_ratio_allowed":["16:9","4:3","1:1","3:4","9:16","21:9"]},"image_to_video":{"output_resolutions":["1080p"],"duration_range":[5,10],"input_width_height_range":[320,4096],"input_size_limit":4928307.2,"input_first_frame":true,"aspect_ratio_allowed":[],"input_last_frame":false,"input_first_last_frame":false,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false},"originalTypes":["video_generate","image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":1}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"jimeng","sourceProviderName":"即梦AI","sourceSpecType":"jimeng","originalTypes":["video_generate","image_to_video"],"alias":"即梦视频生成V3.0_Pro","description":"","iconPath":"https://static.51easyai.com/jimeng-logo.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"jimeng_ti2v_v30_pro","types":["video_generate","image_to_video"],"alias":"即梦视频生成V3.0_Pro","icon_path":"https://static.51easyai.com/jimeng-logo.png","model_limits":{"max_concurrent_requests":1},"capabilities":{"video_generate":{"output_resolutions":["1080p"],"duration_range":[5,10],"aspect_ratio_allowed":["16:9","4:3","1:1","3:4","9:16","21:9"]},"image_to_video":{"output_resolutions":["1080p"],"duration_range":[5,10],"input_width_height_range":[320,4096],"input_size_limit":4928307.2,"input_first_frame":true,"aspect_ratio_allowed":[],"input_last_frame":false,"input_first_last_frame":false,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'jimeng' OR provider_code = 'jimeng' LIMIT 1), 'jimeng', 'jimeng:jimeng_i2v_first_v30', 'jimeng_i2v_first_v30', 'image_to_video', '即梦图生视频V3.0', '{"image_to_video":{"output_resolutions":["720p"],"duration_range":[5,10],"input_width_height_range":[320,4096],"input_size_limit":4928307.2,"input_first_frame":true,"aspect_ratio_allowed":[],"input_last_frame":false,"input_first_last_frame":false,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false},"originalTypes":["image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":1}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"jimeng","sourceProviderName":"即梦AI","sourceSpecType":"jimeng","originalTypes":["image_to_video"],"alias":"即梦图生视频V3.0","description":"","iconPath":"https://static.51easyai.com/jimeng-logo.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"jimeng_i2v_first_v30","types":["image_to_video"],"alias":"即梦图生视频V3.0","icon_path":"https://static.51easyai.com/jimeng-logo.png","model_limits":{"max_concurrent_requests":1},"capabilities":{"image_to_video":{"output_resolutions":["720p"],"duration_range":[5,10],"input_width_height_range":[320,4096],"input_size_limit":4928307.2,"input_first_frame":true,"aspect_ratio_allowed":[],"input_last_frame":false,"input_first_last_frame":false,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'jimeng' OR provider_code = 'jimeng' LIMIT 1), 'jimeng', 'jimeng:jimeng_i2v_first_tail_v30', 'jimeng_i2v_first_tail_v30', 'image_to_video', '即梦首尾帧视频生成V3.0', '{"image_to_video":{"input_smart_multi_frame":true,"smart_multi_frame_range":[2,5],"smart_multi_frame_mode":"stitch","output_resolutions":["720p"],"duration_range":[5,10],"input_width_height_range":[320,4096],"input_size_limit":4928307.2,"input_first_frame":false,"input_first_last_frame":true,"aspect_ratio_allowed":[],"input_last_frame":false,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false},"originalTypes":["image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":1}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"jimeng","sourceProviderName":"即梦AI","sourceSpecType":"jimeng","originalTypes":["image_to_video"],"alias":"即梦首尾帧视频生成V3.0","description":"","iconPath":"https://static.51easyai.com/jimeng-logo.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"jimeng_i2v_first_tail_v30","types":["image_to_video"],"alias":"即梦首尾帧视频生成V3.0","icon_path":"https://static.51easyai.com/jimeng-logo.png","model_limits":{"max_concurrent_requests":1},"capabilities":{"image_to_video":{"input_smart_multi_frame":true,"smart_multi_frame_range":[2,5],"smart_multi_frame_mode":"stitch","output_resolutions":["720p"],"duration_range":[5,10],"input_width_height_range":[320,4096],"input_size_limit":4928307.2,"input_first_frame":false,"input_first_last_frame":true,"aspect_ratio_allowed":[],"input_last_frame":false,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'jimeng' OR provider_code = 'jimeng' LIMIT 1), 'jimeng', 'jimeng:jimeng_t2v_v30_1080p', 'jimeng_t2v_v30_1080p', 'video_generate', '即梦文生视频V3.0_1080p', '{"video_generate":{"output_resolutions":["1080p"],"duration_range":[5,10],"aspect_ratio_allowed":["16:9","4:3","1:1","3:4","9:16","21:9"]},"originalTypes":["video_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":1}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"jimeng","sourceProviderName":"即梦AI","sourceSpecType":"jimeng","originalTypes":["video_generate"],"alias":"即梦文生视频V3.0_1080p","description":"","iconPath":"https://static.51easyai.com/jimeng-logo.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"jimeng_t2v_v30_1080p","types":["video_generate"],"alias":"即梦文生视频V3.0_1080p","icon_path":"https://static.51easyai.com/jimeng-logo.png","model_limits":{"max_concurrent_requests":1},"capabilities":{"video_generate":{"output_resolutions":["1080p"],"duration_range":[5,10],"aspect_ratio_allowed":["16:9","4:3","1:1","3:4","9:16","21:9"]}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'jimeng' OR provider_code = 'jimeng' LIMIT 1), 'jimeng', 'jimeng:jimeng_i2v_first_v30_1080', 'jimeng_i2v_first_v30_1080', 'image_to_video', '即梦图生视频V3.0_1080p', '{"image_to_video":{"output_resolutions":["1080p"],"duration_range":[5,10],"input_width_height_range":[320,4096],"input_size_limit":4928307.2,"input_first_frame":true,"aspect_ratio_allowed":[],"input_last_frame":false,"input_first_last_frame":false,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false},"originalTypes":["image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":1}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"jimeng","sourceProviderName":"即梦AI","sourceSpecType":"jimeng","originalTypes":["image_to_video"],"alias":"即梦图生视频V3.0_1080p","description":"","iconPath":"https://static.51easyai.com/jimeng-logo.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"jimeng_i2v_first_v30_1080","types":["image_to_video"],"alias":"即梦图生视频V3.0_1080p","icon_path":"https://static.51easyai.com/jimeng-logo.png","model_limits":{"max_concurrent_requests":1},"capabilities":{"image_to_video":{"output_resolutions":["1080p"],"duration_range":[5,10],"input_width_height_range":[320,4096],"input_size_limit":4928307.2,"input_first_frame":true,"aspect_ratio_allowed":[],"input_last_frame":false,"input_first_last_frame":false,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'jimeng' OR provider_code = 'jimeng' LIMIT 1), 'jimeng', 'jimeng:jimeng_i2v_first_tail_v30_1080', 'jimeng_i2v_first_tail_v30_1080', 'image_to_video', '即梦图生视频V3.0_1080p_首尾帧', '{"image_to_video":{"input_smart_multi_frame":true,"smart_multi_frame_range":[2,5],"smart_multi_frame_mode":"stitch","output_resolutions":["1080p"],"duration_range":[5,10],"input_width_height_range":[320,4096],"input_size_limit":4928307.2,"input_first_frame":false,"input_first_last_frame":true,"aspect_ratio_allowed":[],"input_last_frame":false,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false},"originalTypes":["image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":1}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"jimeng","sourceProviderName":"即梦AI","sourceSpecType":"jimeng","originalTypes":["image_to_video"],"alias":"即梦图生视频V3.0_1080p_首尾帧","description":"","iconPath":"https://static.51easyai.com/jimeng-logo.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"jimeng_i2v_first_tail_v30_1080","types":["image_to_video"],"alias":"即梦图生视频V3.0_1080p_首尾帧","icon_path":"https://static.51easyai.com/jimeng-logo.png","model_limits":{"max_concurrent_requests":1},"capabilities":{"image_to_video":{"input_smart_multi_frame":true,"smart_multi_frame_range":[2,5],"smart_multi_frame_mode":"stitch","output_resolutions":["1080p"],"duration_range":[5,10],"input_width_height_range":[320,4096],"input_size_limit":4928307.2,"input_first_frame":false,"input_first_last_frame":true,"aspect_ratio_allowed":[],"input_last_frame":false,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'jimeng' OR provider_code = 'jimeng' LIMIT 1), 'jimeng', 'jimeng:jimeng_digital_human_V1', 'jimeng_digital_human_V1', 'digital_human_generate', '即梦数字人V1', '{"originalTypes":["digital_human_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":1}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"jimeng","sourceProviderName":"即梦AI","sourceSpecType":"jimeng","originalTypes":["digital_human_generate"],"alias":"即梦数字人V1","description":"","iconPath":"https://static.51easyai.com/jimeng-logo.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"jimeng_digital_human_V1","types":["digital_human_generate"],"alias":"即梦数字人V1","icon_path":"https://static.51easyai.com/jimeng-logo.png","model_limits":{"max_concurrent_requests":1}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'jimeng' OR provider_code = 'jimeng' LIMIT 1), 'jimeng', 'jimeng:realman_avatar_picture_v2', 'realman_avatar_picture_v2', 'digital_human_generate', '即梦单图音频驱动-普通模式', '{"originalTypes":["digital_human_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":1}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"jimeng","sourceProviderName":"即梦AI","sourceSpecType":"jimeng","originalTypes":["digital_human_generate"],"alias":"即梦单图音频驱动-普通模式","description":"","iconPath":"https://static.51easyai.com/jimeng-logo.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"realman_avatar_picture_v2","types":["digital_human_generate"],"alias":"即梦单图音频驱动-普通模式","icon_path":"https://static.51easyai.com/jimeng-logo.png","model_limits":{"max_concurrent_requests":1}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'jimeng' OR provider_code = 'jimeng' LIMIT 1), 'jimeng', 'jimeng:realman_avatar_picture_loopy', 'realman_avatar_picture_loopy', 'digital_human_generate', '即梦单图音频驱动-灵动模式', '{"originalTypes":["digital_human_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":1}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"jimeng","sourceProviderName":"即梦AI","sourceSpecType":"jimeng","originalTypes":["digital_human_generate"],"alias":"即梦单图音频驱动-灵动模式","description":"","iconPath":"https://static.51easyai.com/jimeng-logo.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"realman_avatar_picture_loopy","types":["digital_human_generate"],"alias":"即梦单图音频驱动-灵动模式","icon_path":"https://static.51easyai.com/jimeng-logo.png","model_limits":{"max_concurrent_requests":1}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'jimeng' OR provider_code = 'jimeng' LIMIT 1), 'jimeng', 'jimeng:realman_change_lips', 'realman_change_lips', 'digital_human_generate', '即梦视频改口型Lite模式', '{"originalTypes":["digital_human_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":1}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"jimeng","sourceProviderName":"即梦AI","sourceSpecType":"jimeng","originalTypes":["digital_human_generate"],"alias":"即梦视频改口型Lite模式","description":"","iconPath":"https://static.51easyai.com/jimeng-logo.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"realman_change_lips","types":["digital_human_generate"],"alias":"即梦视频改口型Lite模式","icon_path":"https://static.51easyai.com/jimeng-logo.png","model_limits":{"max_concurrent_requests":1}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'jimeng' OR provider_code = 'jimeng' LIMIT 1), 'jimeng', 'jimeng:realman_avatar_picture_loopyb', 'realman_avatar_picture_loopyb', 'digital_human_generate', '即梦单图音频驱动-大画幅灵动模式', '{"originalTypes":["digital_human_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":1}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"jimeng","sourceProviderName":"即梦AI","sourceSpecType":"jimeng","originalTypes":["digital_human_generate"],"alias":"即梦单图音频驱动-大画幅灵动模式","description":"","iconPath":"https://static.51easyai.com/jimeng-logo.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"realman_avatar_picture_loopyb","types":["digital_human_generate"],"alias":"即梦单图音频驱动-大画幅灵动模式","icon_path":"https://static.51easyai.com/jimeng-logo.png","model_limits":{"max_concurrent_requests":1}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'jimeng' OR provider_code = 'jimeng' LIMIT 1), 'jimeng', 'jimeng:jimeng_dream_actor_m1_gen_video_cv', 'jimeng_dream_actor_m1_gen_video_cv', 'digital_human_generate', '即梦动作模仿', '{"originalTypes":["digital_human_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":1}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"jimeng","sourceProviderName":"即梦AI","sourceSpecType":"jimeng","originalTypes":["digital_human_generate"],"alias":"即梦动作模仿","description":"","iconPath":"https://static.51easyai.com/jimeng-logo.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"jimeng_dream_actor_m1_gen_video_cv","types":["digital_human_generate"],"alias":"即梦动作模仿","icon_path":"https://static.51easyai.com/jimeng-logo.png","model_limits":{"max_concurrent_requests":1}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'jimeng' OR provider_code = 'jimeng' LIMIT 1), 'jimeng', 'jimeng:jimeng_dreamactor_m20_gen_video', 'jimeng_dreamactor_m20_gen_video', 'digital_human_generate', '即梦动作模仿2.0', '{"originalTypes":["digital_human_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":1}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"jimeng","sourceProviderName":"即梦AI","sourceSpecType":"jimeng","originalTypes":["digital_human_generate"],"alias":"即梦动作模仿2.0","description":"","iconPath":"https://static.51easyai.com/jimeng-logo.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"jimeng_dreamactor_m20_gen_video","types":["digital_human_generate"],"alias":"即梦动作模仿2.0","icon_path":"https://static.51easyai.com/jimeng-logo.png","model_limits":{"max_concurrent_requests":1}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'jimeng' OR provider_code = 'jimeng' LIMIT 1), 'jimeng', 'jimeng:jimeng_realman_avatar_picture_omni_v2', 'jimeng_realman_avatar_picture_omni_v2', 'digital_human_generate', '即梦数字人快速模式1.0', '{"originalTypes":["digital_human_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":1}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"jimeng","sourceProviderName":"即梦AI","sourceSpecType":"jimeng","originalTypes":["digital_human_generate"],"alias":"即梦数字人快速模式1.0","description":"","iconPath":"https://static.51easyai.com/jimeng-logo.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"jimeng_realman_avatar_picture_omni_v2","types":["digital_human_generate"],"alias":"即梦数字人快速模式1.0","icon_path":"https://static.51easyai.com/jimeng-logo.png","model_limits":{"max_concurrent_requests":1}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'jimeng' OR provider_code = 'jimeng' LIMIT 1), 'jimeng', 'jimeng:jimeng_realman_avatar_picture_omni_v15', 'jimeng_realman_avatar_picture_omni_v15', 'digital_human_generate', '即梦数字人快速模式1.5', '{"originalTypes":["digital_human_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":1}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"jimeng","sourceProviderName":"即梦AI","sourceSpecType":"jimeng","originalTypes":["digital_human_generate"],"alias":"即梦数字人快速模式1.5","description":"","iconPath":"https://static.51easyai.com/jimeng-logo.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"jimeng_realman_avatar_picture_omni_v15","types":["digital_human_generate"],"alias":"即梦数字人快速模式1.5","icon_path":"https://static.51easyai.com/jimeng-logo.png","model_limits":{"max_concurrent_requests":1}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'silicon-flow-openai' OR provider_code = 'silicon-flow-openai' LIMIT 1), 'silicon-flow-openai', 'silicon-flow-openai:deepseek-ai/DeepSeek-V3', 'deepseek-ai/DeepSeek-V3', 'text_generate', 'deepseek-ai/DeepSeek-V3', '{"originalTypes":["text_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":-1}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"silicon-flow-openai","sourceProviderName":"硅基流动","sourceSpecType":"openai","originalTypes":["text_generate"],"alias":"","description":"","iconPath":"","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"deepseek-ai/DeepSeek-V3","types":["text_generate"]}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'silicon-flow-openai' OR provider_code = 'silicon-flow-openai' LIMIT 1), 'silicon-flow-openai', 'silicon-flow-openai:deepseek-ai/DeepSeek-R1', 'deepseek-ai/DeepSeek-R1', 'text_generate', 'deepseek-ai/DeepSeek-R1', '{"originalTypes":["text_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":-1}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"silicon-flow-openai","sourceProviderName":"硅基流动","sourceSpecType":"openai","originalTypes":["text_generate"],"alias":"","description":"","iconPath":"","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"deepseek-ai/DeepSeek-R1","types":["text_generate"]}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'tripo3d' OR provider_code = 'tripo3d' LIMIT 1), 'tripo3d', 'tripo3d:Turbo-v1.0-20250506', 'Turbo-v1.0-20250506', 'text_to_model', '3D文生3D图Turbo-v1.0', '{"text_to_model":{"support_texture":true,"support_part_generation":false,"max_face_limit":1000000,"max_face_limit_quad":500000},"originalTypes":["text_to_model"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":10}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"tripo3d","sourceProviderName":"Tripo3D","sourceSpecType":"tripo3d","originalTypes":["text_to_model"],"alias":"3D文生3D图Turbo-v1.0","description":"","iconPath":"https://static.51easyai.com/tripo-logo.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"Turbo-v1.0-20250506","types":["text_to_model"],"alias":"3D文生3D图Turbo-v1.0","icon_path":"https://static.51easyai.com/tripo-logo.png","capabilities":{"text_to_model":{"support_texture":true,"support_part_generation":false,"max_face_limit":1000000,"max_face_limit_quad":500000}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'tripo3d' OR provider_code = 'tripo3d' LIMIT 1), 'tripo3d', 'tripo3d:v2.5-20250123', 'v2.5-20250123', 'text_to_model', '3D文生3D图v2.5', '{"text_to_model":{"support_texture":true,"support_part_generation":true,"max_face_limit":1000000,"max_face_limit_quad":500000},"originalTypes":["text_to_model"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":10}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"tripo3d","sourceProviderName":"Tripo3D","sourceSpecType":"tripo3d","originalTypes":["text_to_model"],"alias":"3D文生3D图v2.5","description":"","iconPath":"https://static.51easyai.com/tripo-logo.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"v2.5-20250123","types":["text_to_model"],"alias":"3D文生3D图v2.5","icon_path":"https://static.51easyai.com/tripo-logo.png","capabilities":{"text_to_model":{"support_texture":true,"support_part_generation":true,"max_face_limit":1000000,"max_face_limit_quad":500000}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'tripo3d' OR provider_code = 'tripo3d' LIMIT 1), 'tripo3d', 'tripo3d:Turbo-v1.0-20250506:2', 'Turbo-v1.0-20250506', 'image_to_model', '3D图生3D图Turbo-v1.0', '{"image_to_model":{"support_texture":true,"support_part_generation":false,"max_face_limit":1000000,"max_face_limit_quad":500000,"support_image_autofix":true},"originalTypes":["image_to_model"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":10}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"tripo3d","sourceProviderName":"Tripo3D","sourceSpecType":"tripo3d","originalTypes":["image_to_model"],"alias":"3D图生3D图Turbo-v1.0","description":"","iconPath":"https://static.51easyai.com/tripo-logo.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"Turbo-v1.0-20250506","types":["image_to_model"],"alias":"3D图生3D图Turbo-v1.0","icon_path":"https://static.51easyai.com/tripo-logo.png","capabilities":{"image_to_model":{"support_texture":true,"support_part_generation":false,"max_face_limit":1000000,"max_face_limit_quad":500000,"support_image_autofix":true}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'tripo3d' OR provider_code = 'tripo3d' LIMIT 1), 'tripo3d', 'tripo3d:v2.5-20250123:2', 'v2.5-20250123', 'image_to_model', '3D图生3D图v2.5', '{"image_to_model":{"support_texture":true,"support_part_generation":true,"max_face_limit":1000000,"max_face_limit_quad":500000,"support_image_autofix":true},"originalTypes":["image_to_model"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":10}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"tripo3d","sourceProviderName":"Tripo3D","sourceSpecType":"tripo3d","originalTypes":["image_to_model"],"alias":"3D图生3D图v2.5","description":"","iconPath":"https://static.51easyai.com/tripo-logo.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"v2.5-20250123","types":["image_to_model"],"alias":"3D图生3D图v2.5","icon_path":"https://static.51easyai.com/tripo-logo.png","capabilities":{"image_to_model":{"support_texture":true,"support_part_generation":true,"max_face_limit":1000000,"max_face_limit_quad":500000,"support_image_autofix":true}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'tripo3d' OR provider_code = 'tripo3d' LIMIT 1), 'tripo3d', 'tripo3d:v2.5-20250123:3', 'v2.5-20250123', 'multiview_to_model', '3D多视图生3D图v2.5', '{"multiview_to_model":{"support_texture":true,"support_part_generation":false,"max_face_limit":1000000,"max_face_limit_quad":500000},"originalTypes":["multiview_to_model"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":10}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"tripo3d","sourceProviderName":"Tripo3D","sourceSpecType":"tripo3d","originalTypes":["multiview_to_model"],"alias":"3D多视图生3D图v2.5","description":"","iconPath":"https://static.51easyai.com/tripo-logo.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"v2.5-20250123","types":["multiview_to_model"],"alias":"3D多视图生3D图v2.5","icon_path":"https://static.51easyai.com/tripo-logo.png","capabilities":{"multiview_to_model":{"support_texture":true,"support_part_generation":false,"max_face_limit":1000000,"max_face_limit_quad":500000}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'tripo3d' OR provider_code = 'tripo3d' LIMIT 1), 'tripo3d', 'tripo3d:v2.5-20250123:4', 'v2.5-20250123', 'mesh_edit', '3D纹理管线v2.5', '{"mesh_edit":{"supported_operations":{"texture":{"supported":true,"supported_formats":["glb"]}}},"originalTypes":["mesh_edit"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":10}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"tripo3d","sourceProviderName":"Tripo3D","sourceSpecType":"tripo3d","originalTypes":["mesh_edit"],"alias":"3D纹理管线v2.5","description":"","iconPath":"https://static.51easyai.com/tripo-logo.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"v2.5-20250123","types":["mesh_edit"],"alias":"3D纹理管线v2.5","icon_path":"https://static.51easyai.com/tripo-logo.png","capabilities":{"mesh_edit":{"supported_operations":{"texture":{"supported":true,"supported_formats":["glb"]}}}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'tripo3d' OR provider_code = 'tripo3d' LIMIT 1), 'tripo3d', 'tripo3d:v1.0-20250506', 'v1.0-20250506', 'mesh_edit', '3D拆分/补全模型v1.0', '{"mesh_edit":{"supported_operations":{"segmentation":{"supported":true},"completion":{"supported":true}}},"originalTypes":["mesh_edit"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":10}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"tripo3d","sourceProviderName":"Tripo3D","sourceSpecType":"tripo3d","originalTypes":["mesh_edit"],"alias":"3D拆分/补全模型v1.0","description":"","iconPath":"https://static.51easyai.com/tripo-logo.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"v1.0-20250506","types":["mesh_edit"],"alias":"3D拆分/补全模型v1.0","icon_path":"https://static.51easyai.com/tripo-logo.png","capabilities":{"mesh_edit":{"supported_operations":{"segmentation":{"supported":true},"completion":{"supported":true}}}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'tripo3d' OR provider_code = 'tripo3d' LIMIT 1), 'tripo3d', 'tripo3d:P-v2.0-20251225', 'P-v2.0-20251225', 'mesh_edit', '3D重拓扑模型v2.0', '{"mesh_edit":{"supported_operations":{"smart_lowpoly":{"supported":true,"smart_low_poly_face_limit":{"triangle":{"min":1000,"max":20000},"quad":{"min":500,"max":10000}}}}},"originalTypes":["mesh_edit"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":10}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"tripo3d","sourceProviderName":"Tripo3D","sourceSpecType":"tripo3d","originalTypes":["mesh_edit"],"alias":"3D重拓扑模型v2.0","description":"","iconPath":"https://static.51easyai.com/tripo-logo.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"P-v2.0-20251225","types":["mesh_edit"],"alias":"3D重拓扑模型v2.0","icon_path":"https://static.51easyai.com/tripo-logo.png","capabilities":{"mesh_edit":{"supported_operations":{"smart_lowpoly":{"supported":true,"smart_low_poly_face_limit":{"triangle":{"min":1000,"max":20000},"quad":{"min":500,"max":10000}}}}}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'tripo3d' OR provider_code = 'tripo3d' LIMIT 1), 'tripo3d', 'tripo3d:v2.5-20260210', 'v2.5-20260210', 'mesh_edit', '3D绑定算法v2.5', '{"mesh_edit":{"supported_operations":{"check_riggable":{"supported":true},"rig":{"supported":true},"retarget_animation":{"supported":true}}},"originalTypes":["mesh_edit"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":10}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"tripo3d","sourceProviderName":"Tripo3D","sourceSpecType":"tripo3d","originalTypes":["mesh_edit"],"alias":"3D绑定算法v2.5","description":"","iconPath":"https://static.51easyai.com/tripo-logo.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"v2.5-20260210","types":["mesh_edit"],"alias":"3D绑定算法v2.5","icon_path":"https://static.51easyai.com/tripo-logo.png","capabilities":{"mesh_edit":{"supported_operations":{"check_riggable":{"supported":true},"rig":{"supported":true},"retarget_animation":{"supported":true}}}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'tripo3d' OR provider_code = 'tripo3d' LIMIT 1), 'tripo3d', 'tripo3d:v2.0-20250506', 'v2.0-20250506', 'mesh_edit', '3D绑定算法v2.0', '{"mesh_edit":{"supported_operations":{"check_riggable":{"supported":true},"rig":{"supported":true},"retarget_animation":{"supported":true}}},"originalTypes":["mesh_edit"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":10}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"tripo3d","sourceProviderName":"Tripo3D","sourceSpecType":"tripo3d","originalTypes":["mesh_edit"],"alias":"3D绑定算法v2.0","description":"","iconPath":"https://static.51easyai.com/tripo-logo.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"v2.0-20250506","types":["mesh_edit"],"alias":"3D绑定算法v2.0","icon_path":"https://static.51easyai.com/tripo-logo.png","capabilities":{"mesh_edit":{"supported_operations":{"check_riggable":{"supported":true},"rig":{"supported":true},"retarget_animation":{"supported":true}}}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'tripo3d' OR provider_code = 'tripo3d' LIMIT 1), 'tripo3d', 'tripo3d:v1.0-20240301', 'v1.0-20240301', 'mesh_edit', '3D绑定算法v1.0', '{"mesh_edit":{"supported_operations":{"check_riggable":{"supported":true},"rig":{"supported":true},"retarget_animation":{"supported":true}}},"originalTypes":["mesh_edit"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":10}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"tripo3d","sourceProviderName":"Tripo3D","sourceSpecType":"tripo3d","originalTypes":["mesh_edit"],"alias":"3D绑定算法v1.0","description":"","iconPath":"https://static.51easyai.com/tripo-logo.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"v1.0-20240301","types":["mesh_edit"],"alias":"3D绑定算法v1.0","icon_path":"https://static.51easyai.com/tripo-logo.png","capabilities":{"mesh_edit":{"supported_operations":{"check_riggable":{"supported":true},"rig":{"supported":true},"retarget_animation":{"supported":true}}}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'tripo3d' OR provider_code = 'tripo3d' LIMIT 1), 'tripo3d', 'tripo3d:v3.0-20250812', 'v3.0-20250812', 'multiview_to_model', 'Trip3D-v3.0', '{"text_to_model":{"geometry_quality_options":["standard","detailed"],"support_texture":true,"support_part_generation":true,"face_limit_by_geometry_quality":{"standard":{"triangle":1000000,"quad":500000},"detailed":{"triangle":2000000,"quad":1000000}}},"image_to_model":{"geometry_quality_options":["standard","detailed"],"support_texture":true,"support_part_generation":true,"face_limit_by_geometry_quality":{"standard":{"triangle":1000000,"quad":500000},"detailed":{"triangle":2000000,"quad":1000000}},"support_image_autofix":true},"multiview_to_model":{"geometry_quality_options":["standard","detailed"],"support_texture":true,"support_part_generation":false,"face_limit_by_geometry_quality":{"standard":{"triangle":1000000,"quad":500000},"detailed":{"triangle":2000000,"quad":1000000}}},"mesh_edit":{"supported_operations":{"texture":{"supported":true,"supported_formats":["glb"]},"convert":{"supported":true,"supported_formats":["glb","gltf","usdz","fbx","obj","stl","3mf"]},"refine":{"supported":true},"stylize":{"supported":true}}},"originalTypes":["multiview_to_model","text_to_model","image_to_model","mesh_edit"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":10}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"tripo3d","sourceProviderName":"Tripo3D","sourceSpecType":"tripo3d","originalTypes":["multiview_to_model","text_to_model","image_to_model","mesh_edit"],"alias":"Trip3D-v3.0","description":"","iconPath":"https://static.51easyai.com/tripo-logo.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"v3.0-20250812","types":["multiview_to_model","text_to_model","image_to_model","mesh_edit"],"alias":"Trip3D-v3.0","icon_path":"https://static.51easyai.com/tripo-logo.png","capabilities":{"text_to_model":{"geometry_quality_options":["standard","detailed"],"support_texture":true,"support_part_generation":true,"face_limit_by_geometry_quality":{"standard":{"triangle":1000000,"quad":500000},"detailed":{"triangle":2000000,"quad":1000000}}},"image_to_model":{"geometry_quality_options":["standard","detailed"],"support_texture":true,"support_part_generation":true,"face_limit_by_geometry_quality":{"standard":{"triangle":1000000,"quad":500000},"detailed":{"triangle":2000000,"quad":1000000}},"support_image_autofix":true},"multiview_to_model":{"geometry_quality_options":["standard","detailed"],"support_texture":true,"support_part_generation":false,"face_limit_by_geometry_quality":{"standard":{"triangle":1000000,"quad":500000},"detailed":{"triangle":2000000,"quad":1000000}}},"mesh_edit":{"supported_operations":{"texture":{"supported":true,"supported_formats":["glb"]},"convert":{"supported":true,"supported_formats":["glb","gltf","usdz","fbx","obj","stl","3mf"]},"refine":{"supported":true},"stylize":{"supported":true}}}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'tripo3d' OR provider_code = 'tripo3d' LIMIT 1), 'tripo3d', 'tripo3d:v3.1-20260211', 'v3.1-20260211', 'multiview_to_model', 'Trip3D-v3.1', '{"text_to_model":{"geometry_quality_options":["standard","detailed"],"support_texture":true,"support_part_generation":true,"face_limit_by_geometry_quality":{"standard":{"triangle":1000000,"quad":500000},"detailed":{"triangle":2000000,"quad":1000000}}},"image_to_model":{"geometry_quality_options":["standard","detailed"],"support_texture":true,"support_part_generation":true,"face_limit_by_geometry_quality":{"standard":{"triangle":1000000,"quad":500000},"detailed":{"triangle":2000000,"quad":1000000}},"support_image_autofix":true},"multiview_to_model":{"geometry_quality_options":["standard","detailed"],"support_texture":true,"support_part_generation":false,"face_limit_by_geometry_quality":{"standard":{"triangle":1000000,"quad":500000},"detailed":{"triangle":2000000,"quad":1000000}}},"mesh_edit":{"supported_operations":{"texture":{"supported":true,"supported_formats":["glb"]},"convert":{"supported":true,"supported_formats":["glb","gltf","usdz","fbx","obj","stl","3mf"]},"refine":{"supported":true},"stylize":{"supported":true}}},"originalTypes":["multiview_to_model","text_to_model","image_to_model","mesh_edit"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":10}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"tripo3d","sourceProviderName":"Tripo3D","sourceSpecType":"tripo3d","originalTypes":["multiview_to_model","text_to_model","image_to_model","mesh_edit"],"alias":"Trip3D-v3.1","description":"","iconPath":"https://static.51easyai.com/tripo-logo.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"v3.1-20260211","types":["multiview_to_model","text_to_model","image_to_model","mesh_edit"],"alias":"Trip3D-v3.1","icon_path":"https://static.51easyai.com/tripo-logo.png","capabilities":{"text_to_model":{"geometry_quality_options":["standard","detailed"],"support_texture":true,"support_part_generation":true,"face_limit_by_geometry_quality":{"standard":{"triangle":1000000,"quad":500000},"detailed":{"triangle":2000000,"quad":1000000}}},"image_to_model":{"geometry_quality_options":["standard","detailed"],"support_texture":true,"support_part_generation":true,"face_limit_by_geometry_quality":{"standard":{"triangle":1000000,"quad":500000},"detailed":{"triangle":2000000,"quad":1000000}},"support_image_autofix":true},"multiview_to_model":{"geometry_quality_options":["standard","detailed"],"support_texture":true,"support_part_generation":false,"face_limit_by_geometry_quality":{"standard":{"triangle":1000000,"quad":500000},"detailed":{"triangle":2000000,"quad":1000000}}},"mesh_edit":{"supported_operations":{"texture":{"supported":true,"supported_formats":["glb"]},"convert":{"supported":true,"supported_formats":["glb","gltf","usdz","fbx","obj","stl","3mf"]},"refine":{"supported":true},"stylize":{"supported":true}}}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'tripo3d' OR provider_code = 'tripo3d' LIMIT 1), 'tripo3d', 'tripo3d:P1-20260311', 'P1-20260311', 'text_to_model', 'Trip3D-P1', '{"text_to_model":{"support_texture":true,"support_part_generation":false,"support_quad":false,"support_smart_low_poly":false,"face_limit_range":{"min":48,"max":20000}},"image_to_model":{"support_texture":true,"support_part_generation":false,"support_quad":false,"support_smart_low_poly":false,"face_limit_range":{"min":48,"max":20000},"support_image_autofix":true},"multiview_to_model":{"support_texture":true,"support_part_generation":false,"support_quad":false,"support_smart_low_poly":false,"face_limit_range":{"min":48,"max":20000}},"originalTypes":["text_to_model","image_to_model","multiview_to_model"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":10}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"tripo3d","sourceProviderName":"Tripo3D","sourceSpecType":"tripo3d","originalTypes":["text_to_model","image_to_model","multiview_to_model"],"alias":"Trip3D-P1","description":"","iconPath":"https://static.51easyai.com/tripo-logo.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"P1-20260311","types":["text_to_model","image_to_model","multiview_to_model"],"alias":"Trip3D-P1","icon_path":"https://static.51easyai.com/tripo-logo.png","capabilities":{"text_to_model":{"support_texture":true,"support_part_generation":false,"support_quad":false,"support_smart_low_poly":false,"face_limit_range":{"min":48,"max":20000}},"image_to_model":{"support_texture":true,"support_part_generation":false,"support_quad":false,"support_smart_low_poly":false,"face_limit_range":{"min":48,"max":20000},"support_image_autofix":true},"multiview_to_model":{"support_texture":true,"support_part_generation":false,"support_quad":false,"support_smart_low_poly":false,"face_limit_range":{"min":48,"max":20000}}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'tencent-hunyuan-image' OR provider_code = 'tencent-hunyuan-image' LIMIT 1), 'tencent-hunyuan-image', 'tencent-hunyuan-image:Image-GI', 'Image-GI', 'image_generate', 'Nano Banana Pro 预览版', '{"image_generate":{"output_resolutions":["1K","2K","4K"],"aspect_ratio_allowed":["1:1","2:3","3:2","3:4","4:3","4:5","5:4","9:16","16:9","21:9"],"output_multiple_images":true,"output_max_images_count":4},"image_edit":{"output_resolutions":["1K","2K","4K"],"aspect_ratio_allowed":["1:1","2:3","3:2","3:4","4:3","4:5","5:4","9:16","16:9","21:9"],"output_multiple_images":true,"output_max_images_count":4,"input_multiple_images":true,"input_max_images_count":11},"originalTypes":["image_generate","image_edit"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":3,"max_request_per_second":20}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"tencent-hunyuan-image","sourceProviderName":"腾讯混元生图(第三方)","sourceSpecType":"tencent-hunyuan-image","originalTypes":["image_generate","image_edit"],"alias":"Nano Banana Pro 预览版","description":"","iconPath":"https://static.51easyai.com/gemini-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"Image-GI","types":["image_generate","image_edit"],"alias":"Nano Banana Pro 预览版","icon_path":"https://static.51easyai.com/gemini-color.png","capabilities":{"image_generate":{"output_resolutions":["1K","2K","4K"],"aspect_ratio_allowed":["1:1","2:3","3:2","3:4","4:3","4:5","5:4","9:16","16:9","21:9"],"output_multiple_images":true,"output_max_images_count":4},"image_edit":{"output_resolutions":["1K","2K","4K"],"aspect_ratio_allowed":["1:1","2:3","3:2","3:4","4:3","4:5","5:4","9:16","16:9","21:9"],"output_multiple_images":true,"output_max_images_count":4,"input_multiple_images":true,"input_max_images_count":11}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'tencent-hunyuan-image' OR provider_code = 'tencent-hunyuan-image' LIMIT 1), 'tencent-hunyuan-image', 'tencent-hunyuan-image:Image-GI2', 'Image-GI2', 'image_generate', 'Nano Banana 2', '{"image_generate":{"output_resolutions":["1K","2K","4K"],"aspect_ratio_allowed":["1:1","2:3","3:2","3:4","4:3","4:5","5:4","9:16","16:9","21:9"],"output_multiple_images":true,"output_max_images_count":4},"image_edit":{"output_resolutions":["1K","2K","4K"],"aspect_ratio_allowed":["1:1","2:3","3:2","3:4","4:3","4:5","5:4","9:16","16:9","21:9"],"output_multiple_images":true,"output_max_images_count":4,"input_multiple_images":true,"input_max_images_count":11},"originalTypes":["image_generate","image_edit"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":3,"max_request_per_second":20}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"tencent-hunyuan-image","sourceProviderName":"腾讯混元生图(第三方)","sourceSpecType":"tencent-hunyuan-image","originalTypes":["image_generate","image_edit"],"alias":"Nano Banana 2","description":"","iconPath":"https://static.51easyai.com/gemini-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"Image-GI2","types":["image_generate","image_edit"],"alias":"Nano Banana 2","icon_path":"https://static.51easyai.com/gemini-color.png","capabilities":{"image_generate":{"output_resolutions":["1K","2K","4K"],"aspect_ratio_allowed":["1:1","2:3","3:2","3:4","4:3","4:5","5:4","9:16","16:9","21:9"],"output_multiple_images":true,"output_max_images_count":4},"image_edit":{"output_resolutions":["1K","2K","4K"],"aspect_ratio_allowed":["1:1","2:3","3:2","3:4","4:3","4:5","5:4","9:16","16:9","21:9"],"output_multiple_images":true,"output_max_images_count":4,"input_multiple_images":true,"input_max_images_count":11}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'tencent-hunyuan-video' OR provider_code = 'tencent-hunyuan-video' LIMIT 1), 'tencent-hunyuan-video', 'tencent-hunyuan-video:v1.6', 'v1.6', 'video_generate', '可灵V1.6', '{"video_generate":{"output_resolutions":["720p","1080p"],"aspect_ratio_allowed":["16:9","1:1","9:16"],"duration_range":[5,10]},"image_to_video":{"input_last_frame":true,"input_first_last_frame":true,"input_first_frame":true,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"output_resolutions":["720p","1080p"],"duration_range":[5,10]},"originalTypes":["video_generate","image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":3,"max_request_per_second":20}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"tencent-hunyuan-video","sourceProviderName":"腾讯混元视频(第三方)","sourceSpecType":"tencent-hunyuan-video","originalTypes":["video_generate","image_to_video"],"alias":"可灵V1.6","description":"","iconPath":"https://static.51easyai.com/kling-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"v1.6","alias":"可灵V1.6","icon_path":"https://static.51easyai.com/kling-color.webp","types":["video_generate","image_to_video"],"capabilities":{"video_generate":{"output_resolutions":["720p","1080p"],"aspect_ratio_allowed":["16:9","1:1","9:16"],"duration_range":[5,10]},"image_to_video":{"input_last_frame":true,"input_first_last_frame":true,"input_first_frame":true,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"output_resolutions":["720p","1080p"],"duration_range":[5,10]}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'tencent-hunyuan-video' OR provider_code = 'tencent-hunyuan-video' LIMIT 1), 'tencent-hunyuan-video', 'tencent-hunyuan-video:v2.0', 'v2.0', 'video_generate', '可灵V2-大师级', '{"video_generate":{"output_resolutions":["720p"],"aspect_ratio_allowed":["16:9","1:1","9:16"],"duration_range":[5,10]},"image_to_video":{"input_last_frame":false,"input_first_last_frame":false,"input_first_frame":true,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"output_resolutions":["720p"],"duration_range":[5,10]},"originalTypes":["video_generate","image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":3,"max_request_per_second":20}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"tencent-hunyuan-video","sourceProviderName":"腾讯混元视频(第三方)","sourceSpecType":"tencent-hunyuan-video","originalTypes":["video_generate","image_to_video"],"alias":"可灵V2-大师级","description":"","iconPath":"https://static.51easyai.com/kling-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"v2.0","alias":"可灵V2-大师级","icon_path":"https://static.51easyai.com/kling-color.webp","types":["video_generate","image_to_video"],"capabilities":{"video_generate":{"output_resolutions":["720p"],"aspect_ratio_allowed":["16:9","1:1","9:16"],"duration_range":[5,10]},"image_to_video":{"input_last_frame":false,"input_first_last_frame":false,"input_first_frame":true,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"output_resolutions":["720p"],"duration_range":[5,10]}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'tencent-hunyuan-video' OR provider_code = 'tencent-hunyuan-video' LIMIT 1), 'tencent-hunyuan-video', 'tencent-hunyuan-video:v2.1m', 'v2.1m', 'video_generate', '可灵V2.1-大师级', '{"video_generate":{"output_resolutions":["1080p"],"aspect_ratio_allowed":["16:9","1:1","9:16"],"duration_range":[5,10]},"image_to_video":{"input_last_frame":false,"input_first_last_frame":false,"input_first_frame":true,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"output_resolutions":["1080p"],"duration_range":[5,10]},"originalTypes":["video_generate","image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":3,"max_request_per_second":20}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"tencent-hunyuan-video","sourceProviderName":"腾讯混元视频(第三方)","sourceSpecType":"tencent-hunyuan-video","originalTypes":["video_generate","image_to_video"],"alias":"可灵V2.1-大师级","description":"","iconPath":"https://static.51easyai.com/kling-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"v2.1m","alias":"可灵V2.1-大师级","icon_path":"https://static.51easyai.com/kling-color.webp","types":["video_generate","image_to_video"],"capabilities":{"video_generate":{"output_resolutions":["1080p"],"aspect_ratio_allowed":["16:9","1:1","9:16"],"duration_range":[5,10]},"image_to_video":{"input_last_frame":false,"input_first_last_frame":false,"input_first_frame":true,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"output_resolutions":["1080p"],"duration_range":[5,10]}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'tencent-hunyuan-video' OR provider_code = 'tencent-hunyuan-video' LIMIT 1), 'tencent-hunyuan-video', 'tencent-hunyuan-video:v2.5', 'v2.5', 'video_generate', '可灵V2.5-turbo', '{"video_generate":{"output_resolutions":["720p","1080p"],"aspect_ratio_allowed":["16:9","1:1","9:16"],"duration_range":[5,10]},"image_to_video":{"input_last_frame":false,"input_first_last_frame":true,"input_first_frame":true,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"output_resolutions":["720p","1080p"],"duration_range":[5,10]},"originalTypes":["video_generate","image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":3,"max_request_per_second":20}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"tencent-hunyuan-video","sourceProviderName":"腾讯混元视频(第三方)","sourceSpecType":"tencent-hunyuan-video","originalTypes":["video_generate","image_to_video"],"alias":"可灵V2.5-turbo","description":"","iconPath":"https://static.51easyai.com/kling-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"v2.5","alias":"可灵V2.5-turbo","icon_path":"https://static.51easyai.com/kling-color.webp","types":["video_generate","image_to_video"],"capabilities":{"video_generate":{"output_resolutions":["720p","1080p"],"aspect_ratio_allowed":["16:9","1:1","9:16"],"duration_range":[5,10]},"image_to_video":{"input_last_frame":false,"input_first_last_frame":true,"input_first_frame":true,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"output_resolutions":["720p","1080p"],"duration_range":[5,10]}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'tencent-hunyuan-video' OR provider_code = 'tencent-hunyuan-video' LIMIT 1), 'tencent-hunyuan-video', 'tencent-hunyuan-video:v2.6', 'v2.6', 'video_generate', '可灵V2.6', '{"video_generate":{"output_resolutions":["1080p"],"aspect_ratio_allowed":["16:9","1:1","9:16"],"duration_range":[5,10],"output_audio":true},"image_to_video":{"input_last_frame":false,"input_first_last_frame":true,"input_first_frame":true,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"output_resolutions":["1080p"],"duration_range":[5,10],"output_audio":true},"originalTypes":["video_generate","image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":3,"max_request_per_second":20}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"tencent-hunyuan-video","sourceProviderName":"腾讯混元视频(第三方)","sourceSpecType":"tencent-hunyuan-video","originalTypes":["video_generate","image_to_video"],"alias":"可灵V2.6","description":"","iconPath":"https://static.51easyai.com/kling-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"v2.6","alias":"可灵V2.6","icon_path":"https://static.51easyai.com/kling-color.webp","types":["video_generate","image_to_video"],"capabilities":{"video_generate":{"output_resolutions":["1080p"],"aspect_ratio_allowed":["16:9","1:1","9:16"],"duration_range":[5,10],"output_audio":true},"image_to_video":{"input_last_frame":false,"input_first_last_frame":true,"input_first_frame":true,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"output_resolutions":["1080p"],"duration_range":[5,10],"output_audio":true}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'tencent-hunyuan-video' OR provider_code = 'tencent-hunyuan-video' LIMIT 1), 'tencent-hunyuan-video', 'tencent-hunyuan-video:v3.0', 'v3.0', 'video_generate', '可灵V3', '{"video_generate":{"output_resolutions":["720p","1080p","2160p"],"aspect_ratio_allowed":["16:9","1:1","9:16"],"duration_range":[3,15],"output_audio":true,"prompt_length_limit":{"max":2500,"count_mode":"non_ascii_weighted","label":"可灵口径"}},"image_to_video":{"input_last_frame":false,"input_first_last_frame":true,"input_first_frame":true,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"output_resolutions":["720p","1080p","2160p"],"aspect_ratio_allowed":["16:9","1:1","9:16"],"duration_range":[3,15],"output_audio":true,"prompt_length_limit":{"max":2500,"count_mode":"non_ascii_weighted","label":"可灵口径"}},"originalTypes":["video_generate","image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":3,"max_request_per_second":20}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"tencent-hunyuan-video","sourceProviderName":"腾讯混元视频(第三方)","sourceSpecType":"tencent-hunyuan-video","originalTypes":["video_generate","image_to_video"],"alias":"可灵V3","description":"","iconPath":"https://static.51easyai.com/kling-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"v3.0","alias":"可灵V3","icon_path":"https://static.51easyai.com/kling-color.webp","types":["video_generate","image_to_video"],"capabilities":{"video_generate":{"output_resolutions":["720p","1080p","2160p"],"aspect_ratio_allowed":["16:9","1:1","9:16"],"duration_range":[3,15],"output_audio":true,"prompt_length_limit":{"max":2500,"count_mode":"non_ascii_weighted","label":"可灵口径"}},"image_to_video":{"input_last_frame":false,"input_first_last_frame":true,"input_first_frame":true,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"output_resolutions":["720p","1080p","2160p"],"aspect_ratio_allowed":["16:9","1:1","9:16"],"duration_range":[3,15],"output_audio":true,"prompt_length_limit":{"max":2500,"count_mode":"non_ascii_weighted","label":"可灵口径"}}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'tencent-hunyuan-video' OR provider_code = 'tencent-hunyuan-video' LIMIT 1), 'tencent-hunyuan-video', 'tencent-hunyuan-video:kling_motion_control_v2_6', 'kling_motion_control_v2_6', 'digital_human_generate', '可灵动作控制V2.6', '{"originalTypes":["digital_human_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":10}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"tencent-hunyuan-video","sourceProviderName":"腾讯混元视频(第三方)","sourceSpecType":"tencent-hunyuan-video","originalTypes":["digital_human_generate"],"alias":"可灵动作控制V2.6","description":"","iconPath":"https://static.51easyai.com/kling-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"kling_motion_control_v2_6","alias":"可灵动作控制V2.6","icon_path":"https://static.51easyai.com/kling-color.webp","types":["digital_human_generate"],"model_limits":{"max_concurrent_requests":10}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'tencent-hunyuan-video' OR provider_code = 'tencent-hunyuan-video' LIMIT 1), 'tencent-hunyuan-video', 'tencent-hunyuan-video:kling_motion_control_v3_0', 'kling_motion_control_v3_0', 'digital_human_generate', '可灵动作控制V3.0', '{"originalTypes":["digital_human_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":10}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"tencent-hunyuan-video","sourceProviderName":"腾讯混元视频(第三方)","sourceSpecType":"tencent-hunyuan-video","originalTypes":["digital_human_generate"],"alias":"可灵动作控制V3.0","description":"","iconPath":"https://static.51easyai.com/kling-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"kling_motion_control_v3_0","alias":"可灵动作控制V3.0","icon_path":"https://static.51easyai.com/kling-color.webp","types":["digital_human_generate"],"model_limits":{"max_concurrent_requests":10}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'tencent-hunyuan-video' OR provider_code = 'tencent-hunyuan-video' LIMIT 1), 'tencent-hunyuan-video', 'tencent-hunyuan-video:kling-video-o1', 'kling-video-o1', 'omni_video', '可灵O1', '{"omni_video":{"supported_modes":["text_to_video","image_reference","element_reference","first_last_frame","video_reference","video_edit"],"output_resolutions":["720p","1080p"],"aspect_ratio_allowed":["16:9","1:1","9:16"],"duration_options":[3,4,5,6,7,8,9,10],"output_audio":true,"input_audio":false,"max_videos":1,"max_audios":0,"max_images":7,"max_elements":7,"max_images_and_elements":7,"limits_with_video":{"max_images_and_elements":4},"support_instruction_edit":true,"prompt_length_limit":{"max":2500,"count_mode":"non_ascii_weighted","label":"可灵口径"}},"originalTypes":["omni_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":3,"max_request_per_second":20}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"tencent-hunyuan-video","sourceProviderName":"腾讯混元视频(第三方)","sourceSpecType":"tencent-hunyuan-video","originalTypes":["omni_video"],"alias":"可灵O1","description":"","iconPath":"https://static.51easyai.com/kling-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"kling-video-o1","alias":"可灵O1","icon_path":"https://static.51easyai.com/kling-color.webp","types":["omni_video"],"capabilities":{"omni_video":{"supported_modes":["text_to_video","image_reference","element_reference","first_last_frame","video_reference","video_edit"],"output_resolutions":["720p","1080p"],"aspect_ratio_allowed":["16:9","1:1","9:16"],"duration_options":[3,4,5,6,7,8,9,10],"output_audio":true,"input_audio":false,"max_videos":1,"max_audios":0,"max_images":7,"max_elements":7,"max_images_and_elements":7,"limits_with_video":{"max_images_and_elements":4},"support_instruction_edit":true,"prompt_length_limit":{"max":2500,"count_mode":"non_ascii_weighted","label":"可灵口径"}}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'tencent-hunyuan-video' OR provider_code = 'tencent-hunyuan-video' LIMIT 1), 'tencent-hunyuan-video', 'tencent-hunyuan-video:kling-v3-omni', 'kling-v3-omni', 'omni_video', '可灵V3多模态', '{"omni_video":{"supported_modes":["text_to_video","image_reference","element_reference","first_last_frame","video_reference","video_edit","multi_shot"],"output_resolutions":["720p","1080p","2160p"],"aspect_ratio_allowed":["16:9","1:1","9:16"],"duration_options":[3,4,5,6,7,8,9,10,11,12,13,14,15],"output_audio":true,"input_audio":false,"max_videos":1,"max_audios":0,"max_images":7,"max_elements":7,"max_images_and_elements":7,"limits_with_video":{"max_images_and_elements":4,"duration_options":[3,4,5,6,7,8,9,10]},"support_instruction_edit":true,"prompt_length_limit":{"max":2500,"count_mode":"non_ascii_weighted","label":"可灵口径"}},"originalTypes":["omni_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":3,"max_request_per_second":20}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"tencent-hunyuan-video","sourceProviderName":"腾讯混元视频(第三方)","sourceSpecType":"tencent-hunyuan-video","originalTypes":["omni_video"],"alias":"可灵V3多模态","description":"","iconPath":"https://static.51easyai.com/kling-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"kling-v3-omni","alias":"可灵V3多模态","icon_path":"https://static.51easyai.com/kling-color.webp","types":["omni_video"],"capabilities":{"omni_video":{"supported_modes":["text_to_video","image_reference","element_reference","first_last_frame","video_reference","video_edit","multi_shot"],"output_resolutions":["720p","1080p","2160p"],"aspect_ratio_allowed":["16:9","1:1","9:16"],"duration_options":[3,4,5,6,7,8,9,10,11,12,13,14,15],"output_audio":true,"input_audio":false,"max_videos":1,"max_audios":0,"max_images":7,"max_elements":7,"max_images_and_elements":7,"limits_with_video":{"max_images_and_elements":4,"duration_options":[3,4,5,6,7,8,9,10]},"support_instruction_edit":true,"prompt_length_limit":{"max":2500,"count_mode":"non_ascii_weighted","label":"可灵口径"}}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'tencent-hunyuan-video' OR provider_code = 'tencent-hunyuan-video' LIMIT 1), 'tencent-hunyuan-video', 'tencent-hunyuan-video:viduq2', 'viduq2', 'video_generate', 'Vidu-Q2', '{"video_generate":{"output_resolutions":["480p","720p","1080p"],"aspect_ratio_allowed":["16:9","9:16","4:3","3:4","1:1"],"duration_range":[1,10]},"originalTypes":["video_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":3,"max_request_per_second":20}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"tencent-hunyuan-video","sourceProviderName":"腾讯混元视频(第三方)","sourceSpecType":"tencent-hunyuan-video","originalTypes":["video_generate"],"alias":"Vidu-Q2","description":"","iconPath":"https://static.51easyai.com/vidu-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"viduq2","alias":"Vidu-Q2","icon_path":"https://static.51easyai.com/vidu-color.webp","types":["video_generate"],"capabilities":{"video_generate":{"output_resolutions":["480p","720p","1080p"],"aspect_ratio_allowed":["16:9","9:16","4:3","3:4","1:1"],"duration_range":[1,10]}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'tencent-hunyuan-video' OR provider_code = 'tencent-hunyuan-video' LIMIT 1), 'tencent-hunyuan-video', 'tencent-hunyuan-video:viduq2-pro', 'viduq2-pro', 'image_to_video', 'Vidu-Q2-Pro', '{"image_to_video":{"input_last_frame":false,"input_first_last_frame":true,"input_first_frame":true,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"output_resolutions":["480p","720p","1080p"],"duration_range":[1,10],"output_audio":true},"originalTypes":["image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":3,"max_request_per_second":20}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"tencent-hunyuan-video","sourceProviderName":"腾讯混元视频(第三方)","sourceSpecType":"tencent-hunyuan-video","originalTypes":["image_to_video"],"alias":"Vidu-Q2-Pro","description":"","iconPath":"https://static.51easyai.com/vidu-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"viduq2-pro","alias":"Vidu-Q2-Pro","icon_path":"https://static.51easyai.com/vidu-color.webp","types":["image_to_video"],"capabilities":{"image_to_video":{"input_last_frame":false,"input_first_last_frame":true,"input_first_frame":true,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"output_resolutions":["480p","720p","1080p"],"duration_range":[1,10],"output_audio":true}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'tencent-hunyuan-video' OR provider_code = 'tencent-hunyuan-video' LIMIT 1), 'tencent-hunyuan-video', 'tencent-hunyuan-video:viduq2-turbo', 'viduq2-turbo', 'image_to_video', 'Vidu-Q2-Turbo', '{"image_to_video":{"input_last_frame":false,"input_first_last_frame":true,"input_first_frame":true,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"output_resolutions":["480p","720p","1080p"],"duration_range":[1,10],"output_audio":true},"originalTypes":["image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":3,"max_request_per_second":20}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"tencent-hunyuan-video","sourceProviderName":"腾讯混元视频(第三方)","sourceSpecType":"tencent-hunyuan-video","originalTypes":["image_to_video"],"alias":"Vidu-Q2-Turbo","description":"","iconPath":"https://static.51easyai.com/vidu-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"viduq2-turbo","alias":"Vidu-Q2-Turbo","icon_path":"https://static.51easyai.com/vidu-color.webp","types":["image_to_video"],"capabilities":{"image_to_video":{"input_last_frame":false,"input_first_last_frame":true,"input_first_frame":true,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"output_resolutions":["480p","720p","1080p"],"duration_range":[1,10],"output_audio":true}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'tencent-hunyuan-video' OR provider_code = 'tencent-hunyuan-video' LIMIT 1), 'tencent-hunyuan-video', 'tencent-hunyuan-video:viduq3-pro', 'viduq3-pro', 'video_generate', 'Vidu-Q3-Pro', '{"video_generate":{"output_resolutions":["480p","720p","1080p"],"aspect_ratio_allowed":["16:9","9:16","4:3","3:4","1:1"],"duration_range":[1,16],"output_audio":true},"image_to_video":{"input_last_frame":false,"input_first_last_frame":false,"input_first_frame":true,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"output_resolutions":["480p","720p","1080p"],"duration_range":[1,16],"output_audio":true},"originalTypes":["video_generate","image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":3,"max_request_per_second":20}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"tencent-hunyuan-video","sourceProviderName":"腾讯混元视频(第三方)","sourceSpecType":"tencent-hunyuan-video","originalTypes":["video_generate","image_to_video"],"alias":"Vidu-Q3-Pro","description":"","iconPath":"https://static.51easyai.com/vidu-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"viduq3-pro","alias":"Vidu-Q3-Pro","icon_path":"https://static.51easyai.com/vidu-color.webp","types":["video_generate","image_to_video"],"capabilities":{"video_generate":{"output_resolutions":["480p","720p","1080p"],"aspect_ratio_allowed":["16:9","9:16","4:3","3:4","1:1"],"duration_range":[1,16],"output_audio":true},"image_to_video":{"input_last_frame":false,"input_first_last_frame":false,"input_first_frame":true,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"output_resolutions":["480p","720p","1080p"],"duration_range":[1,16],"output_audio":true}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'tencent-hunyuan-video' OR provider_code = 'tencent-hunyuan-video' LIMIT 1), 'tencent-hunyuan-video', 'tencent-hunyuan-video:viduq3-turbo', 'viduq3-turbo', 'video_generate', 'Vidu-Q3-Turbo', '{"video_generate":{"output_resolutions":["480p","720p","1080p"],"aspect_ratio_allowed":["16:9","9:16","4:3","3:4","1:1"],"duration_range":[1,16],"output_audio":true},"image_to_video":{"input_last_frame":false,"input_first_last_frame":false,"input_first_frame":true,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"output_resolutions":["480p","720p","1080p"],"duration_range":[1,16],"output_audio":true},"originalTypes":["video_generate","image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":3,"max_request_per_second":20}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"tencent-hunyuan-video","sourceProviderName":"腾讯混元视频(第三方)","sourceSpecType":"tencent-hunyuan-video","originalTypes":["video_generate","image_to_video"],"alias":"Vidu-Q3-Turbo","description":"","iconPath":"https://static.51easyai.com/vidu-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"viduq3-turbo","alias":"Vidu-Q3-Turbo","icon_path":"https://static.51easyai.com/vidu-color.webp","types":["video_generate","image_to_video"],"capabilities":{"video_generate":{"output_resolutions":["480p","720p","1080p"],"aspect_ratio_allowed":["16:9","9:16","4:3","3:4","1:1"],"duration_range":[1,16],"output_audio":true},"image_to_video":{"input_last_frame":false,"input_first_last_frame":false,"input_first_frame":true,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"output_resolutions":["480p","720p","1080p"],"duration_range":[1,16],"output_audio":true}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'tencent-hunyuan-video' OR provider_code = 'tencent-hunyuan-video' LIMIT 1), 'tencent-hunyuan-video', 'tencent-hunyuan-video:V3-Fast', 'V3-Fast', 'video_generate', 'VEO-3-Fast', '{"video_generate":{"output_resolutions":["720p","1080p"],"aspect_ratio_allowed":["16:9","9:16"],"duration_options":[4,6,8]},"image_to_video":{"input_last_frame":false,"input_first_last_frame":true,"input_first_frame":true,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"output_resolutions":["720p","1080p"],"duration_options":[4,6,8]},"originalTypes":["video_generate","image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":3,"max_request_per_second":20}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"tencent-hunyuan-video","sourceProviderName":"腾讯混元视频(第三方)","sourceSpecType":"tencent-hunyuan-video","originalTypes":["video_generate","image_to_video"],"alias":"VEO-3-Fast","description":"","iconPath":"https://static.51easyai.com/gemini-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"V3-Fast","alias":"VEO-3-Fast","icon_path":"https://static.51easyai.com/gemini-color.png","types":["video_generate","image_to_video"],"capabilities":{"video_generate":{"output_resolutions":["720p","1080p"],"aspect_ratio_allowed":["16:9","9:16"],"duration_options":[4,6,8]},"image_to_video":{"input_last_frame":false,"input_first_last_frame":true,"input_first_frame":true,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"output_resolutions":["720p","1080p"],"duration_options":[4,6,8]}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'tencent-hunyuan-video' OR provider_code = 'tencent-hunyuan-video' LIMIT 1), 'tencent-hunyuan-video', 'tencent-hunyuan-video:V3', 'V3', 'video_generate', 'VEO-3', '{"video_generate":{"output_resolutions":["720p","1080p"],"aspect_ratio_allowed":["16:9","9:16"],"duration_options":[4,6,8]},"image_to_video":{"input_last_frame":false,"input_first_last_frame":true,"input_first_frame":true,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"output_resolutions":["720p","1080p"],"duration_options":[4,6,8]},"originalTypes":["video_generate","image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":3,"max_request_per_second":20}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"tencent-hunyuan-video","sourceProviderName":"腾讯混元视频(第三方)","sourceSpecType":"tencent-hunyuan-video","originalTypes":["video_generate","image_to_video"],"alias":"VEO-3","description":"","iconPath":"https://static.51easyai.com/gemini-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"V3","alias":"VEO-3","icon_path":"https://static.51easyai.com/gemini-color.png","types":["video_generate","image_to_video"],"capabilities":{"video_generate":{"output_resolutions":["720p","1080p"],"aspect_ratio_allowed":["16:9","9:16"],"duration_options":[4,6,8]},"image_to_video":{"input_last_frame":false,"input_first_last_frame":true,"input_first_frame":true,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"output_resolutions":["720p","1080p"],"duration_options":[4,6,8]}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'tencent-hunyuan-video' OR provider_code = 'tencent-hunyuan-video' LIMIT 1), 'tencent-hunyuan-video', 'tencent-hunyuan-video:V3-1Fast', 'V3-1Fast', 'video_generate', 'VEO-3.1-Fast', '{"video_generate":{"output_resolutions":["720p","1080p"],"aspect_ratio_allowed":["16:9","9:16"],"duration_options":[4,6,8]},"image_to_video":{"input_last_frame":false,"input_first_last_frame":true,"input_first_frame":true,"input_reference_generate_single":false,"input_reference_generate_multiple":true,"support_video_effect_template":false,"output_resolutions":["720p","1080p"],"duration_options":[4,6,8]},"originalTypes":["video_generate","image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":3,"max_request_per_second":20}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"tencent-hunyuan-video","sourceProviderName":"腾讯混元视频(第三方)","sourceSpecType":"tencent-hunyuan-video","originalTypes":["video_generate","image_to_video"],"alias":"VEO-3.1-Fast","description":"","iconPath":"https://static.51easyai.com/gemini-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"V3-1Fast","alias":"VEO-3.1-Fast","icon_path":"https://static.51easyai.com/gemini-color.png","types":["video_generate","image_to_video"],"capabilities":{"video_generate":{"output_resolutions":["720p","1080p"],"aspect_ratio_allowed":["16:9","9:16"],"duration_options":[4,6,8]},"image_to_video":{"input_last_frame":false,"input_first_last_frame":true,"input_first_frame":true,"input_reference_generate_single":false,"input_reference_generate_multiple":true,"support_video_effect_template":false,"output_resolutions":["720p","1080p"],"duration_options":[4,6,8]}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'tencent-hunyuan-video' OR provider_code = 'tencent-hunyuan-video' LIMIT 1), 'tencent-hunyuan-video', 'tencent-hunyuan-video:V3-1', 'V3-1', 'video_generate', 'VEO-3.1', '{"video_generate":{"output_resolutions":["720p","1080p"],"aspect_ratio_allowed":["16:9","9:16"],"duration_options":[4,6,8]},"image_to_video":{"input_last_frame":false,"input_first_last_frame":true,"input_first_frame":true,"input_reference_generate_single":false,"input_reference_generate_multiple":true,"support_video_effect_template":false,"output_resolutions":["720p","1080p"],"duration_options":[4,6,8]},"originalTypes":["video_generate","image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":3,"max_request_per_second":20}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"tencent-hunyuan-video","sourceProviderName":"腾讯混元视频(第三方)","sourceSpecType":"tencent-hunyuan-video","originalTypes":["video_generate","image_to_video"],"alias":"VEO-3.1","description":"","iconPath":"https://static.51easyai.com/gemini-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"V3-1","alias":"VEO-3.1","icon_path":"https://static.51easyai.com/gemini-color.png","types":["video_generate","image_to_video"],"capabilities":{"video_generate":{"output_resolutions":["720p","1080p"],"aspect_ratio_allowed":["16:9","9:16"],"duration_options":[4,6,8]},"image_to_video":{"input_last_frame":false,"input_first_last_frame":true,"input_first_frame":true,"input_reference_generate_single":false,"input_reference_generate_multiple":true,"support_video_effect_template":false,"output_resolutions":["720p","1080p"],"duration_options":[4,6,8]}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'tencent-hunyuan' OR provider_code = 'tencent-hunyuan' LIMIT 1), 'tencent-hunyuan', 'tencent-hunyuan:hunyuan-v3.0', 'hunyuan-v3.0', 'text_to_model', '混元3D-v3.0', '{"text_to_model":{"support_texture":true,"support_part_generation":false,"face_limit_range":{"min":3000,"max":1500000},"support_quad":true},"image_to_model":{"support_texture":true,"support_part_generation":false,"face_limit_range":{"min":3000,"max":1500000},"support_quad":true,"support_image_autofix":false},"multiview_to_model":{"support_texture":true,"support_part_generation":false,"face_limit_range":{"min":3000,"max":1500000},"support_quad":true},"originalTypes":["text_to_model","image_to_model","multiview_to_model"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":3,"max_request_per_second":20}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"tencent-hunyuan","sourceProviderName":"腾讯混元3D","sourceSpecType":"tencent-hunyuan","originalTypes":["text_to_model","image_to_model","multiview_to_model"],"alias":"混元3D-v3.0","description":"","iconPath":"https://static.51easyai.com/hunyuan3d-logo.svg","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"hunyuan-v3.0","types":["text_to_model","image_to_model","multiview_to_model"],"alias":"混元3D-v3.0","icon_path":"https://static.51easyai.com/hunyuan3d-logo.svg","capabilities":{"text_to_model":{"support_texture":true,"support_part_generation":false,"face_limit_range":{"min":3000,"max":1500000},"support_quad":true},"image_to_model":{"support_texture":true,"support_part_generation":false,"face_limit_range":{"min":3000,"max":1500000},"support_quad":true,"support_image_autofix":false},"multiview_to_model":{"support_texture":true,"support_part_generation":false,"face_limit_range":{"min":3000,"max":1500000},"support_quad":true}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'tencent-hunyuan' OR provider_code = 'tencent-hunyuan' LIMIT 1), 'tencent-hunyuan', 'tencent-hunyuan:hunyuan-v3.1', 'hunyuan-v3.1', 'text_to_model', '混元3D-v3.1', '{"text_to_model":{"support_texture":true,"support_part_generation":false,"face_limit_range":{"min":3000,"max":1500000},"support_quad":true},"image_to_model":{"support_texture":true,"support_part_generation":false,"face_limit_range":{"min":3000,"max":1500000},"support_quad":true,"support_image_autofix":false},"multiview_to_model":{"support_texture":true,"support_part_generation":false,"face_limit_range":{"min":3000,"max":1500000},"support_quad":true},"originalTypes":["text_to_model","image_to_model","multiview_to_model"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":3,"max_request_per_second":20}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"tencent-hunyuan","sourceProviderName":"腾讯混元3D","sourceSpecType":"tencent-hunyuan","originalTypes":["text_to_model","image_to_model","multiview_to_model"],"alias":"混元3D-v3.1","description":"","iconPath":"https://static.51easyai.com/hunyuan3d-logo.svg","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"hunyuan-v3.1","types":["text_to_model","image_to_model","multiview_to_model"],"alias":"混元3D-v3.1","icon_path":"https://static.51easyai.com/hunyuan3d-logo.svg","capabilities":{"text_to_model":{"support_texture":true,"support_part_generation":false,"face_limit_range":{"min":3000,"max":1500000},"support_quad":true},"image_to_model":{"support_texture":true,"support_part_generation":false,"face_limit_range":{"min":3000,"max":1500000},"support_quad":true,"support_image_autofix":false},"multiview_to_model":{"support_texture":true,"support_part_generation":false,"face_limit_range":{"min":3000,"max":1500000},"support_quad":true}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'tencent-hunyuan' OR provider_code = 'tencent-hunyuan' LIMIT 1), 'tencent-hunyuan', 'tencent-hunyuan:hunyuan-v2.5', 'hunyuan-v2.5', 'text_to_model', '混元3D-v2.5', '{"text_to_model":{"support_texture":true,"support_part_generation":false,"support_quad":false},"image_to_model":{"support_texture":true,"support_part_generation":false,"support_quad":false,"support_image_autofix":false},"originalTypes":["text_to_model","image_to_model"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":3,"max_request_per_second":20}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"tencent-hunyuan","sourceProviderName":"腾讯混元3D","sourceSpecType":"tencent-hunyuan","originalTypes":["text_to_model","image_to_model"],"alias":"混元3D-v2.5","description":"","iconPath":"https://static.51easyai.com/hunyuan3d-logo.svg","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"hunyuan-v2.5","types":["text_to_model","image_to_model"],"alias":"混元3D-v2.5","icon_path":"https://static.51easyai.com/hunyuan3d-logo.svg","capabilities":{"text_to_model":{"support_texture":true,"support_part_generation":false,"support_quad":false},"image_to_model":{"support_texture":true,"support_part_generation":false,"support_quad":false,"support_image_autofix":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'tencent-hunyuan' OR provider_code = 'tencent-hunyuan' LIMIT 1), 'tencent-hunyuan', 'tencent-hunyuan:hunyuan-texture-v3.0', 'hunyuan-texture-v3.0', 'mesh_edit', '混元3D纹理-v3.0', '{"mesh_edit":{"supported_operations":{"texture":{"supported":true,"supported_formats":["obj","glb"],"supported_texture_prompt_modes":["text","image"]}}},"originalTypes":["mesh_edit"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":3,"max_request_per_second":20}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"tencent-hunyuan","sourceProviderName":"腾讯混元3D","sourceSpecType":"tencent-hunyuan","originalTypes":["mesh_edit"],"alias":"混元3D纹理-v3.0","description":"","iconPath":"https://static.51easyai.com/hunyuan3d-logo.svg","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"hunyuan-texture-v3.0","types":["mesh_edit"],"alias":"混元3D纹理-v3.0","icon_path":"https://static.51easyai.com/hunyuan3d-logo.svg","capabilities":{"mesh_edit":{"supported_operations":{"texture":{"supported":true,"supported_formats":["obj","glb"],"supported_texture_prompt_modes":["text","image"]}}}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'tencent-hunyuan' OR provider_code = 'tencent-hunyuan' LIMIT 1), 'tencent-hunyuan', 'tencent-hunyuan:hunyuan-texture-v3.1', 'hunyuan-texture-v3.1', 'mesh_edit', '混元3D纹理-v3.1', '{"mesh_edit":{"supported_operations":{"texture":{"supported":true,"supported_formats":["obj","glb"],"supported_texture_prompt_modes":["image","multiview"]}}},"originalTypes":["mesh_edit"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":3,"max_request_per_second":20}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"tencent-hunyuan","sourceProviderName":"腾讯混元3D","sourceSpecType":"tencent-hunyuan","originalTypes":["mesh_edit"],"alias":"混元3D纹理-v3.1","description":"","iconPath":"https://static.51easyai.com/hunyuan3d-logo.svg","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"hunyuan-texture-v3.1","types":["mesh_edit"],"alias":"混元3D纹理-v3.1","icon_path":"https://static.51easyai.com/hunyuan3d-logo.svg","capabilities":{"mesh_edit":{"supported_operations":{"texture":{"supported":true,"supported_formats":["obj","glb"],"supported_texture_prompt_modes":["image","multiview"]}}}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'tencent-hunyuan' OR provider_code = 'tencent-hunyuan' LIMIT 1), 'tencent-hunyuan', 'tencent-hunyuan:hunyuan-part-v1', 'hunyuan-part-v1', 'mesh_edit', '混元3D部件拆分-v1', '{"mesh_edit":{"supported_operations":{"segmentation":{"supported":true,"supported_formats":["fbx"]}}},"originalTypes":["mesh_edit"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":3,"max_request_per_second":20}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"tencent-hunyuan","sourceProviderName":"腾讯混元3D","sourceSpecType":"tencent-hunyuan","originalTypes":["mesh_edit"],"alias":"混元3D部件拆分-v1","description":"","iconPath":"https://static.51easyai.com/hunyuan3d-logo.svg","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"hunyuan-part-v1","types":["mesh_edit"],"alias":"混元3D部件拆分-v1","icon_path":"https://static.51easyai.com/hunyuan3d-logo.svg","capabilities":{"mesh_edit":{"supported_operations":{"segmentation":{"supported":true,"supported_formats":["fbx"]}}}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'tencent-hunyuan' OR provider_code = 'tencent-hunyuan' LIMIT 1), 'tencent-hunyuan', 'tencent-hunyuan:hunyuan-reduce-face-v1.5', 'hunyuan-reduce-face-v1.5', 'mesh_edit', '混元3D智能拓扑-v1.5', '{"mesh_edit":{"supported_operations":{"smart_lowpoly":{"supported":true,"supported_formats":["obj","glb"]}}},"originalTypes":["mesh_edit"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":3,"max_request_per_second":20}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"tencent-hunyuan","sourceProviderName":"腾讯混元3D","sourceSpecType":"tencent-hunyuan","originalTypes":["mesh_edit"],"alias":"混元3D智能拓扑-v1.5","description":"","iconPath":"https://static.51easyai.com/hunyuan3d-logo.svg","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"hunyuan-reduce-face-v1.5","types":["mesh_edit"],"alias":"混元3D智能拓扑-v1.5","icon_path":"https://static.51easyai.com/hunyuan3d-logo.svg","capabilities":{"mesh_edit":{"supported_operations":{"smart_lowpoly":{"supported":true,"supported_formats":["obj","glb"]}}}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'suno' OR provider_code = 'suno' LIMIT 1), 'suno', 'suno:chirp-v3-0', 'chirp-v3-0', 'audio_generate', 'Suno音频生成V3.0', '{"originalTypes":["audio_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"suno","sourceProviderName":"Suno音乐生成","sourceSpecType":"suno","originalTypes":["audio_generate"],"alias":"Suno音频生成V3.0","description":"","iconPath":"https://static.51easyai.com/suno-logo.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"chirp-v3-0","types":["audio_generate"],"alias":"Suno音频生成V3.0","icon_path":"https://static.51easyai.com/suno-logo.png"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'suno' OR provider_code = 'suno' LIMIT 1), 'suno', 'suno:chirp-v3-5', 'chirp-v3-5', 'audio_generate', 'Suno音频生成V3.5', '{"originalTypes":["audio_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"suno","sourceProviderName":"Suno音乐生成","sourceSpecType":"suno","originalTypes":["audio_generate"],"alias":"Suno音频生成V3.5","description":"","iconPath":"https://static.51easyai.com/suno-logo.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"chirp-v3-5","types":["audio_generate"],"alias":"Suno音频生成V3.5","icon_path":"https://static.51easyai.com/suno-logo.png"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'suno' OR provider_code = 'suno' LIMIT 1), 'suno', 'suno:chirp-v4-0', 'chirp-v4-0', 'audio_generate', 'Suno音频生成V4.0', '{"originalTypes":["audio_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"suno","sourceProviderName":"Suno音乐生成","sourceSpecType":"suno","originalTypes":["audio_generate"],"alias":"Suno音频生成V4.0","description":"","iconPath":"https://static.51easyai.com/suno-logo.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"chirp-v4-0","types":["audio_generate"],"alias":"Suno音频生成V4.0","icon_path":"https://static.51easyai.com/suno-logo.png"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'suno' OR provider_code = 'suno' LIMIT 1), 'suno', 'suno:chirp-v4-5', 'chirp-v4-5', 'audio_generate', 'Suno音频生成V4.5', '{"originalTypes":["audio_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"suno","sourceProviderName":"Suno音乐生成","sourceSpecType":"suno","originalTypes":["audio_generate"],"alias":"Suno音频生成V4.5","description":"","iconPath":"https://static.51easyai.com/suno-logo.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"chirp-v4-5","types":["audio_generate"],"alias":"Suno音频生成V4.5","icon_path":"https://static.51easyai.com/suno-logo.png"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'suno' OR provider_code = 'suno' LIMIT 1), 'suno', 'suno:chirp-v5-0', 'chirp-v5-0', 'audio_generate', 'Suno音频生成V5.0', '{"originalTypes":["audio_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"suno","sourceProviderName":"Suno音乐生成","sourceSpecType":"suno","originalTypes":["audio_generate"],"alias":"Suno音频生成V5.0","description":"","iconPath":"https://static.51easyai.com/suno-logo.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"chirp-v5-0","types":["audio_generate"],"alias":"Suno音频生成V5.0","icon_path":"https://static.51easyai.com/suno-logo.png"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'minimax' OR provider_code = 'minimax' LIMIT 1), 'minimax', 'minimax:speech-2.5-hd-preview', 'speech-2.5-hd-preview', 'text_to_speech', 'MiniMax Speech 2.5 HD Preview', '{"originalTypes":["text_to_speech"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_request_per_minute":60}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"minimax","sourceProviderName":"MiniMax","sourceSpecType":"minimax","originalTypes":["text_to_speech"],"alias":"MiniMax Speech 2.5 HD Preview","description":"","iconPath":"https://static.51easyai.com/minimax-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"speech-2.5-hd-preview","types":["text_to_speech"],"alias":"MiniMax Speech 2.5 HD Preview","icon_path":"https://static.51easyai.com/minimax-color.png"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'minimax' OR provider_code = 'minimax' LIMIT 1), 'minimax', 'minimax:speech-2.5-turbo-preview', 'speech-2.5-turbo-preview', 'text_to_speech', 'MiniMax Speech 2.5 Turbo Preview', '{"originalTypes":["text_to_speech"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_request_per_minute":60}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"minimax","sourceProviderName":"MiniMax","sourceSpecType":"minimax","originalTypes":["text_to_speech"],"alias":"MiniMax Speech 2.5 Turbo Preview","description":"","iconPath":"https://static.51easyai.com/minimax-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"speech-2.5-turbo-preview","types":["text_to_speech"],"alias":"MiniMax Speech 2.5 Turbo Preview","icon_path":"https://static.51easyai.com/minimax-color.png"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'minimax' OR provider_code = 'minimax' LIMIT 1), 'minimax', 'minimax:speech-2.6-hd', 'speech-2.6-hd', 'text_to_speech', 'MiniMax Speech 2.6 HD', '{"originalTypes":["text_to_speech"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_request_per_minute":60}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"minimax","sourceProviderName":"MiniMax","sourceSpecType":"minimax","originalTypes":["text_to_speech"],"alias":"MiniMax Speech 2.6 HD","description":"","iconPath":"https://static.51easyai.com/minimax-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"speech-2.6-hd","types":["text_to_speech"],"alias":"MiniMax Speech 2.6 HD","icon_path":"https://static.51easyai.com/minimax-color.png"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'minimax' OR provider_code = 'minimax' LIMIT 1), 'minimax', 'minimax:speech-2.6-turbo', 'speech-2.6-turbo', 'text_to_speech', 'MiniMax Speech 2.6 Turbo', '{"originalTypes":["text_to_speech"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_request_per_minute":60}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"minimax","sourceProviderName":"MiniMax","sourceSpecType":"minimax","originalTypes":["text_to_speech"],"alias":"MiniMax Speech 2.6 Turbo","description":"","iconPath":"https://static.51easyai.com/minimax-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"speech-2.6-turbo","types":["text_to_speech"],"alias":"MiniMax Speech 2.6 Turbo","icon_path":"https://static.51easyai.com/minimax-color.png"}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'minimax' OR provider_code = 'minimax' LIMIT 1), 'minimax', 'minimax:MiniMax-Hailuo-02', 'MiniMax-Hailuo-02', 'video_generate', '海螺02', '{"video_generate":{"output_resolutions":["720p","1080p"],"duration_range":{"720p":[6,10],"1080p":[6,6]},"duration_options":{"720p":[6,10],"1080p":[6]},"aspect_ratio_allowed":[]},"image_to_video":{"output_resolutions":{"input_first_frame":["480p","720p","1080p"],"input_first_last_frame":["720p","1080p"]},"duration_range":{"480p":[6,10],"720p":[6,10],"1080p":[6,6]},"duration_options":{"480p":[6,10],"720p":[6,10],"1080p":[6]},"input_reference_generate_single":false,"input_reference_generate_multiple":false,"input_first_frame":true,"input_last_frame":false,"input_first_last_frame":true,"aspect_ratio_allowed":[],"support_video_effect_template":false},"originalTypes":["video_generate","image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_request_per_minute":60}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"minimax","sourceProviderName":"MiniMax","sourceSpecType":"minimax","originalTypes":["video_generate","image_to_video"],"alias":"海螺02","description":"","iconPath":"https://static.51easyai.com/minimax-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"MiniMax-Hailuo-02","types":["video_generate","image_to_video"],"alias":"海螺02","icon_path":"https://static.51easyai.com/minimax-color.png","capabilities":{"video_generate":{"output_resolutions":["720p","1080p"],"duration_range":{"720p":[6,10],"1080p":[6,6]},"duration_options":{"720p":[6,10],"1080p":[6]},"aspect_ratio_allowed":[]},"image_to_video":{"output_resolutions":{"input_first_frame":["480p","720p","1080p"],"input_first_last_frame":["720p","1080p"]},"duration_range":{"480p":[6,10],"720p":[6,10],"1080p":[6,6]},"duration_options":{"480p":[6,10],"720p":[6,10],"1080p":[6]},"input_reference_generate_single":false,"input_reference_generate_multiple":false,"input_first_frame":true,"input_last_frame":false,"input_first_last_frame":true,"aspect_ratio_allowed":[],"support_video_effect_template":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'minimax' OR provider_code = 'minimax' LIMIT 1), 'minimax', 'minimax:MiniMax-Hailuo-2.3', 'MiniMax-Hailuo-2.3', 'video_generate', '海螺2.3', '{"video_generate":{"output_resolutions":["720p","1080p"],"duration_range":{"720p":[6,10],"1080p":[6,6]},"duration_options":{"720p":[6,10],"1080p":[6]},"aspect_ratio_allowed":[]},"image_to_video":{"output_resolutions":["720p","1080p"],"duration_range":{"720p":[6,10],"1080p":[6,6]},"duration_options":{"720p":[6,10],"1080p":[6]},"input_first_frame":true,"input_first_last_frame":false,"input_last_frame":false,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"aspect_ratio_allowed":[],"support_video_effect_template":false},"originalTypes":["video_generate","image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_request_per_minute":60}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"minimax","sourceProviderName":"MiniMax","sourceSpecType":"minimax","originalTypes":["video_generate","image_to_video"],"alias":"海螺2.3","description":"","iconPath":"https://static.51easyai.com/minimax-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"MiniMax-Hailuo-2.3","types":["video_generate","image_to_video"],"alias":"海螺2.3","icon_path":"https://static.51easyai.com/minimax-color.png","capabilities":{"video_generate":{"output_resolutions":["720p","1080p"],"duration_range":{"720p":[6,10],"1080p":[6,6]},"duration_options":{"720p":[6,10],"1080p":[6]},"aspect_ratio_allowed":[]},"image_to_video":{"output_resolutions":["720p","1080p"],"duration_range":{"720p":[6,10],"1080p":[6,6]},"duration_options":{"720p":[6,10],"1080p":[6]},"input_first_frame":true,"input_first_last_frame":false,"input_last_frame":false,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"aspect_ratio_allowed":[],"support_video_effect_template":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'minimax' OR provider_code = 'minimax' LIMIT 1), 'minimax', 'minimax:MiniMax-Hailuo-2.3-Fast', 'MiniMax-Hailuo-2.3-Fast', 'image_to_video', 'MiniMax-Hailuo-2.3-Fast', '{"image_to_video":{"output_resolutions":["720p","1080p"],"duration_range":{"720p":[6,10],"1080p":[6,6]},"duration_options":{"720p":[6,10],"1080p":[6]},"input_first_frame":true,"input_first_last_frame":false,"input_last_frame":false,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"aspect_ratio_allowed":[],"support_video_effect_template":false},"originalTypes":["image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_request_per_minute":60}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"minimax","sourceProviderName":"MiniMax","sourceSpecType":"minimax","originalTypes":["image_to_video"],"alias":"MiniMax-Hailuo-2.3-Fast","description":"","iconPath":"https://static.51easyai.com/minimax-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"MiniMax-Hailuo-2.3-Fast","types":["image_to_video"],"alias":"MiniMax-Hailuo-2.3-Fast","icon_path":"https://static.51easyai.com/minimax-color.png","capabilities":{"image_to_video":{"output_resolutions":["720p","1080p"],"duration_range":{"720p":[6,10],"1080p":[6,6]},"duration_options":{"720p":[6,10],"1080p":[6]},"input_first_frame":true,"input_first_last_frame":false,"input_last_frame":false,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"aspect_ratio_allowed":[],"support_video_effect_template":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'midjourney' OR provider_code = 'midjourney' LIMIT 1), 'midjourney', 'midjourney:v7', 'v7', 'image_generate', 'Midjourney_v7', '{"image_generate":{"output_resolutions":["1K","2K"]},"image_edit":{"input_multiple_images":true,"input_max_images_count":16,"output_resolutions":["1K","2K"]},"originalTypes":["image_generate","image_edit"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_request_per_minute":60}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"midjourney","sourceProviderName":"Midjourney","sourceSpecType":"midjourney","originalTypes":["image_generate","image_edit"],"alias":"Midjourney_v7","description":"","iconPath":"https://static.51easyai.com/midjourney.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"v7","types":["image_generate","image_edit"],"alias":"Midjourney_v7","icon_path":"https://static.51easyai.com/midjourney.png","capabilities":{"image_generate":{"output_resolutions":["1K","2K"]},"image_edit":{"input_multiple_images":true,"input_max_images_count":16,"output_resolutions":["1K","2K"]}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'midjourney' OR provider_code = 'midjourney' LIMIT 1), 'midjourney', 'midjourney:v6', 'v6', 'image_generate', 'Midjourney_v6', '{"image_generate":{"output_resolutions":["1K","2K"]},"image_edit":{"input_multiple_images":true,"input_max_images_count":16,"output_resolutions":["1K","2K"]},"originalTypes":["image_generate","image_edit"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_request_per_minute":60}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"midjourney","sourceProviderName":"Midjourney","sourceSpecType":"midjourney","originalTypes":["image_generate","image_edit"],"alias":"Midjourney_v6","description":"","iconPath":"https://static.51easyai.com/midjourney.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"v6","types":["image_generate","image_edit"],"alias":"Midjourney_v6","icon_path":"https://static.51easyai.com/midjourney.png","capabilities":{"image_generate":{"output_resolutions":["1K","2K"]},"image_edit":{"input_multiple_images":true,"input_max_images_count":16,"output_resolutions":["1K","2K"]}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'midjourney' OR provider_code = 'midjourney' LIMIT 1), 'midjourney', 'midjourney:v6.1', 'v6.1', 'image_generate', 'Midjourney_v6.1', '{"image_generate":{"output_resolutions":["1K","2K"]},"image_edit":{"input_multiple_images":true,"input_max_images_count":16,"output_resolutions":["1K","2K"]},"originalTypes":["image_generate","image_edit"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_request_per_minute":60}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"midjourney","sourceProviderName":"Midjourney","sourceSpecType":"midjourney","originalTypes":["image_generate","image_edit"],"alias":"Midjourney_v6.1","description":"","iconPath":"https://static.51easyai.com/midjourney.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"v6.1","types":["image_generate","image_edit"],"alias":"Midjourney_v6.1","icon_path":"https://static.51easyai.com/midjourney.png","capabilities":{"image_generate":{"output_resolutions":["1K","2K"]},"image_edit":{"input_multiple_images":true,"input_max_images_count":16,"output_resolutions":["1K","2K"]}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'midjourney' OR provider_code = 'midjourney' LIMIT 1), 'midjourney', 'midjourney:niji 7', 'niji 7', 'image_generate', 'Midjourney_Niji_v7', '{"image_generate":{"output_resolutions":["1K","2K"]},"image_edit":{"input_multiple_images":true,"input_max_images_count":16,"output_resolutions":["1K","2K"]},"originalTypes":["image_generate","image_edit"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_request_per_minute":60}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"midjourney","sourceProviderName":"Midjourney","sourceSpecType":"midjourney","originalTypes":["image_generate","image_edit"],"alias":"Midjourney_Niji_v7","description":"","iconPath":"https://static.51easyai.com/midjourney.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"niji 7","types":["image_generate","image_edit"],"alias":"Midjourney_Niji_v7","icon_path":"https://static.51easyai.com/midjourney.png","capabilities":{"image_generate":{"output_resolutions":["1K","2K"]},"image_edit":{"input_multiple_images":true,"input_max_images_count":16,"output_resolutions":["1K","2K"]}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'midjourney' OR provider_code = 'midjourney' LIMIT 1), 'midjourney', 'midjourney:niji 6', 'niji 6', 'image_generate', 'Midjourney_Niji_v6', '{"image_generate":{"output_resolutions":["1K","2K"]},"image_edit":{"input_multiple_images":true,"input_max_images_count":16,"output_resolutions":["1K","2K"]},"originalTypes":["image_generate","image_edit"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_request_per_minute":60}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"midjourney","sourceProviderName":"Midjourney","sourceSpecType":"midjourney","originalTypes":["image_generate","image_edit"],"alias":"Midjourney_Niji_v6","description":"","iconPath":"https://static.51easyai.com/midjourney.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"niji 6","types":["image_generate","image_edit"],"alias":"Midjourney_Niji_v6","icon_path":"https://static.51easyai.com/midjourney.png","capabilities":{"image_generate":{"output_resolutions":["1K","2K"]},"image_edit":{"input_multiple_images":true,"input_max_images_count":16,"output_resolutions":["1K","2K"]}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'tencent-lke' OR provider_code = 'tencent-lke' LIMIT 1), 'tencent-lke', 'tencent-lke:[appid]|[appkey]', '[appid]|[appkey]', 'text_generate', '[appid]|[appkey]', '{"originalTypes":["text_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":-1}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"tencent-lke","sourceProviderName":"腾讯云智能体开发平台","sourceSpecType":"tencent-lke","originalTypes":["text_generate"],"alias":"","description":"","iconPath":"","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"[appid]|[appkey]","types":["text_generate"]}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'universal' OR provider_code = 'universal' LIMIT 1), 'universal', 'universal:sora-2', 'sora-2', 'video_generate', 'Sora-2', '{"video_generate":{"duration_range":[10,15],"output_resolutions":[],"aspect_ratio_allowed":["16:9","9:16"]},"image_to_video":{"input_first_frame":true,"input_last_frame":false,"input_first_last_frame":false,"duration_range":[10,15],"output_resolutions":[],"aspect_ratio_allowed":["16:9","9:16"],"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false},"originalTypes":["video_generate","image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":15}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"universal","sourceProviderName":"自定义平台通用平台(支持自定义方式接入任意平台)","sourceSpecType":"universal","originalTypes":["video_generate","image_to_video"],"alias":"Sora-2","description":"","iconPath":"https://static.51easyai.com/sora-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"sora-2","types":["video_generate","image_to_video"],"icon_path":"https://static.51easyai.com/sora-color.webp","alias":"Sora-2","model_limits":{"max_concurrent_requests":15},"capabilities":{"video_generate":{"duration_range":[10,15],"output_resolutions":[],"aspect_ratio_allowed":["16:9","9:16"]},"image_to_video":{"input_first_frame":true,"input_last_frame":false,"input_first_last_frame":false,"duration_range":[10,15],"output_resolutions":[],"aspect_ratio_allowed":["16:9","9:16"],"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'universal' OR provider_code = 'universal' LIMIT 1), 'universal', 'universal:sora-2-pro', 'sora-2-pro', 'video_generate', 'Sora-2-Pro', '{"video_generate":{"duration_range":[10,25],"output_resolutions":[],"aspect_ratio_allowed":["16:9","9:16"]},"image_to_video":{"input_first_frame":true,"input_last_frame":false,"input_first_last_frame":false,"duration_range":[10,25],"output_resolutions":[],"aspect_ratio_allowed":["16:9","9:16"],"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false},"originalTypes":["video_generate","image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":15}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"universal","sourceProviderName":"自定义平台通用平台(支持自定义方式接入任意平台)","sourceSpecType":"universal","originalTypes":["video_generate","image_to_video"],"alias":"Sora-2-Pro","description":"","iconPath":"https://static.51easyai.com/sora-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"sora-2-pro","types":["video_generate","image_to_video"],"icon_path":"https://static.51easyai.com/sora-color.webp","alias":"Sora-2-Pro","model_limits":{"max_concurrent_requests":15},"capabilities":{"video_generate":{"duration_range":[10,25],"output_resolutions":[],"aspect_ratio_allowed":["16:9","9:16"]},"image_to_video":{"input_first_frame":true,"input_last_frame":false,"input_first_last_frame":false,"duration_range":[10,25],"output_resolutions":[],"aspect_ratio_allowed":["16:9","9:16"],"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'universal' OR provider_code = 'universal' LIMIT 1), 'universal', 'universal:veo3-fast', 'veo3-fast', 'video_generate', 'VEO-3-Fast', '{"video_generate":{"aspect_ratio_allowed":["16:9","9:16","1:1","4:3","3:4"],"output_resolutions":[],"duration_range":[8,8]},"image_to_video":{"output_resolutions":[],"duration_range":[8,8],"aspect_ratio_allowed":["16:9","9:16","1:1","4:3","3:4"],"input_first_last_frame":true,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"input_first_frame":true,"input_last_frame":false},"originalTypes":["video_generate","image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"universal","sourceProviderName":"自定义平台通用平台(支持自定义方式接入任意平台)","sourceSpecType":"universal","originalTypes":["video_generate","image_to_video"],"alias":"VEO-3-Fast","description":"","iconPath":"https://static.51easyai.com/gemini-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"veo3-fast","types":["video_generate","image_to_video"],"icon_path":"https://static.51easyai.com/gemini-color.png","alias":"VEO-3-Fast","model_limits":{"max_concurrent_requests":5},"capabilities":{"video_generate":{"aspect_ratio_allowed":["16:9","9:16","1:1","4:3","3:4"],"output_resolutions":[],"duration_range":[8,8]},"image_to_video":{"output_resolutions":[],"duration_range":[8,8],"aspect_ratio_allowed":["16:9","9:16","1:1","4:3","3:4"],"input_first_last_frame":true,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"input_first_frame":true,"input_last_frame":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'universal' OR provider_code = 'universal' LIMIT 1), 'universal', 'universal:veo31-fast', 'veo31-fast', 'video_generate', 'VEO-3.1-Fast', '{"video_generate":{"aspect_ratio_allowed":["16:9","9:16","1:1","4:3","3:4"],"output_resolutions":[],"duration_range":[8,8]},"image_to_video":{"output_resolutions":[],"duration_range":[8,8],"aspect_ratio_allowed":["16:9","9:16","1:1","4:3","3:4"],"input_first_last_frame":true,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"input_first_frame":true,"input_last_frame":false},"originalTypes":["video_generate","image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"universal","sourceProviderName":"自定义平台通用平台(支持自定义方式接入任意平台)","sourceSpecType":"universal","originalTypes":["video_generate","image_to_video"],"alias":"VEO-3.1-Fast","description":"","iconPath":"https://static.51easyai.com/gemini-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"veo31-fast","types":["video_generate","image_to_video"],"icon_path":"https://static.51easyai.com/gemini-color.png","alias":"VEO-3.1-Fast","model_limits":{"max_concurrent_requests":5},"capabilities":{"video_generate":{"aspect_ratio_allowed":["16:9","9:16","1:1","4:3","3:4"],"output_resolutions":[],"duration_range":[8,8]},"image_to_video":{"output_resolutions":[],"duration_range":[8,8],"aspect_ratio_allowed":["16:9","9:16","1:1","4:3","3:4"],"input_first_last_frame":true,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"input_first_frame":true,"input_last_frame":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'universal' OR provider_code = 'universal' LIMIT 1), 'universal', 'universal:veo3', 'veo3', 'video_generate', 'VEO-3', '{"video_generate":{"aspect_ratio_allowed":["16:9","9:16","1:1","4:3","3:4"],"output_resolutions":[],"duration_range":[8,8]},"image_to_video":{"output_resolutions":[],"duration_range":[8,8],"aspect_ratio_allowed":["16:9","9:16","1:1","4:3","3:4"],"input_first_last_frame":true,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"input_first_frame":true,"input_last_frame":false},"originalTypes":["video_generate","image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"universal","sourceProviderName":"自定义平台通用平台(支持自定义方式接入任意平台)","sourceSpecType":"universal","originalTypes":["video_generate","image_to_video"],"alias":"VEO-3","description":"","iconPath":"https://static.51easyai.com/gemini-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"veo3","types":["video_generate","image_to_video"],"icon_path":"https://static.51easyai.com/gemini-color.png","alias":"VEO-3","model_limits":{"max_concurrent_requests":5},"capabilities":{"video_generate":{"aspect_ratio_allowed":["16:9","9:16","1:1","4:3","3:4"],"output_resolutions":[],"duration_range":[8,8]},"image_to_video":{"output_resolutions":[],"duration_range":[8,8],"aspect_ratio_allowed":["16:9","9:16","1:1","4:3","3:4"],"input_first_last_frame":true,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"input_first_frame":true,"input_last_frame":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'universal' OR provider_code = 'universal' LIMIT 1), 'universal', 'universal:veo31', 'veo31', 'video_generate', 'VEO-3.1', '{"video_generate":{"aspect_ratio_allowed":["16:9","9:16","1:1","4:3","3:4"],"output_resolutions":[],"duration_range":[8,8]},"image_to_video":{"output_resolutions":[],"duration_range":[8,8],"aspect_ratio_allowed":["16:9","9:16","1:1","4:3","3:4"],"input_first_last_frame":true,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"input_first_frame":true,"input_last_frame":false},"originalTypes":["video_generate","image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"universal","sourceProviderName":"自定义平台通用平台(支持自定义方式接入任意平台)","sourceSpecType":"universal","originalTypes":["video_generate","image_to_video"],"alias":"VEO-3.1","description":"","iconPath":"https://static.51easyai.com/gemini-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"veo31","types":["video_generate","image_to_video"],"icon_path":"https://static.51easyai.com/gemini-color.png","alias":"VEO-3.1","model_limits":{"max_concurrent_requests":5},"capabilities":{"video_generate":{"aspect_ratio_allowed":["16:9","9:16","1:1","4:3","3:4"],"output_resolutions":[],"duration_range":[8,8]},"image_to_video":{"output_resolutions":[],"duration_range":[8,8],"aspect_ratio_allowed":["16:9","9:16","1:1","4:3","3:4"],"input_first_last_frame":true,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"input_first_frame":true,"input_last_frame":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'universal' OR provider_code = 'universal' LIMIT 1), 'universal', 'universal:veo31-pro', 'veo31-pro', 'video_generate', 'VEO-3.1-Pro', '{"video_generate":{"aspect_ratio_allowed":["16:9","9:16","1:1","4:3","3:4"],"output_resolutions":[],"duration_range":[8,8]},"image_to_video":{"output_resolutions":[],"duration_range":[8,8],"aspect_ratio_allowed":["16:9","9:16","1:1","4:3","3:4"],"input_first_last_frame":true,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"input_first_frame":true,"input_last_frame":false},"originalTypes":["video_generate","image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"universal","sourceProviderName":"自定义平台通用平台(支持自定义方式接入任意平台)","sourceSpecType":"universal","originalTypes":["video_generate","image_to_video"],"alias":"VEO-3.1-Pro","description":"","iconPath":"https://static.51easyai.com/gemini-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"veo31-pro","types":["video_generate","image_to_video"],"icon_path":"https://static.51easyai.com/gemini-color.png","alias":"VEO-3.1-Pro","model_limits":{"max_concurrent_requests":5},"capabilities":{"video_generate":{"aspect_ratio_allowed":["16:9","9:16","1:1","4:3","3:4"],"output_resolutions":[],"duration_range":[8,8]},"image_to_video":{"output_resolutions":[],"duration_range":[8,8],"aspect_ratio_allowed":["16:9","9:16","1:1","4:3","3:4"],"input_first_last_frame":true,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"input_first_frame":true,"input_last_frame":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'newapi' OR provider_code = 'newapi' LIMIT 1), 'newapi', 'newapi:veo3-fast', 'veo3-fast', 'video_generate', 'VEO-3-Fast', '{"video_generate":{"aspect_ratio_allowed":["16:9","9:16"],"output_resolutions":[],"duration_range":[8,8]},"image_to_video":{"output_resolutions":[],"duration_range":[8,8],"aspect_ratio_allowed":["16:9","9:16"],"input_first_last_frame":true,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"input_first_frame":true,"input_last_frame":false},"originalTypes":["video_generate","image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"newapi","sourceProviderName":"NewAPI兼容平台","sourceSpecType":"newapi","originalTypes":["video_generate","image_to_video"],"alias":"VEO-3-Fast","description":"","iconPath":"https://static.51easyai.com/gemini-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"veo3-fast","types":["video_generate","image_to_video"],"icon_path":"https://static.51easyai.com/gemini-color.png","alias":"VEO-3-Fast","model_limits":{"max_concurrent_requests":5},"capabilities":{"video_generate":{"aspect_ratio_allowed":["16:9","9:16"],"output_resolutions":[],"duration_range":[8,8]},"image_to_video":{"output_resolutions":[],"duration_range":[8,8],"aspect_ratio_allowed":["16:9","9:16"],"input_first_last_frame":true,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"input_first_frame":true,"input_last_frame":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'newapi' OR provider_code = 'newapi' LIMIT 1), 'newapi', 'newapi:veo3.1-components', 'veo3.1-components', 'video_generate', 'VEO-3.1-Fast', '{"video_generate":{"aspect_ratio_allowed":["16:9","9:16"],"output_resolutions":[],"duration_range":[8,8]},"image_to_video":{"output_resolutions":[],"duration_range":[8,8],"aspect_ratio_allowed":["16:9","9:16"],"input_first_last_frame":true,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"input_first_frame":true,"input_last_frame":false},"originalTypes":["video_generate","image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"newapi","sourceProviderName":"NewAPI兼容平台","sourceSpecType":"newapi","originalTypes":["video_generate","image_to_video"],"alias":"VEO-3.1-Fast","description":"","iconPath":"https://static.51easyai.com/gemini-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"veo3.1-components","types":["video_generate","image_to_video"],"icon_path":"https://static.51easyai.com/gemini-color.png","alias":"VEO-3.1-Fast","model_limits":{"max_concurrent_requests":5},"capabilities":{"video_generate":{"aspect_ratio_allowed":["16:9","9:16"],"output_resolutions":[],"duration_range":[8,8]},"image_to_video":{"output_resolutions":[],"duration_range":[8,8],"aspect_ratio_allowed":["16:9","9:16"],"input_first_last_frame":true,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"input_first_frame":true,"input_last_frame":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'newapi' OR provider_code = 'newapi' LIMIT 1), 'newapi', 'newapi:veo3', 'veo3', 'video_generate', 'VEO-3', '{"video_generate":{"aspect_ratio_allowed":["16:9","9:16"],"output_resolutions":[],"duration_range":[8,8]},"image_to_video":{"output_resolutions":[],"duration_range":[8,8],"aspect_ratio_allowed":["16:9","9:16"],"input_first_last_frame":true,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"input_first_frame":true,"input_last_frame":false},"originalTypes":["video_generate","image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"newapi","sourceProviderName":"NewAPI兼容平台","sourceSpecType":"newapi","originalTypes":["video_generate","image_to_video"],"alias":"VEO-3","description":"","iconPath":"https://static.51easyai.com/gemini-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"veo3","types":["video_generate","image_to_video"],"icon_path":"https://static.51easyai.com/gemini-color.png","alias":"VEO-3","model_limits":{"max_concurrent_requests":5},"capabilities":{"video_generate":{"aspect_ratio_allowed":["16:9","9:16"],"output_resolutions":[],"duration_range":[8,8]},"image_to_video":{"output_resolutions":[],"duration_range":[8,8],"aspect_ratio_allowed":["16:9","9:16"],"input_first_last_frame":true,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"input_first_frame":true,"input_last_frame":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'newapi' OR provider_code = 'newapi' LIMIT 1), 'newapi', 'newapi:veo3.1', 'veo3.1', 'video_generate', 'VEO-3.1', '{"video_generate":{"aspect_ratio_allowed":["16:9","9:16"],"output_resolutions":[],"duration_range":[8,8]},"image_to_video":{"output_resolutions":[],"duration_range":[8,8],"aspect_ratio_allowed":["16:9","9:16"],"input_first_last_frame":true,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"input_first_frame":true,"input_last_frame":false},"originalTypes":["video_generate","image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"newapi","sourceProviderName":"NewAPI兼容平台","sourceSpecType":"newapi","originalTypes":["video_generate","image_to_video"],"alias":"VEO-3.1","description":"","iconPath":"https://static.51easyai.com/gemini-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"veo3.1","types":["video_generate","image_to_video"],"icon_path":"https://static.51easyai.com/gemini-color.png","alias":"VEO-3.1","model_limits":{"max_concurrent_requests":5},"capabilities":{"video_generate":{"aspect_ratio_allowed":["16:9","9:16"],"output_resolutions":[],"duration_range":[8,8]},"image_to_video":{"output_resolutions":[],"duration_range":[8,8],"aspect_ratio_allowed":["16:9","9:16"],"input_first_last_frame":true,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"input_first_frame":true,"input_last_frame":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'newapi' OR provider_code = 'newapi' LIMIT 1), 'newapi', 'newapi:veo3.1-pro', 'veo3.1-pro', 'video_generate', 'VEO-3.1-Pro', '{"video_generate":{"aspect_ratio_allowed":["16:9","9:16"],"output_resolutions":[],"duration_range":[8,8]},"image_to_video":{"output_resolutions":[],"duration_range":[8,8],"aspect_ratio_allowed":["16:9","9:16"],"input_first_last_frame":true,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"input_first_frame":true,"input_last_frame":false},"originalTypes":["video_generate","image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"newapi","sourceProviderName":"NewAPI兼容平台","sourceSpecType":"newapi","originalTypes":["video_generate","image_to_video"],"alias":"VEO-3.1-Pro","description":"","iconPath":"https://static.51easyai.com/gemini-color.png","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"veo3.1-pro","types":["video_generate","image_to_video"],"icon_path":"https://static.51easyai.com/gemini-color.png","alias":"VEO-3.1-Pro","model_limits":{"max_concurrent_requests":5},"capabilities":{"video_generate":{"aspect_ratio_allowed":["16:9","9:16"],"output_resolutions":[],"duration_range":[8,8]},"image_to_video":{"output_resolutions":[],"duration_range":[8,8],"aspect_ratio_allowed":["16:9","9:16"],"input_first_last_frame":true,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"input_first_frame":true,"input_last_frame":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'newapi' OR provider_code = 'newapi' LIMIT 1), 'newapi', 'newapi:sora-2', 'sora-2', 'video_generate', 'Sora-2', '{"video_generate":{"duration_range":[10,15],"output_resolutions":[],"aspect_ratio_allowed":["16:9","9:16"]},"image_to_video":{"input_first_frame":true,"input_last_frame":false,"input_first_last_frame":false,"duration_range":[10,15],"output_resolutions":[],"aspect_ratio_allowed":["16:9","9:16"],"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false},"originalTypes":["video_generate","image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":15}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"newapi","sourceProviderName":"NewAPI兼容平台","sourceSpecType":"newapi","originalTypes":["video_generate","image_to_video"],"alias":"Sora-2","description":"","iconPath":"https://static.51easyai.com/sora-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"sora-2","types":["video_generate","image_to_video"],"icon_path":"https://static.51easyai.com/sora-color.webp","alias":"Sora-2","model_limits":{"max_concurrent_requests":15},"capabilities":{"video_generate":{"duration_range":[10,15],"output_resolutions":[],"aspect_ratio_allowed":["16:9","9:16"]},"image_to_video":{"input_first_frame":true,"input_last_frame":false,"input_first_last_frame":false,"duration_range":[10,15],"output_resolutions":[],"aspect_ratio_allowed":["16:9","9:16"],"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'newapi' OR provider_code = 'newapi' LIMIT 1), 'newapi', 'newapi:sora-2-pro', 'sora-2-pro', 'video_generate', 'Sora-2-Pro', '{"video_generate":{"duration_range":[10,25],"output_resolutions":[],"aspect_ratio_allowed":["16:9","9:16"]},"image_to_video":{"input_first_frame":true,"input_last_frame":false,"input_first_last_frame":false,"duration_range":[10,25],"output_resolutions":[],"aspect_ratio_allowed":["16:9","9:16"],"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false},"originalTypes":["video_generate","image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"modelLimits":{"max_concurrent_requests":15}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"newapi","sourceProviderName":"NewAPI兼容平台","sourceSpecType":"newapi","originalTypes":["video_generate","image_to_video"],"alias":"Sora-2-Pro","description":"","iconPath":"https://static.51easyai.com/sora-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"sora-2-pro","types":["video_generate","image_to_video"],"icon_path":"https://static.51easyai.com/sora-color.webp","alias":"Sora-2-Pro","model_limits":{"max_concurrent_requests":15},"capabilities":{"video_generate":{"duration_range":[10,25],"output_resolutions":[],"aspect_ratio_allowed":["16:9","9:16"]},"image_to_video":{"input_first_frame":true,"input_last_frame":false,"input_first_last_frame":false,"duration_range":[10,25],"output_resolutions":[],"aspect_ratio_allowed":["16:9","9:16"],"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'vidu' OR provider_code = 'vidu' LIMIT 1), 'vidu', 'vidu:viduq2', 'viduq2', 'video_generate', 'Vidu-Q2', '{"video_generate":{"output_resolutions":["720p","480p","1080p"],"aspect_ratio_allowed":["16:9","9:16","4:3","3:4","1:1"],"duration_range":[1,10],"output_bgm":true},"originalTypes":["video_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_request_per_minute":60,"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"vidu","sourceProviderName":"Vidu视频生成","sourceSpecType":"vidu","originalTypes":["video_generate"],"alias":"Vidu-Q2","description":"","iconPath":"https://static.51easyai.com/vidu-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"viduq2","types":["video_generate"],"alias":"Vidu-Q2","icon_path":"https://static.51easyai.com/vidu-color.webp","capabilities":{"video_generate":{"output_resolutions":["720p","480p","1080p"],"aspect_ratio_allowed":["16:9","9:16","4:3","3:4","1:1"],"duration_range":[1,10],"output_bgm":true}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'vidu' OR provider_code = 'vidu' LIMIT 1), 'vidu', 'vidu:viduq1', 'viduq1', 'video_generate', 'Vidu-Q1', '{"video_generate":{"output_resolutions":["1080p"],"aspect_ratio_allowed":["16:9","9:16","1:1"],"duration_range":[5,5],"output_bgm":true},"originalTypes":["video_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_request_per_minute":60,"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"vidu","sourceProviderName":"Vidu视频生成","sourceSpecType":"vidu","originalTypes":["video_generate"],"alias":"Vidu-Q1","description":"","iconPath":"https://static.51easyai.com/vidu-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"viduq1","types":["video_generate"],"alias":"Vidu-Q1","icon_path":"https://static.51easyai.com/vidu-color.webp","capabilities":{"video_generate":{"output_resolutions":["1080p"],"aspect_ratio_allowed":["16:9","9:16","1:1"],"duration_range":[5,5],"output_bgm":true}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'vidu' OR provider_code = 'vidu' LIMIT 1), 'vidu', 'vidu:viduq2-pro-fast', 'viduq2-pro-fast', 'image_to_video', 'Vidu-Q2-Pro-Fast', '{"image_to_video":{"output_resolutions":["720p","1080p"],"input_first_frame":true,"input_first_last_frame":true,"duration_range":[1,10],"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"input_last_frame":false,"output_bgm":true,"output_audio":true,"aspect_ratio_allowed":[]},"originalTypes":["image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_request_per_minute":60,"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"vidu","sourceProviderName":"Vidu视频生成","sourceSpecType":"vidu","originalTypes":["image_to_video"],"alias":"Vidu-Q2-Pro-Fast","description":"","iconPath":"https://static.51easyai.com/vidu-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"viduq2-pro-fast","types":["image_to_video"],"alias":"Vidu-Q2-Pro-Fast","icon_path":"https://static.51easyai.com/vidu-color.webp","capabilities":{"image_to_video":{"output_resolutions":["720p","1080p"],"input_first_frame":true,"input_first_last_frame":true,"duration_range":[1,10],"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"input_last_frame":false,"output_bgm":true,"output_audio":true,"aspect_ratio_allowed":[]}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'vidu' OR provider_code = 'vidu' LIMIT 1), 'vidu', 'vidu:viduq2-pro', 'viduq2-pro', 'image_to_video', 'Vidu-Q2-Pro', '{"image_to_video":{"output_resolutions":["720p","480p","1080p"],"input_first_frame":true,"input_first_last_frame":true,"duration_range":[1,10],"input_last_frame":false,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"output_bgm":true,"output_audio":true,"aspect_ratio_allowed":[],"input_smart_multi_frame":true,"smart_multi_frame_range":[2,9],"smart_multi_frame_mode":"native","smart_multi_frame_duration_range":[2,7]},"originalTypes":["image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_request_per_minute":60,"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"vidu","sourceProviderName":"Vidu视频生成","sourceSpecType":"vidu","originalTypes":["image_to_video"],"alias":"Vidu-Q2-Pro","description":"","iconPath":"https://static.51easyai.com/vidu-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"viduq2-pro","types":["image_to_video"],"alias":"Vidu-Q2-Pro","icon_path":"https://static.51easyai.com/vidu-color.webp","capabilities":{"image_to_video":{"output_resolutions":["720p","480p","1080p"],"input_first_frame":true,"input_first_last_frame":true,"duration_range":[1,10],"input_last_frame":false,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"output_bgm":true,"output_audio":true,"aspect_ratio_allowed":[],"input_smart_multi_frame":true,"smart_multi_frame_range":[2,9],"smart_multi_frame_mode":"native","smart_multi_frame_duration_range":[2,7]}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'vidu' OR provider_code = 'vidu' LIMIT 1), 'vidu', 'vidu:viduq2-turbo', 'viduq2-turbo', 'image_to_video', 'Vidu-Q2-Turbo', '{"image_to_video":{"output_resolutions":["720p","480p","1080p"],"input_first_frame":true,"input_first_last_frame":true,"duration_range":[1,10],"input_last_frame":false,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"output_bgm":true,"output_audio":true,"aspect_ratio_allowed":[],"input_smart_multi_frame":true,"smart_multi_frame_range":[2,9],"smart_multi_frame_mode":"native","smart_multi_frame_duration_range":[2,7]},"originalTypes":["image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_request_per_minute":60,"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"vidu","sourceProviderName":"Vidu视频生成","sourceSpecType":"vidu","originalTypes":["image_to_video"],"alias":"Vidu-Q2-Turbo","description":"","iconPath":"https://static.51easyai.com/vidu-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"viduq2-turbo","types":["image_to_video"],"alias":"Vidu-Q2-Turbo","icon_path":"https://static.51easyai.com/vidu-color.webp","capabilities":{"image_to_video":{"output_resolutions":["720p","480p","1080p"],"input_first_frame":true,"input_first_last_frame":true,"duration_range":[1,10],"input_last_frame":false,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"output_bgm":true,"output_audio":true,"aspect_ratio_allowed":[],"input_smart_multi_frame":true,"smart_multi_frame_range":[2,9],"smart_multi_frame_mode":"native","smart_multi_frame_duration_range":[2,7]}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'vidu' OR provider_code = 'vidu' LIMIT 1), 'vidu', 'vidu:viduq3-pro', 'viduq3-pro', 'video_generate', 'Vidu-Q3-Pro', '{"video_generate":{"output_resolutions":["720p","480p","1080p"],"aspect_ratio_allowed":["16:9","9:16","4:3","3:4","1:1"],"duration_range":[1,16],"output_audio":true},"image_to_video":{"output_resolutions":["720p","480p","1080p"],"input_first_frame":true,"input_first_last_frame":false,"duration_range":[1,16],"input_last_frame":false,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"output_audio":true,"aspect_ratio_allowed":[]},"originalTypes":["video_generate","image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_request_per_minute":60,"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"vidu","sourceProviderName":"Vidu视频生成","sourceSpecType":"vidu","originalTypes":["video_generate","image_to_video"],"alias":"Vidu-Q3-Pro","description":"高效生成优质音视频内容,让视频内容更生动、更形象、更立体","iconPath":"https://static.51easyai.com/vidu-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"viduq3-pro","types":["video_generate","image_to_video"],"alias":"Vidu-Q3-Pro","description":"高效生成优质音视频内容,让视频内容更生动、更形象、更立体","icon_path":"https://static.51easyai.com/vidu-color.webp","capabilities":{"video_generate":{"output_resolutions":["720p","480p","1080p"],"aspect_ratio_allowed":["16:9","9:16","4:3","3:4","1:1"],"duration_range":[1,16],"output_audio":true},"image_to_video":{"output_resolutions":["720p","480p","1080p"],"input_first_frame":true,"input_first_last_frame":false,"duration_range":[1,16],"input_last_frame":false,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"output_audio":true,"aspect_ratio_allowed":[]}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'vidu' OR provider_code = 'vidu' LIMIT 1), 'vidu', 'vidu:viduq1:2', 'viduq1', 'image_to_video', 'Vidu-Q1', '{"image_to_video":{"output_resolutions":["1080p"],"input_first_frame":true,"input_first_last_frame":true,"duration_range":[5,5],"input_last_frame":false,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"output_bgm":true,"output_audio":true,"aspect_ratio_allowed":[]},"originalTypes":["image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_request_per_minute":60,"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"vidu","sourceProviderName":"Vidu视频生成","sourceSpecType":"vidu","originalTypes":["image_to_video"],"alias":"Vidu-Q1","description":"","iconPath":"https://static.51easyai.com/vidu-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"viduq1","types":["image_to_video"],"alias":"Vidu-Q1","icon_path":"https://static.51easyai.com/vidu-color.webp","capabilities":{"image_to_video":{"output_resolutions":["1080p"],"input_first_frame":true,"input_first_last_frame":true,"duration_range":[5,5],"input_last_frame":false,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"output_bgm":true,"output_audio":true,"aspect_ratio_allowed":[]}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'vidu' OR provider_code = 'vidu' LIMIT 1), 'vidu', 'vidu:viduq1-classic', 'viduq1-classic', 'image_to_video', 'Vidu-Q1-Classic', '{"image_to_video":{"output_resolutions":["1080p"],"input_first_frame":true,"input_first_last_frame":true,"duration_range":[5,5],"input_last_frame":false,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"output_bgm":true,"output_audio":true,"aspect_ratio_allowed":[]},"originalTypes":["image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_request_per_minute":60,"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"vidu","sourceProviderName":"Vidu视频生成","sourceSpecType":"vidu","originalTypes":["image_to_video"],"alias":"Vidu-Q1-Classic","description":"","iconPath":"https://static.51easyai.com/vidu-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"viduq1-classic","types":["image_to_video"],"alias":"Vidu-Q1-Classic","icon_path":"https://static.51easyai.com/vidu-color.webp","capabilities":{"image_to_video":{"output_resolutions":["1080p"],"input_first_frame":true,"input_first_last_frame":true,"duration_range":[5,5],"input_last_frame":false,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"output_bgm":true,"output_audio":true,"aspect_ratio_allowed":[]}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'vidu' OR provider_code = 'vidu' LIMIT 1), 'vidu', 'vidu:vidu2.0', 'vidu2.0', 'image_to_video', 'Vidu-2.0', '{"image_to_video":{"output_resolutions":["720p","1080p"],"input_first_frame":true,"input_first_last_frame":true,"duration_range":{"720p":[4,8],"1080p":[4,4]},"input_last_frame":false,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"output_bgm":true,"output_audio":true,"aspect_ratio_allowed":[]},"originalTypes":["image_to_video"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_request_per_minute":60,"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"vidu","sourceProviderName":"Vidu视频生成","sourceSpecType":"vidu","originalTypes":["image_to_video"],"alias":"Vidu-2.0","description":"","iconPath":"https://static.51easyai.com/vidu-color.webp","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"vidu2.0","types":["image_to_video"],"alias":"Vidu-2.0","icon_path":"https://static.51easyai.com/vidu-color.webp","capabilities":{"image_to_video":{"output_resolutions":["720p","1080p"],"input_first_frame":true,"input_first_last_frame":true,"duration_range":{"720p":[4,8],"1080p":[4,4]},"input_last_frame":false,"input_reference_generate_single":false,"input_reference_generate_multiple":false,"support_video_effect_template":false,"output_bgm":true,"output_audio":true,"aspect_ratio_allowed":[]}}}}'::jsonb),
((SELECT id FROM model_catalog_providers WHERE provider_key = 'mock-test' OR provider_code = 'mock-test' LIMIT 1), 'mock-test', 'mock-test:mock-test-image', 'mock-test-image', 'image_generate', 'mock-test-image', '{"image_generate":{"output_resolutions":["1K"],"output_multiple_images":false},"originalTypes":["image_generate"]}'::jsonb, '{"text":{"basePrice":0.01,"baseWeight":1},"image":{"basePrice":10,"baseWeight":1,"dynamicWeight":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4}},"audio":{"basePrice":1,"baseWeight":1},"music":{"basePrice":20,"baseWeight":1},"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"digital_human":{"basePrice":50,"baseWeight":1},"model":{"basePrice":20,"baseWeight":1,"dynamicWeight":{"texture-none":1,"texture-standard":2}}}'::jsonb, '{"platformLimits":{"max_concurrent_requests":5}}'::jsonb, 1, 'active', '{"source":"server-main.integration-platform","sourceProviderCode":"mock-test","sourceProviderName":"Mock测试平台","sourceSpecType":"mock-test","originalTypes":["image_generate"],"alias":"mock-test-image","description":"测试用图像生成模型,走 MockTestClient模拟 10 秒耗时","iconPath":"","billingType":"external-api","billingMode":"","referenceModel":"","modelWeight":null,"selectable":true,"rawModel":{"name":"mock-test-image","alias":"mock-test-image","types":["image_generate"],"description":"测试用图像生成模型,走 MockTestClient模拟 10 秒耗时","capabilities":{"image_generate":{"output_resolutions":["1K"],"output_multiple_images":false}}}}'::jsonb)
ON CONFLICT (canonical_model_key) DO UPDATE SET
provider_id = EXCLUDED.provider_id,
provider_key = EXCLUDED.provider_key,
provider_model_name = EXCLUDED.provider_model_name,
model_type = EXCLUDED.model_type,
display_name = EXCLUDED.display_name,
capabilities = EXCLUDED.capabilities,
base_billing_config = EXCLUDED.base_billing_config,
default_rate_limit_policy = EXCLUDED.default_rate_limit_policy,
pricing_version = EXCLUDED.pricing_version,
status = EXCLUDED.status,
metadata = EXCLUDED.metadata,
updated_at = now();

View File

@ -0,0 +1,177 @@
CREATE TABLE IF NOT EXISTS model_pricing_rule_sets (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
rule_set_key text NOT NULL UNIQUE,
name text NOT NULL,
description text,
category text NOT NULL DEFAULT 'general',
currency text NOT NULL DEFAULT 'resource',
status text NOT NULL DEFAULT 'active',
metadata jsonb NOT NULL DEFAULT '{}'::jsonb,
created_at timestamptz NOT NULL DEFAULT now(),
updated_at timestamptz NOT NULL DEFAULT now()
);
ALTER TABLE IF EXISTS model_pricing_rules
ADD COLUMN IF NOT EXISTS rule_set_id uuid REFERENCES model_pricing_rule_sets(id) ON DELETE CASCADE,
ADD COLUMN IF NOT EXISTS rule_key text NOT NULL DEFAULT ('rule_' || replace(gen_random_uuid()::text, '-', '')),
ADD COLUMN IF NOT EXISTS display_name text NOT NULL DEFAULT '',
ADD COLUMN IF NOT EXISTS calculator_type text NOT NULL DEFAULT 'unit_weight',
ADD COLUMN IF NOT EXISTS dimension_schema jsonb NOT NULL DEFAULT '{}'::jsonb,
ADD COLUMN IF NOT EXISTS formula_config jsonb NOT NULL DEFAULT '{}'::jsonb,
ADD COLUMN IF NOT EXISTS priority integer NOT NULL DEFAULT 100,
ADD COLUMN IF NOT EXISTS status text NOT NULL DEFAULT 'active',
ADD COLUMN IF NOT EXISTS metadata jsonb NOT NULL DEFAULT '{}'::jsonb;
ALTER TABLE IF EXISTS integration_platforms
ADD COLUMN IF NOT EXISTS pricing_rule_set_id uuid REFERENCES model_pricing_rule_sets(id) ON DELETE SET NULL;
ALTER TABLE IF EXISTS platform_models
ADD COLUMN IF NOT EXISTS pricing_rule_set_id uuid REFERENCES model_pricing_rule_sets(id) ON DELETE SET NULL;
DO $$
BEGIN
IF NOT EXISTS (
SELECT 1
FROM pg_constraint c
JOIN pg_attribute a ON a.attrelid = c.conrelid AND a.attnum = ANY(c.conkey)
WHERE c.contype = 'f'
AND c.conrelid = 'integration_platforms'::regclass
AND a.attname = 'pricing_rule_set_id'
) THEN
ALTER TABLE integration_platforms
ADD CONSTRAINT fk_integration_platforms_pricing_rule_set
FOREIGN KEY (pricing_rule_set_id) REFERENCES model_pricing_rule_sets(id) ON DELETE SET NULL;
END IF;
IF NOT EXISTS (
SELECT 1
FROM pg_constraint c
JOIN pg_attribute a ON a.attrelid = c.conrelid AND a.attnum = ANY(c.conkey)
WHERE c.contype = 'f'
AND c.conrelid = 'platform_models'::regclass
AND a.attname = 'pricing_rule_set_id'
) THEN
ALTER TABLE platform_models
ADD CONSTRAINT fk_platform_models_pricing_rule_set
FOREIGN KEY (pricing_rule_set_id) REFERENCES model_pricing_rule_sets(id) ON DELETE SET NULL;
END IF;
END $$;
CREATE INDEX IF NOT EXISTS idx_model_pricing_rule_set
ON model_pricing_rules(rule_set_id, resource_type, priority);
CREATE UNIQUE INDEX IF NOT EXISTS idx_model_pricing_rule_set_key
ON model_pricing_rules(rule_set_id, rule_key)
WHERE rule_set_id IS NOT NULL;
CREATE INDEX IF NOT EXISTS idx_integration_platforms_pricing_rule_set
ON integration_platforms(pricing_rule_set_id);
CREATE INDEX IF NOT EXISTS idx_platform_models_pricing_rule_set
ON platform_models(pricing_rule_set_id);
INSERT INTO model_pricing_rule_sets (rule_set_key, name, description, category, currency, status, metadata)
VALUES (
'default-multimodal-v1',
'默认多模态计价规则',
'覆盖文本、图像和视频的默认计价规则,可作为平台或平台模型的基础价格模板。',
'default',
'resource',
'active',
'{"source":"gateway.default","version":1}'::jsonb
)
ON CONFLICT (rule_set_key) DO UPDATE SET
name = EXCLUDED.name,
description = EXCLUDED.description,
category = EXCLUDED.category,
currency = EXCLUDED.currency,
status = EXCLUDED.status,
metadata = EXCLUDED.metadata,
updated_at = now();
WITH default_set AS (
SELECT id FROM model_pricing_rule_sets WHERE rule_set_key = 'default-multimodal-v1'
)
INSERT INTO model_pricing_rules (
rule_set_id, rule_key, display_name, scope_type, scope_id, resource_type, unit,
base_price, currency, base_weight, dynamic_weight, calculator_type,
dimension_schema, formula_config, priority, status, metadata
)
SELECT default_set.id, item.rule_key, item.display_name, 'rule_set', default_set.id,
item.resource_type, item.unit, item.base_price, 'resource',
item.base_weight, item.dynamic_weight, item.calculator_type,
item.dimension_schema, item.formula_config, item.priority, 'active',
'{"source":"gateway.default"}'::jsonb
FROM default_set
CROSS JOIN (
VALUES
(
'text_input_tokens',
'文本输入 Token',
'text_input',
'1k_tokens',
0.01::numeric,
'{"meter":"input_tokens"}'::jsonb,
'{}'::jsonb,
'token_usage',
'{"metrics":["input_tokens"],"unitScale":1000}'::jsonb,
'{"formula":"ceil(input_tokens / 1000) * base_price"}'::jsonb,
10
),
(
'text_output_tokens',
'文本输出 Token',
'text_output',
'1k_tokens',
0.03::numeric,
'{"meter":"output_tokens"}'::jsonb,
'{}'::jsonb,
'token_usage',
'{"metrics":["output_tokens"],"unitScale":1000}'::jsonb,
'{"formula":"ceil(output_tokens / 1000) * base_price"}'::jsonb,
20
),
(
'image',
'图像',
'image',
'image',
10::numeric,
'{"meter":"count"}'::jsonb,
'{"resolutionFactors":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4},"qualityFactors":{"low":0.5,"medium":1,"high":1.5}}'::jsonb,
'unit_weight',
'{"dimensions":["count","resolution","quality"],"defaults":{"count":1,"quality":"medium","resolution":"1K"}}'::jsonb,
'{"formula":"count * base_price * resolution_factor * quality_factor"}'::jsonb,
30
),
(
'video_generation',
'视频生成',
'video',
'5s',
100::numeric,
'{"meter":"duration","unitSeconds":5}'::jsonb,
'{"resolutionWeights":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2},"audioWeights":{"true":2,"false":1},"referenceVideoWeights":{"true":1.5,"false":1},"voiceSpecifiedWeights":{"true":1.2,"false":1}}'::jsonb,
'duration_weight',
'{"dimensions":["duration_seconds","resolution","audio","reference_video","voice_specified","count"],"defaults":{"count":1,"duration_seconds":5,"resolution":"720p","audio":false,"reference_video":false,"voice_specified":false}}'::jsonb,
'{"formula":"count * ceil(duration_seconds / 5) * base_price * resolution_weight * audio_weight * reference_video_weight * voice_specified_weight"}'::jsonb,
50
)
) AS item(rule_key, display_name, resource_type, unit, base_price, base_weight, dynamic_weight, calculator_type, dimension_schema, formula_config, priority)
ON CONFLICT (rule_set_id, rule_key) WHERE rule_set_id IS NOT NULL DO UPDATE SET
display_name = EXCLUDED.display_name,
scope_type = EXCLUDED.scope_type,
scope_id = EXCLUDED.scope_id,
resource_type = EXCLUDED.resource_type,
unit = EXCLUDED.unit,
base_price = EXCLUDED.base_price,
currency = EXCLUDED.currency,
base_weight = EXCLUDED.base_weight,
dynamic_weight = EXCLUDED.dynamic_weight,
calculator_type = EXCLUDED.calculator_type,
dimension_schema = EXCLUDED.dimension_schema,
formula_config = EXCLUDED.formula_config,
priority = EXCLUDED.priority,
status = EXCLUDED.status,
metadata = EXCLUDED.metadata,
updated_at = now();

View File

@ -0,0 +1,26 @@
DELETE FROM model_pricing_rules
WHERE resource_type = 'image_edit'
OR rule_key = 'image_edit';
DELETE FROM model_pricing_rules old_rule
USING model_pricing_rules image_rule
WHERE old_rule.rule_set_id IS NOT DISTINCT FROM image_rule.rule_set_id
AND old_rule.rule_key = 'image_generation'
AND image_rule.rule_key = 'image';
UPDATE model_pricing_rules
SET rule_key = 'image',
display_name = '图像',
resource_type = 'image',
unit = 'image',
base_price = 10,
base_weight = '{"meter":"count"}'::jsonb,
dynamic_weight = '{"resolutionFactors":{"1K":1,"2K":1.5,"3K":1.75,"4K":2,"8K":4},"qualityFactors":{"low":0.5,"medium":1,"high":1.5}}'::jsonb,
calculator_type = 'unit_weight',
dimension_schema = '{"dimensions":["count","resolution","quality"],"defaults":{"count":1,"quality":"medium","resolution":"1K"}}'::jsonb,
formula_config = '{"formula":"count * base_price * resolution_factor * quality_factor"}'::jsonb,
priority = 30,
metadata = metadata || '{"migration":"0008_pricing_image_single_rule"}'::jsonb,
updated_at = now()
WHERE resource_type = 'image'
AND rule_key IN ('image_generation', 'image');

View File

@ -0,0 +1,62 @@
import type { ReactNode } from 'react';
import { Calculator } from 'lucide-react';
export function PricingInlineField(props: {
label: string;
children: ReactNode;
}) {
return (
<div className="pricingInlineField">
<span>{props.label}</span>
{props.children}
</div>
);
}
export function PricingReadonlyField(props: {
label: string;
value: string;
}) {
return (
<div className="pricingInlineField pricingInlineReadonly">
<span>{props.label}</span>
<strong>{props.value}</strong>
</div>
);
}
export function unitLabel(unit: string | undefined) {
const labels: Record<string, string> = {
image: '每张图片',
'5s': '每 5 秒',
second: '每秒',
item: '每次',
'1k_tokens': '每 1K Token',
character_1k: '每 1K 字符',
};
return labels[unit ?? ''] ?? unit ?? '-';
}
export function calculatorLabel(calculatorType: string | undefined) {
const labels: Record<string, string> = {
token_usage: '按 Token 用量',
unit_weight: '按数量和参数',
duration_weight: '按时长和参数',
formula: '按公式',
};
return labels[calculatorType ?? ''] ?? calculatorType ?? '-';
}
export function PricingFormulaNote(props: {
children: ReactNode;
}) {
return (
<div className="pricingFormulaBox">
<Calculator size={16} />
<div>
<strong></strong>
<p>{props.children}</p>
</div>
</div>
);
}

View File

@ -1,11 +1,19 @@
import { useMemo, useState } from 'react';
import { Calculator, Plus, Trash2 } from 'lucide-react';
import { Plus, Trash2 } from 'lucide-react';
import type { PricingRuleInput } from '@easyai-ai-gateway/contracts';
import { Badge, Button, Input, Label, Select } from '../../components/ui';
import { cn } from '../../lib/utils';
import { calculatorLabel, PricingFormulaNote, PricingInlineField, PricingReadonlyField, unitLabel } from './PricingEditorControls';
type RecordValue = Record<string, unknown>;
type ModeKey = 'text' | 'image' | 'video' | 'digitalHuman' | 'speech' | 'music';
type ModeKey = 'text' | 'image' | 'video';
type ParameterGroup = {
key: string;
title: string;
defaults: RecordValue;
labels?: Record<string, string>;
locked?: boolean;
};
type ModeDefinition = {
key: ModeKey;
@ -13,88 +21,52 @@ type ModeDefinition = {
formula: string;
match: (rule: PricingRuleInput) => boolean;
templates: (currency: string) => PricingRuleInput[];
weightGroups: Array<{ key: string; title: string; defaults: RecordValue }>;
parameterGroups: ParameterGroup[];
};
const currencies = ['resource', 'credit', 'cny', 'usd'];
const calculators = ['token_usage', 'unit_weight', 'duration_weight', 'formula'];
const statuses = ['active', 'deprecated', 'hidden'];
const modeDefinitions: ModeDefinition[] = [
{
key: 'text',
label: '大语言模型',
formula: '扣费 = 输入 Token 单价 × 输入 Token 数 / 1000 + 输出 Token 单价 × 输出 Token 数 / 1000。',
label: '文本',
formula: '一次对话扣费 = 输入 Token / 1000 × 输入扣费单价 + 输出 Token / 1000 × 输出扣费单价。',
match: (rule) => rule.resourceType.startsWith('text_'),
templates: (currency) => [
createRule('text_input_tokens', '文本输入 Token', 'text_input', '1k_tokens', 0.01, currency, 'token_usage', 'ceil(input_tokens / 1000) * base_price', { meter: 'input_tokens' }, {}, { metrics: ['input_tokens'], unitScale: 1000 }),
createRule('text_output_tokens', '文本输出 Token', 'text_output', '1k_tokens', 0.03, currency, 'token_usage', 'ceil(output_tokens / 1000) * base_price', { meter: 'output_tokens' }, {}, { metrics: ['output_tokens'], unitScale: 1000 }),
],
weightGroups: [],
templates: (currency) => [createTextRule(currency, 0.01, 0.03)],
parameterGroups: [],
},
{
key: 'image',
label: '图像生成',
formula: '扣费 = 基础单价 × 基础权重 × 动态参数权重,例如 2K 或高清质量会按对应倍数计费。',
label: '图像',
formula: '扣费 = 基础单价 × 数量 × 分辨率参数 × 图像质量参数。图像质量按 OpenAI GPT Image 的 low / medium / high 三档配置。',
match: (rule) => rule.resourceType === 'image' || rule.resourceType === 'image_edit',
templates: (currency) => [
createRule('image_generation', '图像生成', 'image', 'image', 10, currency, 'unit_weight', 'count * base_price * resolution_weight * quality_weight * mode_weight', { meter: 'count', base: 1 }, {
resolutionWeights: { '512x512': 0.5, '1024x1024': 1, '2K': 1.5, '4K': 2 },
qualityWeights: { standard: 1, hd: 1.5 },
modeWeights: { generation: 1 },
}, { dimensions: ['count', 'resolution', 'quality', 'mode'], defaults: { count: 1, resolution: '1024x1024', quality: 'standard', mode: 'generation' } }),
],
weightGroups: [
{ key: 'resolutionWeights', title: '分辨率', defaults: { '512x512': 0.5, '1024x1024': 1, '2K': 1.5, '4K': 2 } },
{ key: 'qualityWeights', title: '图像质量', defaults: { standard: 1, hd: 1.5 } },
{ key: 'referenceImageWeights', title: '参考图数量', defaults: { single: 1, multiple: 1.3 } },
templates: (currency) => [createRule('image', '图像', 'image', 'image', 10, currency, 'unit_weight', 'count * base_price * resolution_factor * quality_factor', {
resolutionFactors: { '1K': 1, '2K': 1.5, '3K': 1.75, '4K': 2, '8K': 4 },
qualityFactors: { low: 0.5, medium: 1, high: 1.5 },
}, { dimensions: ['count', 'resolution', 'quality'], defaults: { count: 1, resolution: '1K', quality: 'medium' } })],
parameterGroups: [
{ key: 'resolutionFactors', title: '分辨率', defaults: { '1K': 1, '2K': 1.5, '3K': 1.75, '4K': 2, '8K': 4 }, locked: true },
{ key: 'qualityFactors', title: '图像质量', defaults: { low: 0.5, medium: 1, high: 1.5 }, labels: { low: '低质量 (low)', medium: '标准质量 (medium)', high: '高质量 (high)' }, locked: true },
],
},
{
key: 'video',
label: '视频生成',
formula: '扣费 = 基础单价 × 基础权重 × 动态参数权重。例如生成 1080p 且带音频时,会叠加分辨率和音频权重。',
label: '视频',
formula: '扣费 = 基础单价 × 生成时长单位 × 数量 × 分辨率、音频、参考视频、音色等计费参数。',
match: (rule) => rule.resourceType === 'video',
templates: (currency) => [
createRule('video_generation', '视频生成', 'video', '5s', 100, currency, 'duration_weight', 'count * ceil(duration_seconds / 5) * base_price * resolution_weight * audio_weight * reference_video_weight * voice_specified_weight', { meter: 'duration', unitSeconds: 5, base: 1 }, {
createRule('video', '视频', 'video', '5s', 100, currency, 'duration_weight', 'count * ceil(duration_seconds / 5) * base_price * resolution_factor * audio_factor * reference_video_factor * voice_specified_factor', {
resolutionWeights: { '480p': 0.75, '720p': 1, '1080p': 1.5, '2160p': 2 },
audioWeights: { true: 2, false: 1 },
referenceVideoWeights: { true: 1.5, false: 1 },
voiceSpecifiedWeights: { true: 1.2, false: 1 },
}, { dimensions: ['count', 'duration_seconds', 'resolution', 'audio', 'reference_video', 'voice_specified'], defaults: { count: 1, duration_seconds: 5, resolution: '720p', audio: false, reference_video: false, voice_specified: false } }),
],
weightGroups: [
{ key: 'resolutionWeights', title: '分辨率', defaults: { '480p': 0.75, '720p': 1, '1080p': 1.5, '2160p': 2 } },
{ key: 'audioWeights', title: '是否生成音频', defaults: { true: 2, false: 1 } },
{ key: 'referenceVideoWeights', title: '是否含有参考视频', defaults: { true: 1.5, false: 1 } },
{ key: 'voiceSpecifiedWeights', title: '是否指定音色', defaults: { true: 1.2, false: 1 } },
],
},
{
key: 'digitalHuman',
label: '数字人生成',
formula: '扣费 = 基础单价 × 生成时长 × 分辨率、音频驱动等动态参数权重。',
match: (rule) => rule.resourceType === 'digital_human',
templates: (currency) => [createRule('digital_human_generation', '数字人生成', 'digital_human', 'second', 2, currency, 'duration_weight', 'duration_seconds * base_price * resolution_weight', { meter: 'duration_seconds', base: 1 }, { resolutionWeights: { '720p': 1, '1080p': 1.5 } }, { dimensions: ['duration_seconds', 'resolution'], defaults: { duration_seconds: 10, resolution: '720p' } })],
weightGroups: [{ key: 'resolutionWeights', title: '分辨率', defaults: { '720p': 1, '1080p': 1.5 } }],
},
{
key: 'speech',
label: '语音合成',
formula: '扣费 = 基础单价 × 字符数 / 1000 × 声音或质量权重。',
match: (rule) => rule.resourceType === 'audio',
templates: (currency) => [createRule('speech_generation', '语音合成', 'audio', 'character_1k', 1, currency, 'unit_weight', 'ceil(characters / 1000) * base_price * voice_weight', { meter: 'characters', base: 1 }, { voiceWeights: { standard: 1, premium: 1.5 } }, { dimensions: ['characters', 'voice'], defaults: { voice: 'standard' } })],
weightGroups: [{ key: 'voiceWeights', title: '音色', defaults: { standard: 1, premium: 1.5 } }],
},
{
key: 'music',
label: '音乐生成',
formula: '扣费 = 基础单价 × 生成数量 × 时长或质量权重。',
match: (rule) => rule.resourceType === 'music',
templates: (currency) => [createRule('music_generation', '音乐生成', 'music', 'item', 20, currency, 'unit_weight', 'count * base_price * duration_weight * quality_weight', { meter: 'count', base: 1 }, { durationWeights: { short: 1, long: 1.8 }, qualityWeights: { standard: 1, high: 1.5 } }, { dimensions: ['count', 'duration', 'quality'], defaults: { count: 1, duration: 'short', quality: 'standard' } })],
weightGroups: [
{ key: 'durationWeights', title: '时长', defaults: { short: 1, long: 1.8 } },
{ key: 'qualityWeights', title: '质量', defaults: { standard: 1, high: 1.5 } },
parameterGroups: [
{ key: 'resolutionWeights', title: '分辨率', defaults: { '480p': 0.75, '720p': 1, '1080p': 1.5, '2160p': 2 }, locked: true },
{ key: 'audioWeights', title: '生成声音', defaults: { true: 2, false: 1 }, labels: { true: '生成声音', false: '不生成声音' }, locked: true },
{ key: 'referenceVideoWeights', title: '参考视频', defaults: { true: 1.5, false: 1 }, labels: { true: '有参考视频', false: '无参考视频' }, locked: true },
{ key: 'voiceSpecifiedWeights', title: '指定音色', defaults: { true: 1.2, false: 1 }, labels: { true: '指定音色', false: '不指定音色' }, locked: true },
],
},
];
@ -104,27 +76,26 @@ export function PricingRuleVisualEditor(props: {
rules: PricingRuleInput[];
onChange: (rules: PricingRuleInput[]) => void;
}) {
const [activeMode, setActiveMode] = useState<ModeKey>('video');
const [activeMode, setActiveMode] = useState<ModeKey>('text');
const mode = modeDefinitions.find((item) => item.key === activeMode) ?? modeDefinitions[0];
const activeRules = useMemo(() => props.rules.filter(mode.match), [mode, props.rules]);
const rawActiveRules = useMemo(() => props.rules.filter(mode.match), [mode, props.rules]);
const activeRules = useMemo(() => {
if (mode.key === 'text' && rawActiveRules.length) return [completeRule(mergeTextRules(rawActiveRules, props.currency), mode)];
if (mode.key === 'image' && rawActiveRules.length) return [completeRule(mergeTemplateRules(mode.templates(props.currency), rawActiveRules)[0], mode)];
return rawActiveRules.map((rule) => completeRule(rule, mode));
}, [mode.key, props.currency, rawActiveRules]);
function replaceModeRules(nextRules: PricingRuleInput[]) {
props.onChange([...props.rules.filter((rule) => !mode.match(rule)), ...nextRules]);
}
function completeMissing() {
const existing = activeRules.length ? activeRules : mode.templates(props.currency);
replaceModeRules(existing.map((rule) => completeRule(rule, mode)));
}
return (
<section className="pricingModeEditor spanTwo">
<div className="pricingModeHeader">
<div>
<strong></strong>
<span></span>
<span></span>
</div>
<Button type="button" variant="outline" size="sm" onClick={completeMissing}></Button>
</div>
<div className="pricingModeTabs">
{modeDefinitions.map((item) => (
@ -152,6 +123,10 @@ export function PricingRuleVisualEditor(props: {
);
}
export function createDefaultPricingRules(currency: string): PricingRuleInput[] {
return modeDefinitions.flatMap((mode) => mode.templates(currency).map((rule) => completeRule(rule, mode)));
}
function ModeRuleEditor(props: {
mode: ModeDefinition;
rule: PricingRuleInput;
@ -159,19 +134,17 @@ function ModeRuleEditor(props: {
onDelete: () => void;
}) {
const rule = props.rule;
const baseWeight = Number((rule.baseWeight ?? {}).base ?? 1);
const formula = String((rule.formulaConfig ?? {}).formula ?? props.mode.formula);
function patch(patchValue: Partial<PricingRuleInput>) {
props.onChange({ ...rule, ...patchValue });
props.onChange(completeRule({ ...rule, ...patchValue }, props.mode));
}
function patchDynamicWeight(key: string, value: RecordValue) {
patch({ dynamicWeight: { ...(rule.dynamicWeight ?? {}), [key]: value } });
}
function addCustomGroup() {
patchDynamicWeight(nextKey(rule.dynamicWeight ?? {}, 'customWeights'), {});
if (props.mode.key === 'text') {
return <TextRuleEditor formula={props.mode.formula} rule={rule} onChange={props.onChange} onDelete={props.onDelete} />;
}
return (
@ -185,40 +158,33 @@ function ModeRuleEditor(props: {
<Button type="button" variant="ghost" size="sm" onClick={props.onDelete}><Trash2 size={14} /></Button>
</header>
<div className="pricingModeBaseRows">
<Label> Key<Input value={rule.ruleKey ?? ''} onChange={(event) => patch({ ruleKey: event.target.value })} /></Label>
<div className="pricingModeBaseRows compact">
<Label><Input value={rule.displayName ?? ''} onChange={(event) => patch({ displayName: event.target.value })} /></Label>
<Label><Input value={rule.resourceType} onChange={(event) => patch({ resourceType: event.target.value })} /></Label>
<Label><Select value={rule.calculatorType ?? 'unit_weight'} onChange={(event) => patch({ calculatorType: event.target.value })}>{calculators.map((item) => <option key={item} value={item}>{item}</option>)}</Select></Label>
<Label><Select value={rule.currency ?? 'resource'} onChange={(event) => patch({ currency: event.target.value })}>{currencies.map((item) => <option key={item} value={item}>{item}</option>)}</Select></Label>
<Label><Select value={rule.status ?? 'active'} onChange={(event) => patch({ status: event.target.value })}>{statuses.map((item) => <option key={item} value={item}>{item}</option>)}</Select></Label>
</div>
<div className="pricingModeInlineRows">
<div className="pricingModeInlineInput"><span>/{rule.unit}</span><Input min="0" step="0.0001" type="number" value={rule.basePrice} onChange={(event) => patch({ basePrice: Number(event.target.value) })} /></div>
<div className="pricingModeInlineInput"><span></span><Input min="0" step="0.01" type="number" value={baseWeight} onChange={(event) => patch({ baseWeight: { ...(rule.baseWeight ?? {}), base: Number(event.target.value) } })} /></div>
<div className="pricingModeInlineInput"><span></span><Input value={rule.unit} onChange={(event) => patch({ unit: event.target.value })} /></div>
<PricingInlineField label={`基础单价/${unitLabel(rule.unit)}`}>
<Input min="0" step="0.0001" type="number" value={rule.basePrice} onChange={(event) => patch({ basePrice: Number(event.target.value) })} />
</PricingInlineField>
<PricingReadonlyField label="计价单位" value={unitLabel(rule.unit)} />
<PricingReadonlyField label="计算方式" value={calculatorLabel(rule.calculatorType)} />
</div>
<div className="pricingFormulaBox">
<Calculator size={16} />
<div>
<strong></strong>
<Input value={formula} onChange={(event) => patch({ formulaConfig: { ...(rule.formulaConfig ?? {}), formula: event.target.value } })} />
<p>{props.mode.formula}</p>
</div>
</div>
<PricingFormulaNote>{props.mode.formula}</PricingFormulaNote>
<div className="pricingWeightStack">
{props.mode.weightGroups.map((group) => (
{props.mode.parameterGroups.map((group) => (
<WeightTable
key={group.key}
title={group.title}
value={readGroup(rule.dynamicWeight, group)}
labels={group.labels}
locked={group.locked}
onChange={(value) => patchDynamicWeight(group.key, value)}
/>
))}
{Object.entries(rule.dynamicWeight ?? {}).filter(([key]) => !props.mode.weightGroups.some((group) => group.key === key)).map(([key, value]) => (
{Object.entries(rule.dynamicWeight ?? {}).filter(([key]) => !props.mode.parameterGroups.some((group) => group.key === key)).map(([key, value]) => (
<WeightTable key={key} editableTitle title={key} value={isPlainObject(value) ? value as RecordValue : { value }} onChange={(nextValue, nextTitle) => {
const dynamicWeight = { ...(rule.dynamicWeight ?? {}) };
delete dynamicWeight[key];
@ -227,14 +193,74 @@ function ModeRuleEditor(props: {
}} />
))}
</div>
</article>
);
}
<Button className="pricingAddWeightButton" type="button" variant="outline" onClick={addCustomGroup}><Plus size={15} /></Button>
function TextRuleEditor(props: {
formula: string;
rule: PricingRuleInput;
onChange: (rule: PricingRuleInput) => void;
onDelete: () => void;
}) {
const prices = textPrices(props.rule);
function updatePrices(inputTokenPrice: number, outputTokenPrice: number) {
props.onChange({
...props.rule,
basePrice: inputTokenPrice,
displayName: props.rule.displayName || '文本',
resourceType: 'text_total',
ruleKey: 'text',
unit: '1k_tokens',
formulaConfig: {
...(props.rule.formulaConfig ?? {}),
formula: textFormula,
inputTokenPrice,
outputTokenPrice,
},
dimensionSchema: {
...(props.rule.dimensionSchema ?? {}),
metrics: ['input_tokens', 'output_tokens'],
unitScale: 1000,
},
});
}
return (
<article className="pricingModeRule pricingTextRule">
<header>
<div>
<Badge variant="secondary">text_total</Badge>
<strong>{props.rule.displayName || '文本'}</strong>
<span>text</span>
</div>
<Button type="button" variant="ghost" size="sm" onClick={props.onDelete}><Trash2 size={14} /></Button>
</header>
<div className="pricingModeBaseRows compact">
<Label><Input value={props.rule.displayName ?? '文本'} onChange={(event) => props.onChange({ ...props.rule, displayName: event.target.value, ruleKey: 'text' })} /></Label>
<Label><Select value={props.rule.status ?? 'active'} onChange={(event) => props.onChange({ ...props.rule, status: event.target.value })}>{statuses.map((item) => <option key={item} value={item}>{item}</option>)}</Select></Label>
</div>
<div className="pricingTextPriceGrid">
<PricingInlineField label="输入单价/1K tokens">
<Input min="0" step="0.0001" type="number" value={prices.inputTokenPrice} onChange={(event) => updatePrices(Number(event.target.value), prices.outputTokenPrice)} />
</PricingInlineField>
<PricingInlineField label="输出单价/1K tokens">
<Input min="0" step="0.0001" type="number" value={prices.outputTokenPrice} onChange={(event) => updatePrices(prices.inputTokenPrice, Number(event.target.value))} />
</PricingInlineField>
</div>
<PricingFormulaNote>{props.formula}</PricingFormulaNote>
</article>
);
}
function WeightTable(props: {
editableTitle?: boolean;
labels?: Record<string, string>;
locked?: boolean;
title: string;
value: RecordValue;
onChange: (value: RecordValue, title?: string) => void;
@ -256,13 +282,17 @@ function WeightTable(props: {
</header>
<div className="pricingWeightRows">
{rows.map(([key, value], index) => (
<div className="pricingWeightRow" key={`${key}-${index}`}>
<Input value={key} onChange={(event) => updateRows(rows.map((row, rowIndex) => (rowIndex === index ? [event.target.value, value] : row)))} />
<div className={cn('pricingWeightRow', props.locked && 'locked')} key={`${key}-${index}`}>
{props.locked ? (
<span className="pricingFactorLabel">{props.labels?.[key] ?? key}</span>
) : (
<Input value={key} onChange={(event) => updateRows(rows.map((row, rowIndex) => (rowIndex === index ? [event.target.value, value] : row)))} />
)}
<Input value={scalarToString(value)} onChange={(event) => updateRows(rows.map((row, rowIndex) => (rowIndex === index ? [key, parseScalar(event.target.value)] : row)))} />
<Button type="button" variant="ghost" size="icon" onClick={() => updateRows(rows.filter((_, rowIndex) => rowIndex !== index))}><Trash2 size={14} /></Button>
{!props.locked && <Button type="button" variant="ghost" size="icon" onClick={() => updateRows(rows.filter((_, rowIndex) => rowIndex !== index))}><Trash2 size={14} /></Button>}
</div>
))}
<Button className="pricingInlineAdd" type="button" variant="outline" size="sm" onClick={() => updateRows([...rows, [nextKey(props.value, 'option'), 1]])}><Plus size={14} /></Button>
{!props.locked && <Button className="pricingInlineAdd" type="button" variant="outline" size="sm" onClick={() => updateRows([...rows, [nextKey(props.value, 'option'), 1]])}><Plus size={14} /></Button>}
</div>
</section>
);
@ -283,20 +313,130 @@ export function KeyValueEditor(props: {
}
function completeRule(rule: PricingRuleInput, mode: ModeDefinition): PricingRuleInput {
const template = mode.templates(rule.currency ?? 'resource')[0] ?? rule;
return {
...template,
...rule,
dynamicWeight: {
...Object.fromEntries(mode.weightGroups.map((group) => [group.key, { ...group.defaults, ...(isPlainObject(rule.dynamicWeight?.[group.key]) ? rule.dynamicWeight?.[group.key] as RecordValue : {}) }])),
...(rule.dynamicWeight ?? {}),
ruleKey: mode.key,
displayName: normalizeDisplayName(rule.displayName || template.displayName, mode),
resourceType: template.resourceType,
dimensionSchema: template.dimensionSchema,
formulaConfig: {
...(rule.formulaConfig ?? {}),
formula: template.formulaConfig?.formula,
},
dynamicWeight: normalizeDynamicWeight(rule.dynamicWeight, mode),
};
}
function readGroup(value: RecordValue | undefined, group: ModeDefinition['weightGroups'][number]) {
function normalizeDisplayName(value: string | undefined, mode: ModeDefinition) {
const legacyNames: Record<ModeKey, string[]> = {
text: ['文本输入 Token', '文本输出 Token', '文本生成 Token', '文本生成'],
image: ['图像生成', '图像编辑'],
video: ['视频生成'],
};
if (!value || legacyNames[mode.key].includes(value)) return mode.label;
return value;
}
function normalizeDynamicWeight(value: PricingRuleInput['dynamicWeight'], mode: ModeDefinition): RecordValue {
const source = isPlainObject(value) ? { ...(value as RecordValue) } : {};
if (mode.key === 'image') {
if (!isPlainObject(source.resolutionFactors) && isPlainObject(source.resolutionWeights)) {
source.resolutionFactors = source.resolutionWeights;
}
if (!isPlainObject(source.qualityFactors) && isPlainObject(source.qualityWeights)) {
source.qualityFactors = source.qualityWeights;
}
delete source.modeFactors;
delete source.modeWeights;
delete source.referenceImageWeights;
delete source.resolutionWeights;
delete source.qualityWeights;
}
const groupKeys = new Set(mode.parameterGroups.map((group) => group.key));
const defaults = Object.fromEntries(mode.parameterGroups.map((group) => [
group.key,
mergeGroupDefaults(group, isPlainObject(source[group.key]) ? source[group.key] as RecordValue : {}),
]));
const custom = Object.fromEntries(Object.entries(source).filter(([key]) => !groupKeys.has(key)));
return { ...defaults, ...custom };
}
function mergeGroupDefaults(group: ParameterGroup, source: RecordValue): RecordValue {
if (!group.locked) return { ...group.defaults, ...source };
return Object.fromEntries(Object.entries(group.defaults).map(([key, defaultValue]) => [
key,
key in source ? source[key] : defaultValue,
]));
}
function mergeTemplateRules(templates: PricingRuleInput[], rules: PricingRuleInput[]) {
if (templates.length === 1) return rules.length ? [{ ...templates[0], ...rules[0] }] : templates;
const byKey = new Map(templates.map((rule) => [rule.ruleKey ?? rule.resourceType, rule]));
for (const rule of rules) {
byKey.set(rule.ruleKey ?? rule.resourceType, rule);
}
return Array.from(byKey.values());
}
function mergeTextRules(rules: PricingRuleInput[], currency: string): PricingRuleInput {
const totalRule = rules.find((rule) => rule.resourceType === 'text_total');
const inputRule = rules.find((rule) => rule.resourceType === 'text_input');
const outputRule = rules.find((rule) => rule.resourceType === 'text_output');
const source = totalRule ?? inputRule ?? outputRule ?? createTextRule(currency, 0.01, 0.03);
return createTextRule(
source.currency ?? currency,
Number(source.formulaConfig?.inputTokenPrice ?? inputRule?.basePrice ?? source.basePrice ?? 0.01),
Number(source.formulaConfig?.outputTokenPrice ?? outputRule?.basePrice ?? 0.03),
source,
);
}
function readGroup(value: RecordValue | undefined, group: ModeDefinition['parameterGroups'][number]) {
return isPlainObject(value?.[group.key]) ? value?.[group.key] as RecordValue : group.defaults;
}
function createRule(ruleKey: string, displayName: string, resourceType: string, unit: string, basePrice: number, currency: string, calculatorType: string, formula: string, baseWeight: RecordValue, dynamicWeight: RecordValue, dimensionSchema: RecordValue): PricingRuleInput {
const textFormula = 'input_tokens / 1000 * input_token_price + output_tokens / 1000 * output_token_price';
function createTextRule(currency: string, inputTokenPrice: number, outputTokenPrice: number, source?: PricingRuleInput): PricingRuleInput {
return {
...(source ?? {}),
ruleKey: 'text',
displayName: normalizeDisplayName(source?.displayName, modeDefinitions[0]),
resourceType: 'text_total',
unit: '1k_tokens',
basePrice: inputTokenPrice,
currency,
calculatorType: 'token_usage',
baseWeight: {},
dynamicWeight: {},
dimensionSchema: {
metrics: ['input_tokens', 'output_tokens'],
unitScale: 1000,
...(source?.dimensionSchema ?? {}),
},
formulaConfig: {
...(source?.formulaConfig ?? {}),
formula: textFormula,
inputTokenPrice,
outputTokenPrice,
},
priority: source?.priority ?? 100,
status: source?.status ?? 'active',
metadata: source?.metadata ?? {},
};
}
function textPrices(rule: PricingRuleInput) {
return {
inputTokenPrice: Number(rule.formulaConfig?.inputTokenPrice ?? rule.basePrice ?? 0.01),
outputTokenPrice: Number(rule.formulaConfig?.outputTokenPrice ?? 0.03),
};
}
function createRule(ruleKey: string, displayName: string, resourceType: string, unit: string, basePrice: number, currency: string, calculatorType: string, formula: string, dynamicWeight: RecordValue, dimensionSchema: RecordValue): PricingRuleInput {
return {
ruleKey,
displayName,
@ -305,7 +445,7 @@ function createRule(ruleKey: string, displayName: string, resourceType: string,
basePrice,
currency,
calculatorType,
baseWeight,
baseWeight: {},
dynamicWeight,
dimensionSchema,
formulaConfig: { formula },

View File

@ -1,9 +1,10 @@
import { useMemo, useState, type FormEvent } from 'react';
import { Pencil, Plus, RotateCcw, Trash2 } from 'lucide-react';
import { FileText, Image, Pencil, Plus, RotateCcw, Trash2, Video } from 'lucide-react';
import type { PricingRule, PricingRuleInput, PricingRuleSet, PricingRuleSetUpsertRequest } from '@easyai-ai-gateway/contracts';
import { Badge, Button, Card, CardContent, CardHeader, CardTitle, FormDialog, Input, Label, Select } from '../../components/ui';
import type { LoadState } from '../../types';
import { KeyValueEditor, PricingRuleVisualEditor } from './PricingRuleVisualEditor';
import { unitLabel } from './PricingEditorControls';
import { createDefaultPricingRules, KeyValueEditor, PricingRuleVisualEditor } from './PricingRuleVisualEditor';
type PricingForm = {
ruleSetKey: string;
@ -16,17 +17,6 @@ type PricingForm = {
rules: PricingRuleInput[];
};
const emptyForm: PricingForm = {
ruleSetKey: '',
name: '',
description: '',
category: 'custom',
currency: 'resource',
status: 'active',
metadata: {},
rules: [],
};
const categories = ['default', 'custom', 'provider', 'model'];
const statuses = ['active', 'deprecated', 'hidden'];
const currencies = ['resource', 'credit', 'cny', 'usd'];
@ -40,7 +30,7 @@ export function PricingRulesPanel(props: {
}) {
const [dialogOpen, setDialogOpen] = useState(false);
const [editingId, setEditingId] = useState('');
const [form, setForm] = useState<PricingForm>(emptyForm);
const [form, setForm] = useState<PricingForm>(() => createEmptyForm());
const [localError, setLocalError] = useState('');
const [query, setQuery] = useState('');
const filtered = useMemo(() => {
@ -62,7 +52,7 @@ export function PricingRulesPanel(props: {
function openCreateDialog() {
setEditingId('');
setForm(emptyForm);
setForm(createEmptyForm());
setLocalError('');
setDialogOpen(true);
}
@ -76,11 +66,15 @@ export function PricingRulesPanel(props: {
function closeDialog() {
setEditingId('');
setForm(emptyForm);
setForm(createEmptyForm());
setLocalError('');
setDialogOpen(false);
}
function updateCurrency(currency: string) {
setForm({ ...form, currency, rules: ensureRules(form.rules, currency) });
}
async function deleteRuleSet(ruleSet: PricingRuleSet) {
const confirmed = window.confirm(`确认删除定价规则 ${ruleSet.name}?已绑定的平台或模型会清空规则绑定。`);
if (!confirmed) return;
@ -125,11 +119,14 @@ export function PricingRulesPanel(props: {
<div className="providerCatalogMeta">
<span>{ruleSet.category}</span>
<span>{ruleSet.currency}</span>
<span>{ruleSet.rules?.length ?? 0} </span>
<span>{pricingRuleSummaries(ruleSet).length} </span>
</div>
<div className="pricingRuleItems">
{(ruleSet.rules ?? []).slice(0, 5).map((rule) => (
<span key={rule.id || rule.ruleKey}>{rule.displayName || rule.resourceType}: {rule.basePrice}/{rule.unit}</span>
{pricingRuleSummaries(ruleSet).map((item) => (
<span key={item.label}>
<strong>{pricingRuleSummaryIcon(item.kind)}{item.label}</strong>
<em>{item.value}</em>
</span>
))}
</div>
<div className="providerCatalogActions">
@ -163,7 +160,7 @@ export function PricingRulesPanel(props: {
<Label><Input value={form.name} onChange={(event) => setForm({ ...form, name: event.target.value })} /></Label>
<Label className="spanTwo"><Input value={form.description} onChange={(event) => setForm({ ...form, description: event.target.value })} /></Label>
<Label><Select value={form.category} onChange={(event) => setForm({ ...form, category: event.target.value })}>{categories.map((item) => <option value={item} key={item}>{item}</option>)}</Select></Label>
<Label><Select value={form.currency} onChange={(event) => setForm({ ...form, currency: event.target.value })}>{currencies.map((item) => <option value={item} key={item}>{item}</option>)}</Select></Label>
<Label><Select value={form.currency} onChange={(event) => updateCurrency(event.target.value)}>{currencies.map((item) => <option value={item} key={item}>{item}</option>)}</Select></Label>
<Label><Select value={form.status} onChange={(event) => setForm({ ...form, status: event.target.value })}>{statuses.map((item) => <option value={item} key={item}>{item}</option>)}</Select></Label>
<PricingRuleVisualEditor currency={form.currency} rules={form.rules} onChange={(rules) => setForm({ ...form, rules })} />
<KeyValueEditor className="spanTwo" title="规则集元数据" value={form.metadata} onChange={(metadata) => setForm({ ...form, metadata })} />
@ -172,6 +169,19 @@ export function PricingRulesPanel(props: {
);
}
function createEmptyForm(currency = 'resource'): PricingForm {
return {
ruleSetKey: '',
name: '',
description: '',
category: 'custom',
currency,
status: 'active',
metadata: {},
rules: createDefaultPricingRules(currency),
};
}
function ruleSetToForm(ruleSet: PricingRuleSet): PricingForm {
return {
ruleSetKey: ruleSet.ruleSetKey,
@ -205,13 +215,12 @@ function ruleToInput(rule: PricingRule): PricingRuleInput {
}
function formToPayload(form: PricingForm): PricingRuleSetUpsertRequest {
const rules = form.rules.map((rule, index) => ({
const rules = ensureRules(form.rules, form.currency).map((rule, index) => ({
...rule,
displayName: rule.displayName?.trim() || `${rule.resourceType} 计价`,
priority: rule.priority ?? (index + 1) * 10,
ruleKey: rule.ruleKey?.trim() || `${rule.resourceType}_${index + 1}`,
}));
if (!rules.length) throw new Error('计价规则至少需要一条');
return {
ruleSetKey: form.ruleSetKey.trim(),
name: form.name.trim(),
@ -223,3 +232,48 @@ function formToPayload(form: PricingForm): PricingRuleSetUpsertRequest {
rules,
};
}
type PricingRuleSummary = {
kind: 'text' | 'image' | 'video' | 'custom';
label: string;
value: string;
};
function pricingRuleSummaries(ruleSet: PricingRuleSet): PricingRuleSummary[] {
const rules = ruleSet.rules ?? [];
const textTotal = rules.find((rule) => rule.resourceType === 'text_total' || rule.ruleKey === 'text');
const textInput = rules.find((rule) => rule.resourceType === 'text_input');
const textOutput = rules.find((rule) => rule.resourceType === 'text_output');
const image = rules.find((rule) => rule.resourceType === 'image');
const video = rules.find((rule) => rule.resourceType === 'video');
const items: PricingRuleSummary[] = [];
if (textTotal || textInput || textOutput) {
const inputPrice = Number(textTotal?.formulaConfig?.inputTokenPrice ?? textInput?.basePrice ?? textTotal?.basePrice ?? 0);
const outputPrice = Number(textTotal?.formulaConfig?.outputTokenPrice ?? textOutput?.basePrice ?? 0);
items.push({ kind: 'text', label: '文本', value: `输入 ${formatPrice(inputPrice)} / 输出 ${formatPrice(outputPrice)} / 1K Token` });
}
if (image) items.push({ kind: 'image', label: '图像', value: `${formatPrice(image.basePrice)} / ${unitLabel(image.unit)}` });
if (video) items.push({ kind: 'video', label: '视频', value: `${formatPrice(video.basePrice)} / ${unitLabel(video.unit)}` });
if (items.length) return items;
return rules.slice(0, 3).map((rule) => ({
kind: 'custom',
label: rule.displayName || rule.resourceType,
value: `${formatPrice(rule.basePrice)} / ${unitLabel(rule.unit)}`,
}));
}
function pricingRuleSummaryIcon(kind: PricingRuleSummary['kind']) {
if (kind === 'image') return <Image size={14} />;
if (kind === 'video') return <Video size={14} />;
return <FileText size={14} />;
}
function formatPrice(value: number) {
if (!Number.isFinite(value)) return '0';
return Number(value.toFixed(4)).toString();
}
function ensureRules(rules: PricingRuleInput[], currency: string): PricingRuleInput[] {
const sourceRules = rules.length ? rules : createDefaultPricingRules(currency);
return sourceRules.map((rule) => ({ ...rule, currency }));
}

View File

@ -1,22 +1,24 @@
@import './styles/ui.css';
@import './styles/pages.css';
@import './styles/pricing.css';
@import './styles/api-docs.css';
@import './styles/landing.css';
:root {
--background: #f6f7f9;
--foreground: #111827;
--background: #f7f8fa;
--foreground: #101318;
--card: #ffffff;
--card-foreground: #111827;
--muted: #eef2f6;
--muted-foreground: #667085;
--border: #dde3ea;
--input: #cfd8e3;
--primary: #145388;
--card-foreground: #101318;
--muted: #f2f4f7;
--muted-foreground: #6b7280;
--border: #e4e7ec;
--input: #d8dee6;
--primary: #111827;
--primary-foreground: #ffffff;
--secondary: #edf2f7;
--secondary-foreground: #1f2937;
--secondary: #f4f6f8;
--secondary-foreground: #202734;
--destructive: #b42318;
--ring: #2f80c1;
--ring: #64748b;
color: var(--foreground);
background: var(--background);
font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
@ -90,8 +92,8 @@ h1 {
width: 38px;
height: 38px;
place-items: center;
border-radius: 8px;
background: #145388;
border-radius: 10px;
background: #111827;
color: #fff;
font-size: 13px;
font-weight: 900;
@ -153,10 +155,9 @@ h1 {
align-items: center;
gap: 2px;
padding: 3px;
border: 1px solid var(--border);
border: 1px solid #e7ebf0;
border-radius: 999px;
background: #f5f7fa;
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.75);
background: rgba(255, 255, 255, 0.72);
}
.topNavItem {
@ -168,7 +169,7 @@ h1 {
border: 0;
border-radius: 999px;
background: transparent;
color: #475467;
color: #5d6675;
font-size: 14px;
font-weight: 800;
white-space: nowrap;
@ -177,8 +178,8 @@ h1 {
.topNavItem:hover,
.topNavItem[data-active="true"] {
background: #ffffff;
color: #145388;
box-shadow: 0 1px 4px rgba(16, 24, 40, 0.12);
color: #111827;
box-shadow: 0 1px 2px rgba(16, 24, 40, 0.08);
}
.workspaceShell {
@ -196,8 +197,8 @@ h1 {
gap: 16px;
padding: 0 28px;
border-bottom: 1px solid var(--border);
background: rgba(255, 255, 255, 0.94);
box-shadow: 0 1px 10px rgba(16, 24, 40, 0.04);
background: rgba(255, 255, 255, 0.88);
box-shadow: 0 1px 0 rgba(16, 24, 40, 0.03);
backdrop-filter: blur(12px);
}
@ -262,10 +263,10 @@ h1 {
.notice,
.inlineNotice {
padding: 12px 14px;
border: 1px solid #f0b8b8;
border: 1px solid #f0d4d4;
border-radius: 8px;
background: #fff1f1;
color: #9b2c2c;
background: #fff7f7;
color: #9f2f2f;
font-size: 14px;
}
@ -301,17 +302,16 @@ h1 {
min-height: 92px;
padding: 15px;
border: 1px solid var(--border);
border-top: 3px solid #64748b;
border-radius: 8px;
border-radius: 10px;
background: var(--card);
}
.statCard[data-tone="blue"] { border-top-color: #145388; }
.statCard[data-tone="green"] { border-top-color: #14805e; }
.statCard[data-tone="violet"] { border-top-color: #7048b8; }
.statCard[data-tone="amber"] { border-top-color: #b7791f; }
.statCard[data-tone="cyan"] { border-top-color: #087f8c; }
.statCard[data-tone="rose"] { border-top-color: #b8325f; }
.statCard[data-tone="blue"] { border-color: #d8e0ea; }
.statCard[data-tone="green"] { border-color: #d7e7df; }
.statCard[data-tone="violet"] { border-color: #e0dce9; }
.statCard[data-tone="amber"] { border-color: #ebe0cc; }
.statCard[data-tone="cyan"] { border-color: #d5e4e8; }
.statCard[data-tone="rose"] { border-color: #ead8df; }
.statCard span {
color: var(--muted-foreground);
@ -336,9 +336,10 @@ h1 {
width: 38px;
height: 38px;
place-items: center;
border-radius: 8px;
background: #eaf2f8;
color: #145388;
border: 1px solid var(--border);
border-radius: 10px;
background: #fff;
color: #111827;
}
.infoItem,
@ -348,7 +349,7 @@ h1 {
padding: 12px;
border: 1px solid var(--border);
border-radius: 8px;
background: #fbfcfe;
background: #fafbfc;
}
@media (max-width: 980px) {

View File

@ -0,0 +1,188 @@
.apiDocsShell {
display: grid;
min-height: calc(100vh - 120px);
grid-template-columns: 280px minmax(420px, 1fr) 360px;
gap: 0;
overflow: hidden;
border: 1px solid var(--border);
border-radius: 12px;
background: #fff;
}
.docsSidebar,
.docsArticle,
.docsRunner {
min-height: 0;
overflow: auto;
}
.docsSidebar {
padding: 18px;
border-right: 1px solid var(--border);
}
.docsBrand,
.docsSearch {
display: flex;
align-items: center;
gap: 10px;
}
.docsBrand {
margin-bottom: 18px;
font-size: 17px;
}
.docsSearch {
min-height: 40px;
padding: 0 12px;
border: 1px solid var(--border);
border-radius: 8px;
color: var(--muted-foreground);
}
.docsSearch input {
width: 100%;
border: 0;
outline: 0;
}
.docsGroup {
display: grid;
gap: 6px;
margin-top: 22px;
}
.docsGroup h3 {
margin-bottom: 4px;
color: var(--muted-foreground);
font-size: 13px;
}
.docsGroup button {
display: flex;
min-height: 34px;
align-items: center;
justify-content: space-between;
gap: 10px;
padding: 0 10px;
border: 0;
border-radius: 7px;
background: transparent;
color: #344054;
text-align: left;
}
.docsGroup button[data-active="true"] {
background: #f5f6f8;
color: #111827;
}
.docsArticle {
padding: 28px 34px 60px;
background: #fff;
}
.docsArticle h1 {
margin-bottom: 20px;
}
.endpointBar,
.runnerEndpoint {
display: flex;
align-items: center;
gap: 10px;
padding: 10px;
border: 1px solid var(--border);
border-radius: 10px;
background: #fff;
}
.docsLead {
margin: 18px 0 24px;
color: #475467;
line-height: 1.7;
}
.paramCard {
margin-top: 18px;
overflow: hidden;
border: 1px solid var(--border);
border-radius: 12px;
background: #fff;
}
.paramCard header,
.docsRunner header {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
padding: 14px 16px;
border-bottom: 1px solid var(--border);
}
.paramRow {
display: grid;
grid-template-columns: 150px 110px minmax(0, 1fr) 50px;
gap: 12px;
padding: 13px 16px;
border-bottom: 1px solid #f0f2f5;
color: #475467;
font-size: 13px;
}
.paramRow em {
color: #a16207;
font-style: normal;
}
.docsRunner {
border-left: 1px solid var(--border);
background: #fff;
}
.docsRunner form {
display: grid;
gap: 14px;
padding: 0 16px 16px;
}
.runnerResult {
display: grid;
gap: 12px;
padding: 16px;
border-top: 1px solid var(--border);
}
.runnerResult pre {
overflow: auto;
max-height: 300px;
margin: 0;
padding: 12px;
border-radius: 8px;
background: #f7f8fa;
font-size: 12px;
}
@media (max-width: 1180px) {
.apiDocsShell {
grid-template-columns: 240px minmax(0, 1fr);
}
.docsRunner {
grid-column: 1 / -1;
border-top: 1px solid var(--border);
border-left: 0;
}
}
@media (max-width: 860px) {
.apiDocsShell {
grid-template-columns: 1fr;
}
.paramRow {
grid-template-columns: 1fr;
}
}

View File

@ -9,10 +9,10 @@
align-items: center;
gap: 12px;
padding: 10px 16px;
border: 1px solid #d7eadf;
border-radius: 10px;
background: #f1fbf5;
color: #155e3d;
border: 1px solid #e2e8f0;
border-radius: 12px;
background: #fff;
color: #202734;
}
.releaseNotice strong {
@ -20,7 +20,7 @@
}
.releaseNotice span {
color: #43735b;
color: var(--muted-foreground);
font-size: 13px;
}
@ -32,10 +32,8 @@
align-items: center;
padding: 44px;
border: 1px solid var(--border);
border-radius: 12px;
background:
linear-gradient(120deg, rgba(245, 250, 255, 0.96), rgba(255, 255, 255, 0.9)),
#ffffff;
border-radius: 14px;
background: #ffffff;
}
.landingCopy {
@ -66,10 +64,10 @@
display: grid;
gap: 16px;
padding: 18px;
border: 1px solid #dbe5ef;
border-radius: 10px;
background: #f8fafc;
box-shadow: 0 18px 45px rgba(16, 24, 40, 0.10);
border: 1px solid var(--border);
border-radius: 12px;
background: #fafbfc;
box-shadow: 0 20px 60px rgba(16, 24, 40, 0.08);
}
.previewHeader,
@ -98,7 +96,7 @@
min-height: 92px;
padding: 14px;
border: 1px solid var(--border);
border-radius: 8px;
border-radius: 10px;
background: #fff;
}
@ -114,8 +112,8 @@
.previewFlow {
padding: 14px;
border-radius: 8px;
background: #102033;
border-radius: 10px;
background: #111827;
color: #fff;
font-size: 12px;
font-weight: 800;

View File

@ -15,7 +15,9 @@
display: grid;
gap: 6px;
padding: 8px;
background: #fff;
border: 1px solid var(--border);
border-radius: 10px;
background: rgba(255, 255, 255, 0.72);
}
.sideTabs .shTab {
@ -58,7 +60,7 @@
min-height: 28px;
padding: 0 10px;
border: 1px solid var(--border);
border-radius: 6px;
border-radius: 999px;
background: #fff;
color: #344054;
font-size: 12px;
@ -66,8 +68,8 @@
}
.filterChip[data-active="true"] {
border-color: #2f6fe4;
background: #2f6fe4;
border-color: #111827;
background: #111827;
color: #fff;
}
@ -109,9 +111,9 @@
align-items: center;
gap: 14px;
padding: 18px;
border: 1px solid #ebe5fb;
border-radius: 8px;
background: #f6f1ff;
border: 1px solid var(--border);
border-radius: 10px;
background: #fff;
}
.providerHero strong {
@ -130,7 +132,7 @@
width: 42px;
height: 42px;
place-items: center;
border-radius: 8px;
border-radius: 10px;
background: #fff;
color: #111827;
font-weight: 900;
@ -193,9 +195,10 @@
.modelTags span {
padding: 4px 7px;
border-radius: 5px;
background: #fff5e7;
color: #9a5b12;
border: 1px solid #eceff3;
border-radius: 999px;
background: #fafbfc;
color: #5d6675;
font-size: 12px;
}
@ -208,7 +211,7 @@
}
.modelCardFooter a {
color: #2563eb;
color: #111827;
font-size: 12px;
font-weight: 800;
text-decoration: none;
@ -247,7 +250,7 @@
align-items: center;
padding: 16px;
border: 1px solid var(--border);
border-radius: 8px;
border-radius: 10px;
background: #fff;
}
@ -257,9 +260,9 @@
height: 54px;
place-items: center;
overflow: hidden;
border: 1px solid #edf1f5;
border-radius: 8px;
background: #f8fafc;
border: 1px solid #eef1f4;
border-radius: 10px;
background: #fafbfc;
color: #111827;
font-weight: 900;
}
@ -323,7 +326,7 @@
min-height: 184px;
padding: 16px;
border: 1px solid var(--border);
border-radius: 8px;
border-radius: 10px;
background: #fff;
}
@ -359,9 +362,10 @@
.modelAbilityChips span {
padding: 4px 7px;
border-radius: 5px;
background: #eef7ff;
color: #0f5d8f;
border: 1px solid #e8ecf1;
border-radius: 999px;
background: #fafbfc;
color: #4b5563;
font-size: 12px;
font-weight: 800;
}
@ -376,368 +380,17 @@
font-size: 12px;
}
.pricingRuleGrid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 14px;
}
.pricingRuleCard {
display: grid;
gap: 12px;
padding: 16px;
border: 1px solid var(--border);
border-radius: 8px;
background: #fff;
}
.pricingRuleCard header {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 12px;
}
.pricingRuleCard strong,
.pricingRuleCard span {
display: block;
}
.pricingRuleCard header span,
.pricingRuleCard p {
margin: 0;
color: var(--muted-foreground);
font-size: 12px;
}
.pricingRuleItems {
display: flex;
flex-wrap: wrap;
gap: 6px;
}
.pricingRuleItems span {
padding: 5px 7px;
border-radius: 5px;
background: #f1f5f9;
color: #334155;
font-size: 12px;
font-weight: 800;
}
.pricingRuleDialog {
width: min(1120px, 100%);
}
.pricingRuleFormBody {
grid-template-columns: repeat(3, minmax(0, 1fr));
}
.pricingRuleEditor {
display: grid;
gap: 12px;
}
.pricingRuleEditorHeader,
.pricingRuleEditorCard header,
.pricingRuleSubHeader {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
}
.pricingRuleEditorHeader strong,
.pricingRuleEditorCard strong,
.pricingRuleSubHeader strong {
display: block;
font-size: 14px;
}
.pricingRuleEditorHeader span,
.pricingRuleEditorCard header span,
.pricingRuleSubHeader span,
.pricingRuleEmpty span,
.mutedLine {
color: var(--muted-foreground);
font-size: 12px;
}
.pricingRuleQuickActions {
display: flex;
flex-wrap: wrap;
gap: 8px;
}
.pricingRuleEditorCard,
.pricingRuleSubPanel,
.pricingRuleEmpty {
display: grid;
gap: 12px;
padding: 12px;
border: 1px solid var(--border);
border-radius: 8px;
background: #fbfcfe;
}
.pricingRuleEditorCard {
background: #fff;
}
.pricingRuleEditorCard header > div {
display: flex;
min-width: 0;
align-items: center;
gap: 8px;
}
.pricingRuleEditorCard header span {
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.pricingRuleFields {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 10px;
}
.dimensionChips {
display: flex;
flex-wrap: wrap;
gap: 7px;
}
.dimensionChips button {
min-height: 30px;
padding: 0 9px;
border: 1px solid var(--border);
border-radius: 999px;
background: #fff;
color: #475467;
font-size: 12px;
font-weight: 800;
}
.dimensionChips button.active {
border-color: #145388;
background: #eaf3fb;
color: #145388;
}
.weightGroup {
display: grid;
gap: 10px;
padding: 10px;
border: 1px dashed var(--border);
border-radius: 8px;
background: #fff;
}
.keyValueRows {
display: grid;
gap: 8px;
}
.keyValueRow {
display: grid;
grid-template-columns: minmax(120px, 0.55fr) minmax(140px, 1fr) 34px;
gap: 8px;
align-items: center;
}
.apiDocsShell {
display: grid;
min-height: calc(100vh - 120px);
grid-template-columns: 280px minmax(420px, 1fr) 360px;
gap: 0;
overflow: hidden;
border: 1px solid var(--border);
border-radius: 10px;
background: #fff;
}
.docsSidebar,
.docsArticle,
.docsRunner {
min-height: 0;
overflow: auto;
}
.docsSidebar {
padding: 18px;
border-right: 1px solid var(--border);
}
.docsBrand,
.docsSearch {
display: flex;
align-items: center;
gap: 10px;
}
.docsBrand {
margin-bottom: 18px;
font-size: 17px;
}
.docsSearch {
min-height: 40px;
padding: 0 12px;
border: 1px solid var(--border);
border-radius: 8px;
color: var(--muted-foreground);
}
.docsSearch input {
width: 100%;
border: 0;
outline: 0;
}
.docsGroup {
display: grid;
gap: 6px;
margin-top: 22px;
}
.docsGroup h3 {
margin-bottom: 4px;
color: var(--muted-foreground);
font-size: 13px;
}
.docsGroup button {
display: flex;
min-height: 34px;
align-items: center;
justify-content: space-between;
gap: 10px;
padding: 0 10px;
border: 0;
border-radius: 7px;
background: transparent;
color: #344054;
text-align: left;
}
.docsGroup button[data-active="true"] {
background: #f0e9ff;
color: #7048e8;
}
.docsArticle {
padding: 28px 34px 60px;
background: linear-gradient(90deg, #fff 0%, #fbf8ff 100%);
}
.docsArticle h1 {
margin-bottom: 20px;
}
.endpointBar,
.runnerEndpoint {
display: flex;
align-items: center;
gap: 10px;
padding: 10px;
border: 1px solid var(--border);
border-radius: 8px;
background: #fff;
}
.docsLead {
margin: 18px 0 24px;
color: #475467;
line-height: 1.7;
}
.paramCard {
margin-top: 18px;
overflow: hidden;
border: 1px solid var(--border);
border-radius: 10px;
background: #fff;
}
.paramCard header,
.docsRunner header {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
padding: 14px 16px;
border-bottom: 1px solid var(--border);
}
.paramRow {
display: grid;
grid-template-columns: 150px 110px minmax(0, 1fr) 50px;
gap: 12px;
padding: 13px 16px;
border-bottom: 1px solid #f0f2f5;
color: #475467;
font-size: 13px;
}
.paramRow em {
color: #f97316;
font-style: normal;
}
.docsRunner {
border-left: 1px solid var(--border);
background: #fff;
}
.docsRunner form {
display: grid;
gap: 14px;
padding: 0 16px 16px;
}
.runnerResult {
display: grid;
gap: 12px;
padding: 16px;
border-top: 1px solid var(--border);
}
.runnerResult pre {
overflow: auto;
max-height: 300px;
margin: 0;
padding: 12px;
border-radius: 8px;
background: #f8fafc;
font-size: 12px;
}
@media (max-width: 1180px) {
.modelCards,
.providerCatalogGrid,
.baseModelGrid,
.pricingRuleGrid {
.baseModelGrid {
grid-template-columns: repeat(2, minmax(240px, 1fr));
}
.apiDocsShell {
grid-template-columns: 240px minmax(0, 1fr);
}
.docsRunner {
grid-column: 1 / -1;
border-top: 1px solid var(--border);
border-left: 0;
}
}
@media (max-width: 860px) {
.subPageLayout,
.modelsPage,
.apiDocsShell {
.modelsPage {
grid-template-columns: 1fr;
}
@ -749,9 +402,6 @@
.modelCards,
.providerCatalogGrid,
.baseModelGrid,
.pricingRuleGrid,
.pricingRuleFields,
.pricingRuleFormBody,
.modelCatalogFilters {
grid-template-columns: 1fr;
}
@ -770,7 +420,4 @@
justify-content: flex-start;
}
.paramRow {
grid-template-columns: 1fr;
}
}

View File

@ -0,0 +1,302 @@
.pricingRuleGrid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 14px;
}
.pricingRuleCard {
display: grid;
gap: 12px;
padding: 16px;
border: 1px solid var(--border);
border-radius: 10px;
background: #fff;
}
.pricingRuleCard header {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 12px;
}
.pricingRuleCard strong,
.pricingRuleCard span {
display: block;
}
.pricingRuleCard header span,
.pricingRuleCard p {
margin: 0;
color: var(--muted-foreground);
font-size: 12px;
}
.pricingRuleItems {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
gap: 8px;
}
.pricingRuleItems span {
display: grid;
gap: 4px;
min-height: 56px;
padding: 10px;
border-radius: 8px;
border: 1px solid #e8ecf1;
background: #fafbfc;
color: #4b5563;
font-size: 12px;
}
.pricingRuleItems strong {
display: flex;
align-items: center;
gap: 6px;
color: #111827;
font-size: 13px;
}
.pricingRuleItems svg {
color: #6b7280;
}
.pricingRuleItems em {
color: var(--muted-foreground);
font-style: normal;
line-height: 1.35;
}
.pricingRuleDialog {
width: min(1120px, 100%);
}
.pricingRuleFormBody {
grid-template-columns: repeat(3, minmax(0, 1fr));
}
.pricingModeEditor,
.pricingModeRule,
.pricingWeightStack {
display: grid;
gap: 14px;
}
.pricingModeHeader,
.pricingModeRule header,
.pricingWeightTable header {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
}
.pricingModeHeader strong,
.pricingModeRule strong,
.pricingWeightTable strong {
display: block;
font-size: 14px;
}
.pricingModeHeader span,
.pricingModeRule header span {
color: var(--muted-foreground);
font-size: 12px;
}
.pricingModeTabs {
display: flex;
flex-wrap: wrap;
gap: 18px;
border-bottom: 1px solid var(--border);
}
.pricingModeTabs button {
min-height: 40px;
padding: 0 2px;
border: 0;
border-bottom: 3px solid transparent;
background: transparent;
color: #475467;
font-size: 14px;
font-weight: 800;
}
.pricingModeTabs button.active {
border-bottom-color: #111827;
color: #111827;
}
.pricingModeRule,
.pricingModeEmpty {
display: grid;
gap: 12px;
padding: 12px;
border: 1px solid var(--border);
border-radius: 10px;
background: #fff;
}
.pricingModeEmpty {
grid-template-columns: minmax(0, 1fr) auto;
align-items: center;
}
.pricingModeRule header > div {
display: flex;
min-width: 0;
align-items: center;
gap: 8px;
}
.pricingModeRule header span {
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.pricingModeBaseRows {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 8px;
}
.pricingModeBaseRows.compact {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
.pricingModeInlineRows {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 8px;
}
.pricingTextPriceGrid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 8px;
}
.pricingModeInlineInput,
.pricingInlineField {
display: grid;
grid-template-columns: 140px minmax(0, 1fr);
overflow: hidden;
border: 1px solid var(--border);
border-radius: 10px;
background: #fff;
}
.pricingModeInlineInput span,
.pricingInlineField span {
display: flex;
align-items: center;
padding: 0 10px;
border-right: 1px solid var(--border);
background: #fafbfc;
color: #344054;
font-size: 12px;
font-weight: 700;
line-height: 1.35;
}
.pricingModeInlineInput input,
.pricingModeInlineInput select,
.pricingInlineField input,
.pricingInlineField select {
border: 0;
border-radius: 0;
}
.pricingInlineReadonly strong {
display: flex;
min-height: 40px;
align-items: center;
padding: 0 12px;
color: #111827;
font-size: 13px;
}
.pricingFormulaBox {
display: grid;
grid-template-columns: 20px minmax(0, 1fr);
gap: 10px;
padding: 12px;
border-radius: 10px;
background: #f6f7f9;
color: #344054;
}
.pricingFormulaBox p {
margin-top: 8px;
color: var(--muted-foreground);
font-size: 13px;
font-weight: 700;
}
.pricingFormulaBox input {
margin-top: 8px;
}
.pricingWeightTable {
display: grid;
overflow: hidden;
border: 1px solid var(--border);
border-radius: 10px;
background: #fff;
}
.pricingWeightTable header {
min-height: 36px;
padding: 0 12px;
background: #f6f7f9;
}
.pricingWeightRows {
display: flex;
flex-wrap: wrap;
gap: 8px;
padding: 9px;
}
.pricingWeightRow {
display: grid;
grid-template-columns: minmax(100px, 150px) minmax(82px, 120px) 32px;
gap: 6px;
align-items: center;
}
.pricingWeightRow.locked {
grid-template-columns: minmax(112px, 150px) minmax(82px, 120px);
}
.pricingFactorLabel {
display: flex;
min-height: 34px;
align-items: center;
padding: 0 10px;
border: 1px solid var(--border);
border-radius: 8px;
background: #fafbfc;
color: #344054;
font-size: 13px;
font-weight: 700;
}
.pricingInlineAdd {
border-style: dashed;
}
@media (max-width: 860px) {
.pricingRuleGrid,
.pricingModeBaseRows,
.pricingRuleFormBody,
.pricingModeInlineRows,
.pricingModeInlineInput,
.pricingInlineField,
.pricingTextPriceGrid {
grid-template-columns: 1fr;
}
}

View File

@ -1,7 +1,7 @@
.shCard {
overflow: hidden;
border: 1px solid var(--border);
border-radius: 8px;
border-radius: 10px;
background: var(--card);
color: var(--card-foreground);
}
@ -18,7 +18,7 @@
align-items: center;
justify-content: space-between;
gap: 12px;
border-bottom: 1px solid #edf1f5;
border-bottom: 1px solid #eef1f4;
}
.shCardTitle {
@ -39,9 +39,10 @@
justify-content: center;
gap: 8px;
border: 1px solid transparent;
border-radius: 8px;
border-radius: 7px;
font-weight: 800;
line-height: 1;
transition: background 0.16s ease, border-color 0.16s ease, box-shadow 0.16s ease, color 0.16s ease;
}
.shButtonDefaultSize {
@ -65,6 +66,10 @@
color: var(--primary-foreground);
}
.shButtonDefault:hover {
background: #202734;
}
.shButtonSecondary {
background: var(--secondary);
color: var(--secondary-foreground);
@ -76,11 +81,21 @@
color: #344054;
}
.shButtonOutline:hover,
.shButtonSecondary:hover {
border-color: #d5dbe3;
background: #f9fafb;
}
.shButtonGhost {
background: transparent;
color: #344054;
}
.shButtonGhost:hover {
background: #f5f6f8;
}
.shButtonDestructive {
background: var(--destructive);
color: #fff;
@ -93,7 +108,7 @@
display: grid;
place-items: center;
padding: 24px;
background: rgba(15, 23, 42, 0.42);
background: rgba(16, 19, 24, 0.36);
}
.formDialog {
@ -103,9 +118,9 @@
grid-template-rows: auto minmax(0, 1fr);
overflow: hidden;
border: 1px solid var(--border);
border-radius: 10px;
border-radius: 12px;
background: #fff;
box-shadow: 0 24px 70px rgba(15, 23, 42, 0.22);
box-shadow: 0 22px 60px rgba(16, 24, 40, 0.16);
}
.formDialogHeader {
@ -154,14 +169,14 @@
padding: 14px 18px;
border-top: 1px solid var(--border);
background: #fff;
box-shadow: 0 -10px 24px rgba(15, 23, 42, 0.06);
box-shadow: 0 -1px 0 rgba(16, 24, 40, 0.02);
}
.shInput,
.shTextarea {
width: 100%;
border: 1px solid var(--input);
border-radius: 8px;
border-radius: 7px;
background: #fff;
color: var(--foreground);
outline: none;
@ -182,7 +197,7 @@
.shTextarea:focus,
.tokenInline input:focus {
border-color: var(--ring);
box-shadow: 0 0 0 3px rgba(47, 128, 193, 0.16);
box-shadow: 0 0 0 3px rgba(100, 116, 139, 0.14);
}
.shLabel,
@ -212,7 +227,7 @@
padding: 4px;
border: 1px solid var(--border);
border-radius: 8px;
background: #f8fafc;
background: #f6f7f9;
}
.shTab {
@ -230,8 +245,8 @@
.shTab[data-active="true"] {
background: #fff;
color: #145388;
box-shadow: 0 1px 2px rgba(16, 24, 40, 0.08);
color: #111827;
box-shadow: 0 1px 2px rgba(16, 24, 40, 0.06);
}
.shBadge {
@ -246,12 +261,12 @@
font-weight: 900;
}
.shBadgeDefault { background: #eaf2f8; color: #145388; }
.shBadgeSecondary { background: #eef2f6; color: #475467; }
.shBadgeDefault { background: #eef1f5; color: #202734; }
.shBadgeSecondary { background: #f3f5f7; color: #5d6675; }
.shBadgeOutline { border-color: var(--border); background: #fff; color: #344054; }
.shBadgeSuccess { background: #e8f5ef; color: #14805e; }
.shBadgeWarning { background: #fff6df; color: #98690c; }
.shBadgeDestructive { background: #fff1f1; color: #b42318; }
.shBadgeSuccess { background: #edf7f1; color: #157a57; }
.shBadgeWarning { background: #fbf4e8; color: #8a6116; }
.shBadgeDestructive { background: #fff3f3; color: #b42318; }
.shTable {
overflow: auto;
@ -261,11 +276,11 @@
display: grid;
grid-template-columns: repeat(auto-fit, minmax(118px, 1fr));
min-width: 520px;
border-bottom: 1px solid #edf1f5;
border-bottom: 1px solid #eef1f4;
}
.shTableHeader {
background: #f8fafc;
background: #f7f8fa;
}
.shTableHead,
@ -305,7 +320,7 @@
overflow: auto;
border: 1px solid var(--border);
border-radius: 8px;
background: #f8fafc;
background: #f7f8fa;
color: #1f2937;
font-family: "SFMono-Regular", Consolas, monospace;
font-size: 12px;

View File

@ -311,9 +311,13 @@ AI Gateway 的外部接口必须以“兼容现有 EasyAI 路由、请求 DTO、
| `POST` | `/api/v1/auth/register` | `public` | Gateway 本地账号注册,`invitationCode` 可选 |
| `POST` | `/api/v1/auth/login` | `public` | Gateway 本地账号登录 |
| `GET` | `/api/v1/me` | `basic` | 网关当前身份调试 |
| `GET` | `/api/v1/public/catalog/providers` | `public` | 公开 provider 展示目录,供未登录模型页和 API 文档使用 |
| `GET` | `/api/v1/public/catalog/base-models` | `public` | 公开基准模型展示目录,不包含平台凭证 |
| `GET` | `/api/v1/catalog/providers` | `power` | 基准 provider 列表 |
| `GET` | `/api/v1/catalog/base-models` | `power` | 基准模型库列表 |
| `GET` | `/api/v1/catalog/base-models/:id` | `power` | 基准模型详情 |
| `POST` | `/api/v1/catalog/base-models` | `manager` | 新增基准模型,支持写入能力、基准计费、默认限流和元数据 |
| `PATCH` | `/api/v1/catalog/base-models/:id` | `manager` | 修改基准模型 |
| `DELETE` | `/api/v1/catalog/base-models/:id` | `manager` | 删除基准模型 |
| `GET` | `/api/v1/tenants` | `power` | 网关租户列表,支持本地租户和 server-main 同步租户 |
| `GET` | `/api/v1/tenants/:id` | `power` | 租户详情、来源、策略和同步状态 |
| `POST` | `/api/v1/tenants/sync` | `power` | 从 `server-main` 拉取或接收租户同步 |
@ -334,6 +338,10 @@ AI Gateway 的外部接口必须以“兼容现有 EasyAI 路由、请求 DTO、
| `PATCH` | `/api/v1/api-keys/:id/disable` | `basic` | 禁用本地 API Key |
| `POST` | `/api/v1/pricing/estimate` | `basic` | 使用 effective pricing resolver 做价格预估 |
| `GET` | `/api/v1/pricing/rules` | `power` | 定价规则列表 |
| `GET` | `/api/v1/pricing/rule-sets` | `power` | 定价规则集列表,包含规则集下的多条文本/图像/视频规则 |
| `POST` | `/api/v1/pricing/rule-sets` | `manager` | 新增定价规则集 |
| `PATCH` | `/api/v1/pricing/rule-sets/:id` | `manager` | 修改定价规则集和其下计价规则 |
| `DELETE` | `/api/v1/pricing/rule-sets/:id` | `manager` | 删除定价规则集;已绑定平台/模型需先迁移或按外键策略清空绑定 |
| `GET` | `/api/v1/tasks/:taskId` | `basic` | Gateway 任务详情 |
| `GET` | `/api/v1/tasks/:taskId/events` | `basic` | SSE 任务进度 |
| `GET` | `/api/v1/runtime/clients` | `power` | 客户端运行状态 |
@ -564,19 +572,23 @@ Gateway 需要支持三种身份运行模式,默认配置为 `IDENTITY_MODE=hy
| 字段 | 类型 | 约束 | 说明 |
| --- | --- | --- | --- |
| `id` | `uuid` | PK | 基准 provider ID |
| `provider_key` | `text` | unique, not null | 稳定 provider key`openai`、`runninghub`、`jimeng` |
| `provider_key` | `text` | unique, not null | Gateway 内部稳定 provider key`openai`、`gemini`、`runninghub` |
| `provider_code` | `text` | unique, not null | 原 `server-main` `integration-platform.code`,如 `openai`、`google-gemini` |
| `display_name` | `text` | not null | 展示名称 |
| `provider_type` | `text` | not null | `openai_compatible`、`workflow_app`、`video_vendor`、`audio_vendor` |
| `provider_type` | `text` | not null | 对应原 `integration-platform.spec_type`,如 `openai`、`google-gemini`、`runninghub`、`jimeng` |
| `icon_path` | `text` | nullable | 原 `integration-platform.icon_path``Logos[code]` 解析后的图标地址 |
| `source` | `text` | not null | `gateway`、`server-main.integration-platform`、`sync` |
| `capability_schema` | `jsonb` | not null, default `{}` | provider 支持的能力字段定义 |
| `default_rate_limit_policy` | `jsonb` | not null, default `{}` | provider 默认 TPM/RPM/并发模板 |
| `status` | `text` | not null | `active`、`deprecated`、`hidden` |
| `metadata` | `jsonb` | not null, default `{}` | 文档链接、logo、排序等 |
| `metadata` | `jsonb` | not null, default `{}` | 原始同步字段、文档链接、排序等 |
| `created_at` | `timestamptz` | not null | 创建时间 |
| `updated_at` | `timestamptz` | not null | 更新时间 |
索引:
- `uniq_model_catalog_provider_key(provider_key)`
- `idx_model_catalog_provider_code(provider_code)`
- `idx_model_catalog_provider_status(status)`
#### 7.9.2 `base_model_catalog`
@ -590,7 +602,7 @@ Gateway 需要支持三种身份运行模式,默认配置为 `IDENTITY_MODE=hy
| `provider_key` | `text` | not null | 冗余 provider key方便查询 |
| `canonical_model_key` | `text` | unique, not null | Gateway 内部标准模型 key |
| `provider_model_name` | `text` | not null | 供应商原始模型名 |
| `model_type` | `text` | not null | `chat`、`image`、`video`、`audio`、`embedding`、`music`、`digital_human`、`model_3d` |
| `model_type` | `text` | not null | `PlatformModelType` 主类型,如 `text_generate`、`image_generate`、`image_edit`、`video_generate`、`image_to_video`、`omni_video` 等 |
| `display_name` | `text` | not null | 展示名称 |
| `capabilities` | `jsonb` | not null, default `{}` | 上下文、多模态、参考图/视频/音频、尺寸、时长、质量等基准能力 |
| `base_billing_config` | `jsonb` | not null, default `{}` | 基准计费配置 |
@ -607,21 +619,47 @@ Gateway 需要支持三种身份运行模式,默认配置为 `IDENTITY_MODE=hy
- `idx_base_model_catalog_provider(provider_key, model_type, status)`
- `idx_base_model_catalog_capabilities` 使用 `GIN(capabilities)`
#### 7.9.3 `model_pricing_rules`
#### 7.9.3 `model_pricing_rule_sets` / `model_pricing_rules`
保存基准模型和平台模型的可版本化价格规则。平台模型没有自定义规则时,使用 `base_model_catalog.base_billing_config` 并应用折扣。
定价规则从“单条规则散落在模型或平台上”调整为“规则集 + 多条计价规则”。规则集是可绑定对象规则是具体资源维度的计算条目。默认规则集必须覆盖文本、图像、视频后续新增音频、音乐、数字人、3D 等能力时只新增规则,不改变平台和模型绑定关系。
`model_pricing_rule_sets` 保存规则集:
| 字段 | 类型 | 约束 | 说明 |
| --- | --- | --- | --- |
| `id` | `uuid` | PK | 规则集 ID |
| `rule_set_key` | `text` | unique, not null | 稳定 key`default-multimodal-v1` |
| `name` | `text` | not null | 展示名称 |
| `description` | `text` | nullable | 说明 |
| `category` | `text` | not null, default `custom` | `default`、`custom`、`provider`、`model` |
| `currency` | `text` | not null, default `resource` | 默认货币或资源单位 |
| `status` | `text` | not null, default `active` | `active`、`deprecated`、`hidden` |
| `metadata` | `jsonb` | not null, default `{}` | 来源、版本、同步信息、展示扩展 |
| `created_at` | `timestamptz` | not null | 创建时间 |
| `updated_at` | `timestamptz` | not null | 更新时间 |
`model_pricing_rules` 保存规则集下的计价规则:
| 字段 | 类型 | 约束 | 说明 |
| --- | --- | --- | --- |
| `id` | `uuid` | PK | 价格规则 ID |
| `scope_type` | `text` | not null | `base_model`、`platform`、`platform_model` |
| `scope_id` | `uuid` | nullable | 对应基准模型、平台或平台模型 ID |
| `rule_set_id` | `uuid` | FK nullable | 所属规则集;兼容旧数据时可为空 |
| `rule_key` | `text` | not null | 规则集内稳定 key`text_input_tokens` |
| `display_name` | `text` | not null | 展示名称 |
| `scope_type` | `text` | not null | 默认 `rule_set`;兼容旧数据可为 `base_model`、`platform`、`platform_model` |
| `scope_id` | `uuid` | nullable | 旧 scope 兼容字段;新规则集模式通常为空 |
| `resource_type` | `text` | not null | `text_input`、`text_output`、`image`、`video`、`audio`、`music`、`digital_human`、`model` |
| `unit` | `text` | not null | `1k_tokens`、`image`、`5s`、`second`、`character_1k`、`item` |
| `base_price` | `numeric` | not null | 基准单价,单位使用 EasyAI resource / credit |
| `currency` | `text` | not null, default `resource` | `resource`、`credit`、`cny`、`usd` |
| `base_weight` | `jsonb` | not null, default `{}` | 固定权重,如默认倍率 |
| `dynamic_weight` | `jsonb` | not null, default `{}` | 分辨率、质量、时长、有无音频等动态权重 |
| `dynamic_weight` | `jsonb` | not null, default `{}` | 分辨率、质量、时长、有无音频、有无参考视频等动态权重 |
| `calculator_type` | `text` | not null, default `weighted_unit` | `token_usage`、`weighted_unit`、`duration_weighted`、`formula` |
| `dimension_schema` | `jsonb` | not null, default `{}` | 本规则消费的维度定义,如 token、resolution、duration、hasAudio |
| `formula_config` | `jsonb` | not null, default `{}` | 计算公式配置、单位换算和缺省值 |
| `priority` | `int` | not null, default `100` | 规则执行顺序 |
| `status` | `text` | not null, default `active` | `active`、`deprecated`、`hidden` |
| `metadata` | `jsonb` | not null, default `{}` | provider 原始字段、价格版本、说明 |
| `effective_from` | `timestamptz` | nullable | 生效开始 |
| `effective_to` | `timestamptz` | nullable | 生效结束 |
| `created_at` | `timestamptz` | not null | 创建时间 |
@ -630,6 +668,8 @@ Gateway 需要支持三种身份运行模式,默认配置为 `IDENTITY_MODE=hy
索引:
- `idx_model_pricing_scope(scope_type, scope_id, resource_type)`
- `idx_model_pricing_rule_set(rule_set_id, resource_type)`
- `idx_model_pricing_rule_set_key(rule_set_id, rule_key)` 唯一
- `idx_model_pricing_effective(effective_from, effective_to)`
#### 7.9.4 `gateway_tenants`
@ -881,6 +921,7 @@ Gateway 需要支持三种身份运行模式,默认配置为 `IDENTITY_MODE=hy
| `tenant_key` | `text` | nullable | Gateway 租户 key |
| `default_pricing_mode` | `text` | not null, default `inherit_discount` | 平台默认价格模式:`inherit`、`inherit_discount`、`custom` |
| `default_discount_factor` | `numeric` | not null, default `1` | 平台默认折扣系数,创建平台时可统一基于基准模型打折 |
| `pricing_rule_set_id` | `uuid` | FK nullable | 平台默认绑定的定价规则集;为空时 follow 基准模型或全局默认规则集 |
| `retry_policy` | `jsonb` | not null, default `{}` | 平台级重试策略 |
| `rate_limit_policy` | `jsonb` | not null, default `{}` | 平台级限流策略 |
| `priority` | `int` | not null, default `100` | 静态优先级,越小越优先 |
@ -914,6 +955,7 @@ Gateway 需要支持三种身份运行模式,默认配置为 `IDENTITY_MODE=hy
| `capabilities` | `jsonb` | not null, default `{}` | 解析后的有效能力,用于路由和前端展示 |
| `pricing_mode` | `text` | not null, default `inherit_discount` | `inherit`、`inherit_discount`、`custom` |
| `discount_factor` | `numeric` | nullable | 模型级折扣,空值时继承平台默认折扣 |
| `pricing_rule_set_id` | `uuid` | FK nullable | 模型级定价规则集;优先级高于平台绑定规则集 |
| `billing_config_override` | `jsonb` | not null, default `{}` | 自定义计费覆盖 |
| `billing_config` | `jsonb` | not null, default `{}` | 解析后的有效计费配置,用于 estimated billing 和真实 billings |
| `permission_config` | `jsonb` | not null, default `{}` | 平台维度权限过滤配置 |
@ -1285,7 +1327,17 @@ RPM 和并发的边界:
## 9. 基准模型库与定价体系
定价不直接散落在平台模型里。Gateway 先有一个基准模型库,基准模型库存所有 provider、模型、能力、默认限流模板和基准价格平台创建和平台模型配置都基于这个库继承或覆盖。
定价不直接散落在平台模型里。Gateway 先有一个基准模型库,基准模型库存所有 provider、模型、能力、默认限流模板和基准计价规则平台创建和平台模型配置都通过“规则集绑定 + 折扣率”继承或覆盖。
新的定价核心是 `model_pricing_rule_sets`
- 一个规则集可以包含多条计价规则,默认规则集覆盖文本、图像、视频。
- 平台可绑定一个规则集,并设置 `default_discount_factor` 做整体价格调节。
- 平台模型可绑定另一个规则集,并设置 `discount_factor` 做模型级整体调节。
- 未绑定模型规则集时继承平台规则集;平台也未绑定时 follow 基准模型或全局默认规则集。
- 折扣率只调整最终价格,不改变规则本身,便于后续对同一规则做不同平台、不同模型的商业策略。
Provider 目录从原 `easyai-server-main``integration-platform` 模块同步:`name` 映射为 `display_name``code` 映射为 `provider_code``icon_path` 优先使用平台配置,缺省时按原模块 `Logos[code]` 解析。Gateway 运行时仍保留 `provider_key` 作为内部路由 key避免原平台 code 改名影响已有任务与平台模型配置。
### 9.1 基准模型库内容
@ -1296,32 +1348,61 @@ RPM 和并发的边界:
- provider model name供应商真实请求模型名。
- model type`chat`、`image`、`video`、`audio`、`embedding`、`music`、`digital_human`、`model_3d`。
- capabilities上下文窗口、stream、多模态输入、参考图、参考视频、参考音频、支持尺寸、质量、时长、有无音频、最大 batch 等。
- base billing config文本、图像、视频、音频等不同能力的基准价格。
- base billing config兼容旧配置的价格快照新价格以定价规则集为准。
- default pricing rule set推荐绑定的默认计价规则集可覆盖文本、图像、视频等多种能力。
- default rate limit policyprovider 或模型默认 TPM/RPM/并发模板。
### 9.2 平台价格继承与覆盖
### 9.2 定价规则集与绑定
创建平台时有三种方式:
创建平台或平台模型时不直接编辑散落的单价,而是选择定价规则集:
| 绑定位置 | 字段 | 生效范围 | 说明 |
| --- | --- | --- | --- |
| 基准模型 | `base_model_catalog.base_billing_config` / metadata | fallback | 兼容旧价格快照,也可记录推荐默认规则集 key |
| 平台 | `integration_platforms.pricing_rule_set_id` | 平台下所有未覆盖模型 | 创建平台时选择规则集,并用 `default_discount_factor` 做整体折扣 |
| 平台模型 | `platform_models.pricing_rule_set_id` | 单个模型 | 模型单独选择规则集,并用 `discount_factor` 覆盖平台折扣 |
有效规则集解析顺序:
1. 平台模型 `pricing_rule_set_id`
2. 平台 `pricing_rule_set_id`
3. 基准模型推荐规则集或 `base_billing_config` 映射出的规则集。
4. 全局默认规则集 `default-multimodal-v1`
有效折扣解析顺序:
1. 平台模型 `discount_factor`
2. 平台 `default_discount_factor`
3. 用户组 `billing_discount_policy`,用于用户组级模型调用折扣。
4. 租户、API Key 或促销策略的额外折扣,按策略优先级合并。
有效价计算:
```text
effective price = rule price(request dimensions) * platform/model discount * user/group policy discount
```
### 9.3 规则集模式
| 模式 | 配置 | 说明 |
| --- | --- | --- |
| `inherit` | 不填价格 | 完全 follow 基准模型价格和能力 |
| `inherit_discount` | `default_discount_factor` 或模型级 `discount_factor` | 有效价 = 基准价 x 折扣系数;能力默认 follow 基准模型,可局部覆盖 |
| `custom` | `billing_config_override` / `capability_override` | 平台模型完全自定义价格或能力,未覆盖字段仍从基准模型补齐 |
| `inherit` | 不填规则集,不填折扣 | follow 上一级规则集和能力 |
| `inherit_discount` | 继承规则集,只填平台或模型折扣 | 有效价 = 继承规则集价格 x 折扣系数;能力默认 follow 基准模型,可局部覆盖 |
| `custom` | 绑定自定义规则集 / `capability_override` | 使用自定义规则集和能力覆盖;未覆盖能力仍从基准模型补齐 |
有效配置解析顺序:
1. 平台模型 `capability_override` / `billing_config_override`
2. 平台模型 `discount_factor`
3. 平台 `default_discount_factor`
4. 用户组 `billing_discount_policy`,用于用户组级模型调用折扣。
5. 基准模型 `capabilities` / `base_billing_config`
1. 平台模型 `capability_override`
2. 平台模型 `pricing_rule_set_id` / `discount_factor`。
3. 平台 `pricing_rule_set_id` / `default_discount_factor`。
4. 用户组、租户、API Key 的折扣和配额策略
5. 基准模型 `capabilities` / 默认规则集
如果没有配置平台模型价格,必须 follow 基准模型;不能出现空价格导致预估扣费为 0 的隐式行为。
如果没有配置平台模型定价,必须 follow 上一级规则集;不能出现空价格导致预估扣费为 0 的隐式行为。
接入 `server-main` 时,充值折扣不在 Gateway 内直接变更余额。Gateway 只保存 `recharge_discount_policy` 并与主服务同步;充值订单、资源包发放、余额流水仍由 `server-main` 作为事实源执行。独立模式下,充值、余额、订单和钱包流水由 Gateway 本地账务模块闭环。
### 9.3 各能力计价模型
### 9.4 各能力计价模型
文本类:
@ -1329,6 +1410,7 @@ RPM 和并发的边界:
- 输入和输出分开计价:`text_input`、`text_output`。
- 如果模型只配置总价,可 fallback 到 `text_total`,但 resolver 对外仍展开成输入/输出明细。
- 预估时用输入 token + 输出 token 预估值;最终结算用 provider usage 或 Gateway tokenizer 回填。
- 规则维度:`input_tokens`、`output_tokens`、`cached_tokens`、`reasoning_tokens`、`unitScale`。
图像类:
@ -1337,6 +1419,7 @@ RPM 和并发的边界:
- 分辨率示例:`512x512`、`1024x1024`、`1K`、`2K`、`4K`、`8K`。
- 质量示例:`standard`、`hd`、`high`、`ultra`。
- 公式示例:`count * basePrice * resolutionWeight * qualityWeight * modeWeight`。
- 规则维度:`resolution`、`quality`、`count`、`mode`、`referenceImageCount`、`mask`。
视频类:
@ -1344,6 +1427,7 @@ RPM 和并发的边界:
- 动态权重至少支持:时长、分辨率、是否包含音频、是否使用参考视频、是否指定声音/音色、生成数量。
- 分辨率示例:`480p`、`720p`、`1080p`、`2160p`。
- 公式示例:`count * ceil(durationSeconds / unitSeconds) * basePrice * resolutionWeight * audioWeight * referenceWeight`。
- 规则维度:`durationSeconds`、`resolution`、`count`、`hasAudio`、`hasReferenceVideo`、`hasReferenceImage`、`voice`。
音频、音乐、数字人、3D 模型:
@ -1352,7 +1436,7 @@ RPM 和并发的边界:
- 数字人可按时长、分辨率、音频驱动方式计费。
- 3D / model 类按任务数、模型复杂度或 provider 返回的计费单位映射。
### 9.4 estimated billing 一致性
### 9.5 estimated billing 一致性
`/integration-platform/models/estimatedBilling`、`/integration-platform/models/estimatedBilling/:workflowId` 和真实任务结算必须使用同一个 resolver
@ -1909,7 +1993,7 @@ type ServerMainUploadClient interface {
| 全局模型配置 | `/admin/models/global` | `power` | 基准模型库、能力 schema、基准定价、默认限流模板 |
| 基准 Provider | `/admin/catalog/providers` | `power` | provider 列表、协议类型、能力 schema、启停状态 |
| 基准模型详情 | `/admin/catalog/base-models/:id` | `power` | 能力、价格版本、默认 TPM/RPM/并发、引用平台模型 |
| 定价规则 | `/admin/pricing/rules` | `power` | 文本/图像/视频/音频价格、动态权重、版本生效时间 |
| 定价规则 | `/admin/pricing/rules` | `power` | 定价规则集、文本/图像/视频规则、动态权重、平台/模型绑定引用 |
| 平台管理 | `/admin/platforms` | `power` | 平台 CRUD、启停、优先级、凭证状态、复制、异常重置 |
| 平台详情 | `/admin/platforms/:id` | `power` | 基础信息、凭证、模型、折扣、限流、重试、运行态、快照 |
| 平台模型 | `/admin/platform-models` | `power` | 平台模型列表、基准映射、能力覆盖、价格覆盖、权限过滤 |
@ -1927,11 +2011,11 @@ type ServerMainUploadClient interface {
关键管理页面:
- 全局模型配置:维护 `model_catalog_providers`、`base_model_catalog`、`model_pricing_rules`,支持导入旧项目配置
- 全局模型配置:维护 `model_catalog_providers`、`base_model_catalog`、`model_pricing_rule_sets`、`model_pricing_rules`,支持从旧项目 `integration-platform` 同步 provider 名称、code、图标和全量模型基准配置。基准模型库在管理端以模型卡片呈现可按厂商、能力、名称筛选并通过弹窗新增、修改、删除模型
- 租户管理:维护 `gateway_tenants`,支持本地租户 CRUD、从 `server-main` 增量同步、禁用状态同步、租户策略和用量隔离审计。
- 用户管理:维护 `gateway_users`,支持本地用户 CRUD、从 `server-main` 增量同步、禁用状态同步、角色同步和同步差异审计。
- 用户组管理:维护 `gateway_user_groups`、`gateway_user_group_memberships`,支持从 `server-main` 同步成员关系;独立模式执行全部策略,接入模式下充值折扣由 `server-main` 执行Gateway 执行调用折扣和并发/限流。
- 平台管理:创建平台时选择基准 provider,配置默认折扣系数;平台模型可 follow 基准、按折扣继承或自定义覆盖
- 平台管理:创建平台时选择基准 provider、默认定价规则集和默认折扣系数;平台模型可继承平台规则集,或单独绑定规则集并配置模型折扣率
- 队列与限流:展示 TPM/RPM 窗口、预占值、并发 lease、cooldown、next run。
- 回调 outbox展示 Gateway 到进度回调目标的投递结果,支持按 task replay。
@ -2038,15 +2122,15 @@ apps/web/src/
- 建立 JWT / API Key 授权中间件骨架和 `standalone` / `server-main` / `hybrid` 身份模式配置,默认 `hybrid`
- 固化 API、事件、数据库设计。
- 建立 simulation / dry-run 模式配置与安全开关,默认禁止生产环境普通用户随意开启。
- 建立基准 provider、基准模型库、价规则、用户、用户组策略、邀请码、本地 API Key、钱包、充值订单和 TPM/RPM/并发限流表结构。
- 建立基准 provider、基准模型库、价规则、用户、用户组策略、邀请码、本地 API Key、钱包、充值订单和 TPM/RPM/并发限流表结构。
### Phase 1模型库 + 首批生成能力
第一阶段只做可落地的核心闭环模型库、大模型对话、生图、图像编辑。Client 只迁移 OpenAI 和 Gemini 两个,视频和其他 provider 后移。
- 导入 OpenAI、Gemini 的基准 provider、基准模型、能力 schema、默认限流模板形成首批 `base_model_catalog`
- 建立全局模型配置:模型类型、上下文、多模态能力、图片输入/输出能力、stream 支持、价规则。
- 平台创建支持选择基准模型、设置默认折扣系数;平台模型支持 follow 基准模型、折扣继承和自定义覆盖。
- 默认导入原 `integration-platform` 的全量 provider 和基准模型,完整保留模型 `types`、`capabilities`、图标、计费和限流元数据Phase 1 只迁移 OpenAI、Gemini 两个 Client 的真实调用实现
- 建立全局模型配置:模型类型、上下文、多模态能力、图片输入/输出能力、stream 支持、价规则
- 平台创建支持选择基准 provider、默认定价规则集、默认折扣系数平台模型支持 follow 平台规则集、模型级规则集覆盖、折扣继承和自定义覆盖。
- 建立 `gateway_users` 同步副本和 `gateway_user_groups` 策略解析,支持本地用户与 `server-main` 用户在同一套策略链路里命中不同折扣和限流。
- 建立本地账号闭环:普通注册可选邀请码,独立模式支持本地 API Key、余额、充值订单和钱包流水。
- 迁移大模型对话路由:`/chat/completions`、`/v1/chat/completions`,并为 `/responses` / `/v1/responses` 保留兼容契约。

View File

@ -1,6 +1,50 @@
#!/usr/bin/env bash
set -euo pipefail
PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
stop_stale_api_processes() {
local api_port="${HTTP_ADDR:-:8088}"
api_port="${api_port##*:}"
local api_cwd="${PROJECT_ROOT}/apps/api"
if command -v pgrep >/dev/null 2>&1; then
while read -r pid; do
[[ -z "$pid" || "$pid" == "$$" ]] && continue
local cwd
cwd="$(lsof -a -p "$pid" -d cwd -Fn 2>/dev/null | awk '/^n/ {print substr($0, 2); exit}')"
if [[ "$cwd" == "$api_cwd" ]]; then
echo "[ai-gateway] stopping stale go-watch process: ${pid}"
kill "$pid" 2>/dev/null || true
fi
done < <(pgrep -f "go-watch\\.mjs -- go run ./cmd/gateway" || true)
fi
if ! command -v lsof >/dev/null 2>&1; then
return
fi
local pids
pids="$(lsof -tiTCP:"$api_port" -sTCP:LISTEN 2>/dev/null || true)"
[[ -z "$pids" ]] && return
while read -r pid; do
[[ -z "$pid" ]] && continue
local cwd command
cwd="$(lsof -a -p "$pid" -d cwd -Fn 2>/dev/null | awk '/^n/ {print substr($0, 2); exit}')"
command="$(ps -p "$pid" -o command= 2>/dev/null || true)"
if [[ "$cwd" == "$api_cwd" || "$command" == *"easyai-ai-gateway"* ]]; then
echo "[ai-gateway] freeing API port ${api_port}, stopping stale process: ${pid}"
kill "$pid" 2>/dev/null || true
else
echo "[ai-gateway] port ${api_port} is used by an unrelated process: ${pid} ${command}" >&2
exit 1
fi
done <<< "$pids"
sleep 0.5
}
if [[ -z "${AI_GATEWAY_PG_CONTAINER:-}" ]]; then
if docker inspect easyai-pgvector >/dev/null 2>&1; then
export AI_GATEWAY_PG_CONTAINER="easyai-pgvector"
@ -26,4 +70,5 @@ echo "[ai-gateway] using database: ${AI_GATEWAY_DATABASE_URL}"
scripts/create-database.sh
pnpm nx run api:migrate
stop_stale_api_processes
exec pnpm nx run-many -t dev -p api web --parallel=2