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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: amd-gaia
3
- Version: 0.15.1
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
- [![GAIA Build Installer](https://github.com/amd/gaia/actions/workflows/build_installer.yml/badge.svg)](https://github.com/amd/gaia/tree/main/tests "Check out our build")
104
103
  [![GAIA CLI Tests](https://github.com/amd/gaia/actions/workflows/test_gaia_cli.yml/badge.svg)](https://github.com/amd/gaia/tree/main/tests "Check out our cli tests")
105
104
  [![Latest Release](https://img.shields.io/github/v/release/amd/gaia?include_prereleases)](https://github.com/amd/gaia/releases/latest "Download the latest release")
106
105
  [![PyPI](https://img.shields.io/pypi/v/amd-gaia)](https://pypi.org/project/amd-gaia/)
@@ -1,20 +1,21 @@
1
- amd_gaia-0.15.1.dist-info/licenses/LICENSE.md,sha256=yIF_ozJFJ83xmRHBrFVeGoc12JVoCphi1cy07CsfroQ,1083
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=vZqXsf2PoQEiKoHVLlVnjQEO4iU3nS-nJCkTQnHAzZ4,213698
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=V3gLT_emdE4PeI4fUpFFkaRjkAiExYt5VQ-x_dgAdR0,5826
6
+ gaia/security.py,sha256=O2XKjAEGkjleWN-MKQPXgk6C4k_n-K4X2OYAdm6YtDA,6816
7
7
  gaia/util.py,sha256=QYOjlm4dEJePwptjMJOkVGYXbw7wAee4o4P1KOUKicY,1569
8
- gaia/version.py,sha256=4mV1qXwtJKSJfXl-1t1rOdtIxw0aN5cRyHfp5fC7P0M,2840
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=dBK-tl0hBEaeVPxOWMZu6_ZoYOruVmClS4qYPm-KdA8,96464
12
- gaia/agents/base/api_agent.py,sha256=oZOv9C968PiJrpQr-ssbAa8Gox8Rv21QQ0iW98x4ghc,3907
13
- gaia/agents/base/console.py,sha256=D0zC7T6FxXigA-SRHBCHTYt3y7gBHyghq-4dpExYQn0,65468
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=pj9mus4a2TKR9b2rlKZttCPZ0TnwItuA-DXHtD-nn6Q,2614
17
- gaia/agents/blender/agent.py,sha256=58JNWre9GrG9YsCSY3GORg7FA7dBnwvOa4fCiRnhIxE,20714
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=lWEjYMvJ7LabODLZSvroYNPLNoWylne5tp2BSd8LRss,4978
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=IADyZ1dQpl5QEbq0cIa7Nf64_3IdkGFYK3w3dD4kMMU,33449
29
- gaia/agents/chat/app.py,sha256=qE4IFV754nb6Lo_H9huJ14ZzSCRtaAkrWKthySf2hnw,47159
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=ozCUlLVZRYsXb4uwNQifL16nSOhxijq46yEqF9I9yAU,78779
34
- gaia/agents/chat/tools/shell_tools.py,sha256=mm4HYUy89cfVc3-7k6l1R8xdieOFdznuQyT6R23LCb8,18229
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=MTza2RZDFs_5zoEXb8mz8sCwR_y7HqqVbIOm84XPlQY,67530
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=XCXUdZnGHxaX7MC1NagAFwPxlbqZCWMMbeG5T6PZLRY,24992
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=Gi7FAWaGQDxy252qVrmmcED3SDGWgIXRZWgPDnRadnw,58383
88
- gaia/agents/emr/cli.py,sha256=5PohlvjTKxAUPWZpzr4RZd8kXsSWwB6Eg-Vl-SBZGvU,45464
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=uY3GfuDy9OH44GJ7cIKUKf2asyytymCwcac4s7ykl6Q,77005
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=7EBFN6GVHVGSnZbOOP-MA_q8H0myzjDtvUNh6Rlikas,4984
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=YKfJsf0bp3YqRIu8l8aTZdEuxdKgvtvMbOrOgOYZjF8,12330
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/llm/__init__.py,sha256=K-2-6ajS82JArumYvH085fDl-AujwfZ7waCTL4iqv3U,308
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=1cuIbBQu5UIgEjvhRUYnpIIP9GDmiasddcThZcBNBKI,119083
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=-GjDjZZKcWkeoNKea6AUMk1c4Hy2kDzcms_ub5BaNJg,4192
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=4kFHE-zlNLSj8hdapoYuES1Ew05hkVRKEBF52I194tU,85817
165
- gaia/talk/app.py,sha256=zf7Az7LoNpImYK9vdgf7gaAFXPIQcnheH8jqChzEZlc,7924
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.1.dist-info/METADATA,sha256=42H7lodyn4kAppu7u20k27kxGDJbhBHnEdwLQR-z3rE,8633
175
- amd_gaia-0.15.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
176
- amd_gaia-0.15.1.dist-info/entry_points.txt,sha256=nXsKQ1xgHlGqfZgBksSaEOL0TA8zV7lXJaxVSlgsygE,223
177
- amd_gaia-0.15.1.dist-info/top_level.txt,sha256=79yz2gLmqK4bFQkuN8_cnHVY-lobuVT0Ww4YoO6OFvU,5
178
- amd_gaia-0.15.1.dist-info/RECORD,,
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,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.9.0)
2
+ Generator: setuptools (80.10.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
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 _TOOL_REGISTRY.items():
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
- # Validate plan required
2019
- self._validate_plan_required(parsed, steps_taken)
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
@@ -13,7 +13,6 @@ Inheritance patterns:
13
13
  - Future: FooAgent(MCPAgent, ApiAgent, Agent) - Multiple inheritance
14
14
  """
15
15
 
16
-
17
16
  from typing import Any, Dict
18
17
 
19
18
  from .agent import Agent
@@ -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, **kwargs # pylint: disable=unused-argument
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
@@ -0,0 +1,7 @@
1
+ # Copyright(C) 2025-2026 Advanced Micro Devices, Inc. All rights reserved.
2
+ # SPDX-License-Identifier: MIT
3
+ """Blender Agent for 3D scene automation."""
4
+
5
+ from gaia.agents.blender.agent import BlenderAgent
6
+
7
+ __all__ = ["BlenderAgent"]
@@ -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 f"""
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 get_object_info(name: str) -> Dict[str, Any]:
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 delete_object(name: str) -> Dict[str, Any]:
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 execute_blender_code(code: str) -> Dict[str, Any]:
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 diagnose_scene() -> Dict[str, Any]:
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.
@@ -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, orbit_selection: bool = True
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
- orbit_selection: Whether to enable orbit around selection (default: True, but may not work in all Blender versions)
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():