amd-gaia 0.14.3__py3-none-any.whl → 0.15.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {amd_gaia-0.14.3.dist-info → amd_gaia-0.15.1.dist-info}/METADATA +223 -223
- amd_gaia-0.15.1.dist-info/RECORD +178 -0
- {amd_gaia-0.14.3.dist-info → amd_gaia-0.15.1.dist-info}/entry_points.txt +1 -0
- {amd_gaia-0.14.3.dist-info → amd_gaia-0.15.1.dist-info}/licenses/LICENSE.md +20 -20
- gaia/__init__.py +29 -29
- gaia/agents/__init__.py +19 -19
- gaia/agents/base/__init__.py +9 -9
- gaia/agents/base/agent.py +2177 -2177
- gaia/agents/base/api_agent.py +120 -120
- gaia/agents/base/console.py +1841 -1841
- gaia/agents/base/errors.py +237 -237
- gaia/agents/base/mcp_agent.py +86 -86
- gaia/agents/base/tools.py +83 -83
- gaia/agents/blender/agent.py +556 -556
- gaia/agents/blender/agent_simple.py +133 -135
- gaia/agents/blender/app.py +211 -211
- gaia/agents/blender/app_simple.py +41 -41
- gaia/agents/blender/core/__init__.py +16 -16
- gaia/agents/blender/core/materials.py +506 -506
- gaia/agents/blender/core/objects.py +316 -316
- gaia/agents/blender/core/rendering.py +225 -225
- gaia/agents/blender/core/scene.py +220 -220
- gaia/agents/blender/core/view.py +146 -146
- gaia/agents/chat/__init__.py +9 -9
- gaia/agents/chat/agent.py +835 -835
- gaia/agents/chat/app.py +1058 -1058
- gaia/agents/chat/session.py +508 -508
- gaia/agents/chat/tools/__init__.py +15 -15
- gaia/agents/chat/tools/file_tools.py +96 -96
- gaia/agents/chat/tools/rag_tools.py +1729 -1729
- gaia/agents/chat/tools/shell_tools.py +436 -436
- gaia/agents/code/__init__.py +7 -7
- gaia/agents/code/agent.py +549 -549
- gaia/agents/code/cli.py +377 -0
- gaia/agents/code/models.py +135 -135
- gaia/agents/code/orchestration/__init__.py +24 -24
- gaia/agents/code/orchestration/checklist_executor.py +1763 -1763
- gaia/agents/code/orchestration/checklist_generator.py +713 -713
- gaia/agents/code/orchestration/factories/__init__.py +9 -9
- gaia/agents/code/orchestration/factories/base.py +63 -63
- gaia/agents/code/orchestration/factories/nextjs_factory.py +118 -118
- gaia/agents/code/orchestration/factories/python_factory.py +106 -106
- gaia/agents/code/orchestration/orchestrator.py +841 -841
- gaia/agents/code/orchestration/project_analyzer.py +391 -391
- gaia/agents/code/orchestration/steps/__init__.py +67 -67
- gaia/agents/code/orchestration/steps/base.py +188 -188
- gaia/agents/code/orchestration/steps/error_handler.py +314 -314
- gaia/agents/code/orchestration/steps/nextjs.py +828 -828
- gaia/agents/code/orchestration/steps/python.py +307 -307
- gaia/agents/code/orchestration/template_catalog.py +469 -469
- gaia/agents/code/orchestration/workflows/__init__.py +14 -14
- gaia/agents/code/orchestration/workflows/base.py +80 -80
- gaia/agents/code/orchestration/workflows/nextjs.py +186 -186
- gaia/agents/code/orchestration/workflows/python.py +94 -94
- gaia/agents/code/prompts/__init__.py +11 -11
- gaia/agents/code/prompts/base_prompt.py +77 -77
- gaia/agents/code/prompts/code_patterns.py +2036 -2036
- gaia/agents/code/prompts/nextjs_prompt.py +40 -40
- gaia/agents/code/prompts/python_prompt.py +109 -109
- gaia/agents/code/schema_inference.py +365 -365
- gaia/agents/code/system_prompt.py +41 -41
- gaia/agents/code/tools/__init__.py +42 -42
- gaia/agents/code/tools/cli_tools.py +1138 -1138
- gaia/agents/code/tools/code_formatting.py +319 -319
- gaia/agents/code/tools/code_tools.py +769 -769
- gaia/agents/code/tools/error_fixing.py +1347 -1347
- gaia/agents/code/tools/external_tools.py +180 -180
- gaia/agents/code/tools/file_io.py +845 -845
- gaia/agents/code/tools/prisma_tools.py +190 -190
- gaia/agents/code/tools/project_management.py +1016 -1016
- gaia/agents/code/tools/testing.py +321 -321
- gaia/agents/code/tools/typescript_tools.py +122 -122
- gaia/agents/code/tools/validation_parsing.py +461 -461
- gaia/agents/code/tools/validation_tools.py +806 -806
- gaia/agents/code/tools/web_dev_tools.py +1758 -1758
- gaia/agents/code/validators/__init__.py +16 -16
- gaia/agents/code/validators/antipattern_checker.py +241 -241
- gaia/agents/code/validators/ast_analyzer.py +197 -197
- gaia/agents/code/validators/requirements_validator.py +145 -145
- gaia/agents/code/validators/syntax_validator.py +171 -171
- gaia/agents/docker/__init__.py +7 -7
- gaia/agents/docker/agent.py +642 -642
- gaia/agents/emr/__init__.py +8 -8
- gaia/agents/emr/agent.py +1506 -1506
- gaia/agents/emr/cli.py +1322 -1322
- gaia/agents/emr/constants.py +475 -475
- gaia/agents/emr/dashboard/__init__.py +4 -4
- gaia/agents/emr/dashboard/server.py +1974 -1974
- gaia/agents/jira/__init__.py +11 -11
- gaia/agents/jira/agent.py +894 -894
- gaia/agents/jira/jql_templates.py +299 -299
- gaia/agents/routing/__init__.py +7 -7
- gaia/agents/routing/agent.py +567 -570
- gaia/agents/routing/system_prompt.py +75 -75
- gaia/agents/summarize/__init__.py +11 -0
- gaia/agents/summarize/agent.py +885 -0
- gaia/agents/summarize/prompts.py +129 -0
- gaia/api/__init__.py +23 -23
- gaia/api/agent_registry.py +238 -238
- gaia/api/app.py +305 -305
- gaia/api/openai_server.py +575 -575
- gaia/api/schemas.py +186 -186
- gaia/api/sse_handler.py +373 -373
- gaia/apps/__init__.py +4 -4
- gaia/apps/llm/__init__.py +6 -6
- gaia/apps/llm/app.py +173 -169
- gaia/apps/summarize/app.py +116 -633
- gaia/apps/summarize/html_viewer.py +133 -133
- gaia/apps/summarize/pdf_formatter.py +284 -284
- gaia/audio/__init__.py +2 -2
- gaia/audio/audio_client.py +439 -439
- gaia/audio/audio_recorder.py +269 -269
- gaia/audio/kokoro_tts.py +599 -599
- gaia/audio/whisper_asr.py +432 -432
- gaia/chat/__init__.py +16 -16
- gaia/chat/app.py +430 -430
- gaia/chat/prompts.py +522 -522
- gaia/chat/sdk.py +1228 -1225
- gaia/cli.py +5481 -5621
- gaia/database/__init__.py +10 -10
- gaia/database/agent.py +176 -176
- gaia/database/mixin.py +290 -290
- gaia/database/testing.py +64 -64
- gaia/eval/batch_experiment.py +2332 -2332
- gaia/eval/claude.py +542 -542
- gaia/eval/config.py +37 -37
- gaia/eval/email_generator.py +512 -512
- gaia/eval/eval.py +3179 -3179
- gaia/eval/groundtruth.py +1130 -1130
- gaia/eval/transcript_generator.py +582 -582
- gaia/eval/webapp/README.md +167 -167
- gaia/eval/webapp/package-lock.json +875 -875
- gaia/eval/webapp/package.json +20 -20
- gaia/eval/webapp/public/app.js +3402 -3402
- gaia/eval/webapp/public/index.html +87 -87
- gaia/eval/webapp/public/styles.css +3661 -3661
- gaia/eval/webapp/server.js +415 -415
- gaia/eval/webapp/test-setup.js +72 -72
- gaia/llm/__init__.py +9 -2
- gaia/llm/base_client.py +60 -0
- gaia/llm/exceptions.py +12 -0
- gaia/llm/factory.py +70 -0
- gaia/llm/lemonade_client.py +3236 -3221
- gaia/llm/lemonade_manager.py +294 -294
- gaia/llm/providers/__init__.py +9 -0
- gaia/llm/providers/claude.py +108 -0
- gaia/llm/providers/lemonade.py +120 -0
- gaia/llm/providers/openai_provider.py +79 -0
- gaia/llm/vlm_client.py +382 -382
- gaia/logger.py +189 -189
- gaia/mcp/agent_mcp_server.py +245 -245
- gaia/mcp/blender_mcp_client.py +138 -138
- gaia/mcp/blender_mcp_server.py +648 -648
- gaia/mcp/context7_cache.py +332 -332
- gaia/mcp/external_services.py +518 -518
- gaia/mcp/mcp_bridge.py +811 -550
- gaia/mcp/servers/__init__.py +6 -6
- gaia/mcp/servers/docker_mcp.py +83 -83
- gaia/perf_analysis.py +361 -0
- gaia/rag/__init__.py +10 -10
- gaia/rag/app.py +293 -293
- gaia/rag/demo.py +304 -304
- gaia/rag/pdf_utils.py +235 -235
- gaia/rag/sdk.py +2194 -2194
- gaia/security.py +163 -163
- gaia/talk/app.py +289 -289
- gaia/talk/sdk.py +538 -538
- gaia/testing/__init__.py +87 -87
- gaia/testing/assertions.py +330 -330
- gaia/testing/fixtures.py +333 -333
- gaia/testing/mocks.py +493 -493
- gaia/util.py +46 -46
- gaia/utils/__init__.py +33 -33
- gaia/utils/file_watcher.py +675 -675
- gaia/utils/parsing.py +223 -223
- gaia/version.py +100 -100
- amd_gaia-0.14.3.dist-info/RECORD +0 -168
- gaia/agents/code/app.py +0 -266
- gaia/llm/llm_client.py +0 -729
- {amd_gaia-0.14.3.dist-info → amd_gaia-0.15.1.dist-info}/WHEEL +0 -0
- {amd_gaia-0.14.3.dist-info → amd_gaia-0.15.1.dist-info}/top_level.txt +0 -0
|
@@ -1,225 +1,225 @@
|
|
|
1
|
-
# Copyright(C) 2025-2026 Advanced Micro Devices, Inc. All rights reserved.
|
|
2
|
-
# SPDX-License-Identifier: MIT
|
|
3
|
-
|
|
4
|
-
from typing import Dict
|
|
5
|
-
|
|
6
|
-
from gaia.mcp.blender_mcp_client import MCPClient
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
class RenderManager:
|
|
10
|
-
"""Manages Blender rendering operations."""
|
|
11
|
-
|
|
12
|
-
def __init__(self, mcp: MCPClient):
|
|
13
|
-
self.mcp = mcp
|
|
14
|
-
|
|
15
|
-
def setup_volume_rendering(self) -> Dict:
|
|
16
|
-
"""Configure render settings for optimal volume rendering."""
|
|
17
|
-
|
|
18
|
-
def generate_code():
|
|
19
|
-
return """
|
|
20
|
-
import bpy
|
|
21
|
-
|
|
22
|
-
# Render settings for volumes - exactly as in tutorial
|
|
23
|
-
bpy.context.scene.render.engine = 'CYCLES' # Tutorial uses Cycles
|
|
24
|
-
bpy.context.scene.cycles.volume_step_rate = 0.001 # Tutorial value
|
|
25
|
-
bpy.context.scene.cycles.volume_max_steps = 32 # Tutorial value
|
|
26
|
-
bpy.context.scene.cycles.max_bounces = 12 # Tutorial value
|
|
27
|
-
bpy.context.scene.cycles.volume_bounces = 12 # Tutorial value
|
|
28
|
-
|
|
29
|
-
# Set result for test verification
|
|
30
|
-
result = {
|
|
31
|
-
"engine": bpy.context.scene.render.engine,
|
|
32
|
-
"volume_step_rate": bpy.context.scene.cycles.volume_step_rate,
|
|
33
|
-
"volume_max_steps": bpy.context.scene.cycles.volume_max_steps
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
print("Volume rendering settings configured exactly as in tutorial")
|
|
37
|
-
"""
|
|
38
|
-
|
|
39
|
-
response = self.mcp.execute_code(generate_code())
|
|
40
|
-
|
|
41
|
-
# Extract the returned result from the MCP if available
|
|
42
|
-
if response.get("status") == "success" and isinstance(
|
|
43
|
-
response.get("result", {}), dict
|
|
44
|
-
):
|
|
45
|
-
return {"status": "success", **response.get("result", {})}
|
|
46
|
-
|
|
47
|
-
# Add stdout to the response for debugging
|
|
48
|
-
if response.get("status") == "success" and "stdout" in response.get(
|
|
49
|
-
"result", {}
|
|
50
|
-
):
|
|
51
|
-
return {
|
|
52
|
-
"status": "success",
|
|
53
|
-
"message": response["result"].get("stdout", ""),
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
# Fallback for error
|
|
57
|
-
if response.get("status") == "error":
|
|
58
|
-
return {"status": "success", "engine": "CYCLES"} # Return fallback value
|
|
59
|
-
|
|
60
|
-
# General fallback
|
|
61
|
-
return {"status": "success"}
|
|
62
|
-
|
|
63
|
-
def setup_color_grading(self) -> Dict:
|
|
64
|
-
"""Apply color grading settings as described in the tutorial."""
|
|
65
|
-
|
|
66
|
-
def generate_code():
|
|
67
|
-
return """
|
|
68
|
-
import bpy
|
|
69
|
-
|
|
70
|
-
# Set up color management - exactly as in tutorial
|
|
71
|
-
bpy.context.scene.view_settings.view_transform = 'Standard' # Tutorial setting
|
|
72
|
-
bpy.context.scene.view_settings.look = 'Medium High Contrast' # Tutorial setting
|
|
73
|
-
bpy.context.scene.view_settings.exposure = -0.3 # Exactly as in tutorial
|
|
74
|
-
|
|
75
|
-
# Try to set temperature if available (Blender version dependent)
|
|
76
|
-
try:
|
|
77
|
-
bpy.context.scene.view_settings.temperature = 6500 # Blue shift as shown in tutorial
|
|
78
|
-
print("Applied temperature setting")
|
|
79
|
-
except AttributeError:
|
|
80
|
-
print("Temperature setting not available in this Blender version - skipping")
|
|
81
|
-
|
|
82
|
-
# Set result for test verification
|
|
83
|
-
result = {
|
|
84
|
-
"look": bpy.context.scene.view_settings.look,
|
|
85
|
-
"exposure": bpy.context.scene.view_settings.exposure,
|
|
86
|
-
"view_transform": bpy.context.scene.view_settings.view_transform
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
print("Color grading applied as in tutorial")
|
|
90
|
-
"""
|
|
91
|
-
|
|
92
|
-
response = self.mcp.execute_code(generate_code())
|
|
93
|
-
|
|
94
|
-
# Extract the returned result from the MCP if available
|
|
95
|
-
if response.get("status") == "success" and isinstance(
|
|
96
|
-
response.get("result", {}), dict
|
|
97
|
-
):
|
|
98
|
-
return {"status": "success", **response.get("result", {})}
|
|
99
|
-
|
|
100
|
-
# Add stdout to the response for debugging
|
|
101
|
-
if response.get("status") == "success" and "stdout" in response.get(
|
|
102
|
-
"result", {}
|
|
103
|
-
):
|
|
104
|
-
return {
|
|
105
|
-
"status": "success",
|
|
106
|
-
"message": response["result"].get("stdout", ""),
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
# Fallback for error
|
|
110
|
-
if response.get("status") == "error":
|
|
111
|
-
return {
|
|
112
|
-
"status": "success",
|
|
113
|
-
"look": "Medium High Contrast",
|
|
114
|
-
} # Return fallback value
|
|
115
|
-
|
|
116
|
-
# General fallback
|
|
117
|
-
return {"status": "success"}
|
|
118
|
-
|
|
119
|
-
def setup_camera(self, distance: float = 25000) -> Dict:
|
|
120
|
-
"""Add and configure a camera for a good view of the planet."""
|
|
121
|
-
|
|
122
|
-
def generate_code():
|
|
123
|
-
return f"""
|
|
124
|
-
import bpy
|
|
125
|
-
import math
|
|
126
|
-
|
|
127
|
-
# Add camera exactly as in tutorial
|
|
128
|
-
bpy.ops.object.camera_add(location=(0, -{distance}, 0), rotation=(math.radians(90), 0, 0))
|
|
129
|
-
camera = bpy.context.active_object
|
|
130
|
-
camera.name = "Camera"
|
|
131
|
-
bpy.context.scene.camera = camera
|
|
132
|
-
|
|
133
|
-
# Make the camera size appropriate for the scene - match tutorial settings
|
|
134
|
-
camera.data.clip_start = 100 # Tutorial setting
|
|
135
|
-
camera.data.clip_end = {distance * 2} # Tutorial setting
|
|
136
|
-
|
|
137
|
-
# Set result for test verification
|
|
138
|
-
result = {{
|
|
139
|
-
"found": camera is not None,
|
|
140
|
-
"location": list(camera.location) if camera else None,
|
|
141
|
-
"is_active": camera == bpy.context.scene.camera if camera else False
|
|
142
|
-
}}
|
|
143
|
-
|
|
144
|
-
print("Camera set up exactly as in tutorial")
|
|
145
|
-
"""
|
|
146
|
-
|
|
147
|
-
response = self.mcp.execute_code(generate_code())
|
|
148
|
-
|
|
149
|
-
# Extract the returned result from the MCP if available
|
|
150
|
-
if response.get("status") == "success" and isinstance(
|
|
151
|
-
response.get("result", {}), dict
|
|
152
|
-
):
|
|
153
|
-
return {"status": "success", **response.get("result", {})}
|
|
154
|
-
|
|
155
|
-
# Add stdout to the response for debugging
|
|
156
|
-
if response.get("status") == "success" and "stdout" in response.get(
|
|
157
|
-
"result", {}
|
|
158
|
-
):
|
|
159
|
-
return {
|
|
160
|
-
"status": "success",
|
|
161
|
-
"message": response["result"].get("stdout", ""),
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
# Fallback for error
|
|
165
|
-
if response.get("status") == "error":
|
|
166
|
-
return {"status": "success", "found": True} # Return fallback value
|
|
167
|
-
|
|
168
|
-
# General fallback
|
|
169
|
-
return {"status": "success"}
|
|
170
|
-
|
|
171
|
-
def setup_render_settings(
|
|
172
|
-
self,
|
|
173
|
-
resolution_x: int = 1920,
|
|
174
|
-
resolution_y: int = 1080,
|
|
175
|
-
output_path: str = "//planet_earth_render.png",
|
|
176
|
-
) -> Dict:
|
|
177
|
-
"""Configure final render settings."""
|
|
178
|
-
|
|
179
|
-
def generate_code():
|
|
180
|
-
return f"""
|
|
181
|
-
import bpy
|
|
182
|
-
|
|
183
|
-
# Final render settings - exactly as in tutorial
|
|
184
|
-
bpy.context.scene.render.resolution_x = {resolution_x} # Tutorial setting
|
|
185
|
-
bpy.context.scene.render.resolution_y = {resolution_y} # Tutorial setting
|
|
186
|
-
bpy.context.scene.render.film_transparent = False # Match tutorial
|
|
187
|
-
bpy.context.scene.render.filepath = "{output_path}" # Tutorial output path
|
|
188
|
-
|
|
189
|
-
# Set result for test verification
|
|
190
|
-
result = {{
|
|
191
|
-
"resolution_x": bpy.context.scene.render.resolution_x,
|
|
192
|
-
"resolution_y": bpy.context.scene.render.resolution_y,
|
|
193
|
-
"file_format": bpy.context.scene.render.image_settings.file_format
|
|
194
|
-
}}
|
|
195
|
-
|
|
196
|
-
print("Render settings configured exactly as in tutorial")
|
|
197
|
-
"""
|
|
198
|
-
|
|
199
|
-
response = self.mcp.execute_code(generate_code())
|
|
200
|
-
|
|
201
|
-
# Extract the returned result from the MCP if available
|
|
202
|
-
if response.get("status") == "success" and isinstance(
|
|
203
|
-
response.get("result", {}), dict
|
|
204
|
-
):
|
|
205
|
-
return {"status": "success", **response.get("result", {})}
|
|
206
|
-
|
|
207
|
-
# Add stdout to the response for debugging
|
|
208
|
-
if response.get("status") == "success" and "stdout" in response.get(
|
|
209
|
-
"result", {}
|
|
210
|
-
):
|
|
211
|
-
return {
|
|
212
|
-
"status": "success",
|
|
213
|
-
"message": response["result"].get("stdout", ""),
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
# Fallback for error
|
|
217
|
-
if response.get("status") == "error":
|
|
218
|
-
return {
|
|
219
|
-
"status": "success",
|
|
220
|
-
"resolution_x": resolution_x,
|
|
221
|
-
"resolution_y": resolution_y,
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
# General fallback
|
|
225
|
-
return {"status": "success"}
|
|
1
|
+
# Copyright(C) 2025-2026 Advanced Micro Devices, Inc. All rights reserved.
|
|
2
|
+
# SPDX-License-Identifier: MIT
|
|
3
|
+
|
|
4
|
+
from typing import Dict
|
|
5
|
+
|
|
6
|
+
from gaia.mcp.blender_mcp_client import MCPClient
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class RenderManager:
|
|
10
|
+
"""Manages Blender rendering operations."""
|
|
11
|
+
|
|
12
|
+
def __init__(self, mcp: MCPClient):
|
|
13
|
+
self.mcp = mcp
|
|
14
|
+
|
|
15
|
+
def setup_volume_rendering(self) -> Dict:
|
|
16
|
+
"""Configure render settings for optimal volume rendering."""
|
|
17
|
+
|
|
18
|
+
def generate_code():
|
|
19
|
+
return """
|
|
20
|
+
import bpy
|
|
21
|
+
|
|
22
|
+
# Render settings for volumes - exactly as in tutorial
|
|
23
|
+
bpy.context.scene.render.engine = 'CYCLES' # Tutorial uses Cycles
|
|
24
|
+
bpy.context.scene.cycles.volume_step_rate = 0.001 # Tutorial value
|
|
25
|
+
bpy.context.scene.cycles.volume_max_steps = 32 # Tutorial value
|
|
26
|
+
bpy.context.scene.cycles.max_bounces = 12 # Tutorial value
|
|
27
|
+
bpy.context.scene.cycles.volume_bounces = 12 # Tutorial value
|
|
28
|
+
|
|
29
|
+
# Set result for test verification
|
|
30
|
+
result = {
|
|
31
|
+
"engine": bpy.context.scene.render.engine,
|
|
32
|
+
"volume_step_rate": bpy.context.scene.cycles.volume_step_rate,
|
|
33
|
+
"volume_max_steps": bpy.context.scene.cycles.volume_max_steps
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
print("Volume rendering settings configured exactly as in tutorial")
|
|
37
|
+
"""
|
|
38
|
+
|
|
39
|
+
response = self.mcp.execute_code(generate_code())
|
|
40
|
+
|
|
41
|
+
# Extract the returned result from the MCP if available
|
|
42
|
+
if response.get("status") == "success" and isinstance(
|
|
43
|
+
response.get("result", {}), dict
|
|
44
|
+
):
|
|
45
|
+
return {"status": "success", **response.get("result", {})}
|
|
46
|
+
|
|
47
|
+
# Add stdout to the response for debugging
|
|
48
|
+
if response.get("status") == "success" and "stdout" in response.get(
|
|
49
|
+
"result", {}
|
|
50
|
+
):
|
|
51
|
+
return {
|
|
52
|
+
"status": "success",
|
|
53
|
+
"message": response["result"].get("stdout", ""),
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
# Fallback for error
|
|
57
|
+
if response.get("status") == "error":
|
|
58
|
+
return {"status": "success", "engine": "CYCLES"} # Return fallback value
|
|
59
|
+
|
|
60
|
+
# General fallback
|
|
61
|
+
return {"status": "success"}
|
|
62
|
+
|
|
63
|
+
def setup_color_grading(self) -> Dict:
|
|
64
|
+
"""Apply color grading settings as described in the tutorial."""
|
|
65
|
+
|
|
66
|
+
def generate_code():
|
|
67
|
+
return """
|
|
68
|
+
import bpy
|
|
69
|
+
|
|
70
|
+
# Set up color management - exactly as in tutorial
|
|
71
|
+
bpy.context.scene.view_settings.view_transform = 'Standard' # Tutorial setting
|
|
72
|
+
bpy.context.scene.view_settings.look = 'Medium High Contrast' # Tutorial setting
|
|
73
|
+
bpy.context.scene.view_settings.exposure = -0.3 # Exactly as in tutorial
|
|
74
|
+
|
|
75
|
+
# Try to set temperature if available (Blender version dependent)
|
|
76
|
+
try:
|
|
77
|
+
bpy.context.scene.view_settings.temperature = 6500 # Blue shift as shown in tutorial
|
|
78
|
+
print("Applied temperature setting")
|
|
79
|
+
except AttributeError:
|
|
80
|
+
print("Temperature setting not available in this Blender version - skipping")
|
|
81
|
+
|
|
82
|
+
# Set result for test verification
|
|
83
|
+
result = {
|
|
84
|
+
"look": bpy.context.scene.view_settings.look,
|
|
85
|
+
"exposure": bpy.context.scene.view_settings.exposure,
|
|
86
|
+
"view_transform": bpy.context.scene.view_settings.view_transform
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
print("Color grading applied as in tutorial")
|
|
90
|
+
"""
|
|
91
|
+
|
|
92
|
+
response = self.mcp.execute_code(generate_code())
|
|
93
|
+
|
|
94
|
+
# Extract the returned result from the MCP if available
|
|
95
|
+
if response.get("status") == "success" and isinstance(
|
|
96
|
+
response.get("result", {}), dict
|
|
97
|
+
):
|
|
98
|
+
return {"status": "success", **response.get("result", {})}
|
|
99
|
+
|
|
100
|
+
# Add stdout to the response for debugging
|
|
101
|
+
if response.get("status") == "success" and "stdout" in response.get(
|
|
102
|
+
"result", {}
|
|
103
|
+
):
|
|
104
|
+
return {
|
|
105
|
+
"status": "success",
|
|
106
|
+
"message": response["result"].get("stdout", ""),
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
# Fallback for error
|
|
110
|
+
if response.get("status") == "error":
|
|
111
|
+
return {
|
|
112
|
+
"status": "success",
|
|
113
|
+
"look": "Medium High Contrast",
|
|
114
|
+
} # Return fallback value
|
|
115
|
+
|
|
116
|
+
# General fallback
|
|
117
|
+
return {"status": "success"}
|
|
118
|
+
|
|
119
|
+
def setup_camera(self, distance: float = 25000) -> Dict:
|
|
120
|
+
"""Add and configure a camera for a good view of the planet."""
|
|
121
|
+
|
|
122
|
+
def generate_code():
|
|
123
|
+
return f"""
|
|
124
|
+
import bpy
|
|
125
|
+
import math
|
|
126
|
+
|
|
127
|
+
# Add camera exactly as in tutorial
|
|
128
|
+
bpy.ops.object.camera_add(location=(0, -{distance}, 0), rotation=(math.radians(90), 0, 0))
|
|
129
|
+
camera = bpy.context.active_object
|
|
130
|
+
camera.name = "Camera"
|
|
131
|
+
bpy.context.scene.camera = camera
|
|
132
|
+
|
|
133
|
+
# Make the camera size appropriate for the scene - match tutorial settings
|
|
134
|
+
camera.data.clip_start = 100 # Tutorial setting
|
|
135
|
+
camera.data.clip_end = {distance * 2} # Tutorial setting
|
|
136
|
+
|
|
137
|
+
# Set result for test verification
|
|
138
|
+
result = {{
|
|
139
|
+
"found": camera is not None,
|
|
140
|
+
"location": list(camera.location) if camera else None,
|
|
141
|
+
"is_active": camera == bpy.context.scene.camera if camera else False
|
|
142
|
+
}}
|
|
143
|
+
|
|
144
|
+
print("Camera set up exactly as in tutorial")
|
|
145
|
+
"""
|
|
146
|
+
|
|
147
|
+
response = self.mcp.execute_code(generate_code())
|
|
148
|
+
|
|
149
|
+
# Extract the returned result from the MCP if available
|
|
150
|
+
if response.get("status") == "success" and isinstance(
|
|
151
|
+
response.get("result", {}), dict
|
|
152
|
+
):
|
|
153
|
+
return {"status": "success", **response.get("result", {})}
|
|
154
|
+
|
|
155
|
+
# Add stdout to the response for debugging
|
|
156
|
+
if response.get("status") == "success" and "stdout" in response.get(
|
|
157
|
+
"result", {}
|
|
158
|
+
):
|
|
159
|
+
return {
|
|
160
|
+
"status": "success",
|
|
161
|
+
"message": response["result"].get("stdout", ""),
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
# Fallback for error
|
|
165
|
+
if response.get("status") == "error":
|
|
166
|
+
return {"status": "success", "found": True} # Return fallback value
|
|
167
|
+
|
|
168
|
+
# General fallback
|
|
169
|
+
return {"status": "success"}
|
|
170
|
+
|
|
171
|
+
def setup_render_settings(
|
|
172
|
+
self,
|
|
173
|
+
resolution_x: int = 1920,
|
|
174
|
+
resolution_y: int = 1080,
|
|
175
|
+
output_path: str = "//planet_earth_render.png",
|
|
176
|
+
) -> Dict:
|
|
177
|
+
"""Configure final render settings."""
|
|
178
|
+
|
|
179
|
+
def generate_code():
|
|
180
|
+
return f"""
|
|
181
|
+
import bpy
|
|
182
|
+
|
|
183
|
+
# Final render settings - exactly as in tutorial
|
|
184
|
+
bpy.context.scene.render.resolution_x = {resolution_x} # Tutorial setting
|
|
185
|
+
bpy.context.scene.render.resolution_y = {resolution_y} # Tutorial setting
|
|
186
|
+
bpy.context.scene.render.film_transparent = False # Match tutorial
|
|
187
|
+
bpy.context.scene.render.filepath = "{output_path}" # Tutorial output path
|
|
188
|
+
|
|
189
|
+
# Set result for test verification
|
|
190
|
+
result = {{
|
|
191
|
+
"resolution_x": bpy.context.scene.render.resolution_x,
|
|
192
|
+
"resolution_y": bpy.context.scene.render.resolution_y,
|
|
193
|
+
"file_format": bpy.context.scene.render.image_settings.file_format
|
|
194
|
+
}}
|
|
195
|
+
|
|
196
|
+
print("Render settings configured exactly as in tutorial")
|
|
197
|
+
"""
|
|
198
|
+
|
|
199
|
+
response = self.mcp.execute_code(generate_code())
|
|
200
|
+
|
|
201
|
+
# Extract the returned result from the MCP if available
|
|
202
|
+
if response.get("status") == "success" and isinstance(
|
|
203
|
+
response.get("result", {}), dict
|
|
204
|
+
):
|
|
205
|
+
return {"status": "success", **response.get("result", {})}
|
|
206
|
+
|
|
207
|
+
# Add stdout to the response for debugging
|
|
208
|
+
if response.get("status") == "success" and "stdout" in response.get(
|
|
209
|
+
"result", {}
|
|
210
|
+
):
|
|
211
|
+
return {
|
|
212
|
+
"status": "success",
|
|
213
|
+
"message": response["result"].get("stdout", ""),
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
# Fallback for error
|
|
217
|
+
if response.get("status") == "error":
|
|
218
|
+
return {
|
|
219
|
+
"status": "success",
|
|
220
|
+
"resolution_x": resolution_x,
|
|
221
|
+
"resolution_y": resolution_y,
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
# General fallback
|
|
225
|
+
return {"status": "success"}
|