pygeai 0.3.2__py3-none-any.whl → 0.4.0__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.
Files changed (45) hide show
  1. pygeai/__init__.py +1 -1
  2. pygeai/chat/ui.py +0 -1
  3. pygeai/cli/__init__.py +1 -1
  4. pygeai/cli/commands/chat.py +54 -56
  5. pygeai/cli/commands/lab/ai_lab.py +129 -466
  6. pygeai/cli/commands/lab/options.py +8 -0
  7. pygeai/cli/commands/lab/utils.py +13 -0
  8. pygeai/cli/geai.py +5 -2
  9. pygeai/cli/texts/help.py +12 -0
  10. pygeai/core/common/config.py +0 -2
  11. pygeai/core/common/exceptions.py +6 -0
  12. pygeai/lab/agents/clients.py +30 -61
  13. pygeai/lab/clients.py +20 -0
  14. pygeai/lab/managers.py +6 -58
  15. pygeai/lab/processes/clients.py +81 -129
  16. pygeai/lab/strategies/clients.py +11 -17
  17. pygeai/lab/tools/clients.py +59 -59
  18. pygeai/tests/integration/assistants/__init__.py +0 -0
  19. pygeai/tests/integration/assistants/rag/__init__.py +0 -0
  20. pygeai/tests/integration/assistants/rag/test_create_rag.py +72 -0
  21. pygeai/tests/integration/chat/__init__.py +0 -0
  22. pygeai/tests/integration/chat/test_generate_image.py +162 -0
  23. pygeai/tests/integration/lab/agents/test_create_agent.py +9 -13
  24. pygeai/tests/integration/lab/agents/test_publish_agent_revision.py +0 -1
  25. pygeai/tests/integration/lab/agents/test_update_agent.py +6 -15
  26. pygeai/tests/integration/lab/tools/__init__.py +0 -0
  27. pygeai/tests/integration/lab/tools/test_create_tool.py +292 -0
  28. pygeai/tests/integration/lab/tools/test_delete_tool.py +87 -0
  29. pygeai/tests/integration/lab/tools/test_get_parameter.py +98 -0
  30. pygeai/tests/integration/lab/tools/test_get_tool.py +91 -0
  31. pygeai/tests/integration/lab/tools/test_list_tools.py +106 -0
  32. pygeai/tests/integration/lab/tools/test_publish_tool_revision.py +119 -0
  33. pygeai/tests/integration/lab/tools/test_set_parameter.py +114 -0
  34. pygeai/tests/integration/lab/tools/test_update_tool.py +268 -0
  35. pygeai/tests/snippets/lab/agents/create_agent_edge_case.py +48 -0
  36. pygeai/tests/snippets/lab/agents/create_agent_without_instructions.py +48 -0
  37. pygeai/tests/snippets/lab/agents/get_sharing_link.py +1 -2
  38. pygeai/tests/snippets/lab/tools/create_tool.py +1 -1
  39. pygeai/tests/snippets/lab/tools/create_tool_edge_case.py +50 -0
  40. {pygeai-0.3.2.dist-info → pygeai-0.4.0.dist-info}/METADATA +1 -1
  41. {pygeai-0.3.2.dist-info → pygeai-0.4.0.dist-info}/RECORD +45 -25
  42. {pygeai-0.3.2.dist-info → pygeai-0.4.0.dist-info}/WHEEL +0 -0
  43. {pygeai-0.3.2.dist-info → pygeai-0.4.0.dist-info}/entry_points.txt +0 -0
  44. {pygeai-0.3.2.dist-info → pygeai-0.4.0.dist-info}/licenses/LICENSE +0 -0
  45. {pygeai-0.3.2.dist-info → pygeai-0.4.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,268 @@
1
+ from unittest import TestCase
2
+ import uuid
3
+ from pygeai.core.common.exceptions import APIError
4
+ from pygeai.lab.managers import AILabManager
5
+ from pygeai.lab.models import Tool, ToolParameter
6
+
7
+
8
+ class TestAILabUpdateToolIntegration(TestCase):
9
+ def setUp(self):
10
+ """
11
+ Set up the test environment.
12
+ """
13
+ self.ai_lab_manager = AILabManager(alias="beta")
14
+ self.tool_to_update = self.__load_tool()
15
+
16
+
17
+ def __load_tool(self):
18
+ self.random_str = str(uuid.uuid4())
19
+ return Tool(
20
+ id="c77e1f2e-0322-4dd0-b6ec-aff217f1cb32",
21
+ name=f"sdk_project_updated_tool_{self.random_str}",
22
+ description=f"Tool updated for sdk testing purposes {self.random_str}",
23
+ scope="builtin",
24
+ openApi="https://raw.usercontent.com//openapi.json",
25
+ openApiJson={"openapi": "3.0.0","info": {"title": f"Simple API overview {self.random_str}","version": "3.0.0"}},
26
+ accessScope="private",
27
+ reportEvents="None",
28
+ parameters=[{
29
+ "key": "param",
30
+ "description": f"param description {self.random_str}",
31
+ "type":"app",
32
+ "value": f"value {self.random_str}",
33
+ "data_type": "String",
34
+ "isRequired": False
35
+ }]
36
+ )
37
+
38
+
39
+ def __update_tool(self, tool: Tool = None, automatic_publish: bool = False, upsert: bool = False):
40
+ """
41
+ Helper method to update a tool.
42
+ """
43
+ return self.ai_lab_manager.update_tool(
44
+ tool = self.tool_to_update if tool is None else tool,
45
+ automatic_publish=automatic_publish,
46
+ upsert=upsert
47
+ )
48
+
49
+
50
+ def test_update_tool_all_fields_success(self):
51
+ updated_tool = self.__update_tool()
52
+ self.assertEqual(updated_tool.name, self.tool_to_update.name)
53
+ self.assertEqual(updated_tool.description, self.tool_to_update.description)
54
+ self.assertEqual(updated_tool.open_api_json, self.tool_to_update.open_api_json)
55
+ self.assertEqual(updated_tool.parameters[0].description, self.tool_to_update.parameters[0].description)
56
+ self.assertEqual(updated_tool.parameters[0].value, self.tool_to_update.parameters[0].value)
57
+ self.assertTrue(updated_tool.is_draft, "Expected tool to be in draft state after update")
58
+
59
+
60
+ def test_update_tool_invalid_name(self):
61
+ test_params = [ True, False ]
62
+
63
+ for auto_publish in test_params:
64
+ with self.subTest(input=auto_publish):
65
+ tool = self.__load_tool()
66
+ tool2 = self.__load_tool()
67
+
68
+ with self.assertRaises(APIError) as exception:
69
+ tool.name = f"{tool.name}:invalid"
70
+ self.__update_tool(tool=tool, automatic_publish=auto_publish)
71
+ self.assertIn(
72
+ "Invalid character in name (: is not allowed).",
73
+ str(exception.exception),
74
+ f"Expected an error about invalid character (:) in tool name with autopublish {'enabled' if auto_publish else 'disabled'}"
75
+ )
76
+
77
+ with self.assertRaises(APIError) as exception:
78
+ tool2.name = f"{tool2.name}/invalid"
79
+ self.__update_tool(tool=tool2, automatic_publish=auto_publish)
80
+ self.assertIn(
81
+ "Invalid character in name (/ is not allowed).",
82
+ str(exception.exception),
83
+ f"Expected an error about invalid character (/) in tool name with autopublish {'enabled' if auto_publish else 'disabled'}"
84
+ )
85
+
86
+
87
+ def test_update_tool_duplicated_name(self):
88
+ test_params = [ True, False ]
89
+
90
+ for auto_publish in test_params:
91
+
92
+ with self.subTest(input=auto_publish):
93
+ self.tool_to_update.name = "sdk_project_gemini_tool"
94
+ with self.assertRaises(APIError) as exception:
95
+ self.__update_tool(automatic_publish=auto_publish)
96
+ self.assertIn(
97
+ "Tool already exists",
98
+ str(exception.exception),
99
+ f"Expected an error about duplicated tool name with autopublish {'enabled' if auto_publish else 'disabled'}"
100
+ )
101
+
102
+
103
+ def test_update_tool_no_name(self):
104
+ test_params = [ True, False ]
105
+
106
+ for auto_publish in test_params:
107
+
108
+ with self.subTest(input=auto_publish):
109
+ self.tool_to_update.name = ""
110
+ with self.assertRaises(APIError) as exception:
111
+ self.__update_tool(automatic_publish=auto_publish)
112
+ self.assertIn(
113
+ "Tool name cannot be empty",
114
+ str(exception.exception),
115
+ f"Expected an error when tool name is not provided with autopublish {'enabled' if auto_publish else 'disabled'}"
116
+ )
117
+
118
+
119
+ def test_update_tool_invalid_id(self):
120
+ test_params = [ True, False ]
121
+
122
+ for auto_publish in test_params:
123
+ with self.subTest(input=auto_publish):
124
+ invalid_id = "0026e53d-ea78-4cac-af9f-12650invalid"
125
+ self.tool_to_update.id = invalid_id
126
+ with self.assertRaises(APIError) as exception:
127
+ self.__update_tool(automatic_publish=auto_publish)
128
+ self.assertIn(
129
+ f"Tool not found [IdOrName= {invalid_id}",
130
+ str(exception.exception),
131
+ f"Expected an error when tool id is invalid and autopublish is {'enabled' if auto_publish else 'disabled'}"
132
+ )
133
+
134
+
135
+ def test_update_tool_scope(self):
136
+ for scope in ["builtin", "external", "api"]:
137
+ tool = self.__load_tool()
138
+ tool.scope = scope
139
+ result = self.__update_tool(tool=tool)
140
+ self.assertEqual(result.scope, scope)
141
+
142
+
143
+ def test_update_tool_invalid_scope(self):
144
+ test_params = [ True, False ]
145
+ self.tool_to_update.scope = "project"
146
+ for auto_publish in test_params:
147
+ with self.subTest(input=auto_publish):
148
+ with self.assertRaises(ValueError) as exception:
149
+ self.__update_tool(automatic_publish=auto_publish)
150
+ self.assertIn(
151
+ f"Scope must be one of builtin, external, api, proxied",
152
+ str(exception.exception),
153
+ f"Expected an error when tool scope is invalid and autopublish {'enabled' if auto_publish else 'disabled'}"
154
+ )
155
+
156
+
157
+ def test_update_tool_access_scope(self):
158
+ for access_scope in ["public", "private"]:
159
+ tool = self.__load_tool()
160
+ tool.access_scope = access_scope
161
+
162
+ if access_scope == "public":
163
+ tool.public_name = f"com.sdk.testing.{self.random_str}"
164
+
165
+ updated_tool = self.__update_tool(tool=tool)
166
+ self.assertEqual(updated_tool.access_scope, access_scope)
167
+
168
+
169
+ def test_update_tool_invalid_public_name(self):
170
+ test_params = [ True, False ]
171
+ self.tool_to_update.access_scope = "public"
172
+ self.tool_to_update.public_name = "invalid#name"
173
+ for auto_publish in test_params:
174
+ with self.subTest(input=auto_publish):
175
+ with self.assertRaises(APIError) as exception:
176
+ self.__update_tool(automatic_publish=auto_publish)
177
+ self.assertIn(
178
+ "Invalid public name, it can only contain lowercase letters, numbers, periods (.), dashes (-), and underscores (_). Please remove any other characters.",
179
+ str(exception.exception),
180
+ f"Expected error when invalid public name is sent and autopublish is {'enabled' if auto_publish else 'disabled'}"
181
+ )
182
+
183
+ def test_update_tool_duplicate_public_name(self):
184
+ test_params = [ True, False ]
185
+ self.tool_to_update.access_scope = "public"
186
+ self.tool_to_update.public_name = "test.sdk.beta.tool"
187
+ for auto_publish in test_params:
188
+ with self.subTest(input=auto_publish):
189
+ with self.assertRaises(Exception) as exc:
190
+ self.__update_tool(automatic_publish=auto_publish)
191
+ self.assertIn(
192
+ "Tool already exists",
193
+ str(exc.exception),
194
+ f"Expected error when public name is duplicated and autopublish is {'enabled' if auto_publish else 'disabled'}"
195
+ )
196
+
197
+
198
+ def test_update_tool_no_public_name(self):
199
+ test_params = [ True, False ]
200
+ self.tool_to_update.access_scope = "public"
201
+ self.tool_to_update.public_name = ""
202
+
203
+ for auto_publish in test_params:
204
+ with self.subTest(input=auto_publish):
205
+ with self.assertRaises(Exception) as exc:
206
+ self.__update_tool(automatic_publish=auto_publish)
207
+ self.assertIn(
208
+ "Tool publicName is required for tools with accessScope=public.",
209
+ str(exc.exception),
210
+ f"Expected error when public name is not provided and autopublish is {'enabled' if auto_publish else 'disabled'}"
211
+ )
212
+
213
+
214
+ def test_update_tool_no_open_api_nor_json(self):
215
+ test_params = [ True, False ]
216
+ self.tool_to_update.scope = "api"
217
+ self.tool_to_update.open_api = ""
218
+ self.tool_to_update.open_api_json = None
219
+
220
+ for auto_publish in test_params:
221
+ with self.subTest(input=auto_publish):
222
+ with self.assertRaises(APIError) as exc:
223
+ self.__update_tool(automatic_publish=auto_publish)
224
+ self.assertIn(
225
+ "Either openApi (URL with the OpenAPI definition) or the openApiJson (with the conent) are required for api-tools.",
226
+ str(exc.exception),
227
+ f"Expected error when no openApi or openApiJson are provided and autopublish is {'enabled' if auto_publish else 'disabled'}"
228
+ )
229
+
230
+
231
+ def test_update_tool_parameters(self):
232
+ self.tool_to_update.parameters = [
233
+ ToolParameter(key="paramA", data_type="String", description="descA", is_required=True),
234
+ ToolParameter(key="paramB", data_type="String", description="descB", is_required=False)
235
+ ]
236
+ result = self.__update_tool()
237
+ self.assertEqual(len(result.parameters), 2)
238
+ self.assertEqual(result.parameters[0].key, "paramA")
239
+ self.assertEqual(result.parameters[1].key, "paramB")
240
+
241
+
242
+ def test_update_tool_automatic_publish(self):
243
+ result = self.__update_tool(automatic_publish=True)
244
+ self.assertFalse(result.is_draft, "Expected tool to be published after update with automatic_publish=True")
245
+
246
+
247
+ def test_update_tool_upsert(self):
248
+ print(self.tool_to_update)
249
+ self.tool_to_update.id = str(uuid.uuid4())
250
+ self.tool_to_update.name = str(uuid.uuid4())
251
+ result = self.__update_tool(upsert=True)
252
+
253
+ if isinstance(result, Tool):
254
+ self.ai_lab_manager.delete_tool(result.id)
255
+
256
+ self.assertEqual(result.name, self.tool_to_update.name)
257
+
258
+
259
+ def test_update_tool_upsert_false_not_exists(self):
260
+ new_id = str(uuid.uuid4())
261
+ self.tool_to_update.id = new_id
262
+ with self.assertRaises(Exception) as exc:
263
+ self.__update_tool(upsert=False)
264
+ self.assertIn(f"Tool not found [IdOrName= {new_id}]", str(exc.exception))
265
+
266
+
267
+
268
+
@@ -0,0 +1,48 @@
1
+ from pygeai.lab.managers import AILabManager
2
+ from pygeai.lab.models import Agent, AgentData, Prompt, LlmConfig, Model, Sampling, PromptExample, PromptOutput
3
+
4
+ agent = Agent(
5
+ id="f64ba214-152b-4dd4-be0d-2920da415f5d",
6
+ status="active",
7
+ name="Private Translator V25",
8
+ access_scope="private",
9
+ public_name="com.genexus.geai.private_translator#",
10
+ job_description="Translates",
11
+ avatar_image="https://www.shareicon.net/data/128x128/2016/11/09/851442_logo_512x512.png",
12
+ description="Agent that translates from any language to english.",
13
+ is_draft=False,
14
+ is_readonly=False,
15
+ revision=1,
16
+ version=None,
17
+ agent_data=AgentData(
18
+ prompt=Prompt(
19
+ instructions="the user will provide a text, you must return the same text translated to english",
20
+ inputs=["text", "avoid slang indicator"],
21
+ outputs=[
22
+ PromptOutput(key="translated_text", description="translated text, with slang or not depending on the indication. in plain text."),
23
+ PromptOutput(key="summary", description="a summary in the original language of the text to be translated, also in plain text.")
24
+ ],
25
+ examples=[
26
+ PromptExample(input_data="opitiiiis mundo [no-slang]", output='{"translated_text":"hello world","summary":"saludo"}'),
27
+ PromptExample(input_data="esto es una prueba pincheguey [keep-slang]", output='{"translated_text":"this is a test pal","summary":"prueba"}')
28
+ ]
29
+ ),
30
+ llm_config=LlmConfig(
31
+ max_tokens=5000,
32
+ timeout=0,
33
+ sampling=Sampling(temperature=0.5, top_k=0, top_p=0)
34
+ ),
35
+ models=[Model(name="gpt-4-turbo-preview")]
36
+ )
37
+ )
38
+
39
+
40
+ manager = AILabManager()
41
+ result = manager.create_agent(
42
+ agent=agent,
43
+ automatic_publish=False
44
+ )
45
+
46
+
47
+ print(f"Agent: {agent.to_dict()}")
48
+
@@ -0,0 +1,48 @@
1
+ from pygeai.lab.managers import AILabManager
2
+ from pygeai.lab.models import Agent, AgentData, Prompt, LlmConfig, Model, Sampling, PromptExample, PromptOutput
3
+
4
+ agent = Agent(
5
+ id="f64ba214-152b-4dd4-be0d-2920da415f5d",
6
+ status="active",
7
+ name="Private Translator V25",
8
+ access_scope="private",
9
+ public_name="com.genexus.geai.private_translator_25",
10
+ job_description="Translates",
11
+ avatar_image="https://www.shareicon.net/data/128x128/2016/11/09/851442_logo_512x512.png",
12
+ description="Agent that translates from any language to english.",
13
+ is_draft=False,
14
+ is_readonly=False,
15
+ revision=1,
16
+ version=None,
17
+ agent_data=AgentData(
18
+ prompt=Prompt(
19
+ instructions="the user will provide a text, you must return the same text translated to english",
20
+ inputs=["text", "avoid slang indicator"],
21
+ outputs=[
22
+ PromptOutput(key="translated_text", description="translated text, with slang or not depending on the indication. in plain text."),
23
+ PromptOutput(key="summary", description="a summary in the original language of the text to be translated, also in plain text.")
24
+ ],
25
+ examples=[
26
+ PromptExample(input_data="opitiiiis mundo [no-slang]", output='{"translated_text":"hello world","summary":"saludo"}'),
27
+ PromptExample(input_data="esto es una prueba pincheguey [keep-slang]", output='{"translated_text":"this is a test pal","summary":"prueba"}')
28
+ ]
29
+ ),
30
+ llm_config=LlmConfig(
31
+ max_tokens=5000,
32
+ timeout=0,
33
+ sampling=Sampling(temperature=0.5, top_k=0, top_p=0)
34
+ ),
35
+ models=[Model(name="gpt-4-turbo-preview")]
36
+ )
37
+ )
38
+
39
+
40
+ manager = AILabManager()
41
+ result = manager.create_agent(
42
+ agent=agent,
43
+ automatic_publish=False
44
+ )
45
+
46
+
47
+ print(f"Agent: {agent.to_dict()}")
48
+
@@ -10,5 +10,4 @@ result = manager.create_sharing_link(
10
10
 
11
11
 
12
12
  print(f"Sharing link created for agent ID: {result.agent_id}")
13
- print(f"API Token: {result.api_token}")
14
- print(f"Shared Link: {result.shared_link}")
13
+ print(f"Shared Link: {result.shared_link}")
@@ -28,7 +28,7 @@ parameters = [
28
28
  ]
29
29
 
30
30
  tool = Tool(
31
- name="sample_tool_v5",
31
+ name="sample_tool_v7",
32
32
  description="a builtin tool that does something but really does nothing cos it does not exist.",
33
33
  scope="builtin",
34
34
  parameters=parameters
@@ -0,0 +1,50 @@
1
+ from pygeai.lab.managers import AILabManager
2
+ from pygeai.lab.models import Tool, ToolParameter
3
+
4
+ parameters = [
5
+ ToolParameter(
6
+ key="input",
7
+ data_type="String",
8
+ description="some input that the tool needs.",
9
+ is_required=True
10
+ ),
11
+ ToolParameter(
12
+ key="some_nonsensitive_id",
13
+ data_type="String",
14
+ description="Configuration that is static, in the sense that whenever the tool is used, the value for this parameter is configured here. The llm will not know about it.",
15
+ is_required=True,
16
+ type="config",
17
+ from_secret=False,
18
+ value="b001e30b4016001f5f76b9ae9215ac40"
19
+ ),
20
+ ToolParameter(
21
+ key="api_token",
22
+ data_type="String",
23
+ description="Configuration that is static, but it is sensitive information . The value is stored in secret-manager",
24
+ is_required=True,
25
+ type="config",
26
+ value="0cd84dc7-f3f5-4a03-9288-cdfd8d72fde1"
27
+ )
28
+ ]
29
+
30
+ tool = Tool(
31
+ name="sample_tool_v5",
32
+ access_scope="private",
33
+ public_name="sample.tool.test#",
34
+ description="a builtin tool that does something but really does nothing cos it does not exist.",
35
+ scope="builtin",
36
+ parameters=parameters
37
+ )
38
+
39
+
40
+ manager = AILabManager()
41
+
42
+
43
+ result = manager.create_tool(
44
+ tool=tool,
45
+ automatic_publish=False
46
+ )
47
+
48
+ print(f"Created tool: {result.name}, ID: {result.id}")
49
+ print(f"Description: {result.description}")
50
+ print(f"Messages: {result.messages}")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pygeai
3
- Version: 0.3.2
3
+ Version: 0.4.0
4
4
  Summary: Software Development Kit to interact with Globant Enterprise AI.
5
5
  Author-email: Globant <geai-sdk@globant.com>
6
6
  License-Expression: MIT
@@ -1,4 +1,4 @@
1
- pygeai/__init__.py,sha256=ZhSarc8h0U0CMhQDbY9Uw3JbqrPXfXdtXYRERhLPUzY,502
1
+ pygeai/__init__.py,sha256=robCZ_NkO88faXr08sW9mAJ-eBXAcAUU24mINsALRVs,502
2
2
  pygeai/admin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
3
  pygeai/admin/clients.py,sha256=2wuXSmTyg-gCbempDFCeI1yCKeOlKDBZsrFyFWxcwBg,6698
4
4
  pygeai/admin/endpoints.py,sha256=Osi8UIBhrEzKlTLF2a-q2boDUl0XMR3lQ8sDrz72TL0,747
@@ -25,10 +25,10 @@ pygeai/chat/iris.py,sha256=-9pDHQpWhR_PvbZ6rD8eMPFk46PI9sCdPQ9aAyvSexs,413
25
25
  pygeai/chat/managers.py,sha256=f0BGfu9EF0G8rUyARslZi0pyDTL2yQadav0taCljI_I,3114
26
26
  pygeai/chat/session.py,sha256=k7Y6rr9x7CfAGDI-Vt3c6eGLQX57YZ74lEVJGzwwdzw,1193
27
27
  pygeai/chat/settings.py,sha256=-B2fEemZLifdsf7_7xNmWuFZYzL-yRqefivBmv3w8j8,124
28
- pygeai/chat/ui.py,sha256=_t4ehG-n2-nxlc4esL09ORjmjTHhLWybUiEwGstIo-g,34620
29
- pygeai/cli/__init__.py,sha256=7prYyn8lejShxA0xLR3cm0k34Wfo7WHsSJGwBU-bEB0,117
28
+ pygeai/chat/ui.py,sha256=-xvjCzBwWlvyq-C0kN2YPczl4Q0alyJamXULOlGjKRA,34595
29
+ pygeai/cli/__init__.py,sha256=9fVRZ6_hmlv9adqGukFuS_s5Yb3jSyF8vv50-d4mbQo,117
30
30
  pygeai/cli/__main__.py,sha256=2RkQaX48mS2keTpv3-9rxk5dw35PL_deqxcKUUNhp6E,154
31
- pygeai/cli/geai.py,sha256=W-zhw4NSJxQ5KDOjksLREjySKWs962IGV6y3YW1tDFY,4247
31
+ pygeai/cli/geai.py,sha256=Smqxqc3XIy8RMuFVIsS9qNuYtqkNWba_CJJrhe7kW0E,4451
32
32
  pygeai/cli/geai_proxy.py,sha256=BSoeh32fhATxbsAA_B92HKDBiLgfejEQ0XwXfeOk49g,13356
33
33
  pygeai/cli/install_man.py,sha256=DjZ3k05sKSzpLFqsU4LHz1b37NHLVdOvS6oZihdBSis,3794
34
34
  pygeai/cli/parsers.py,sha256=8kKvUbg33K4VbE7ryHwq3Uwwp42BK6ZOAKycYjEj1Io,2525
@@ -37,7 +37,7 @@ pygeai/cli/commands/admin.py,sha256=LDxUrq9qGAswT4HbaN_c_ovVKbgGct7ffjXA8zVYjWY,
37
37
  pygeai/cli/commands/assistant.py,sha256=fQ_El6_BmFDpFjm_gPxzWk7bOzhimhiTwG8K0UpcxDo,18711
38
38
  pygeai/cli/commands/base.py,sha256=kkJEObpT2xSiObWAliJfGV73JS3LjLTMq7FEd4SpxkE,6930
39
39
  pygeai/cli/commands/builders.py,sha256=xXk1F4phSQxHN3NiQltl_KEZdCwwJiKLmVqQsft2OC4,1130
40
- pygeai/cli/commands/chat.py,sha256=vQ-NyMHdsbTy1Rc2obT3IB-OIFn0ngFmPG76ZqB4_pY,25304
40
+ pygeai/cli/commands/chat.py,sha256=Y2e3NjDXYjutdxbpGUDmewZfKnR_QHb69Jz4L-2GHY4,25170
41
41
  pygeai/cli/commands/common.py,sha256=zL1cWKMTqzqMsHBDFfVzbZe0i2l0hgJNpzjSRgvloY8,16568
42
42
  pygeai/cli/commands/configuration.py,sha256=J1Y8AH1xYWvcY4bzqKvF-_ggEDJ22Dv4iEcCBi2pq_8,4140
43
43
  pygeai/cli/commands/embeddings.py,sha256=om_RR3CHgfmHcTN43F6TzP71n-BS8Lf589wyBMVZJ3g,4220
@@ -57,11 +57,13 @@ pygeai/cli/commands/validators.py,sha256=lNtYSJvKFrEeg_h0oYURMuoQbNG5r6QdjzDL-aT
57
57
  pygeai/cli/commands/version.py,sha256=vyJcnxwL_TfpOQI0yE2a1ZyA3VRAE7ssh9APNBXpmqk,1701
58
58
  pygeai/cli/commands/flows/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
59
59
  pygeai/cli/commands/lab/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
60
- pygeai/cli/commands/lab/ai_lab.py,sha256=oiCYN_1mLXwbOQ7rh-MXVp9xUcRFTy6b0hNHcS4ytg8,137440
60
+ pygeai/cli/commands/lab/ai_lab.py,sha256=KJMRY_xA-B_XBM2VjgniYt5UeAbcvUCZhzb1jXUUni8,129235
61
61
  pygeai/cli/commands/lab/common.py,sha256=YBenPCVgK01Xaxgj1429bp_Ri1SN4beBxZk3dCLp7X0,6590
62
+ pygeai/cli/commands/lab/options.py,sha256=T13Vi97zochr0cU4yjyvvwWRPENILFDYpvqpU4uEBis,165
62
63
  pygeai/cli/commands/lab/spec.py,sha256=EjNdEnljKpYPQyT4d4ViAPrM1g7oIitv6ddnWVkWXPk,8301
64
+ pygeai/cli/commands/lab/utils.py,sha256=uxhgHvCRrV6WYRxR2qd3nED_hhXcxJ1tAU8MlzoshEg,456
63
65
  pygeai/cli/texts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
64
- pygeai/cli/texts/help.py,sha256=IgifNjO22kbRB5bsuckFrzRvg7Q14y96IfxRnlJAUcw,15516
66
+ pygeai/cli/texts/help.py,sha256=0idAj91GTubRRXgN1t8_SRiF1Ou89ssHC5vKwONDxMM,16074
65
67
  pygeai/core/__init__.py,sha256=bbNktFp7t2dOBIvWto-uGVBW8acaKIe8EKcfuLV-HmA,189
66
68
  pygeai/core/handlers.py,sha256=la1QcQbLwfiNd-xDQ3jtWRHmeEm6E93Rfx5c-5bkLmw,934
67
69
  pygeai/core/models.py,sha256=uIwrmlB6yuulScUcYIBSH3Sxm5YyzaicV7Dz2bYLi2I,24229
@@ -74,9 +76,9 @@ pygeai/core/base/models.py,sha256=_h62nnMhJXr1BLNoaldT4d9oqCTSistfF3D2LQ3bvlg,38
74
76
  pygeai/core/base/responses.py,sha256=k-mrzNO_AtEsGTUJnyRT76FJ7gfYxQ_SAhB8MBNqPZI,763
75
77
  pygeai/core/base/session.py,sha256=WVb4MmptwdgK7paHOSvfEle_HPXRRXO8CHgi0qbgtOg,2990
76
78
  pygeai/core/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
77
- pygeai/core/common/config.py,sha256=zrlNF-0AE54qZ-XpR0RgYzM_7v8LtS0jUpM7UXrbSqQ,4475
79
+ pygeai/core/common/config.py,sha256=uEPqTTonya8IBX0KSRI927cjUJ39JvYExnkqep-5U6o,4395
78
80
  pygeai/core/common/decorators.py,sha256=X7Tv5XBmsuS7oZHSmI95eX8UkuukKoiOiNRl5w9lgR4,1227
79
- pygeai/core/common/exceptions.py,sha256=9h_el66mS838l-FINY3gO8CrSQuFhXyljHtdrn5AOnM,1085
81
+ pygeai/core/common/exceptions.py,sha256=-eF4V0B-27zfp0aHMlZWqWRIty6P7TCOrzMRW87ZnlE,1251
80
82
  pygeai/core/embeddings/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
81
83
  pygeai/core/embeddings/clients.py,sha256=0r-BX4ptivIBNrsOAMgw0q5nNLrIU7UxJ3SD6MkfXX4,3543
82
84
  pygeai/core/embeddings/endpoints.py,sha256=b__cuKQjribog9PSUeDzwrQ0vBO4WyYahLhLjDiUpL0,98
@@ -142,27 +144,28 @@ pygeai/health/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
142
144
  pygeai/health/clients.py,sha256=U2eb1tkXt1Rf_KdV0ZFQS2k4wGnJTXHHd9-Er0eWQuw,1011
143
145
  pygeai/health/endpoints.py,sha256=UAzMcqSXZtMj4r8M8B7a_a5LT6X_jMFNsCTvcsjNTYA,71
144
146
  pygeai/lab/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
147
+ pygeai/lab/clients.py,sha256=5JebyNpKCVwAQpeOAkJPIHRf_6hoKA3uUm9xewm01UQ,816
145
148
  pygeai/lab/constants.py,sha256=ddgDnXP4GD0woi-FUJaJXzaWS3H6zmDN0B-v8utM95Q,170
146
- pygeai/lab/managers.py,sha256=9wV6SipzsIwFP9SXsKqZ0X5x6KbUuo6iCxPZF4zNGj4,72714
149
+ pygeai/lab/managers.py,sha256=EGU2NTpZyWtPo-VBX_wSrNOjLNPBIt7cxha9lIbuXgk,70725
147
150
  pygeai/lab/models.py,sha256=1m41gSqpXZVO9AcPVxzlsC-TgxZcCsgGUbpN5zoDMjU,71451
148
151
  pygeai/lab/runners.py,sha256=-uaCPHpFyiKtVOxlEjPjAc9h-onSdGAcYJ5IAZPqlb0,4147
149
152
  pygeai/lab/agents/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
150
- pygeai/lab/agents/clients.py,sha256=2SYNjyD9LZaOUxmTcrwzqcHwW7K1wAmYwen_u0G-RfU,22659
153
+ pygeai/lab/agents/clients.py,sha256=VIbKSDxSNH1P-CX6hF7LUcgtvrE3jvO_gu4KCtyzyls,21213
151
154
  pygeai/lab/agents/endpoints.py,sha256=RpWbFwqgX_GCVn29DYM46PVon5qjD7C1SmzvcjEKMzI,696
152
155
  pygeai/lab/agents/mappers.py,sha256=K6rxsO2Nq6GglmCUmyDKUNmzTG8HRbCelap6qaVKXQw,10583
153
156
  pygeai/lab/processes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
154
- pygeai/lab/processes/clients.py,sha256=C1YYJE7c5qJSZUIDKzo5kK-LOZP6jbdrG01aE8zoEYg,51403
157
+ pygeai/lab/processes/clients.py,sha256=4OUf36Dhyd4hJZomeLcq9XDpLiCINwmfu6tHy69TkDE,49417
155
158
  pygeai/lab/processes/endpoints.py,sha256=nFIEcNP22xe4j6URI6KcwTh7h-xgYjYYuHT6PDPiO3I,2100
156
159
  pygeai/lab/processes/mappers.py,sha256=YOWcVKdcJmLMAq-f3qevzqQ8L_hjb0_jVXBdCHutpzk,15815
157
160
  pygeai/lab/spec/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
158
161
  pygeai/lab/spec/loader.py,sha256=Dq9MhLqFwF4RPdBBaqKPGqt43-PrNlsHpe-NXe4S0qQ,709
159
162
  pygeai/lab/spec/parsers.py,sha256=oG7tY-GylweRxpvtCl3p53t0IoTX3UZFiB77x__3Qp8,646
160
163
  pygeai/lab/strategies/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
161
- pygeai/lab/strategies/clients.py,sha256=UZV21W-F7CHmi53oDWDloEQ4vf9DW8G_DNpB3nWDfeg,10563
164
+ pygeai/lab/strategies/clients.py,sha256=_a1yc8kwd50Yv4g1jqfa0gRnMiROR7Dn0gx3xqFUjVE,10316
162
165
  pygeai/lab/strategies/endpoints.py,sha256=LgEvUgeeN-X6VMl-tpl9_N12GRppLPScQmiMRk7Ri28,541
163
166
  pygeai/lab/strategies/mappers.py,sha256=6C_jubAVXMKLGQy5NUD0OX7SlrU2mLe2QsgzeJ1-WKw,2437
164
167
  pygeai/lab/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
165
- pygeai/lab/tools/clients.py,sha256=TfgociWyvzao3B6g2VfjAb6FmXp1YqmJRG2TT7RwOic,27441
168
+ pygeai/lab/tools/clients.py,sha256=3yESr0NQoO7qKi9s7VodxaV_4qjBlJ6cT_fBmEhyT48,28151
166
169
  pygeai/lab/tools/endpoints.py,sha256=HiGoMs4OVeCgH7EAERTtifFPl53NryA1Awh7D6AO8bA,699
167
170
  pygeai/lab/tools/mappers.py,sha256=bYi5k36h0k4mCvOnV-r8YOHKz0U9P0mH21GNs20w2eM,4998
168
171
  pygeai/man/__init__.py,sha256=gqGI92vUPt6RPweoWX3mTUYPWNDlm6aGUjQOnYXqthk,53
@@ -268,15 +271,29 @@ pygeai/tests/gam/test_clients.py,sha256=vNz-4ux0cubztTY-_fEPWEoMCt5VAmZLecd0V-sE
268
271
  pygeai/tests/health/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
269
272
  pygeai/tests/health/test_clients.py,sha256=kfakkZHFMfo2IAN-PzmtMGmgR4iNiN1RpRopI--0qHI,1525
270
273
  pygeai/tests/integration/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
274
+ pygeai/tests/integration/assistants/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
275
+ pygeai/tests/integration/assistants/rag/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
276
+ pygeai/tests/integration/assistants/rag/test_create_rag.py,sha256=yTHlfTUi7DeZRzo4T25sqAAoS3mV5apN-Elf1DX8aoM,2121
277
+ pygeai/tests/integration/chat/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
278
+ pygeai/tests/integration/chat/test_generate_image.py,sha256=byCQQK6dIy68yPAhAa66bh7N0Xz5WnKSClx1vaIIzZA,5431
271
279
  pygeai/tests/integration/lab/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
272
280
  pygeai/tests/integration/lab/agents/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
273
281
  pygeai/tests/integration/lab/agents/test_agents_list.py,sha256=F2KUCdeiaBC3dn8ARNWqSz_kJcRyA0HC1nquhamN35Q,4187
274
- pygeai/tests/integration/lab/agents/test_create_agent.py,sha256=J3_QYCQM02LVdYZN3Y4nFmqn43_BgbV6ZELtLhZnjl0,14475
282
+ pygeai/tests/integration/lab/agents/test_create_agent.py,sha256=JLCnrij_uS4wTvu06Ng3ODfLTikFQwmPep4HG0ebUKI,14104
275
283
  pygeai/tests/integration/lab/agents/test_create_sharing_link.py,sha256=y-e8Q_TfuLz7XXMRERSKA_-OQJUMBIsJcK0lQ0Oh858,2467
276
284
  pygeai/tests/integration/lab/agents/test_delete_agent.py,sha256=sb3RfoZJdzQvcVdNcXY2C2FO3yY1ZNiAZ_6Ay6f331E,2524
277
285
  pygeai/tests/integration/lab/agents/test_get_agent.py,sha256=oW1F6SENvhL9jZC021Rj-f_Xek2DSTx3SsZBr3YT6Hk,3666
278
- pygeai/tests/integration/lab/agents/test_publish_agent_revision.py,sha256=4vpuAVBenLCyWvaKTA2PQVLn_e-abGDscngUzZm3dMs,5284
279
- pygeai/tests/integration/lab/agents/test_update_agent.py,sha256=vme9TJij46U55oOvUYGdKRyzZn-UKzXXYGJH0-zCeRs,11959
286
+ pygeai/tests/integration/lab/agents/test_publish_agent_revision.py,sha256=PGlYn8y2L2FUfSG3NGDPHl3ZyIiohhir1spYqO6J3xY,5182
287
+ pygeai/tests/integration/lab/agents/test_update_agent.py,sha256=X3SpA1CPr4ZZQazsCSv8Z9rDcHJTih1c8AFKdwW80xg,11624
288
+ pygeai/tests/integration/lab/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
289
+ pygeai/tests/integration/lab/tools/test_create_tool.py,sha256=0Yzlu9ATnsxPVPa4vO4j-j5Hc6VyHQ2KoSaf0dfmqpk,12351
290
+ pygeai/tests/integration/lab/tools/test_delete_tool.py,sha256=wy979nZh8ERd-k3jhJTjHqG4wxWE4sx-r4yn2nBc7Aw,2913
291
+ pygeai/tests/integration/lab/tools/test_get_parameter.py,sha256=r5TIaY_ABdyrtGfQwvs6F76dxEoy5HnvOSDwYpZo4ow,3610
292
+ pygeai/tests/integration/lab/tools/test_get_tool.py,sha256=3fVDQlklmvOUgYDp0ATv5RqRmApgD4Qw_YGqjBOaOOo,3437
293
+ pygeai/tests/integration/lab/tools/test_list_tools.py,sha256=KMLWXUmk_hKChKo4t5xEZtuIS1UmhAH6VdEq15KCrbY,3744
294
+ pygeai/tests/integration/lab/tools/test_publish_tool_revision.py,sha256=AoCdHF8f7jUwAEL3PUvZMEE67m8OCcn_hqY67thJplU,4589
295
+ pygeai/tests/integration/lab/tools/test_set_parameter.py,sha256=NqLVMlOF4QiTcc2HTdVaJuWCrEvb5QkOX_xScyjyWGU,4025
296
+ pygeai/tests/integration/lab/tools/test_update_tool.py,sha256=tZKZDoYS6RuTdRLgAmENq5tRvK-MohJGCt-s83QoBCA,11683
280
297
  pygeai/tests/lab/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
281
298
  pygeai/tests/lab/test_managers.py,sha256=AsOAvyCkRpbskEy214aV2TwrqilWH6bxOiTWDOb1twQ,29778
282
299
  pygeai/tests/lab/test_mappers.py,sha256=2cLSggf168XWFpeZeBR7uJ-8C32TKb7qA91i_9fr_b0,11409
@@ -368,9 +385,11 @@ pygeai/tests/snippets/lab/runner_1.py,sha256=QD92MvC22wpWj6YyrSgpp46EcL0ciac2x1z
368
385
  pygeai/tests/snippets/lab/agents/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
369
386
  pygeai/tests/snippets/lab/agents/create_agent.py,sha256=EVyfQzDST9A9KaM0ToZJKlJ7yCbfhpSVkVK_MaUVQPw,1875
370
387
  pygeai/tests/snippets/lab/agents/create_agent_2.py,sha256=jd7HKhle_c0S0vI80AejOyLaNqBWkILlRF_znzyCGcQ,1879
388
+ pygeai/tests/snippets/lab/agents/create_agent_edge_case.py,sha256=8dA9giNdsHjFZsIWTlBFk8e1QS3YtbZxklsVu0ZrDrk,1877
389
+ pygeai/tests/snippets/lab/agents/create_agent_without_instructions.py,sha256=jd7HKhle_c0S0vI80AejOyLaNqBWkILlRF_znzyCGcQ,1879
371
390
  pygeai/tests/snippets/lab/agents/delete_agent.py,sha256=GfDX667_V3tZMz3vjsbrxoFZggzpwjZYH_PVO2Qjw5s,269
372
391
  pygeai/tests/snippets/lab/agents/get_agent.py,sha256=bcqloJHwmNsFjEfri6QIRaTuHzwLtfEqIQPIC5pdkWQ,516
373
- pygeai/tests/snippets/lab/agents/get_sharing_link.py,sha256=2mYPwMgFFbqzmWZEBrFYSjdZscVyjJYCs4A3L0x8Sr8,355
392
+ pygeai/tests/snippets/lab/agents/get_sharing_link.py,sha256=FSXuzbX8Folh1h_6liHeZyA8T21_Y-2Ws9B6-uXatDU,316
374
393
  pygeai/tests/snippets/lab/agents/list_agents.py,sha256=gY5RBFUozhkk1uJO6opjkLmKmYpF9Ws-B7Oibhs99qQ,457
375
394
  pygeai/tests/snippets/lab/agents/publish_agent_revision.py,sha256=ATbFnnSLYRmFTC4GJJUyBwxKosoTWx661Q9FpuktREM,344
376
395
  pygeai/tests/snippets/lab/agents/update_agent.py,sha256=6qCnqkowCCygEl3tv_nvdlwXG8k0-LEloKYQUdIfkrs,1943
@@ -393,7 +412,8 @@ pygeai/tests/snippets/lab/strategies/get_reasoning_strategy.py,sha256=OxxXIRWH_c
393
412
  pygeai/tests/snippets/lab/strategies/list_reasoning_strategies.py,sha256=4pqsW16m-oiv_UUVLgZrkeWZESIfDq2nvcfNC0ZpAGo,485
394
413
  pygeai/tests/snippets/lab/strategies/update_reasoning_strategy.py,sha256=OIoHNkdnXbC9GacPgXUG1jKlVizVtWfRI-E8_3xF5b0,889
395
414
  pygeai/tests/snippets/lab/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
396
- pygeai/tests/snippets/lab/tools/create_tool.py,sha256=dreldR8QIu9Q9tjOG2hkD6b8KZa_VrwSfSnCrzPgQLA,1400
415
+ pygeai/tests/snippets/lab/tools/create_tool.py,sha256=X8qoL7TOk9Gm7jyk5MvhB5V-TBvog3TETCLNL90Z3HA,1400
416
+ pygeai/tests/snippets/lab/tools/create_tool_edge_case.py,sha256=8w4mvoRTMTyc70yYm2bgV2dr_Rh5QpPJR8VoqX-eY-s,1465
397
417
  pygeai/tests/snippets/lab/tools/delete_tool.py,sha256=pnIkYvdP7X7Gx79AMK5MSVliIXdHSpyVwRhH3kgi7ys,452
398
418
  pygeai/tests/snippets/lab/tools/get_parameter.py,sha256=dXdlHhoWxzZIYdsvHKnLLT5Vff2Tip46XCoOo-B8Gf0,490
399
419
  pygeai/tests/snippets/lab/tools/get_tool.py,sha256=-fkKAE6nflwtLY_Lf6itZJyx_9aanFp-TSDHUzub1AM,477
@@ -482,9 +502,9 @@ pygeai/vendor/a2a/utils/helpers.py,sha256=6Tbd8SVfXvdNEk6WYmLOjrAxkzFf1aIg8dkFfB
482
502
  pygeai/vendor/a2a/utils/message.py,sha256=gc_EKO69CJ4HkR76IFgsy-kENJz1dn7CfSgWJWvt-gs,2197
483
503
  pygeai/vendor/a2a/utils/task.py,sha256=BYRA_L1HpoUGJAVlyHML0lCM9Awhf2Ovjj7oPFXKbh0,1647
484
504
  pygeai/vendor/a2a/utils/telemetry.py,sha256=VvSp1Ztqaobkmq9-3sNhhPEilJS32-JTSfKzegkj6FU,10861
485
- pygeai-0.3.2.dist-info/licenses/LICENSE,sha256=eHfqo7-AWS8cMq0cg03lq7owsLeCmZA-xS5L0kuHnl8,1474
486
- pygeai-0.3.2.dist-info/METADATA,sha256=bhejl4MTXN0F315fIxAdpmpaqy_aIx50RpKsP89Zgjc,6938
487
- pygeai-0.3.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
488
- pygeai-0.3.2.dist-info/entry_points.txt,sha256=OAmwuXVCQBTCE3HeVegVd37hbhCcp9TPahvdrCuMYWw,178
489
- pygeai-0.3.2.dist-info/top_level.txt,sha256=bJFwp2tURmCfB94yXDF7ylvdSJXFDDJsyUOb-7PJgwc,7
490
- pygeai-0.3.2.dist-info/RECORD,,
505
+ pygeai-0.4.0.dist-info/licenses/LICENSE,sha256=eHfqo7-AWS8cMq0cg03lq7owsLeCmZA-xS5L0kuHnl8,1474
506
+ pygeai-0.4.0.dist-info/METADATA,sha256=1mO96mgfRX1G1mJivH1rOUJP3B6maoRX3Ckb3IK_3ig,6938
507
+ pygeai-0.4.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
508
+ pygeai-0.4.0.dist-info/entry_points.txt,sha256=OAmwuXVCQBTCE3HeVegVd37hbhCcp9TPahvdrCuMYWw,178
509
+ pygeai-0.4.0.dist-info/top_level.txt,sha256=bJFwp2tURmCfB94yXDF7ylvdSJXFDDJsyUOb-7PJgwc,7
510
+ pygeai-0.4.0.dist-info/RECORD,,
File without changes