amd-gaia 0.15.1__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.1.dist-info → amd_gaia-0.15.2.dist-info}/METADATA +1 -2
- {amd_gaia-0.15.1.dist-info → amd_gaia-0.15.2.dist-info}/RECORD +35 -31
- {amd_gaia-0.15.1.dist-info → amd_gaia-0.15.2.dist-info}/WHEEL +1 -1
- gaia/agents/base/agent.py +45 -90
- gaia/agents/base/api_agent.py +0 -1
- gaia/agents/base/console.py +126 -0
- gaia/agents/base/tools.py +7 -2
- gaia/agents/blender/__init__.py +7 -0
- gaia/agents/blender/agent.py +7 -10
- gaia/agents/blender/core/view.py +2 -2
- gaia/agents/chat/agent.py +22 -48
- gaia/agents/chat/app.py +7 -0
- gaia/agents/chat/tools/rag_tools.py +23 -8
- gaia/agents/chat/tools/shell_tools.py +1 -0
- gaia/agents/code/prompts/code_patterns.py +2 -4
- gaia/agents/docker/agent.py +1 -0
- gaia/agents/emr/agent.py +3 -5
- gaia/agents/emr/cli.py +1 -1
- gaia/agents/emr/dashboard/server.py +2 -4
- gaia/apps/llm/app.py +14 -3
- gaia/chat/app.py +2 -4
- gaia/cli.py +511 -333
- gaia/installer/__init__.py +23 -0
- gaia/installer/init_command.py +1275 -0
- gaia/installer/lemonade_installer.py +619 -0
- gaia/llm/__init__.py +2 -1
- gaia/llm/lemonade_client.py +284 -99
- gaia/llm/providers/lemonade.py +12 -14
- gaia/rag/sdk.py +1 -1
- gaia/security.py +24 -4
- gaia/talk/app.py +2 -4
- gaia/version.py +2 -2
- {amd_gaia-0.15.1.dist-info → amd_gaia-0.15.2.dist-info}/entry_points.txt +0 -0
- {amd_gaia-0.15.1.dist-info → amd_gaia-0.15.2.dist-info}/licenses/LICENSE.md +0 -0
- {amd_gaia-0.15.1.dist-info → amd_gaia-0.15.2.dist-info}/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: amd-gaia
|
|
3
|
-
Version: 0.15.
|
|
3
|
+
Version: 0.15.2
|
|
4
4
|
Summary: GAIA is a lightweight agent framework designed for the edge and AI PCs.
|
|
5
5
|
Home-page: https://github.com/amd/gaia
|
|
6
6
|
Author: AMD
|
|
@@ -100,7 +100,6 @@ Dynamic: summary
|
|
|
100
100
|
|
|
101
101
|
# <img src="https://raw.githubusercontent.com/amd/gaia/main/src/gaia/img/gaia.ico" alt="GAIA Logo" width="64" height="64" style="vertical-align: middle;"> GAIA: AI Agent Framework for AMD Ryzen AI
|
|
102
102
|
|
|
103
|
-
[](https://github.com/amd/gaia/tree/main/tests "Check out our build")
|
|
104
103
|
[](https://github.com/amd/gaia/tree/main/tests "Check out our cli tests")
|
|
105
104
|
[](https://github.com/amd/gaia/releases/latest "Download the latest release")
|
|
106
105
|
[](https://pypi.org/project/amd-gaia/)
|
|
@@ -1,20 +1,21 @@
|
|
|
1
|
-
amd_gaia-0.15.
|
|
1
|
+
amd_gaia-0.15.2.dist-info/licenses/LICENSE.md,sha256=yIF_ozJFJ83xmRHBrFVeGoc12JVoCphi1cy07CsfroQ,1083
|
|
2
2
|
gaia/__init__.py,sha256=4SNDd1YBqgMNkH71EY3x81E_CSM4gc3Wl7GClCl1KTI,843
|
|
3
|
-
gaia/cli.py,sha256=
|
|
3
|
+
gaia/cli.py,sha256=sjgL2Ch7Zs0gSclHCdDfuw-lFHRaIzI0-fQ-aWGVYKQ,220283
|
|
4
4
|
gaia/logger.py,sha256=lrE9P2uL97TO35rfRyNMOdjo_BcNlvlym2N18B4sT7Y,6560
|
|
5
5
|
gaia/perf_analysis.py,sha256=RJjv8d52zkbZzPlv7lLLwtQS7qiQY7VX-g-W0skcdyU,11070
|
|
6
|
-
gaia/security.py,sha256=
|
|
6
|
+
gaia/security.py,sha256=O2XKjAEGkjleWN-MKQPXgk6C4k_n-K4X2OYAdm6YtDA,6816
|
|
7
7
|
gaia/util.py,sha256=QYOjlm4dEJePwptjMJOkVGYXbw7wAee4o4P1KOUKicY,1569
|
|
8
|
-
gaia/version.py,sha256=
|
|
8
|
+
gaia/version.py,sha256=WRkdcNEUd-2Zi922mMofuQyPsGTDnxUCP8Q-YNQWf10,2840
|
|
9
9
|
gaia/agents/__init__.py,sha256=-xX8KhEOt3OglQnHJh_fh2WlRibvnNptOsRMzpkUb-c,471
|
|
10
10
|
gaia/agents/base/__init__.py,sha256=rgZ1-KKULJpy337UWHaEyU-SPTmqbUHTjBuaiAI87I8,364
|
|
11
|
-
gaia/agents/base/agent.py,sha256=
|
|
12
|
-
gaia/agents/base/api_agent.py,sha256=
|
|
13
|
-
gaia/agents/base/console.py,sha256=
|
|
11
|
+
gaia/agents/base/agent.py,sha256=q2UrK-Fa16EC5xASK-F2eJtsG5RJp2f8nbSZM3Avav0,94355
|
|
12
|
+
gaia/agents/base/api_agent.py,sha256=vjFGufBikYcgigjWPxNP-IGJl3joyHsT43mr7uOXs4I,3906
|
|
13
|
+
gaia/agents/base/console.py,sha256=Y-pTmzy7ap3EvoyjhVFfvb5xqAhrXeOaxPlTS_yOXEM,69801
|
|
14
14
|
gaia/agents/base/errors.py,sha256=UQs9Zt-Rhl480d5h3qoAzC8UKZsdy-gQGzrDlE73DFA,7011
|
|
15
15
|
gaia/agents/base/mcp_agent.py,sha256=j53OIpwvn-bGOnq5UxlctLcX65mjaxKPziveWRiGalw,2352
|
|
16
|
-
gaia/agents/base/tools.py,sha256=
|
|
17
|
-
gaia/agents/blender/
|
|
16
|
+
gaia/agents/base/tools.py,sha256=zghYt8bVCiwEz-zcrsQpNom3e_JMoY4X1VgP_siYywU,2796
|
|
17
|
+
gaia/agents/blender/__init__.py,sha256=PiQYj1N-w93H_HTWqYnFC55Hy7bBES81B9IP_zRGdbo,231
|
|
18
|
+
gaia/agents/blender/agent.py,sha256=4UYoNUtaEfoHUBfU_MYUWr3SzaMbHAgB11SLQgmzC4U,20602
|
|
18
19
|
gaia/agents/blender/agent_simple.py,sha256=JJAagDUKBTKWRqPxUrpydL843FuSLFS_t4x4DJiq-YQ,4830
|
|
19
20
|
gaia/agents/blender/app.py,sha256=-CpauICzYVsXkTEnKcj03ZeLFHxbAcbpM7DJtZpKJYI,7229
|
|
20
21
|
gaia/agents/blender/app_simple.py,sha256=li-s86X7QwsLD8XtgRDCRRHYs4w118PRRjVI08n71mE,1252
|
|
@@ -23,15 +24,15 @@ gaia/agents/blender/core/materials.py,sha256=-7_w3jePL1fvN3vxn3SLTx-9f_Kf5uy95KH
|
|
|
23
24
|
gaia/agents/blender/core/objects.py,sha256=jDZu8ZaHJVTDLaS5yv5aSPlKqCuUvFa5Fg9zxmI_Zyk,10330
|
|
24
25
|
gaia/agents/blender/core/rendering.py,sha256=v8ai0vEA1eL1FnNpW1HKHKxlyv5Emns8FCyWzPih9To,7564
|
|
25
26
|
gaia/agents/blender/core/scene.py,sha256=bSf5hjblYoGZsjsABKXy25E0wP0S7dUMO98RsGE5IcY,6971
|
|
26
|
-
gaia/agents/blender/core/view.py,sha256=
|
|
27
|
+
gaia/agents/blender/core/view.py,sha256=eY2DlxIodHb6QPD7okUSo0whHC6ALsuBVGzQBIPSlkQ,4980
|
|
27
28
|
gaia/agents/chat/__init__.py,sha256=Ys_t9QdnLvPTJNgbxrj1PmAFE6ZHJCzmITbO_FFSI9Q,235
|
|
28
|
-
gaia/agents/chat/agent.py,sha256
|
|
29
|
-
gaia/agents/chat/app.py,sha256=
|
|
29
|
+
gaia/agents/chat/agent.py,sha256=-mcCM1Z5rJHMFvJ4wuZk66mmQ_qJkHQHyjQ5qs_49ac,32469
|
|
30
|
+
gaia/agents/chat/app.py,sha256=hQwlvZM7Vqa_GMWZxsZQFho8lhm31_Hu6lC7_XJvddQ,47496
|
|
30
31
|
gaia/agents/chat/session.py,sha256=7-MwarXLXSQb4cBVSyPOoHrunpv1RUBPW6g9bpwfPDk,17856
|
|
31
32
|
gaia/agents/chat/tools/__init__.py,sha256=0xQ4S8dJzoOTHOiXJ27Az2lxpxbzM50VN6p4QMAve-I,451
|
|
32
33
|
gaia/agents/chat/tools/file_tools.py,sha256=GkSVfTq96xNgcQ5WgfWvjcfMpD94vBBjO-JMV_t0Rq0,3763
|
|
33
|
-
gaia/agents/chat/tools/rag_tools.py,sha256=
|
|
34
|
-
gaia/agents/chat/tools/shell_tools.py,sha256=
|
|
34
|
+
gaia/agents/chat/tools/rag_tools.py,sha256=17e4vw90pHTZd2Rr9cDAOyNtlFKg_2svFhxiY5_1dkk,79337
|
|
35
|
+
gaia/agents/chat/tools/shell_tools.py,sha256=4bd02jlybnFWj-iiToFkWB_nEQRGNy0duxaedctGpvk,18254
|
|
35
36
|
gaia/agents/code/__init__.py,sha256=0Ad5Cl4uJPqY8iaOc8zTbsWeaY0PQY652JMJj4lljS8,188
|
|
36
37
|
gaia/agents/code/agent.py,sha256=QzoS_Vc6qN7DwpI3SxpRHTzo_c7XuDKhN5spme2Bkpo,21994
|
|
37
38
|
gaia/agents/code/cli.py,sha256=gygaN4chkt14bNfoqDeCucWa5ykuoYggtITbY6Z4EZM,11535
|
|
@@ -59,7 +60,7 @@ gaia/agents/code/orchestration/workflows/nextjs.py,sha256=uh24eTkLQshaxck5y7txJv
|
|
|
59
60
|
gaia/agents/code/orchestration/workflows/python.py,sha256=loEiXotb_oJKQXGjgVQybpv2AmD-p-QY-gT9dPIn8Hs,2457
|
|
60
61
|
gaia/agents/code/prompts/__init__.py,sha256=augJiIL5IEIEwdBFQ8olB6i88gRHq8p-K2_KBC1M-QQ,309
|
|
61
62
|
gaia/agents/code/prompts/base_prompt.py,sha256=V6VpCH61V4kWHeawJabmCQaGIBsa6zqWVWUrs-Y9eCg,2734
|
|
62
|
-
gaia/agents/code/prompts/code_patterns.py,sha256=
|
|
63
|
+
gaia/agents/code/prompts/code_patterns.py,sha256=lUS1PhZde0OWzU2O6j2Dtlc5RGH2k7Zm332BXAzekeM,67508
|
|
63
64
|
gaia/agents/code/prompts/nextjs_prompt.py,sha256=L4Mz9mzKbTpzv9oK67VJw0GtA0n5LJgb26nB_UgEvsc,1336
|
|
64
65
|
gaia/agents/code/prompts/python_prompt.py,sha256=b7nDto8WLzpcV2blb6ALu9_500zLxMeHeZxxHFrMM9s,5157
|
|
65
66
|
gaia/agents/code/tools/__init__.py,sha256=RwzWZSJfWzNNe5HLFUOckvT9JI2pQCDs_kA_Kx98iyo,1194
|
|
@@ -82,13 +83,13 @@ gaia/agents/code/validators/ast_analyzer.py,sha256=X-Yo365WhmGIKijzndmrBxO_QtMVY
|
|
|
82
83
|
gaia/agents/code/validators/requirements_validator.py,sha256=e49UW4j4_PUwid5rDdJG7fGngcRSYNin9iyHXs-2LfQ,4874
|
|
83
84
|
gaia/agents/code/validators/syntax_validator.py,sha256=dHKIJDkkHywvxZXaSHT-gYqmq7WU2HNiEXn5k87Xc7Y,5202
|
|
84
85
|
gaia/agents/docker/__init__.py,sha256=CJrfgp08EiwRFdecnRMF9GAVegtwZSr5GYjsOpLUPTg,212
|
|
85
|
-
gaia/agents/docker/agent.py,sha256=
|
|
86
|
+
gaia/agents/docker/agent.py,sha256=kqfi5A59Vyo5GWAuS95AaTUbujcPGA9mYS7zMeWfFXY,24993
|
|
86
87
|
gaia/agents/emr/__init__.py,sha256=pkwTATtg2FTAMIOTVRxJyp2chmg6mEB90bMObk_lQDI,257
|
|
87
|
-
gaia/agents/emr/agent.py,sha256=
|
|
88
|
-
gaia/agents/emr/cli.py,sha256=
|
|
88
|
+
gaia/agents/emr/agent.py,sha256=5vaZBeI5VfADJhyASC5HhFCliQsPee2VmTDgHl7qEcU,58342
|
|
89
|
+
gaia/agents/emr/cli.py,sha256=ox6cmBxaixvp2-ChK6hXKS5jSK8y_Td4lRmt6ErWMVM,45453
|
|
89
90
|
gaia/agents/emr/constants.py,sha256=O8U6UJGxsrDCCs-FRFGbPXVA9uzvaAhqsrbajBDTGeo,14090
|
|
90
91
|
gaia/agents/emr/dashboard/__init__.py,sha256=LuxNnUsmYYrsTTEa9jIAQtvsEkKiY_I9AuaRmU7aav0,142
|
|
91
|
-
gaia/agents/emr/dashboard/server.py,sha256=
|
|
92
|
+
gaia/agents/emr/dashboard/server.py,sha256=YQTrYM-vOt0I8KXXjzI1pNgDYoK10ZRd86NyrrD-nmM,76965
|
|
92
93
|
gaia/agents/jira/__init__.py,sha256=7REShMYH9BTXmYaqBPpm9jDzE2LofMX_1-PKWWH6eiE,395
|
|
93
94
|
gaia/agents/jira/agent.py,sha256=jbAPNfO8_0QM9gAeH278MtExVwib_z3yGfGZSwkzFsI,34478
|
|
94
95
|
gaia/agents/jira/jql_templates.py,sha256=c1BKGPoeOWeB-EExFzTkb2UcGuC_wWsiOEqpX0oImSg,11136
|
|
@@ -106,7 +107,7 @@ gaia/api/schemas.py,sha256=yVgHEGtslbkgJKgflolcYlKvr4I13R4Re1K6cyu4JL0,4936
|
|
|
106
107
|
gaia/api/sse_handler.py,sha256=dHJmB2mgMoKctx_IKUM-KQKDY0PsKlg0rtKW6UlcMvM,13154
|
|
107
108
|
gaia/apps/__init__.py,sha256=YnsP88ZyPLsKkMlEKyzq2TYGOV5nZvmp2V9cMtjb9fw,131
|
|
108
109
|
gaia/apps/llm/__init__.py,sha256=dKYgZ2z17HGYR_MDMk-18WUofVodd6dSGeSY1yzth3A,156
|
|
109
|
-
gaia/apps/llm/app.py,sha256=
|
|
110
|
+
gaia/apps/llm/app.py,sha256=z3SCiBrKszzpyo12s04O07KWCLlVGcjqT9V1WC0exVo,5353
|
|
110
111
|
gaia/apps/summarize/app.py,sha256=CHxP2UZZ_alwm6tNgJ5mEYkWv6W0gISpd_zae0Lm_4U,3747
|
|
111
112
|
gaia/apps/summarize/html_viewer.py,sha256=PybAu7Kh47zCnvI9dKoGWw9ePK9E-ixskSzV5jB54Ig,4181
|
|
112
113
|
gaia/apps/summarize/pdf_formatter.py,sha256=JhYXyNYP7juknTE09WRudfAKSmQpmkmpDvkBtGpFZhE,10427
|
|
@@ -116,7 +117,7 @@ gaia/audio/audio_recorder.py,sha256=0ZxBPPMn52Y9hJeMmRycTkP0a9W-o0WwpKzxn-bD8Q4,
|
|
|
116
117
|
gaia/audio/kokoro_tts.py,sha256=_7tXznt42EXcM4ZaDoShZ0sSJffn9IEpnkVIhKKxstg,21831
|
|
117
118
|
gaia/audio/whisper_asr.py,sha256=prytZRuS465oeMkaj8ygdfb_QrTs71ucllWnp1-DNiY,16516
|
|
118
119
|
gaia/chat/__init__.py,sha256=SdzKPgy_XeQp6uj6HBeUwcRBK0xja7eFMow2eaKYlSE,349
|
|
119
|
-
gaia/chat/app.py,sha256=
|
|
120
|
+
gaia/chat/app.py,sha256=vQUfC7fyLNYm5KT-z_sxWT54Jg35i5sd3dYqKg1wWS4,12316
|
|
120
121
|
gaia/chat/prompts.py,sha256=2U1CaIM_TwLr7klZlbmNrwEV0tbWR8HE0RJ3HGZcfdU,21567
|
|
121
122
|
gaia/chat/sdk.py,sha256=joL82YWZRn350E9vD3cchHjmIUlSN-jWcWoUXbyk7Tg,44661
|
|
122
123
|
gaia/database/__init__.py,sha256=fLH8BhaDMMAluXQg5r82agX3kVKsH1DxvQKs5YdZ_kE,338
|
|
@@ -138,16 +139,19 @@ gaia/eval/webapp/test-setup.js,sha256=NfIwc-hcnrVbNHyUvtvZWP88na9gdNXxnlQKGArG3Y
|
|
|
138
139
|
gaia/eval/webapp/public/app.js,sha256=-qqTCqIXLJ2JKBMcXnNPM04XBD-ioX_4JzR50Gr3qu8,164547
|
|
139
140
|
gaia/eval/webapp/public/index.html,sha256=qfo97RArd77bSMAWQrNnUVp7_To8e6XCXV3iHqNmw1E,4738
|
|
140
141
|
gaia/eval/webapp/public/styles.css,sha256=toAtkMtfYB16ZApZXTQQ6i7IYC2S9CahUT6oj1a0B0Y,71381
|
|
141
|
-
gaia/
|
|
142
|
+
gaia/installer/__init__.py,sha256=NvQ-XNJsAnjwfyF2YwkerNcztTMDMxKXf_9NGoNYQdY,503
|
|
143
|
+
gaia/installer/init_command.py,sha256=vx9PMct5Uxs_6PKvsN4GbsqE_AmPStJHenk72ka43VE,47854
|
|
144
|
+
gaia/installer/lemonade_installer.py,sha256=DL8ziWnXubbj-5Tc7eBuEO_Sfa7t1Y7cLq0qUKqxXYg,21611
|
|
145
|
+
gaia/llm/__init__.py,sha256=fdu07-f682NvxLR-wgwaY5s0L-ZEphXD0sfUp-LAQn8,355
|
|
142
146
|
gaia/llm/base_client.py,sha256=g9JXXWslQLdwzeURnddmZzj7u27VMu2nILm5OSCA05Q,1701
|
|
143
147
|
gaia/llm/exceptions.py,sha256=aQ7sk_KtwW5MlJP6HFFnnKDhevNfsNIvYOTF8UUJnaQ,413
|
|
144
148
|
gaia/llm/factory.py,sha256=IkbCHCIbLADWuU1_HoooJTDhr0xu_mDQVzhxtc-S9tY,2508
|
|
145
|
-
gaia/llm/lemonade_client.py,sha256=
|
|
149
|
+
gaia/llm/lemonade_client.py,sha256=pv-736R1Qpodfa2XLLJQesV4I7WeEu69SYjrMke7P_w,126772
|
|
146
150
|
gaia/llm/lemonade_manager.py,sha256=R93qqmsuYqSf4gLG0R1BTTkZxu9WCLmKCHLvzu1K_yE,11017
|
|
147
151
|
gaia/llm/vlm_client.py,sha256=D4bV-XmO2-Lu34qFGqP5l0zN6p0x85to3aJRGQ4SA0A,13247
|
|
148
152
|
gaia/llm/providers/__init__.py,sha256=h2qbDWhOfE9G6YHgLMYzTw5bv1L63cSGuwEzML6iJU8,329
|
|
149
153
|
gaia/llm/providers/claude.py,sha256=r22rb8sZR-wt-LzNEDU49drftPOn5ZY1MrftO65_78M,3262
|
|
150
|
-
gaia/llm/providers/lemonade.py,sha256
|
|
154
|
+
gaia/llm/providers/lemonade.py,sha256=BbeSzNzqRnEiUn9P55TYUf9kuGN_NL1ib9XO9pPH5Sw,4004
|
|
151
155
|
gaia/llm/providers/openai_provider.py,sha256=eU1NRtSPCfW0wKiK2ePcWNczvwt1E4koD9aL_D6cwc0,2502
|
|
152
156
|
gaia/mcp/agent_mcp_server.py,sha256=YU_BgRRK0VPaJJgO1CgFodFuYrO6XoRCo3cfltpTlQY,10152
|
|
153
157
|
gaia/mcp/blender_mcp_client.py,sha256=M5aI5esMPFqVrxYE0m7_xPAI-y8eTMgorlcflfyMM44,4967
|
|
@@ -161,8 +165,8 @@ gaia/rag/__init__.py,sha256=aoe0OsqNFEIqRfyT4eC5k8x2LYUlgNWd_JONCT4pzuY,326
|
|
|
161
165
|
gaia/rag/app.py,sha256=c4uTS7pcAPV2G9zci6zYBjxbe2kWyEvKAEBToyw8j4Y,8579
|
|
162
166
|
gaia/rag/demo.py,sha256=OSrJYSY-1V8j0i6F286bLhFD9_FXHUsi5KerInu7H6U,10305
|
|
163
167
|
gaia/rag/pdf_utils.py,sha256=0gI30uv_nbryEaNdPYQHsFzSFnDx-UeuKfuFzByHwtw,7461
|
|
164
|
-
gaia/rag/sdk.py,sha256=
|
|
165
|
-
gaia/talk/app.py,sha256=
|
|
168
|
+
gaia/rag/sdk.py,sha256=SPiRoAsPCDdDhoR6kgLnAFSwxAKAO46HiMdUYEb91qk,85806
|
|
169
|
+
gaia/talk/app.py,sha256=N_qqjkP6jPw4U7OE0BENYs1OQwfwdeyAbP8RdXjLvjg,7910
|
|
166
170
|
gaia/talk/sdk.py,sha256=YgxkxpFUVz4ZcW1UfxIHYTDDOwQyBypqJe3q0J6gEG4,17324
|
|
167
171
|
gaia/testing/__init__.py,sha256=KZNDdFiCVeUD2CoEKuaKtBdHOFUA9rHvuw2oKD9dd20,1925
|
|
168
172
|
gaia/testing/assertions.py,sha256=RvNmIA1naG-lz9S_MSC38U4nfWzM3XweTYiezl9VynM,9845
|
|
@@ -171,8 +175,8 @@ gaia/testing/mocks.py,sha256=ojqkCYXBEAiMqiv6icfCVKOL6fw0RIc-Cv67uq08jNI,13895
|
|
|
171
175
|
gaia/utils/__init__.py,sha256=HnxwoKZvPoYWcSdf-iu5rYzwySkpuqSAwyFSFIHjBNI,733
|
|
172
176
|
gaia/utils/file_watcher.py,sha256=ZTlPvAmrSUtm42he29YCHfy3YByg03C4tFTPWM4ZsEc,22388
|
|
173
177
|
gaia/utils/parsing.py,sha256=PZ0aizm-pVox2pAqZA8Xc-k10c-bAXh71C5RkbyniyA,6695
|
|
174
|
-
amd_gaia-0.15.
|
|
175
|
-
amd_gaia-0.15.
|
|
176
|
-
amd_gaia-0.15.
|
|
177
|
-
amd_gaia-0.15.
|
|
178
|
-
amd_gaia-0.15.
|
|
178
|
+
amd_gaia-0.15.2.dist-info/METADATA,sha256=N7qMt4xbXkMCfIXQ25E6KTELtE8Rwk7SDpJnk7TffMA,8463
|
|
179
|
+
amd_gaia-0.15.2.dist-info/WHEEL,sha256=qELbo2s1Yzl39ZmrAibXA2jjPLUYfnVhUNTlyF1rq0Y,92
|
|
180
|
+
amd_gaia-0.15.2.dist-info/entry_points.txt,sha256=nXsKQ1xgHlGqfZgBksSaEOL0TA8zV7lXJaxVSlgsygE,223
|
|
181
|
+
amd_gaia-0.15.2.dist-info/top_level.txt,sha256=79yz2gLmqK4bFQkuN8_cnHVY-lobuVT0Ww4YoO6OFvU,5
|
|
182
|
+
amd_gaia-0.15.2.dist-info/RECORD,,
|
gaia/agents/base/agent.py
CHANGED
|
@@ -61,10 +61,6 @@ class Agent(abc.ABC):
|
|
|
61
61
|
STATE_ERROR_RECOVERY = "ERROR_RECOVERY"
|
|
62
62
|
STATE_COMPLETION = "COMPLETION"
|
|
63
63
|
|
|
64
|
-
# Define tools that can execute directly without requiring a plan
|
|
65
|
-
# Subclasses can override this to specify domain-specific simple tools
|
|
66
|
-
SIMPLE_TOOLS = []
|
|
67
|
-
|
|
68
64
|
def __init__(
|
|
69
65
|
self,
|
|
70
66
|
use_claude: bool = False,
|
|
@@ -280,7 +276,7 @@ You must respond ONLY in valid JSON. No text before { or after }.
|
|
|
280
276
|
self.console.print_header(f"🛠️ Registered Tools for {self.__class__.__name__}")
|
|
281
277
|
self.console.print_separator()
|
|
282
278
|
|
|
283
|
-
for name, tool_info in
|
|
279
|
+
for name, tool_info in self.get_tools_info().items():
|
|
284
280
|
# Format parameters
|
|
285
281
|
params = []
|
|
286
282
|
for param_name, param_info in tool_info["parameters"].items():
|
|
@@ -313,6 +309,14 @@ You must respond ONLY in valid JSON. No text before { or after }.
|
|
|
313
309
|
|
|
314
310
|
return None
|
|
315
311
|
|
|
312
|
+
def get_tools_info(self) -> Dict[str, Any]:
|
|
313
|
+
"""Get information about all registered tools."""
|
|
314
|
+
return _TOOL_REGISTRY
|
|
315
|
+
|
|
316
|
+
def get_tools(self) -> List[Dict[str, Any]]:
|
|
317
|
+
"""Get a list of registered tools for the agent."""
|
|
318
|
+
return list(_TOOL_REGISTRY.values())
|
|
319
|
+
|
|
316
320
|
def _extract_json_from_response(self, response: str) -> Optional[Dict[str, Any]]:
|
|
317
321
|
"""
|
|
318
322
|
Apply multiple extraction strategies to find valid JSON in the response.
|
|
@@ -1177,43 +1181,6 @@ You must respond ONLY in valid JSON. No text before { or after }.
|
|
|
1177
1181
|
steps_taken += 1
|
|
1178
1182
|
logger.debug(f"Step {steps_taken}/{steps_limit}")
|
|
1179
1183
|
|
|
1180
|
-
# Check if we're at the limit and ask user if they want to continue
|
|
1181
|
-
if steps_taken == steps_limit and final_answer is None:
|
|
1182
|
-
# Show what was accomplished
|
|
1183
|
-
max_steps_msg = self._generate_max_steps_message(
|
|
1184
|
-
conversation, steps_taken, steps_limit
|
|
1185
|
-
)
|
|
1186
|
-
self.console.print_warning(max_steps_msg)
|
|
1187
|
-
|
|
1188
|
-
# Ask user if they want to continue (skip in silent mode OR if stdin is not available)
|
|
1189
|
-
# IMPORTANT: Never call input() in API/CI contexts to avoid blocking threads
|
|
1190
|
-
import sys
|
|
1191
|
-
|
|
1192
|
-
has_stdin = sys.stdin and sys.stdin.isatty()
|
|
1193
|
-
if has_stdin and not (
|
|
1194
|
-
hasattr(self, "silent_mode") and self.silent_mode
|
|
1195
|
-
):
|
|
1196
|
-
try:
|
|
1197
|
-
response = (
|
|
1198
|
-
input("\nContinue with 50 more steps? (y/n): ")
|
|
1199
|
-
.strip()
|
|
1200
|
-
.lower()
|
|
1201
|
-
)
|
|
1202
|
-
if response in ["y", "yes"]:
|
|
1203
|
-
steps_limit += 50
|
|
1204
|
-
self.console.print_info(
|
|
1205
|
-
f"✓ Continuing with {steps_limit} total steps...\n"
|
|
1206
|
-
)
|
|
1207
|
-
else:
|
|
1208
|
-
self.console.print_info("Stopping at user request.")
|
|
1209
|
-
break
|
|
1210
|
-
except (EOFError, KeyboardInterrupt):
|
|
1211
|
-
self.console.print_info("\nStopping at user request.")
|
|
1212
|
-
break
|
|
1213
|
-
else:
|
|
1214
|
-
# Silent mode - just stop
|
|
1215
|
-
break
|
|
1216
|
-
|
|
1217
1184
|
# Display current step
|
|
1218
1185
|
self.console.print_step_header(steps_taken, steps_limit)
|
|
1219
1186
|
|
|
@@ -1668,9 +1635,6 @@ You must respond ONLY in valid JSON. No text before { or after }.
|
|
|
1668
1635
|
# Add assistant response to messages for chat history
|
|
1669
1636
|
messages.append({"role": "assistant", "content": response})
|
|
1670
1637
|
|
|
1671
|
-
# Validate the response has a plan if required
|
|
1672
|
-
self._validate_plan_required(parsed, steps_taken)
|
|
1673
|
-
|
|
1674
1638
|
# If the LLM needs to create a plan first, re-prompt it specifically for that
|
|
1675
1639
|
if "needs_plan" in parsed and parsed["needs_plan"]:
|
|
1676
1640
|
# Prepare a special prompt that specifically requests a plan
|
|
@@ -2015,8 +1979,42 @@ You must respond ONLY in valid JSON. No text before { or after }.
|
|
|
2015
1979
|
self.console.print_final_answer(final_answer, streaming=self.streaming)
|
|
2016
1980
|
break
|
|
2017
1981
|
|
|
2018
|
-
#
|
|
2019
|
-
|
|
1982
|
+
# Check if we're at the limit and ask user if they want to continue
|
|
1983
|
+
if steps_taken == steps_limit and final_answer is None:
|
|
1984
|
+
# Show what was accomplished
|
|
1985
|
+
max_steps_msg = self._generate_max_steps_message(
|
|
1986
|
+
conversation, steps_taken, steps_limit
|
|
1987
|
+
)
|
|
1988
|
+
self.console.print_warning(max_steps_msg)
|
|
1989
|
+
|
|
1990
|
+
# Ask user if they want to continue (skip in silent mode OR if stdin is not available)
|
|
1991
|
+
# IMPORTANT: Never call input() in API/CI contexts to avoid blocking threads
|
|
1992
|
+
import sys
|
|
1993
|
+
|
|
1994
|
+
has_stdin = sys.stdin and sys.stdin.isatty()
|
|
1995
|
+
if has_stdin and not (
|
|
1996
|
+
hasattr(self, "silent_mode") and self.silent_mode
|
|
1997
|
+
):
|
|
1998
|
+
try:
|
|
1999
|
+
response = (
|
|
2000
|
+
input("\nContinue with 50 more steps? (y/n): ")
|
|
2001
|
+
.strip()
|
|
2002
|
+
.lower()
|
|
2003
|
+
)
|
|
2004
|
+
if response in ["y", "yes"]:
|
|
2005
|
+
steps_limit += 50
|
|
2006
|
+
self.console.print_info(
|
|
2007
|
+
f"✓ Continuing with {steps_limit} total steps...\n"
|
|
2008
|
+
)
|
|
2009
|
+
else:
|
|
2010
|
+
self.console.print_info("Stopping at user request.")
|
|
2011
|
+
break
|
|
2012
|
+
except (EOFError, KeyboardInterrupt):
|
|
2013
|
+
self.console.print_info("\nStopping at user request.")
|
|
2014
|
+
break
|
|
2015
|
+
else:
|
|
2016
|
+
# Silent mode - just stop
|
|
2017
|
+
break
|
|
2020
2018
|
|
|
2021
2019
|
# Print completion message
|
|
2022
2020
|
self.console.print_completion(steps_taken, steps_limit)
|
|
@@ -2132,46 +2130,3 @@ You must respond ONLY in valid JSON. No text before { or after }.
|
|
|
2132
2130
|
List of error messages
|
|
2133
2131
|
"""
|
|
2134
2132
|
return self.error_history
|
|
2135
|
-
|
|
2136
|
-
def _validate_plan_required(self, parsed: Dict[str, Any], step: int) -> None:
|
|
2137
|
-
"""
|
|
2138
|
-
Validate that the response includes a plan when required by the agent.
|
|
2139
|
-
|
|
2140
|
-
Args:
|
|
2141
|
-
parsed: The parsed response from the LLM
|
|
2142
|
-
step: The current step number
|
|
2143
|
-
"""
|
|
2144
|
-
# Skip validation if we're not in planning mode or if we're already executing a plan
|
|
2145
|
-
if self.execution_state != self.STATE_PLANNING or self.current_plan is not None:
|
|
2146
|
-
return
|
|
2147
|
-
|
|
2148
|
-
# Allow simple single-tool operations without requiring a plan
|
|
2149
|
-
if "tool" in parsed and step == 1:
|
|
2150
|
-
tool_name = parsed.get("tool", "")
|
|
2151
|
-
# List of tools that can execute directly without a plan
|
|
2152
|
-
simple_tools = self.SIMPLE_TOOLS
|
|
2153
|
-
if tool_name in simple_tools:
|
|
2154
|
-
logger.debug(f"Allowing direct execution of simple tool: {tool_name}")
|
|
2155
|
-
return
|
|
2156
|
-
|
|
2157
|
-
# Check if plan is missing on the first step
|
|
2158
|
-
# BUT: Allow direct answers without plans (for simple conversational queries)
|
|
2159
|
-
if "plan" not in parsed and "answer" not in parsed and step == 1:
|
|
2160
|
-
warning_msg = f"No plan found in step {step} response. The agent should create a plan for all tasks."
|
|
2161
|
-
logger.warning(warning_msg)
|
|
2162
|
-
self.console.print_warning(warning_msg)
|
|
2163
|
-
|
|
2164
|
-
# For the first step, we'll add a flag to indicate we need to re-prompt for a plan
|
|
2165
|
-
parsed["needs_plan"] = True
|
|
2166
|
-
|
|
2167
|
-
# If there's a tool in the response, store it but don't execute it yet
|
|
2168
|
-
if "tool" in parsed:
|
|
2169
|
-
parsed["deferred_tool"] = parsed["tool"]
|
|
2170
|
-
parsed["deferred_tool_args"] = parsed.get("tool_args", {})
|
|
2171
|
-
# Remove the tool so it won't be executed
|
|
2172
|
-
del parsed["tool"]
|
|
2173
|
-
if "tool_args" in parsed:
|
|
2174
|
-
del parsed["tool_args"]
|
|
2175
|
-
|
|
2176
|
-
# Set state to indicate we need planning
|
|
2177
|
-
self.execution_state = self.STATE_PLANNING
|
gaia/agents/base/api_agent.py
CHANGED
gaia/agents/base/console.py
CHANGED
|
@@ -1233,6 +1233,132 @@ class AgentConsole(OutputHandler):
|
|
|
1233
1233
|
else:
|
|
1234
1234
|
print(f"✅ Model {status}: {model_name}")
|
|
1235
1235
|
|
|
1236
|
+
# === Download Progress Methods ===
|
|
1237
|
+
|
|
1238
|
+
def print_download_start(self, model_name: str) -> None:
|
|
1239
|
+
"""
|
|
1240
|
+
Print download starting notification.
|
|
1241
|
+
|
|
1242
|
+
Args:
|
|
1243
|
+
model_name: Name of the model being downloaded
|
|
1244
|
+
"""
|
|
1245
|
+
if self.rich_available and self.console:
|
|
1246
|
+
self.console.print()
|
|
1247
|
+
self.console.print(
|
|
1248
|
+
f"[bold blue]📥 Downloading:[/bold blue] [cyan]{model_name}[/cyan]"
|
|
1249
|
+
)
|
|
1250
|
+
else:
|
|
1251
|
+
rprint(f"\n📥 Downloading: {model_name}")
|
|
1252
|
+
|
|
1253
|
+
def print_download_progress(
|
|
1254
|
+
self,
|
|
1255
|
+
percent: int,
|
|
1256
|
+
bytes_downloaded: int,
|
|
1257
|
+
bytes_total: int,
|
|
1258
|
+
speed_mbps: float = 0.0,
|
|
1259
|
+
) -> None:
|
|
1260
|
+
"""
|
|
1261
|
+
Print download progress with a progress bar that updates in place.
|
|
1262
|
+
|
|
1263
|
+
Args:
|
|
1264
|
+
percent: Download percentage (0-100)
|
|
1265
|
+
bytes_downloaded: Bytes downloaded so far
|
|
1266
|
+
bytes_total: Total bytes to download
|
|
1267
|
+
speed_mbps: Download speed in MB/s (optional)
|
|
1268
|
+
"""
|
|
1269
|
+
import sys
|
|
1270
|
+
|
|
1271
|
+
# Format sizes
|
|
1272
|
+
if bytes_total > 1024**3: # > 1 GB
|
|
1273
|
+
dl_str = f"{bytes_downloaded / 1024**3:.2f} GB"
|
|
1274
|
+
total_str = f"{bytes_total / 1024**3:.2f} GB"
|
|
1275
|
+
elif bytes_total > 1024**2: # > 1 MB
|
|
1276
|
+
dl_str = f"{bytes_downloaded / 1024**2:.0f} MB"
|
|
1277
|
+
total_str = f"{bytes_total / 1024**2:.0f} MB"
|
|
1278
|
+
else:
|
|
1279
|
+
dl_str = f"{bytes_downloaded / 1024:.0f} KB"
|
|
1280
|
+
total_str = f"{bytes_total / 1024:.0f} KB"
|
|
1281
|
+
|
|
1282
|
+
# Progress bar characters
|
|
1283
|
+
bar_width = 25
|
|
1284
|
+
filled = int(bar_width * percent / 100)
|
|
1285
|
+
bar = "━" * filled + "─" * (bar_width - filled)
|
|
1286
|
+
|
|
1287
|
+
# Build progress line with optional speed
|
|
1288
|
+
progress_line = f" [{bar}] {percent:3d}% {dl_str} / {total_str}"
|
|
1289
|
+
if speed_mbps > 0.1:
|
|
1290
|
+
progress_line += f" @ {speed_mbps:.0f} MB/s"
|
|
1291
|
+
|
|
1292
|
+
# Update in place with carriage return
|
|
1293
|
+
sys.stdout.write(f"\r{progress_line:<80}")
|
|
1294
|
+
sys.stdout.flush()
|
|
1295
|
+
|
|
1296
|
+
def print_download_complete(self, model_name: str = None) -> None:
|
|
1297
|
+
"""
|
|
1298
|
+
Print download complete notification.
|
|
1299
|
+
|
|
1300
|
+
Args:
|
|
1301
|
+
model_name: Optional name of the downloaded model
|
|
1302
|
+
"""
|
|
1303
|
+
if self.rich_available and self.console:
|
|
1304
|
+
self.console.print() # Newline after progress bar
|
|
1305
|
+
if model_name:
|
|
1306
|
+
self.console.print(
|
|
1307
|
+
f" [green]✅ Downloaded successfully:[/green] [cyan]{model_name}[/cyan]"
|
|
1308
|
+
)
|
|
1309
|
+
else:
|
|
1310
|
+
self.console.print(" [green]✅ Download complete[/green]")
|
|
1311
|
+
else:
|
|
1312
|
+
rprint()
|
|
1313
|
+
msg = (
|
|
1314
|
+
f" ✅ Downloaded: {model_name}"
|
|
1315
|
+
if model_name
|
|
1316
|
+
else " ✅ Download complete"
|
|
1317
|
+
)
|
|
1318
|
+
rprint(msg)
|
|
1319
|
+
|
|
1320
|
+
def print_download_error(self, error_message: str, model_name: str = None) -> None:
|
|
1321
|
+
"""
|
|
1322
|
+
Print download error notification.
|
|
1323
|
+
|
|
1324
|
+
Args:
|
|
1325
|
+
error_message: Error description
|
|
1326
|
+
model_name: Optional name of the model that failed
|
|
1327
|
+
"""
|
|
1328
|
+
if self.rich_available and self.console:
|
|
1329
|
+
self.console.print() # Newline after progress bar
|
|
1330
|
+
if model_name:
|
|
1331
|
+
self.console.print(
|
|
1332
|
+
f" [red]❌ Download failed for {model_name}:[/red] {error_message}"
|
|
1333
|
+
)
|
|
1334
|
+
else:
|
|
1335
|
+
self.console.print(f" [red]❌ Download failed:[/red] {error_message}")
|
|
1336
|
+
else:
|
|
1337
|
+
rprint()
|
|
1338
|
+
msg = (
|
|
1339
|
+
f" ❌ Download failed for {model_name}: {error_message}"
|
|
1340
|
+
if model_name
|
|
1341
|
+
else f" ❌ Download failed: {error_message}"
|
|
1342
|
+
)
|
|
1343
|
+
rprint(msg)
|
|
1344
|
+
|
|
1345
|
+
def print_download_skipped(
|
|
1346
|
+
self, model_name: str, reason: str = "already downloaded"
|
|
1347
|
+
) -> None:
|
|
1348
|
+
"""
|
|
1349
|
+
Print download skipped notification.
|
|
1350
|
+
|
|
1351
|
+
Args:
|
|
1352
|
+
model_name: Name of the model that was skipped
|
|
1353
|
+
reason: Reason for skipping
|
|
1354
|
+
"""
|
|
1355
|
+
if self.rich_available and self.console:
|
|
1356
|
+
self.console.print(
|
|
1357
|
+
f"[green]✅[/green] [cyan]{model_name}[/cyan] [dim]({reason})[/dim]"
|
|
1358
|
+
)
|
|
1359
|
+
else:
|
|
1360
|
+
rprint(f"✅ {model_name} ({reason})")
|
|
1361
|
+
|
|
1236
1362
|
def print_extraction_start(
|
|
1237
1363
|
self, image_num: int, page_num: int, mime_type: str
|
|
1238
1364
|
) -> None:
|
gaia/agents/base/tools.py
CHANGED
|
@@ -17,7 +17,10 @@ _TOOL_REGISTRY = {}
|
|
|
17
17
|
|
|
18
18
|
|
|
19
19
|
def tool(
|
|
20
|
-
func: Callable = None,
|
|
20
|
+
func: Callable = None,
|
|
21
|
+
*,
|
|
22
|
+
atomic: bool = False,
|
|
23
|
+
**kwargs, # pylint: disable=unused-argument
|
|
21
24
|
) -> Callable:
|
|
22
25
|
"""
|
|
23
26
|
Decorator to register a function as a tool.
|
|
@@ -28,6 +31,7 @@ def tool(
|
|
|
28
31
|
|
|
29
32
|
Args:
|
|
30
33
|
func: Function to register as a tool (when used as @tool)
|
|
34
|
+
atomic: If True, marks this tool as atomic (can execute without multi-step planning)
|
|
31
35
|
**kwargs: Optional arguments (ignored, for backward compatibility)
|
|
32
36
|
|
|
33
37
|
Returns:
|
|
@@ -63,12 +67,13 @@ def tool(
|
|
|
63
67
|
|
|
64
68
|
params[name] = param_info
|
|
65
69
|
|
|
66
|
-
# Register the tool
|
|
70
|
+
# Register the tool with atomic metadata
|
|
67
71
|
_TOOL_REGISTRY[tool_name] = {
|
|
68
72
|
"name": tool_name,
|
|
69
73
|
"description": f.__doc__ or "",
|
|
70
74
|
"parameters": params,
|
|
71
75
|
"function": f,
|
|
76
|
+
"atomic": atomic,
|
|
72
77
|
}
|
|
73
78
|
|
|
74
79
|
# Return the function unchanged
|
gaia/agents/blender/agent.py
CHANGED
|
@@ -24,9 +24,6 @@ class BlenderAgent(Agent):
|
|
|
24
24
|
Inherits core functionality from the base Agent class.
|
|
25
25
|
"""
|
|
26
26
|
|
|
27
|
-
# Define Blender-specific tools that can execute directly without requiring a plan
|
|
28
|
-
SIMPLE_TOOLS = ["clear_scene", "get_scene_info"]
|
|
29
|
-
|
|
30
27
|
def __init__(
|
|
31
28
|
self,
|
|
32
29
|
mcp: Optional[MCPClient] = None,
|
|
@@ -80,7 +77,7 @@ class BlenderAgent(Agent):
|
|
|
80
77
|
def _get_system_prompt(self) -> str:
|
|
81
78
|
"""Generate the system prompt for the Blender agent."""
|
|
82
79
|
# Get formatted tools from registry
|
|
83
|
-
return
|
|
80
|
+
return """
|
|
84
81
|
You are a specialized Blender 3D assistant that can create and modify 3D scenes.
|
|
85
82
|
You will use a set of tools to accomplish tasks based on the user's request.
|
|
86
83
|
|
|
@@ -169,7 +166,7 @@ Examples of colored requests:
|
|
|
169
166
|
def _register_tools(self):
|
|
170
167
|
"""Register all Blender-related tools for the agent."""
|
|
171
168
|
|
|
172
|
-
@tool
|
|
169
|
+
@tool(atomic=True)
|
|
173
170
|
def clear_scene() -> Dict[str, Any]:
|
|
174
171
|
"""
|
|
175
172
|
Remove all objects from the current Blender scene.
|
|
@@ -283,7 +280,7 @@ Examples of colored requests:
|
|
|
283
280
|
return {"status": "error", "error": str(e)}
|
|
284
281
|
|
|
285
282
|
# @tool
|
|
286
|
-
def
|
|
283
|
+
def _get_object_info(name: str) -> Dict[str, Any]:
|
|
287
284
|
"""
|
|
288
285
|
Get information about an object in the scene.
|
|
289
286
|
|
|
@@ -354,7 +351,7 @@ Examples of colored requests:
|
|
|
354
351
|
return {"status": "error", "error": str(e)}
|
|
355
352
|
|
|
356
353
|
# @tool
|
|
357
|
-
def
|
|
354
|
+
def _delete_object(name: str) -> Dict[str, Any]:
|
|
358
355
|
"""
|
|
359
356
|
Delete an object from the scene.
|
|
360
357
|
|
|
@@ -382,7 +379,7 @@ Examples of colored requests:
|
|
|
382
379
|
self.error_history.append(str(e))
|
|
383
380
|
return {"status": "error", "error": str(e)}
|
|
384
381
|
|
|
385
|
-
@tool
|
|
382
|
+
@tool(atomic=True)
|
|
386
383
|
def get_scene_info() -> Dict[str, Any]:
|
|
387
384
|
"""
|
|
388
385
|
Get information about the current scene.
|
|
@@ -407,7 +404,7 @@ Examples of colored requests:
|
|
|
407
404
|
return {"status": "error", "error": str(e)}
|
|
408
405
|
|
|
409
406
|
# @tool
|
|
410
|
-
def
|
|
407
|
+
def _execute_blender_code(code: str) -> Dict[str, Any]:
|
|
411
408
|
"""
|
|
412
409
|
Execute arbitrary Python code in Blender with error handling.
|
|
413
410
|
|
|
@@ -436,7 +433,7 @@ Examples of colored requests:
|
|
|
436
433
|
return {"status": "error", "error": str(e)}
|
|
437
434
|
|
|
438
435
|
# @tool
|
|
439
|
-
def
|
|
436
|
+
def _diagnose_scene() -> Dict[str, Any]:
|
|
440
437
|
"""
|
|
441
438
|
Diagnose the current Blender scene for common issues.
|
|
442
439
|
Returns information about objects, materials, and potential problems.
|
gaia/agents/blender/core/view.py
CHANGED
|
@@ -13,13 +13,13 @@ class ViewManager:
|
|
|
13
13
|
self.mcp = mcp
|
|
14
14
|
|
|
15
15
|
def adjust_for_large_scale(
|
|
16
|
-
self, clip_end: float = 100000,
|
|
16
|
+
self, clip_end: float = 100000, _orbit_selection: bool = True
|
|
17
17
|
) -> Dict:
|
|
18
18
|
"""Adjust viewport settings to properly view large-scale objects like Earth.
|
|
19
19
|
|
|
20
20
|
Args:
|
|
21
21
|
clip_end: The maximum view distance to set for the 3D viewport (default: 100000)
|
|
22
|
-
|
|
22
|
+
_orbit_selection: Whether to enable orbit around selection (default: True, but may not work in all Blender versions)
|
|
23
23
|
"""
|
|
24
24
|
|
|
25
25
|
def generate_code():
|