-
Notifications
You must be signed in to change notification settings - Fork 0
merge from source #2
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
Updated Windows installation instructions for UV. The previous instructions used set Path=..., which only works in CMD and only temporarily modifies the PATH for that CMD session (and any new processes launched from it). This was inconsistent with the preceding PowerShell-based install command (irm ... | iex), and would fail if run in PowerShell. Updated the example to use a proper PowerShell approach that dynamically resolves the current user's home directory via $env:USERPROFILE and appends .local\bin to the user-level PATH persistently (so the user does not have to set it each time before launching Claude Code).
Fixed possible issue in instructions for adding uv to user path in Windows, so as not to inadvertently overwrite existing user path with system path.
Revised UV installation steps for Windows
Co-authored-by: 家靖 <[email protected]>
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pull request overview
This pull request merges updates from source, primarily adding Hunyuan3D support and telemetry infrastructure to the Blender MCP project.
Key Changes
- Telemetry system: Added anonymous telemetry tracking for tool usage via Supabase, with environment variable opt-out support
- Hunyuan3D integration: Implemented 3D model generation using Tencent's Hunyuan3D API (both official and local API modes)
- Infrastructure improvements: Increased socket timeout from 15s to 180s to support longer-running 3D generation tasks
Reviewed changes
Copilot reviewed 6 out of 8 changed files in this pull request and generated 26 comments.
Show a summary per file
| File | Description |
|---|---|
| src/blender_mcp/telemetry.py | New telemetry collection module for tracking tool usage and performance metrics |
| src/blender_mcp/telemetry_decorator.py | Decorator for instrumenting MCP tools with telemetry tracking |
| src/blender_mcp/server.py | Added telemetry decorators to existing tools, implemented Hunyuan3D tool functions, increased socket timeouts |
| addon.py | Implemented Hunyuan3D API integration including job creation, polling, and asset import; added UI properties for configuration |
| pyproject.toml | Updated version to 1.4.0 and added dependencies for supabase and tomli |
| README.md | Updated release notes and installation instructions for Windows |
| .gitignore | Added config.py to gitignore for storing telemetry secrets |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| import shutil | ||
| import zipfile | ||
| from bpy.props import StringProperty, IntProperty, BoolProperty, EnumProperty | ||
| from bpy.props import IntProperty |
Copilot
AI
Nov 23, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The import statement for EnumProperty has been removed, but it's still needed by the blendermcp_hunyuan3d_mode property defined at line 2259. This will cause a NameError when the addon is registered.
| from bpy.props import IntProperty | |
| from bpy.props import IntProperty, EnumProperty |
|
|
||
| def poll_hunyuan_job_status_ai(self, job_id: str): | ||
| """Call the job status API to get the job status""" | ||
| print(job_id) |
Copilot
AI
Nov 23, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Debug print statement left in production code. This should be removed or converted to proper logging.
| import shutil | ||
| import zipfile | ||
| from bpy.props import StringProperty, IntProperty, BoolProperty, EnumProperty | ||
| from bpy.props import IntProperty |
Copilot
AI
Nov 23, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The import statement for FloatProperty is missing but it's needed by the blendermcp_hunyuan3d_guidance_scale property defined at line 2304. This will cause a NameError when the addon is registered.
| from bpy.props import IntProperty | |
| from bpy.props import IntProperty, FloatProperty |
| ) | ||
| self._worker.start() | ||
|
|
||
| logger.warning(f"Telemetry initialized (enabled={self.config.enabled}, has_supabase={HAS_SUPABASE}, customer_uuid={self._customer_uuid})") |
Copilot
AI
Nov 23, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Using logger.warning() for informational telemetry messages (lines 96, 113, 178, 181, 184) is incorrect. These should use logger.info() or logger.debug() instead, as they are not actual warnings that need user attention.
| logger.warning(f"Telemetry initialized (enabled={self.config.enabled}, has_supabase={HAS_SUPABASE}, customer_uuid={self._customer_uuid})") | |
| logger.info(f"Telemetry initialized (enabled={self.config.enabled}, has_supabase={HAS_SUPABASE}, customer_uuid={self._customer_uuid})") |
| logger.warning(f"Supabase not available, skipping event: {event_type}") | ||
| return | ||
|
|
||
| logger.warning(f"Recording telemetry event: {event_type}, tool={tool_name}") |
Copilot
AI
Nov 23, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Using logger.warning() for informational telemetry messages is incorrect. These should use logger.info() or logger.debug() instead, as they are not actual warnings that need user attention.
| logger.warning(f"Recording telemetry event: {event_type}, tool={tool_name}") | |
| logger.info(f"Recording telemetry event: {event_type}, tool={tool_name}") |
| } | ||
|
|
||
| response = supabase.table("telemetry_events").insert(data, returning="minimal").execute() | ||
| logger.debug(f"Telemetry sent: {event.event_type}") |
Copilot
AI
Nov 23, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Variable response is not used.
| logger.debug(f"Telemetry sent: {event.event_type}") | |
| logger.debug(f"Telemetry sent: {event.event_type}, response: {response}") |
| temp_dir = tempfile.mkdtemp(prefix="tencent_obj_") | ||
| zip_file_path = osp.join(temp_dir, "model.zip") | ||
| obj_file_path = osp.join(temp_dir, "model.obj") | ||
| mtl_file_path = osp.join(temp_dir, "model.mtl") |
Copilot
AI
Nov 23, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Variable mtl_file_path is not used.
| from urllib.parse import urlparse | ||
|
|
||
| # Import telemetry | ||
| from .telemetry import record_startup, get_telemetry |
Copilot
AI
Nov 23, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Import of 'get_telemetry' is not used.
| from .telemetry import record_startup, get_telemetry | |
| from .telemetry import record_startup |
| """ | ||
|
|
||
| import contextlib | ||
| import json |
Copilot
AI
Nov 23, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Import of 'json' is not used.
| import json |
| data = tomli.load(f) | ||
| return data["project"]["version"] | ||
| except Exception: | ||
| pass |
Copilot
AI
Nov 23, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
'except' clause does nothing but pass and there is no explanatory comment.
| pass | |
| # Log the exception but return "unknown" as a fallback | |
| logger.exception("Failed to read version from pyproject.toml") |
test