amd-gaia 0.15.0__py3-none-any.whl → 0.15.2__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.15.0.dist-info → amd_gaia-0.15.2.dist-info}/METADATA +222 -223
- amd_gaia-0.15.2.dist-info/RECORD +182 -0
- {amd_gaia-0.15.0.dist-info → amd_gaia-0.15.2.dist-info}/WHEEL +1 -1
- {amd_gaia-0.15.0.dist-info → amd_gaia-0.15.2.dist-info}/entry_points.txt +1 -0
- {amd_gaia-0.15.0.dist-info → amd_gaia-0.15.2.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 +2132 -2177
- gaia/agents/base/api_agent.py +119 -120
- gaia/agents/base/console.py +1967 -1841
- gaia/agents/base/errors.py +237 -237
- gaia/agents/base/mcp_agent.py +86 -86
- gaia/agents/base/tools.py +88 -83
- gaia/agents/blender/__init__.py +7 -0
- gaia/agents/blender/agent.py +553 -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 +809 -835
- gaia/agents/chat/app.py +1065 -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 +1744 -1729
- gaia/agents/chat/tools/shell_tools.py +437 -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 +2034 -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 +643 -642
- gaia/agents/emr/__init__.py +8 -8
- gaia/agents/emr/agent.py +1504 -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 +1972 -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 +184 -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 +428 -430
- gaia/chat/prompts.py +522 -522
- gaia/chat/sdk.py +1228 -1225
- gaia/cli.py +5659 -5632
- 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/installer/__init__.py +23 -0
- gaia/installer/init_command.py +1275 -0
- gaia/installer/lemonade_installer.py +619 -0
- gaia/llm/__init__.py +10 -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 +3421 -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 +118 -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 +183 -163
- gaia/talk/app.py +287 -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.15.0.dist-info/RECORD +0 -168
- gaia/agents/code/app.py +0 -266
- gaia/llm/llm_client.py +0 -723
- {amd_gaia-0.15.0.dist-info → amd_gaia-0.15.2.dist-info}/top_level.txt +0 -0
gaia/mcp/blender_mcp_client.py
CHANGED
|
@@ -1,138 +1,138 @@
|
|
|
1
|
-
# Copyright(C) 2025-2026 Advanced Micro Devices, Inc. All rights reserved.
|
|
2
|
-
# SPDX-License-Identifier: MIT
|
|
3
|
-
|
|
4
|
-
# This Blender MCP client is a simplified and modified version of the BlenderMCP project from https://github.com/BlenderMCP/blender-mcp
|
|
5
|
-
|
|
6
|
-
import json
|
|
7
|
-
import logging
|
|
8
|
-
import re
|
|
9
|
-
import socket
|
|
10
|
-
|
|
11
|
-
from gaia.logger import get_logger
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
class MCPError(Exception):
|
|
15
|
-
"""Exception raised for MCP client errors."""
|
|
16
|
-
|
|
17
|
-
pass
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
# MCP client class for tests
|
|
21
|
-
class MCPClient:
|
|
22
|
-
log = get_logger(__name__)
|
|
23
|
-
|
|
24
|
-
def __init__(self, host="localhost", port=9876):
|
|
25
|
-
self.host = host
|
|
26
|
-
self.port = port
|
|
27
|
-
self.log = self.__class__.log # Use the class-level logger for instances
|
|
28
|
-
self.log.setLevel(logging.INFO)
|
|
29
|
-
|
|
30
|
-
def _enhance_error_message(self, error_message):
|
|
31
|
-
"""Enhance error messages with more helpful information."""
|
|
32
|
-
# Detect common Python errors and provide better context
|
|
33
|
-
if "name '" in error_message and "is not defined" in error_message:
|
|
34
|
-
# Extract variable name from NameError
|
|
35
|
-
match = re.search(r"name '(\w+)' is not defined", error_message)
|
|
36
|
-
if match:
|
|
37
|
-
var_name = match.group(1)
|
|
38
|
-
return f"Variable '{var_name}' is not defined. Make sure to declare it before use or check for typos."
|
|
39
|
-
|
|
40
|
-
# Handle object not found errors
|
|
41
|
-
if "Object not found:" in error_message:
|
|
42
|
-
obj_name = error_message.replace("Object not found: ", "")
|
|
43
|
-
return f"Object '{obj_name}' not found in the scene. It may have been deleted or renamed."
|
|
44
|
-
|
|
45
|
-
# Return original message if no enhancement is available
|
|
46
|
-
return error_message
|
|
47
|
-
|
|
48
|
-
def send_command(self, cmd_type, params=None):
|
|
49
|
-
if params is None:
|
|
50
|
-
params = {}
|
|
51
|
-
|
|
52
|
-
# Create command
|
|
53
|
-
command = {"type": cmd_type, "params": params}
|
|
54
|
-
|
|
55
|
-
self.log.debug(f"Sending command: {cmd_type} with params: {params}")
|
|
56
|
-
|
|
57
|
-
# Send command to server
|
|
58
|
-
try:
|
|
59
|
-
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
|
|
60
|
-
sock.connect((self.host, self.port))
|
|
61
|
-
sock.sendall(json.dumps(command).encode("utf-8"))
|
|
62
|
-
|
|
63
|
-
# Receive the response
|
|
64
|
-
response = sock.recv(65536).decode("utf-8")
|
|
65
|
-
|
|
66
|
-
# Parse the JSON response
|
|
67
|
-
parsed_response = json.loads(response)
|
|
68
|
-
|
|
69
|
-
if parsed_response["status"] == "error":
|
|
70
|
-
error_message = parsed_response.get("message", "Unknown error")
|
|
71
|
-
enhanced_message = self._enhance_error_message(error_message)
|
|
72
|
-
self.log.error(f"Error response: {error_message}")
|
|
73
|
-
raise MCPError(enhanced_message)
|
|
74
|
-
else:
|
|
75
|
-
self.log.debug(f"Response status: {parsed_response['status']}")
|
|
76
|
-
|
|
77
|
-
return parsed_response
|
|
78
|
-
except ConnectionRefusedError:
|
|
79
|
-
error_msg = "Connection refused. Is the Blender MCP server running?"
|
|
80
|
-
self.log.error(f"Connection error: {error_msg}")
|
|
81
|
-
raise MCPError(error_msg)
|
|
82
|
-
except MCPError:
|
|
83
|
-
# Re-raise MCPError without wrapping it
|
|
84
|
-
raise
|
|
85
|
-
except Exception as e:
|
|
86
|
-
error_msg = f"Error: {str(e)}"
|
|
87
|
-
self.log.error(error_msg)
|
|
88
|
-
raise MCPError(error_msg)
|
|
89
|
-
|
|
90
|
-
def execute_code(self, code):
|
|
91
|
-
self.log.debug(f"Executing code in Blender")
|
|
92
|
-
return self.send_command("execute_code", {"code": code})
|
|
93
|
-
|
|
94
|
-
def get_scene_info(self):
|
|
95
|
-
self.log.debug(f"Getting scene info")
|
|
96
|
-
return self.send_command("get_scene_info")
|
|
97
|
-
|
|
98
|
-
def create_object(
|
|
99
|
-
self,
|
|
100
|
-
type="CUBE",
|
|
101
|
-
name=None,
|
|
102
|
-
location=(0, 0, 0),
|
|
103
|
-
rotation=(0, 0, 0),
|
|
104
|
-
scale=(1, 1, 1),
|
|
105
|
-
):
|
|
106
|
-
params = {
|
|
107
|
-
"type": type,
|
|
108
|
-
"location": location,
|
|
109
|
-
"rotation": rotation,
|
|
110
|
-
"scale": scale,
|
|
111
|
-
}
|
|
112
|
-
if name:
|
|
113
|
-
params["name"] = name
|
|
114
|
-
self.log.debug(f"Creating {type} object{' named ' + name if name else ''}")
|
|
115
|
-
return self.send_command("create_object", params)
|
|
116
|
-
|
|
117
|
-
def modify_object(
|
|
118
|
-
self, name, location=None, rotation=None, scale=None, visible=None
|
|
119
|
-
):
|
|
120
|
-
params = {"name": name}
|
|
121
|
-
if location is not None:
|
|
122
|
-
params["location"] = location
|
|
123
|
-
if rotation is not None:
|
|
124
|
-
params["rotation"] = rotation
|
|
125
|
-
if scale is not None:
|
|
126
|
-
params["scale"] = scale
|
|
127
|
-
if visible is not None:
|
|
128
|
-
params["visible"] = visible
|
|
129
|
-
self.log.debug(f"Modifying object '{name}'")
|
|
130
|
-
return self.send_command("modify_object", params)
|
|
131
|
-
|
|
132
|
-
def delete_object(self, name):
|
|
133
|
-
self.log.debug(f"Deleting object '{name}'")
|
|
134
|
-
return self.send_command("delete_object", {"name": name})
|
|
135
|
-
|
|
136
|
-
def get_object_info(self, name):
|
|
137
|
-
self.log.debug(f"Getting info for object '{name}'")
|
|
138
|
-
return self.send_command("get_object_info", {"name": name})
|
|
1
|
+
# Copyright(C) 2025-2026 Advanced Micro Devices, Inc. All rights reserved.
|
|
2
|
+
# SPDX-License-Identifier: MIT
|
|
3
|
+
|
|
4
|
+
# This Blender MCP client is a simplified and modified version of the BlenderMCP project from https://github.com/BlenderMCP/blender-mcp
|
|
5
|
+
|
|
6
|
+
import json
|
|
7
|
+
import logging
|
|
8
|
+
import re
|
|
9
|
+
import socket
|
|
10
|
+
|
|
11
|
+
from gaia.logger import get_logger
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class MCPError(Exception):
|
|
15
|
+
"""Exception raised for MCP client errors."""
|
|
16
|
+
|
|
17
|
+
pass
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
# MCP client class for tests
|
|
21
|
+
class MCPClient:
|
|
22
|
+
log = get_logger(__name__)
|
|
23
|
+
|
|
24
|
+
def __init__(self, host="localhost", port=9876):
|
|
25
|
+
self.host = host
|
|
26
|
+
self.port = port
|
|
27
|
+
self.log = self.__class__.log # Use the class-level logger for instances
|
|
28
|
+
self.log.setLevel(logging.INFO)
|
|
29
|
+
|
|
30
|
+
def _enhance_error_message(self, error_message):
|
|
31
|
+
"""Enhance error messages with more helpful information."""
|
|
32
|
+
# Detect common Python errors and provide better context
|
|
33
|
+
if "name '" in error_message and "is not defined" in error_message:
|
|
34
|
+
# Extract variable name from NameError
|
|
35
|
+
match = re.search(r"name '(\w+)' is not defined", error_message)
|
|
36
|
+
if match:
|
|
37
|
+
var_name = match.group(1)
|
|
38
|
+
return f"Variable '{var_name}' is not defined. Make sure to declare it before use or check for typos."
|
|
39
|
+
|
|
40
|
+
# Handle object not found errors
|
|
41
|
+
if "Object not found:" in error_message:
|
|
42
|
+
obj_name = error_message.replace("Object not found: ", "")
|
|
43
|
+
return f"Object '{obj_name}' not found in the scene. It may have been deleted or renamed."
|
|
44
|
+
|
|
45
|
+
# Return original message if no enhancement is available
|
|
46
|
+
return error_message
|
|
47
|
+
|
|
48
|
+
def send_command(self, cmd_type, params=None):
|
|
49
|
+
if params is None:
|
|
50
|
+
params = {}
|
|
51
|
+
|
|
52
|
+
# Create command
|
|
53
|
+
command = {"type": cmd_type, "params": params}
|
|
54
|
+
|
|
55
|
+
self.log.debug(f"Sending command: {cmd_type} with params: {params}")
|
|
56
|
+
|
|
57
|
+
# Send command to server
|
|
58
|
+
try:
|
|
59
|
+
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
|
|
60
|
+
sock.connect((self.host, self.port))
|
|
61
|
+
sock.sendall(json.dumps(command).encode("utf-8"))
|
|
62
|
+
|
|
63
|
+
# Receive the response
|
|
64
|
+
response = sock.recv(65536).decode("utf-8")
|
|
65
|
+
|
|
66
|
+
# Parse the JSON response
|
|
67
|
+
parsed_response = json.loads(response)
|
|
68
|
+
|
|
69
|
+
if parsed_response["status"] == "error":
|
|
70
|
+
error_message = parsed_response.get("message", "Unknown error")
|
|
71
|
+
enhanced_message = self._enhance_error_message(error_message)
|
|
72
|
+
self.log.error(f"Error response: {error_message}")
|
|
73
|
+
raise MCPError(enhanced_message)
|
|
74
|
+
else:
|
|
75
|
+
self.log.debug(f"Response status: {parsed_response['status']}")
|
|
76
|
+
|
|
77
|
+
return parsed_response
|
|
78
|
+
except ConnectionRefusedError:
|
|
79
|
+
error_msg = "Connection refused. Is the Blender MCP server running?"
|
|
80
|
+
self.log.error(f"Connection error: {error_msg}")
|
|
81
|
+
raise MCPError(error_msg)
|
|
82
|
+
except MCPError:
|
|
83
|
+
# Re-raise MCPError without wrapping it
|
|
84
|
+
raise
|
|
85
|
+
except Exception as e:
|
|
86
|
+
error_msg = f"Error: {str(e)}"
|
|
87
|
+
self.log.error(error_msg)
|
|
88
|
+
raise MCPError(error_msg)
|
|
89
|
+
|
|
90
|
+
def execute_code(self, code):
|
|
91
|
+
self.log.debug(f"Executing code in Blender")
|
|
92
|
+
return self.send_command("execute_code", {"code": code})
|
|
93
|
+
|
|
94
|
+
def get_scene_info(self):
|
|
95
|
+
self.log.debug(f"Getting scene info")
|
|
96
|
+
return self.send_command("get_scene_info")
|
|
97
|
+
|
|
98
|
+
def create_object(
|
|
99
|
+
self,
|
|
100
|
+
type="CUBE",
|
|
101
|
+
name=None,
|
|
102
|
+
location=(0, 0, 0),
|
|
103
|
+
rotation=(0, 0, 0),
|
|
104
|
+
scale=(1, 1, 1),
|
|
105
|
+
):
|
|
106
|
+
params = {
|
|
107
|
+
"type": type,
|
|
108
|
+
"location": location,
|
|
109
|
+
"rotation": rotation,
|
|
110
|
+
"scale": scale,
|
|
111
|
+
}
|
|
112
|
+
if name:
|
|
113
|
+
params["name"] = name
|
|
114
|
+
self.log.debug(f"Creating {type} object{' named ' + name if name else ''}")
|
|
115
|
+
return self.send_command("create_object", params)
|
|
116
|
+
|
|
117
|
+
def modify_object(
|
|
118
|
+
self, name, location=None, rotation=None, scale=None, visible=None
|
|
119
|
+
):
|
|
120
|
+
params = {"name": name}
|
|
121
|
+
if location is not None:
|
|
122
|
+
params["location"] = location
|
|
123
|
+
if rotation is not None:
|
|
124
|
+
params["rotation"] = rotation
|
|
125
|
+
if scale is not None:
|
|
126
|
+
params["scale"] = scale
|
|
127
|
+
if visible is not None:
|
|
128
|
+
params["visible"] = visible
|
|
129
|
+
self.log.debug(f"Modifying object '{name}'")
|
|
130
|
+
return self.send_command("modify_object", params)
|
|
131
|
+
|
|
132
|
+
def delete_object(self, name):
|
|
133
|
+
self.log.debug(f"Deleting object '{name}'")
|
|
134
|
+
return self.send_command("delete_object", {"name": name})
|
|
135
|
+
|
|
136
|
+
def get_object_info(self, name):
|
|
137
|
+
self.log.debug(f"Getting info for object '{name}'")
|
|
138
|
+
return self.send_command("get_object_info", {"name": name})
|