diff --git a/apps/api/internal/clients/clients_test.go b/apps/api/internal/clients/clients_test.go new file mode 100644 index 0000000..5f9fdc8 --- /dev/null +++ b/apps/api/internal/clients/clients_test.go @@ -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 +} diff --git a/apps/api/internal/clients/gemini.go b/apps/api/internal/clients/gemini.go new file mode 100644 index 0000000..411b17e --- /dev/null +++ b/apps/api/internal/clients/gemini.go @@ -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} +} diff --git a/apps/api/internal/clients/helpers.go b/apps/api/internal/clients/helpers.go new file mode 100644 index 0000000..f453ce5 --- /dev/null +++ b/apps/api/internal/clients/helpers.go @@ -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() +} diff --git a/apps/api/internal/clients/openai.go b/apps/api/internal/clients/openai.go new file mode 100644 index 0000000..310ea09 --- /dev/null +++ b/apps/api/internal/clients/openai.go @@ -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}}, + } +} diff --git a/apps/api/internal/clients/simulation.go b/apps/api/internal/clients/simulation.go new file mode 100644 index 0000000..8396fc2 --- /dev/null +++ b/apps/api/internal/clients/simulation.go @@ -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 +} diff --git a/apps/api/internal/clients/types.go b/apps/api/internal/clients/types.go new file mode 100644 index 0000000..f5f539d --- /dev/null +++ b/apps/api/internal/clients/types.go @@ -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 +} diff --git a/apps/api/internal/httpapi/catalog_handlers.go b/apps/api/internal/httpapi/catalog_handlers.go new file mode 100644 index 0000000..533194f --- /dev/null +++ b/apps/api/internal/httpapi/catalog_handlers.go @@ -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) != "" +} diff --git a/apps/api/internal/httpapi/core_flow_integration_test.go b/apps/api/internal/httpapi/core_flow_integration_test.go index 3c16083..7806b02 100644 --- a/apps/api/internal/httpapi/core_flow_integration_test.go +++ b/apps/api/internal/httpapi/core_flow_integration_test.go @@ -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) { diff --git a/apps/api/internal/httpapi/handlers.go b/apps/api/internal/httpapi/handlers.go index a979690..e6e5e4c 100644 --- a/apps/api/internal/httpapi/handlers.go +++ b/apps/api/internal/httpapi/handlers.go @@ -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 { diff --git a/apps/api/internal/httpapi/pricing_handlers.go b/apps/api/internal/httpapi/pricing_handlers.go new file mode 100644 index 0000000..eae4ce0 --- /dev/null +++ b/apps/api/internal/httpapi/pricing_handlers.go @@ -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 +} diff --git a/apps/api/internal/httpapi/server.go b/apps/api/internal/httpapi/server.go index e90c257..8bf6a88 100644 --- a/apps/api/internal/httpapi/server.go +++ b/apps/api/internal/httpapi/server.go @@ -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)) } diff --git a/apps/api/internal/httpapi/streaming.go b/apps/api/internal/httpapi/streaming.go new file mode 100644 index 0000000..053bfda --- /dev/null +++ b/apps/api/internal/httpapi/streaming.go @@ -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 "" +} diff --git a/apps/api/internal/runner/helpers.go b/apps/api/internal/runner/helpers.go new file mode 100644 index 0000000..efb8a48 --- /dev/null +++ b/apps/api/internal/runner/helpers.go @@ -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 + } +} diff --git a/apps/api/internal/runner/limits.go b/apps/api/internal/runner/limits.go new file mode 100644 index 0000000..fbf0bb5 --- /dev/null +++ b/apps/api/internal/runner/limits.go @@ -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 +} diff --git a/apps/api/internal/runner/pricing.go b/apps/api/internal/runner/pricing.go new file mode 100644 index 0000000..440ade3 --- /dev/null +++ b/apps/api/internal/runner/pricing.go @@ -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 +} diff --git a/apps/api/internal/runner/service.go b/apps/api/internal/runner/service.go new file mode 100644 index 0000000..3fd0614 --- /dev/null +++ b/apps/api/internal/runner/service.go @@ -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 +} diff --git a/apps/api/internal/runner/upload.go b/apps/api/internal/runner/upload.go new file mode 100644 index 0000000..2972137 --- /dev/null +++ b/apps/api/internal/runner/upload.go @@ -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 +} diff --git a/apps/api/internal/store/base_models.go b/apps/api/internal/store/base_models.go new file mode 100644 index 0000000..d328d64 --- /dev/null +++ b/apps/api/internal/store/base_models.go @@ -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 +} diff --git a/apps/api/internal/store/candidates.go b/apps/api/internal/store/candidates.go new file mode 100644 index 0000000..3f2a239 --- /dev/null +++ b/apps/api/internal/store/candidates.go @@ -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 +} diff --git a/apps/api/internal/store/catalog_providers.go b/apps/api/internal/store/catalog_providers.go new file mode 100644 index 0000000..4fdcfec --- /dev/null +++ b/apps/api/internal/store/catalog_providers.go @@ -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 +} diff --git a/apps/api/internal/store/platform_models.go b/apps/api/internal/store/platform_models.go new file mode 100644 index 0000000..24acffa --- /dev/null +++ b/apps/api/internal/store/platform_models.go @@ -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 +} diff --git a/apps/api/internal/store/postgres.go b/apps/api/internal/store/postgres.go index e4cc284..ae250c7 100644 --- a/apps/api/internal/store/postgres.go +++ b/apps/api/internal/store/postgres.go @@ -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 { diff --git a/apps/api/internal/store/pricing_rules.go b/apps/api/internal/store/pricing_rules.go new file mode 100644 index 0000000..cd1071c --- /dev/null +++ b/apps/api/internal/store/pricing_rules.go @@ -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 +} diff --git a/apps/api/internal/store/rate_limits.go b/apps/api/internal/store/rate_limits.go new file mode 100644 index 0000000..578d599 --- /dev/null +++ b/apps/api/internal/store/rate_limits.go @@ -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 +} diff --git a/apps/api/internal/store/runtime_types.go b/apps/api/internal/store/runtime_types.go new file mode 100644 index 0000000..aadd022 --- /dev/null +++ b/apps/api/internal/store/runtime_types.go @@ -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 +} diff --git a/apps/api/internal/store/tasks_runtime.go b/apps/api/internal/store/tasks_runtime.go new file mode 100644 index 0000000..e79133b --- /dev/null +++ b/apps/api/internal/store/tasks_runtime.go @@ -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 +} diff --git a/apps/api/internal/store/user_group_policy.go b/apps/api/internal/store/user_group_policy.go new file mode 100644 index 0000000..b3f019a --- /dev/null +++ b/apps/api/internal/store/user_group_policy.go @@ -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 +} diff --git a/apps/api/migrations/0001_init.sql b/apps/api/migrations/0001_init.sql index eeb8c7c..2c8b819 100644 --- a/apps/api/migrations/0001_init.sql +++ b/apps/api/migrations/0001_init.sql @@ -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, diff --git a/apps/api/migrations/0002_invitation_relationship_only.sql b/apps/api/migrations/0002_invitation_relationship_only.sql index b5adbc9..28aa96d 100644 --- a/apps/api/migrations/0002_invitation_relationship_only.sql +++ b/apps/api/migrations/0002_invitation_relationship_only.sql @@ -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 diff --git a/apps/api/migrations/0003_phase1_seed_runtime.sql b/apps/api/migrations/0003_phase1_seed_runtime.sql new file mode 100644 index 0000000..9757de6 --- /dev/null +++ b/apps/api/migrations/0003_phase1_seed_runtime.sql @@ -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 +); diff --git a/apps/api/migrations/0004_provider_catalog_sync_fields.sql b/apps/api/migrations/0004_provider_catalog_sync_fields.sql new file mode 100644 index 0000000..0b184fd --- /dev/null +++ b/apps/api/migrations/0004_provider_catalog_sync_fields.sql @@ -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); diff --git a/apps/api/migrations/0005_seed_server_main_providers.sql b/apps/api/migrations/0005_seed_server_main_providers.sql new file mode 100644 index 0000000..d7e4c47 --- /dev/null +++ b/apps/api/migrations/0005_seed_server_main_providers.sql @@ -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', 'MiniMax(OpenAI兼容)', '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(); diff --git a/apps/api/migrations/0006_seed_server_main_base_models.sql b/apps/api/migrations/0006_seed_server_main_base_models.sql new file mode 100644 index 0000000..65a2af2 --- /dev/null +++ b/apps/api/migrations/0006_seed_server_main_base_models.sql @@ -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":"MiniMax(OpenAI兼容)","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":"MiniMax(OpenAI兼容)","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":"MiniMax(OpenAI兼容)","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":"MiniMax(OpenAI兼容)","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":"MiniMax(OpenAI兼容)","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":"MiniMax(OpenAI兼容)","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":"MiniMax(OpenAI兼容)","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(); diff --git a/apps/api/migrations/0007_pricing_rule_sets.sql b/apps/api/migrations/0007_pricing_rule_sets.sql new file mode 100644 index 0000000..18bae32 --- /dev/null +++ b/apps/api/migrations/0007_pricing_rule_sets.sql @@ -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(); diff --git a/apps/api/migrations/0008_pricing_image_single_rule.sql b/apps/api/migrations/0008_pricing_image_single_rule.sql new file mode 100644 index 0000000..af2b526 --- /dev/null +++ b/apps/api/migrations/0008_pricing_image_single_rule.sql @@ -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'); diff --git a/apps/web/src/pages/admin/PricingEditorControls.tsx b/apps/web/src/pages/admin/PricingEditorControls.tsx new file mode 100644 index 0000000..2ffc67a --- /dev/null +++ b/apps/web/src/pages/admin/PricingEditorControls.tsx @@ -0,0 +1,62 @@ +import type { ReactNode } from 'react'; +import { Calculator } from 'lucide-react'; + +export function PricingInlineField(props: { + label: string; + children: ReactNode; +}) { + return ( +
+ {props.label} + {props.children} +
+ ); +} + +export function PricingReadonlyField(props: { + label: string; + value: string; +}) { + return ( +
+ {props.label} + {props.value} +
+ ); +} + +export function unitLabel(unit: string | undefined) { + const labels: Record = { + 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 = { + token_usage: '按 Token 用量', + unit_weight: '按数量和参数', + duration_weight: '按时长和参数', + formula: '按公式', + }; + return labels[calculatorType ?? ''] ?? calculatorType ?? '-'; +} + +export function PricingFormulaNote(props: { + children: ReactNode; +}) { + return ( +
+ +
+ 计费公式 +

{props.children}

+
+
+ ); +} diff --git a/apps/web/src/pages/admin/PricingRuleVisualEditor.tsx b/apps/web/src/pages/admin/PricingRuleVisualEditor.tsx index 9900be1..c3c426c 100644 --- a/apps/web/src/pages/admin/PricingRuleVisualEditor.tsx +++ b/apps/web/src/pages/admin/PricingRuleVisualEditor.tsx @@ -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; -type ModeKey = 'text' | 'image' | 'video' | 'digitalHuman' | 'speech' | 'music'; +type ModeKey = 'text' | 'image' | 'video'; +type ParameterGroup = { + key: string; + title: string; + defaults: RecordValue; + labels?: Record; + 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('video'); + const [activeMode, setActiveMode] = useState('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 (
计费模式 - 选择能力后维护基础价格、计费公式和动态权重。 + 选择能力后维护基础价格、计费公式和计费参数。
-
{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) { - 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 ; } return ( @@ -185,40 +158,33 @@ function ModeRuleEditor(props: { -
- +
- - -
-
基础单价/{rule.unit} patch({ basePrice: Number(event.target.value) })} />
-
基础权重 patch({ baseWeight: { ...(rule.baseWeight ?? {}), base: Number(event.target.value) } })} />
-
单位 patch({ unit: event.target.value })} />
+ + patch({ basePrice: Number(event.target.value) })} /> + + +
-
- -
- 计费公式 - patch({ formulaConfig: { ...(rule.formulaConfig ?? {}), formula: event.target.value } })} /> -

{props.mode.formula}

-
-
+ {props.mode.formula}
- {props.mode.weightGroups.map((group) => ( + {props.mode.parameterGroups.map((group) => ( 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]) => ( { const dynamicWeight = { ...(rule.dynamicWeight ?? {}) }; delete dynamicWeight[key]; @@ -227,14 +193,74 @@ function ModeRuleEditor(props: { }} /> ))}
+ + ); +} - +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 ( +
+
+
+ text_total + {props.rule.displayName || '文本'} + text +
+ +
+ +
+ + +
+ +
+ + updatePrices(Number(event.target.value), prices.outputTokenPrice)} /> + + + updatePrices(prices.inputTokenPrice, Number(event.target.value))} /> + +
+ + {props.formula}
); } function WeightTable(props: { editableTitle?: boolean; + labels?: Record; + locked?: boolean; title: string; value: RecordValue; onChange: (value: RecordValue, title?: string) => void; @@ -256,13 +282,17 @@ function WeightTable(props: {
{rows.map(([key, value], index) => ( -
- updateRows(rows.map((row, rowIndex) => (rowIndex === index ? [event.target.value, value] : row)))} /> +
+ {props.locked ? ( + {props.labels?.[key] ?? key} + ) : ( + updateRows(rows.map((row, rowIndex) => (rowIndex === index ? [event.target.value, value] : row)))} /> + )} updateRows(rows.map((row, rowIndex) => (rowIndex === index ? [key, parseScalar(event.target.value)] : row)))} /> - + {!props.locked && }
))} - + {!props.locked && }
); @@ -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 = { + 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 }, diff --git a/apps/web/src/pages/admin/PricingRulesPanel.tsx b/apps/web/src/pages/admin/PricingRulesPanel.tsx index 86f048e..7610b51 100644 --- a/apps/web/src/pages/admin/PricingRulesPanel.tsx +++ b/apps/web/src/pages/admin/PricingRulesPanel.tsx @@ -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(emptyForm); + const [form, setForm] = useState(() => 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: {
{ruleSet.category} {ruleSet.currency} - {ruleSet.rules?.length ?? 0} 条计价规则 + {pricingRuleSummaries(ruleSet).length} 条计价规则
- {(ruleSet.rules ?? []).slice(0, 5).map((rule) => ( - {rule.displayName || rule.resourceType}: {rule.basePrice}/{rule.unit} + {pricingRuleSummaries(ruleSet).map((item) => ( + + {pricingRuleSummaryIcon(item.kind)}{item.label} + {item.value} + ))}
@@ -163,7 +160,7 @@ export function PricingRulesPanel(props: { - + setForm({ ...form, rules })} /> 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 ; + if (kind === 'video') return