| from __future__ import annotations | |
| from comfy_api_nodes.apis import ( | |
| TripoModelVersion, | |
| TripoTextureQuality, | |
| ) | |
| from enum import Enum | |
| from typing import Optional, List, Dict, Any, Union | |
| from pydantic import BaseModel, Field, RootModel | |
| class TripoStyle(str, Enum): | |
| PERSON_TO_CARTOON = "person:person2cartoon" | |
| ANIMAL_VENOM = "animal:venom" | |
| OBJECT_CLAY = "object:clay" | |
| OBJECT_STEAMPUNK = "object:steampunk" | |
| OBJECT_CHRISTMAS = "object:christmas" | |
| OBJECT_BARBIE = "object:barbie" | |
| GOLD = "gold" | |
| ANCIENT_BRONZE = "ancient_bronze" | |
| NONE = "None" | |
| class TripoTaskType(str, Enum): | |
| TEXT_TO_MODEL = "text_to_model" | |
| IMAGE_TO_MODEL = "image_to_model" | |
| MULTIVIEW_TO_MODEL = "multiview_to_model" | |
| TEXTURE_MODEL = "texture_model" | |
| REFINE_MODEL = "refine_model" | |
| ANIMATE_PRERIGCHECK = "animate_prerigcheck" | |
| ANIMATE_RIG = "animate_rig" | |
| ANIMATE_RETARGET = "animate_retarget" | |
| STYLIZE_MODEL = "stylize_model" | |
| CONVERT_MODEL = "convert_model" | |
| class TripoTextureAlignment(str, Enum): | |
| ORIGINAL_IMAGE = "original_image" | |
| GEOMETRY = "geometry" | |
| class TripoOrientation(str, Enum): | |
| ALIGN_IMAGE = "align_image" | |
| DEFAULT = "default" | |
| class TripoOutFormat(str, Enum): | |
| GLB = "glb" | |
| FBX = "fbx" | |
| class TripoTopology(str, Enum): | |
| BIP = "bip" | |
| QUAD = "quad" | |
| class TripoSpec(str, Enum): | |
| MIXAMO = "mixamo" | |
| TRIPO = "tripo" | |
| class TripoAnimation(str, Enum): | |
| IDLE = "preset:idle" | |
| WALK = "preset:walk" | |
| CLIMB = "preset:climb" | |
| JUMP = "preset:jump" | |
| RUN = "preset:run" | |
| SLASH = "preset:slash" | |
| SHOOT = "preset:shoot" | |
| HURT = "preset:hurt" | |
| FALL = "preset:fall" | |
| TURN = "preset:turn" | |
| class TripoStylizeStyle(str, Enum): | |
| LEGO = "lego" | |
| VOXEL = "voxel" | |
| VORONOI = "voronoi" | |
| MINECRAFT = "minecraft" | |
| class TripoConvertFormat(str, Enum): | |
| GLTF = "GLTF" | |
| USDZ = "USDZ" | |
| FBX = "FBX" | |
| OBJ = "OBJ" | |
| STL = "STL" | |
| _3MF = "3MF" | |
| class TripoTextureFormat(str, Enum): | |
| BMP = "BMP" | |
| DPX = "DPX" | |
| HDR = "HDR" | |
| JPEG = "JPEG" | |
| OPEN_EXR = "OPEN_EXR" | |
| PNG = "PNG" | |
| TARGA = "TARGA" | |
| TIFF = "TIFF" | |
| WEBP = "WEBP" | |
| class TripoTaskStatus(str, Enum): | |
| QUEUED = "queued" | |
| RUNNING = "running" | |
| SUCCESS = "success" | |
| FAILED = "failed" | |
| CANCELLED = "cancelled" | |
| UNKNOWN = "unknown" | |
| BANNED = "banned" | |
| EXPIRED = "expired" | |
| class TripoFileTokenReference(BaseModel): | |
| type: Optional[str] = Field(None, description='The type of the reference') | |
| file_token: str | |
| class TripoUrlReference(BaseModel): | |
| type: Optional[str] = Field(None, description='The type of the reference') | |
| url: str | |
| class TripoObjectStorage(BaseModel): | |
| bucket: str | |
| key: str | |
| class TripoObjectReference(BaseModel): | |
| type: str | |
| object: TripoObjectStorage | |
| class TripoFileEmptyReference(BaseModel): | |
| pass | |
| class TripoFileReference(RootModel): | |
| root: Union[TripoFileTokenReference, TripoUrlReference, TripoObjectReference, TripoFileEmptyReference] | |
| class TripoGetStsTokenRequest(BaseModel): | |
| format: str = Field(..., description='The format of the image') | |
| class TripoTextToModelRequest(BaseModel): | |
| type: TripoTaskType = Field(TripoTaskType.TEXT_TO_MODEL, description='Type of task') | |
| prompt: str = Field(..., description='The text prompt describing the model to generate', max_length=1024) | |
| negative_prompt: Optional[str] = Field(None, description='The negative text prompt', max_length=1024) | |
| model_version: Optional[TripoModelVersion] = TripoModelVersion.v2_5_20250123 | |
| face_limit: Optional[int] = Field(None, description='The number of faces to limit the generation to') | |
| texture: Optional[bool] = Field(True, description='Whether to apply texture to the generated model') | |
| pbr: Optional[bool] = Field(True, description='Whether to apply PBR to the generated model') | |
| image_seed: Optional[int] = Field(None, description='The seed for the text') | |
| model_seed: Optional[int] = Field(None, description='The seed for the model') | |
| texture_seed: Optional[int] = Field(None, description='The seed for the texture') | |
| texture_quality: Optional[TripoTextureQuality] = TripoTextureQuality.standard | |
| style: Optional[TripoStyle] = None | |
| auto_size: Optional[bool] = Field(False, description='Whether to auto-size the model') | |
| quad: Optional[bool] = Field(False, description='Whether to apply quad to the generated model') | |
| class TripoImageToModelRequest(BaseModel): | |
| type: TripoTaskType = Field(TripoTaskType.IMAGE_TO_MODEL, description='Type of task') | |
| file: TripoFileReference = Field(..., description='The file reference to convert to a model') | |
| model_version: Optional[TripoModelVersion] = Field(None, description='The model version to use for generation') | |
| face_limit: Optional[int] = Field(None, description='The number of faces to limit the generation to') | |
| texture: Optional[bool] = Field(True, description='Whether to apply texture to the generated model') | |
| pbr: Optional[bool] = Field(True, description='Whether to apply PBR to the generated model') | |
| model_seed: Optional[int] = Field(None, description='The seed for the model') | |
| texture_seed: Optional[int] = Field(None, description='The seed for the texture') | |
| texture_quality: Optional[TripoTextureQuality] = TripoTextureQuality.standard | |
| texture_alignment: Optional[TripoTextureAlignment] = Field(TripoTextureAlignment.ORIGINAL_IMAGE, description='The texture alignment method') | |
| style: Optional[TripoStyle] = Field(None, description='The style to apply to the generated model') | |
| auto_size: Optional[bool] = Field(False, description='Whether to auto-size the model') | |
| orientation: Optional[TripoOrientation] = TripoOrientation.DEFAULT | |
| quad: Optional[bool] = Field(False, description='Whether to apply quad to the generated model') | |
| class TripoMultiviewToModelRequest(BaseModel): | |
| type: TripoTaskType = TripoTaskType.MULTIVIEW_TO_MODEL | |
| files: List[TripoFileReference] = Field(..., description='The file references to convert to a model') | |
| model_version: Optional[TripoModelVersion] = Field(None, description='The model version to use for generation') | |
| orthographic_projection: Optional[bool] = Field(False, description='Whether to use orthographic projection') | |
| face_limit: Optional[int] = Field(None, description='The number of faces to limit the generation to') | |
| texture: Optional[bool] = Field(True, description='Whether to apply texture to the generated model') | |
| pbr: Optional[bool] = Field(True, description='Whether to apply PBR to the generated model') | |
| model_seed: Optional[int] = Field(None, description='The seed for the model') | |
| texture_seed: Optional[int] = Field(None, description='The seed for the texture') | |
| texture_quality: Optional[TripoTextureQuality] = TripoTextureQuality.standard | |
| texture_alignment: Optional[TripoTextureAlignment] = TripoTextureAlignment.ORIGINAL_IMAGE | |
| auto_size: Optional[bool] = Field(False, description='Whether to auto-size the model') | |
| orientation: Optional[TripoOrientation] = Field(TripoOrientation.DEFAULT, description='The orientation for the model') | |
| quad: Optional[bool] = Field(False, description='Whether to apply quad to the generated model') | |
| class TripoTextureModelRequest(BaseModel): | |
| type: TripoTaskType = Field(TripoTaskType.TEXTURE_MODEL, description='Type of task') | |
| original_model_task_id: str = Field(..., description='The task ID of the original model') | |
| texture: Optional[bool] = Field(True, description='Whether to apply texture to the model') | |
| pbr: Optional[bool] = Field(True, description='Whether to apply PBR to the model') | |
| model_seed: Optional[int] = Field(None, description='The seed for the model') | |
| texture_seed: Optional[int] = Field(None, description='The seed for the texture') | |
| texture_quality: Optional[TripoTextureQuality] = Field(None, description='The quality of the texture') | |
| texture_alignment: Optional[TripoTextureAlignment] = Field(TripoTextureAlignment.ORIGINAL_IMAGE, description='The texture alignment method') | |
| class TripoRefineModelRequest(BaseModel): | |
| type: TripoTaskType = Field(TripoTaskType.REFINE_MODEL, description='Type of task') | |
| draft_model_task_id: str = Field(..., description='The task ID of the draft model') | |
| class TripoAnimatePrerigcheckRequest(BaseModel): | |
| type: TripoTaskType = Field(TripoTaskType.ANIMATE_PRERIGCHECK, description='Type of task') | |
| original_model_task_id: str = Field(..., description='The task ID of the original model') | |
| class TripoAnimateRigRequest(BaseModel): | |
| type: TripoTaskType = Field(TripoTaskType.ANIMATE_RIG, description='Type of task') | |
| original_model_task_id: str = Field(..., description='The task ID of the original model') | |
| out_format: Optional[TripoOutFormat] = Field(TripoOutFormat.GLB, description='The output format') | |
| spec: Optional[TripoSpec] = Field(TripoSpec.TRIPO, description='The specification for rigging') | |
| class TripoAnimateRetargetRequest(BaseModel): | |
| type: TripoTaskType = Field(TripoTaskType.ANIMATE_RETARGET, description='Type of task') | |
| original_model_task_id: str = Field(..., description='The task ID of the original model') | |
| animation: TripoAnimation = Field(..., description='The animation to apply') | |
| out_format: Optional[TripoOutFormat] = Field(TripoOutFormat.GLB, description='The output format') | |
| bake_animation: Optional[bool] = Field(True, description='Whether to bake the animation') | |
| class TripoStylizeModelRequest(BaseModel): | |
| type: TripoTaskType = Field(TripoTaskType.STYLIZE_MODEL, description='Type of task') | |
| style: TripoStylizeStyle = Field(..., description='The style to apply to the model') | |
| original_model_task_id: str = Field(..., description='The task ID of the original model') | |
| block_size: Optional[int] = Field(80, description='The block size for stylization') | |
| class TripoConvertModelRequest(BaseModel): | |
| type: TripoTaskType = Field(TripoTaskType.CONVERT_MODEL, description='Type of task') | |
| format: TripoConvertFormat = Field(..., description='The format to convert to') | |
| original_model_task_id: str = Field(..., description='The task ID of the original model') | |
| quad: Optional[bool] = Field(False, description='Whether to apply quad to the model') | |
| force_symmetry: Optional[bool] = Field(False, description='Whether to force symmetry') | |
| face_limit: Optional[int] = Field(10000, description='The number of faces to limit the conversion to') | |
| flatten_bottom: Optional[bool] = Field(False, description='Whether to flatten the bottom of the model') | |
| flatten_bottom_threshold: Optional[float] = Field(0.01, description='The threshold for flattening the bottom') | |
| texture_size: Optional[int] = Field(4096, description='The size of the texture') | |
| texture_format: Optional[TripoTextureFormat] = Field(TripoTextureFormat.JPEG, description='The format of the texture') | |
| pivot_to_center_bottom: Optional[bool] = Field(False, description='Whether to pivot to the center bottom') | |
| class TripoTaskRequest(RootModel): | |
| root: Union[ | |
| TripoTextToModelRequest, | |
| TripoImageToModelRequest, | |
| TripoMultiviewToModelRequest, | |
| TripoTextureModelRequest, | |
| TripoRefineModelRequest, | |
| TripoAnimatePrerigcheckRequest, | |
| TripoAnimateRigRequest, | |
| TripoAnimateRetargetRequest, | |
| TripoStylizeModelRequest, | |
| TripoConvertModelRequest | |
| ] | |
| class TripoTaskOutput(BaseModel): | |
| model: Optional[str] = Field(None, description='URL to the model') | |
| base_model: Optional[str] = Field(None, description='URL to the base model') | |
| pbr_model: Optional[str] = Field(None, description='URL to the PBR model') | |
| rendered_image: Optional[str] = Field(None, description='URL to the rendered image') | |
| riggable: Optional[bool] = Field(None, description='Whether the model is riggable') | |
| class TripoTask(BaseModel): | |
| task_id: str = Field(..., description='The task ID') | |
| type: Optional[str] = Field(None, description='The type of task') | |
| status: Optional[TripoTaskStatus] = Field(None, description='The status of the task') | |
| input: Optional[Dict[str, Any]] = Field(None, description='The input parameters for the task') | |
| output: Optional[TripoTaskOutput] = Field(None, description='The output of the task') | |
| progress: Optional[int] = Field(None, description='The progress of the task', ge=0, le=100) | |
| create_time: Optional[int] = Field(None, description='The creation time of the task') | |
| running_left_time: Optional[int] = Field(None, description='The estimated time left for the task') | |
| queue_position: Optional[int] = Field(None, description='The position in the queue') | |
| class TripoTaskResponse(BaseModel): | |
| code: int = Field(0, description='The response code') | |
| data: TripoTask = Field(..., description='The task data') | |
| class TripoGeneralResponse(BaseModel): | |
| code: int = Field(0, description='The response code') | |
| data: Dict[str, str] = Field(..., description='The task ID data') | |
| class TripoBalanceData(BaseModel): | |
| balance: float = Field(..., description='The account balance') | |
| frozen: float = Field(..., description='The frozen balance') | |
| class TripoBalanceResponse(BaseModel): | |
| code: int = Field(0, description='The response code') | |
| data: TripoBalanceData = Field(..., description='The balance data') | |
| class TripoErrorResponse(BaseModel): | |
| code: int = Field(..., description='The error code') | |
| message: str = Field(..., description='The error message') | |
| suggestion: str = Field(..., description='The suggestion for fixing the error') | |