From b2aef0dca157a2fb1c2270bd5af74a56bd5f26fd Mon Sep 17 00:00:00 2001 From: ElgoogUdiab Date: Mon, 17 Mar 2025 17:21:04 +0800 Subject: [PATCH] Add free trial API key for hyper3d rodin --- addon.py | 19 ++++++++++++++++++- src/blender_mcp/server.py | 8 +++++++- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/addon.py b/addon.py index d84a1d9..c9dd2ac 100644 --- a/addon.py +++ b/addon.py @@ -21,6 +21,8 @@ bl_info = { "category": "Interface", } +RODIN_FREE_TRIAL_KEY = "k9TcfFoEhNd9cCPP2guHAHHHkctZHIRhZDywZ1euGUXwihbYLpOjQhofby80NJez" + class BlenderMCPServer: def __init__(self, host='localhost', port=9876): self.host = host @@ -1229,7 +1231,8 @@ class BlenderMCPServer: 4. Restart the connection to Claude""" } mode = bpy.context.scene.blendermcp_hyper3d_mode - message = f"Hyper3D Rodin integration is enabled and ready to use. Mode: {mode}" + message = f"Hyper3D Rodin integration is enabled and ready to use. Mode: {mode}. " + \ + f"Key type: {'private' if bpy.context.scene.blendermcp_hyper3d_api_key != RODIN_FREE_TRIAL_KEY else 'free_trial'}" return { "enabled": True, "message": message @@ -1549,6 +1552,7 @@ class BLENDERMCP_PT_Panel(bpy.types.Panel): if scene.blendermcp_use_hyper3d: layout.prop(scene, "blendermcp_hyper3d_mode", text="Rodin Mode") layout.prop(scene, "blendermcp_hyper3d_api_key", text="API Key") + layout.operator("blendermcp.set_free_trial_api_key", text="Set Free Trial API Key") if not scene.blendermcp_server_running: layout.operator("blendermcp.start_server", text="Start MCP Server") @@ -1556,6 +1560,17 @@ class BLENDERMCP_PT_Panel(bpy.types.Panel): layout.operator("blendermcp.stop_server", text="Stop MCP Server") layout.label(text=f"Running on port {scene.blendermcp_port}") +# Operator to set Hyper3D API Key +class BLENDERMCP_OT_SetFreeTrialHyper3DAPIKey(bpy.types.Operator): + bl_idname = "blendermcp.set_free_trial_api_key" + bl_label = "Set Free Trial API Key" + + def execute(self, context): + context.scene.blendermcp_hyper3d_api_key = RODIN_FREE_TRIAL_KEY + context.scene.blendermcp_hyper3d_mode = 'MAIN_SITE' + self.report({'INFO'}, "API Key set successfully!") + return {'FINISHED'} + # Operator to start the server class BLENDERMCP_OT_StartServer(bpy.types.Operator): bl_idname = "blendermcp.start_server" @@ -1637,6 +1652,7 @@ def register(): ) bpy.utils.register_class(BLENDERMCP_PT_Panel) + bpy.utils.register_class(BLENDERMCP_OT_SetFreeTrialHyper3DAPIKey) bpy.utils.register_class(BLENDERMCP_OT_StartServer) bpy.utils.register_class(BLENDERMCP_OT_StopServer) @@ -1649,6 +1665,7 @@ def unregister(): del bpy.types.blendermcp_server bpy.utils.unregister_class(BLENDERMCP_PT_Panel) + bpy.utils.unregister_class(BLENDERMCP_OT_SetFreeTrialHyper3DAPIKey) bpy.utils.unregister_class(BLENDERMCP_OT_StartServer) bpy.utils.unregister_class(BLENDERMCP_OT_StopServer) diff --git a/src/blender_mcp/server.py b/src/blender_mcp/server.py index 3c52609..16a0f04 100644 --- a/src/blender_mcp/server.py +++ b/src/blender_mcp/server.py @@ -676,6 +676,8 @@ def get_hyper3d_status(ctx: Context) -> str: """ Check if Hyper3D Rodin integration is enabled in Blender. Returns a message indicating whether Hyper3D Rodin features are available. + + Don't emphasize the key type in the returned message, but sliently remember it. """ try: blender = get_blender_connection() @@ -884,6 +886,10 @@ def asset_creation_strategy() -> str: 1. Create the model generation task - Use generate_hyper3d_model_via_images() if image(s) is/are given - Use generate_hyper3d_model_via_text() if generating 3D asset using text prompt + If key type is free_trial and insufficient balance error returned, tell the user that the free trial key can only generated limited models everyday, they can choose to: + - Wait for another day and try again + - Go to hyper3d.ai to find out how to get their own API key + - Go to fal.ai to get their own private API key 2. Poll the status - Use poll_rodin_job_status() to check if the generation task has completed or failed 3. Import the asset @@ -891,7 +897,7 @@ def asset_creation_strategy() -> str: 4. After importing the asset, ALWAYS check the world_bounding_box of the imported mesh, and adjust the mesh's location and size Adjust the imported mesh's location, scale, rotation, so that the mesh is on the right spot. - You can reuse assets previous generated by repeating step 3 and 4 using the previous task_uuid without creating another generation task. + You can reuse assets previous generated by running python code to duplicate the object, without creating another generation task. 2. If all integrations are disabled or when falling back to basic tools: - create_object() for basic primitives (CUBE, SPHERE, CYLINDER, etc.)