from __future__ import annotations
from dataclasses import dataclass
from enum import Enum
from typing import Mapping
class ToolProfile(str, Enum):
MINIMAL = "minimal"
STANDARD = "standard"
FULL = "full"
@dataclass(frozen=True)
class IntegrationsEnabled:
polyhaven: bool = False
sketchfab: bool = False
hyper3d: bool = False
hunyuan3d: bool = False
@staticmethod
def from_capabilities_integrations(value: object) -> "IntegrationsEnabled":
if not isinstance(value, Mapping):
return IntegrationsEnabled()
return IntegrationsEnabled(
polyhaven=bool(value.get("polyhaven", False)),
sketchfab=bool(value.get("sketchfab", False)),
hyper3d=bool(value.get("hyper3d", False)),
hunyuan3d=bool(value.get("hunyuan3d", False)),
)
CORE_TOOLS: frozenset[str] = frozenset(
{
"get_scene_info",
"get_viewport_screenshot",
"get_capabilities",
"execute_ops",
}
)
COMMON_WRAPPERS: frozenset[str] = frozenset(
{
"create_primitive",
"set_transform",
"select_objects",
"assign_material",
"render_still",
# Escape hatch: arbitrary Python execution in Blender.
# WARNING: Powerful and potentially dangerous; keep scripts small and step-by-step.
"execute_blender_code",
}
)
POLYHAVEN_TOOLS: frozenset[str] = frozenset(
{
"get_polyhaven_status",
"get_polyhaven_categories",
"search_polyhaven_assets",
"download_polyhaven_asset",
"set_texture",
}
)
SKETCHFAB_TOOLS: frozenset[str] = frozenset(
{
"get_sketchfab_status",
"search_sketchfab_models",
"download_sketchfab_model",
}
)
HYPER3D_TOOLS: frozenset[str] = frozenset(
{
"get_hyper3d_status",
"generate_hyper3d_model_via_text",
"generate_hyper3d_model_via_images",
"poll_rodin_job_status",
"import_generated_asset",
}
)
HUNYUAN3D_TOOLS: frozenset[str] = frozenset(
{
"get_hunyuan3d_status",
"generate_hunyuan3d_model",
"poll_hunyuan_job_status",
"import_generated_asset_hunyuan",
}
)
def select_tool_names(profile: ToolProfile, integrations: IntegrationsEnabled) -> set[str]:
"""
Pure selection function.
- MINIMAL: core only
- STANDARD: core + common wrappers + integration tools (only if enabled)
- FULL: everything (caller provides full registry)
"""
if profile == ToolProfile.MINIMAL:
return set(CORE_TOOLS)
if profile == ToolProfile.STANDARD:
selected = set(CORE_TOOLS) | set(COMMON_WRAPPERS)
if integrations.polyhaven:
selected |= set(POLYHAVEN_TOOLS)
if integrations.sketchfab:
selected |= set(SKETCHFAB_TOOLS)
if integrations.hyper3d:
selected |= set(HYPER3D_TOOLS)
if integrations.hunyuan3d:
selected |= set(HUNYUAN3D_TOOLS)
return selected
# FULL: caller should register all available tools.
return set()
def parse_tool_profile(value: str | None) -> ToolProfile:
v = (value or "").strip().lower()
if not v:
return ToolProfile.STANDARD
try:
return ToolProfile(v) # type: ignore[arg-type]
except Exception:
return ToolProfile.STANDARD