pygeai 0.4.0b3__py3-none-any.whl → 0.4.0b5__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.
- pygeai/assistant/rag/models.py +1 -1
- pygeai/cli/commands/chat.py +8 -2
- pygeai/cli/commands/lab/ai_lab.py +44 -550
- pygeai/cli/commands/lab/utils.py +13 -0
- pygeai/cli/geai.py +5 -2
- pygeai/cli/texts/help.py +12 -0
- pygeai/core/common/exceptions.py +5 -0
- pygeai/lab/agents/clients.py +30 -61
- pygeai/lab/clients.py +17 -0
- pygeai/lab/managers.py +1 -53
- pygeai/lab/models.py +1 -1
- pygeai/lab/processes/clients.py +81 -129
- pygeai/lab/processes/mappers.py +2 -2
- pygeai/lab/strategies/clients.py +11 -17
- pygeai/lab/tools/clients.py +30 -50
- pygeai/lab/tools/mappers.py +5 -5
- pygeai/tests/integration/chat/__init__.py +0 -0
- pygeai/tests/integration/chat/test_generate_image.py +162 -0
- pygeai/tests/integration/lab/agents/test_create_agent.py +9 -12
- pygeai/tests/integration/lab/agents/test_update_agent.py +6 -14
- pygeai/tests/integration/lab/tools/test_create_tool.py +3 -5
- pygeai/tests/integration/lab/tools/test_list_tools.py +106 -0
- pygeai/tests/integration/lab/tools/test_update_tool.py +268 -0
- {pygeai-0.4.0b3.dist-info → pygeai-0.4.0b5.dist-info}/METADATA +4 -4
- {pygeai-0.4.0b3.dist-info → pygeai-0.4.0b5.dist-info}/RECORD +29 -23
- {pygeai-0.4.0b3.dist-info → pygeai-0.4.0b5.dist-info}/WHEEL +0 -0
- {pygeai-0.4.0b3.dist-info → pygeai-0.4.0b5.dist-info}/entry_points.txt +0 -0
- {pygeai-0.4.0b3.dist-info → pygeai-0.4.0b5.dist-info}/licenses/LICENSE +0 -0
- {pygeai-0.4.0b3.dist-info → pygeai-0.4.0b5.dist-info}/top_level.txt +0 -0
|
@@ -287,21 +287,18 @@ class TestAILabCreateAgentIntegration(TestCase):
|
|
|
287
287
|
)
|
|
288
288
|
|
|
289
289
|
|
|
290
|
-
@unittest.skip("Agent is getting created regardless of the prompt instructions being empty")
|
|
291
290
|
def test_create_agent_no_prompt_instructions(self):
|
|
292
291
|
self.new_agent.agent_data.prompt.instructions = ""
|
|
293
|
-
|
|
294
|
-
self.__create_agent()
|
|
295
|
-
self.assertIn(
|
|
296
|
-
"instructions",
|
|
297
|
-
str(exception.exception),
|
|
298
|
-
"Expected a validation error about allowed values for instructions"
|
|
299
|
-
)
|
|
292
|
+
self.created_agent = self.__create_agent()
|
|
300
293
|
|
|
301
|
-
self.
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
294
|
+
self.assertTrue(
|
|
295
|
+
isinstance(self.created_agent, Agent),
|
|
296
|
+
"Expected a created agent"
|
|
297
|
+
)
|
|
298
|
+
|
|
299
|
+
self.assertIsNone(
|
|
300
|
+
self.created_agent.agent_data.prompt.instructions,
|
|
301
|
+
"Expected the created agent to not have prompt instructions"
|
|
305
302
|
)
|
|
306
303
|
|
|
307
304
|
|
|
@@ -207,28 +207,20 @@ class TestAILabUpdateAgentIntegration(TestCase):
|
|
|
207
207
|
f"Expected a validation error about allowed values for instructions when autopublish is {'enabled' if auto_publish else 'disabled'}"
|
|
208
208
|
)
|
|
209
209
|
|
|
210
|
-
|
|
210
|
+
# TODO: Change validation when API behavior is fixed
|
|
211
211
|
def test_update_agent_no_model(self):
|
|
212
212
|
test_params = [ True, False ]
|
|
213
213
|
self.agent_to_update.agent_data.models[0].name = ""
|
|
214
214
|
|
|
215
215
|
for auto_publish in test_params:
|
|
216
216
|
with self.subTest(input=auto_publish):
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
217
|
+
|
|
218
|
+
# If the agent is not published, the API returns a warning message for invalid model name. However, the sdk mapping is not returning it.
|
|
219
|
+
if auto_publish == False:
|
|
220
|
+
updated_agent = self.__update_agent(automatic_publish=auto_publish)
|
|
220
221
|
error_msg = str(exception.exception)
|
|
221
222
|
|
|
222
|
-
self.
|
|
223
|
-
"name",
|
|
224
|
-
error_msg,
|
|
225
|
-
"Expected a validation error about empty model name"
|
|
226
|
-
)
|
|
227
|
-
self.assertIn(
|
|
228
|
-
"Input should be a valid string [type=string_type, input_value=None, input_type=NoneType]",
|
|
229
|
-
error_msg,
|
|
230
|
-
"Expected a validation error about empty model name"
|
|
231
|
-
)
|
|
223
|
+
self.assertTrue(self.isInstance(updated_agent), Agent)
|
|
232
224
|
else:
|
|
233
225
|
with self.assertRaises(APIError) as exception:
|
|
234
226
|
self.__update_agent(automatic_publish=auto_publish)
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
from unittest import TestCase
|
|
2
|
-
import unittest
|
|
3
2
|
import uuid
|
|
4
3
|
from pygeai.lab.managers import AILabManager
|
|
5
|
-
from pygeai.lab.models import
|
|
4
|
+
from pygeai.lab.models import Tool, ToolParameter
|
|
6
5
|
from pydantic import ValidationError
|
|
7
|
-
from pygeai.core.common.exceptions import APIError
|
|
6
|
+
from pygeai.core.common.exceptions import APIError
|
|
8
7
|
|
|
9
8
|
|
|
10
9
|
class TestAILabCreateToolIntegration(TestCase):
|
|
@@ -14,7 +13,7 @@ class TestAILabCreateToolIntegration(TestCase):
|
|
|
14
13
|
"""
|
|
15
14
|
self.ai_lab_manager = AILabManager(alias="beta")
|
|
16
15
|
self.new_tool = self.__load_tool()
|
|
17
|
-
self.created_tool:
|
|
16
|
+
self.created_tool: Tool = None
|
|
18
17
|
|
|
19
18
|
|
|
20
19
|
def tearDown(self):
|
|
@@ -28,7 +27,6 @@ class TestAILabCreateToolIntegration(TestCase):
|
|
|
28
27
|
|
|
29
28
|
|
|
30
29
|
def __load_tool(self):
|
|
31
|
-
#random_str = str(uuid.uuid4())
|
|
32
30
|
return Tool(
|
|
33
31
|
name=str(uuid.uuid4()),
|
|
34
32
|
description="Tool created for sdk testing purposes",
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
from unittest import TestCase
|
|
2
|
+
from pygeai.lab.managers import AILabManager
|
|
3
|
+
from pygeai.lab.models import ToolList, FilterSettings
|
|
4
|
+
import copy
|
|
5
|
+
|
|
6
|
+
ai_lab_manager: AILabManager
|
|
7
|
+
|
|
8
|
+
class TestAILabListToolsIntegration(TestCase):
|
|
9
|
+
|
|
10
|
+
def setUp(self):
|
|
11
|
+
self.ai_lab_manager = AILabManager(alias="beta")
|
|
12
|
+
self.filter_settings = FilterSettings(
|
|
13
|
+
allow_external=False,
|
|
14
|
+
allow_drafts=True,
|
|
15
|
+
access_scope="private"
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def __list_tools(self, filter_settings: FilterSettings = None):
|
|
20
|
+
filter_settings = filter_settings if filter_settings != None else self.filter_settings
|
|
21
|
+
return self.ai_lab_manager.list_tools(filter_settings=filter_settings)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def test_private_list_tools(self):
|
|
25
|
+
result = self.__list_tools()
|
|
26
|
+
self.assertIsInstance(result, ToolList , "Expected a list of tools")
|
|
27
|
+
|
|
28
|
+
for tool in result.tools:
|
|
29
|
+
self.assertTrue(tool.access_scope == "private", "Expected all tools to be private")
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def test_public_list_tools(self):
|
|
33
|
+
filter_settings = copy.deepcopy(self.filter_settings)
|
|
34
|
+
filter_settings.access_scope = "public"
|
|
35
|
+
|
|
36
|
+
result = self.__list_tools(filter_settings=filter_settings)
|
|
37
|
+
self.assertIsInstance(result, ToolList , "Expected a list of tools")
|
|
38
|
+
|
|
39
|
+
for tool in result.tools:
|
|
40
|
+
self.assertTrue(tool.access_scope == "public", "Expected all tools to be public")
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def test_list_tools_small_count(self):
|
|
44
|
+
filter_settings = copy.deepcopy(self.filter_settings)
|
|
45
|
+
filter_settings.count = 2
|
|
46
|
+
|
|
47
|
+
result = self.__list_tools(filter_settings=filter_settings)
|
|
48
|
+
self.assertIsInstance(result, ToolList , "Expected a list of tools")
|
|
49
|
+
|
|
50
|
+
self.assertEqual(len(result), 2, "Expected list of tools returned to be 2")
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def test_list_tools_big_count(self):
|
|
54
|
+
filter_settings = copy.deepcopy(self.filter_settings)
|
|
55
|
+
filter_settings.count = 500
|
|
56
|
+
|
|
57
|
+
result = self.__list_tools(filter_settings=filter_settings)
|
|
58
|
+
self.assertIsInstance(result, ToolList , "Expected a list of tools")
|
|
59
|
+
|
|
60
|
+
self.assertLessEqual(len(result), 500, "Expected list of tools returned to be 500 or less")
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def test_list_tools_allowing_draft(self):
|
|
64
|
+
result = self.__list_tools()
|
|
65
|
+
validated = any(tool.is_draft == True for tool in result.tools)
|
|
66
|
+
self.assertTrue(
|
|
67
|
+
validated,
|
|
68
|
+
"Expected at least one tool to be a draft"
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def test_list_tools_no_draft(self):
|
|
73
|
+
filter_settings = copy.deepcopy(self.filter_settings)
|
|
74
|
+
filter_settings.allow_drafts = False
|
|
75
|
+
result = self.__list_tools(filter_settings=filter_settings)
|
|
76
|
+
|
|
77
|
+
validated = any(tool.is_draft == True for tool in result.tools)
|
|
78
|
+
self.assertFalse(
|
|
79
|
+
validated,
|
|
80
|
+
"Expected no draft tools in the list"
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def test_list_tools_invalid_scope(self):
|
|
85
|
+
filter_settings = copy.deepcopy(self.filter_settings)
|
|
86
|
+
filter_settings.scope = "project"
|
|
87
|
+
|
|
88
|
+
with self.assertRaises(ValueError) as exception:
|
|
89
|
+
self.__list_tools(filter_settings=filter_settings)
|
|
90
|
+
|
|
91
|
+
self.assertIn(
|
|
92
|
+
"Scope must be one of builtin, external, api, proxied.",
|
|
93
|
+
str(exception.exception),
|
|
94
|
+
f"The expected error about invalid scope was not returned"
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def test_list_tools_allowing_external(self):
|
|
99
|
+
filter_settings = copy.deepcopy(self.filter_settings)
|
|
100
|
+
filter_settings.allow_external = False
|
|
101
|
+
|
|
102
|
+
result = self.__list_tools(filter_settings=filter_settings)
|
|
103
|
+
self.assertIsInstance(result, ToolList , "Expected a list of tools")
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
|
|
@@ -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
|
+
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pygeai
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.0b5
|
|
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
|
|
@@ -41,11 +41,11 @@ Dynamic: license-file
|
|
|
41
41
|
|
|
42
42
|
PyGEAI is a Software Development Kit (SDK) for interacting with [Globant Enterprise AI](https://wiki.genexus.com/enterprise-ai/wiki?8,Table+of+contents%3AEnterprise+AI). It comprises libraries, tools, code samples, and documentation to simplify your experience with the platform.
|
|
43
43
|
|
|
44
|
-
##
|
|
44
|
+
## Terms and conditions
|
|
45
45
|
|
|
46
|
-
|
|
46
|
+
By using the Python SDK to interact with Globant Enterprise AI, you agree with the following Terms and Conditions:
|
|
47
47
|
|
|
48
|
-
[
|
|
48
|
+
[Terms and Conditions](https://www.globant.com/enterprise-ai/terms-of-use)
|
|
49
49
|
|
|
50
50
|
## Compatibility
|
|
51
51
|
This package is compatible with the Globant Enterprise AI release from June 2025.
|
|
@@ -16,7 +16,7 @@ pygeai/assistant/rag/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hS
|
|
|
16
16
|
pygeai/assistant/rag/clients.py,sha256=9a8loVLRnVkA3nHvvOpbdUEhy_TEnHm1rhdBYrBVABE,15893
|
|
17
17
|
pygeai/assistant/rag/endpoints.py,sha256=7YlHIvAYj3-xsCWtVMDYobxXbAO0lCo9yJdOrQxwCrQ,1145
|
|
18
18
|
pygeai/assistant/rag/mappers.py,sha256=n3aeNXqz_7zq_JWq5wJfeNX1kvV3arOxAoUsqRYOZsc,8645
|
|
19
|
-
pygeai/assistant/rag/models.py,sha256=
|
|
19
|
+
pygeai/assistant/rag/models.py,sha256=g5UiHuRjobgU1WgUMxeBzXykxgJ5q7eb_YY8qDciNvw,15732
|
|
20
20
|
pygeai/assistant/rag/responses.py,sha256=fY97ibsCVLQ3Ssnjuvj-JeA883WqjOw7ZdxbpQp_B1E,196
|
|
21
21
|
pygeai/chat/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
22
22
|
pygeai/chat/clients.py,sha256=QEyeTIPxp6xXKAEkE_XkjIxZDnaH808GKhIYr7ulrSA,10785
|
|
@@ -28,7 +28,7 @@ pygeai/chat/settings.py,sha256=-B2fEemZLifdsf7_7xNmWuFZYzL-yRqefivBmv3w8j8,124
|
|
|
28
28
|
pygeai/chat/ui.py,sha256=_t4ehG-n2-nxlc4esL09ORjmjTHhLWybUiEwGstIo-g,34620
|
|
29
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=
|
|
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=
|
|
40
|
+
pygeai/cli/commands/chat.py,sha256=F9SOJWfW577y9lF6xR_LLpvVB2jevGvLH1KG7NqOdfc,25640
|
|
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,12 @@ 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=
|
|
60
|
+
pygeai/cli/commands/lab/ai_lab.py,sha256=mS6QtRuCjQvA71CTD657tUYYvtw_mtDWLsGvzARSi2U,122999
|
|
61
61
|
pygeai/cli/commands/lab/common.py,sha256=YBenPCVgK01Xaxgj1429bp_Ri1SN4beBxZk3dCLp7X0,6590
|
|
62
62
|
pygeai/cli/commands/lab/spec.py,sha256=EjNdEnljKpYPQyT4d4ViAPrM1g7oIitv6ddnWVkWXPk,8301
|
|
63
|
+
pygeai/cli/commands/lab/utils.py,sha256=uxhgHvCRrV6WYRxR2qd3nED_hhXcxJ1tAU8MlzoshEg,456
|
|
63
64
|
pygeai/cli/texts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
64
|
-
pygeai/cli/texts/help.py,sha256=
|
|
65
|
+
pygeai/cli/texts/help.py,sha256=0idAj91GTubRRXgN1t8_SRiF1Ou89ssHC5vKwONDxMM,16074
|
|
65
66
|
pygeai/core/__init__.py,sha256=bbNktFp7t2dOBIvWto-uGVBW8acaKIe8EKcfuLV-HmA,189
|
|
66
67
|
pygeai/core/handlers.py,sha256=la1QcQbLwfiNd-xDQ3jtWRHmeEm6E93Rfx5c-5bkLmw,934
|
|
67
68
|
pygeai/core/models.py,sha256=uIwrmlB6yuulScUcYIBSH3Sxm5YyzaicV7Dz2bYLi2I,24229
|
|
@@ -76,7 +77,7 @@ pygeai/core/base/session.py,sha256=WVb4MmptwdgK7paHOSvfEle_HPXRRXO8CHgi0qbgtOg,2
|
|
|
76
77
|
pygeai/core/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
77
78
|
pygeai/core/common/config.py,sha256=zrlNF-0AE54qZ-XpR0RgYzM_7v8LtS0jUpM7UXrbSqQ,4475
|
|
78
79
|
pygeai/core/common/decorators.py,sha256=X7Tv5XBmsuS7oZHSmI95eX8UkuukKoiOiNRl5w9lgR4,1227
|
|
79
|
-
pygeai/core/common/exceptions.py,sha256=
|
|
80
|
+
pygeai/core/common/exceptions.py,sha256=hfyCj5iLuWJzg93rGrR9wpVESGnq6Dq0HJQBuuitNo0,1204
|
|
80
81
|
pygeai/core/embeddings/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
81
82
|
pygeai/core/embeddings/clients.py,sha256=0r-BX4ptivIBNrsOAMgw0q5nNLrIU7UxJ3SD6MkfXX4,3543
|
|
82
83
|
pygeai/core/embeddings/endpoints.py,sha256=b__cuKQjribog9PSUeDzwrQ0vBO4WyYahLhLjDiUpL0,98
|
|
@@ -142,29 +143,30 @@ pygeai/health/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
|
142
143
|
pygeai/health/clients.py,sha256=U2eb1tkXt1Rf_KdV0ZFQS2k4wGnJTXHHd9-Er0eWQuw,1011
|
|
143
144
|
pygeai/health/endpoints.py,sha256=UAzMcqSXZtMj4r8M8B7a_a5LT6X_jMFNsCTvcsjNTYA,71
|
|
144
145
|
pygeai/lab/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
146
|
+
pygeai/lab/clients.py,sha256=4N1P_kZhwe3IvDnrbsdd-GVai7jamVnBder6ft-o4d0,640
|
|
145
147
|
pygeai/lab/constants.py,sha256=ddgDnXP4GD0woi-FUJaJXzaWS3H6zmDN0B-v8utM95Q,170
|
|
146
|
-
pygeai/lab/managers.py,sha256=
|
|
147
|
-
pygeai/lab/models.py,sha256=
|
|
148
|
+
pygeai/lab/managers.py,sha256=eDnT31n-xPUcK_Hjfe9FXjz6dAwAqmrbaYZ6XEHonQE,70554
|
|
149
|
+
pygeai/lab/models.py,sha256=1m41gSqpXZVO9AcPVxzlsC-TgxZcCsgGUbpN5zoDMjU,71451
|
|
148
150
|
pygeai/lab/runners.py,sha256=-uaCPHpFyiKtVOxlEjPjAc9h-onSdGAcYJ5IAZPqlb0,4147
|
|
149
151
|
pygeai/lab/agents/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
150
|
-
pygeai/lab/agents/clients.py,sha256=
|
|
152
|
+
pygeai/lab/agents/clients.py,sha256=VIbKSDxSNH1P-CX6hF7LUcgtvrE3jvO_gu4KCtyzyls,21213
|
|
151
153
|
pygeai/lab/agents/endpoints.py,sha256=RpWbFwqgX_GCVn29DYM46PVon5qjD7C1SmzvcjEKMzI,696
|
|
152
154
|
pygeai/lab/agents/mappers.py,sha256=K6rxsO2Nq6GglmCUmyDKUNmzTG8HRbCelap6qaVKXQw,10583
|
|
153
155
|
pygeai/lab/processes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
154
|
-
pygeai/lab/processes/clients.py,sha256=
|
|
156
|
+
pygeai/lab/processes/clients.py,sha256=4OUf36Dhyd4hJZomeLcq9XDpLiCINwmfu6tHy69TkDE,49417
|
|
155
157
|
pygeai/lab/processes/endpoints.py,sha256=nFIEcNP22xe4j6URI6KcwTh7h-xgYjYYuHT6PDPiO3I,2100
|
|
156
|
-
pygeai/lab/processes/mappers.py,sha256=
|
|
158
|
+
pygeai/lab/processes/mappers.py,sha256=YOWcVKdcJmLMAq-f3qevzqQ8L_hjb0_jVXBdCHutpzk,15815
|
|
157
159
|
pygeai/lab/spec/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
158
160
|
pygeai/lab/spec/loader.py,sha256=Dq9MhLqFwF4RPdBBaqKPGqt43-PrNlsHpe-NXe4S0qQ,709
|
|
159
161
|
pygeai/lab/spec/parsers.py,sha256=oG7tY-GylweRxpvtCl3p53t0IoTX3UZFiB77x__3Qp8,646
|
|
160
162
|
pygeai/lab/strategies/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
161
|
-
pygeai/lab/strategies/clients.py,sha256=
|
|
163
|
+
pygeai/lab/strategies/clients.py,sha256=_a1yc8kwd50Yv4g1jqfa0gRnMiROR7Dn0gx3xqFUjVE,10316
|
|
162
164
|
pygeai/lab/strategies/endpoints.py,sha256=LgEvUgeeN-X6VMl-tpl9_N12GRppLPScQmiMRk7Ri28,541
|
|
163
165
|
pygeai/lab/strategies/mappers.py,sha256=6C_jubAVXMKLGQy5NUD0OX7SlrU2mLe2QsgzeJ1-WKw,2437
|
|
164
166
|
pygeai/lab/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
165
|
-
pygeai/lab/tools/clients.py,sha256=
|
|
167
|
+
pygeai/lab/tools/clients.py,sha256=cjoNIdCTYqVIw4MpEnwtFt4HSGl1snYFSEEOo_jZWUs,26515
|
|
166
168
|
pygeai/lab/tools/endpoints.py,sha256=HiGoMs4OVeCgH7EAERTtifFPl53NryA1Awh7D6AO8bA,699
|
|
167
|
-
pygeai/lab/tools/mappers.py,sha256=
|
|
169
|
+
pygeai/lab/tools/mappers.py,sha256=bYi5k36h0k4mCvOnV-r8YOHKz0U9P0mH21GNs20w2eM,4998
|
|
168
170
|
pygeai/man/__init__.py,sha256=gqGI92vUPt6RPweoWX3mTUYPWNDlm6aGUjQOnYXqthk,53
|
|
169
171
|
pygeai/man/man1/__init__.py,sha256=CFvES6cP_sbhgpm-I-QSbPC1f7Bw7cFsMW2-sxm4FtM,54
|
|
170
172
|
pygeai/man/man1/geai-proxy.1,sha256=N5jtjzS5dB3JjAkG0Rw8EBzhC6Jgoy6zbS7XDgcE4EA,6735
|
|
@@ -268,19 +270,23 @@ pygeai/tests/gam/test_clients.py,sha256=vNz-4ux0cubztTY-_fEPWEoMCt5VAmZLecd0V-sE
|
|
|
268
270
|
pygeai/tests/health/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
269
271
|
pygeai/tests/health/test_clients.py,sha256=kfakkZHFMfo2IAN-PzmtMGmgR4iNiN1RpRopI--0qHI,1525
|
|
270
272
|
pygeai/tests/integration/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
273
|
+
pygeai/tests/integration/chat/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
274
|
+
pygeai/tests/integration/chat/test_generate_image.py,sha256=byCQQK6dIy68yPAhAa66bh7N0Xz5WnKSClx1vaIIzZA,5431
|
|
271
275
|
pygeai/tests/integration/lab/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
272
276
|
pygeai/tests/integration/lab/agents/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
273
277
|
pygeai/tests/integration/lab/agents/test_agents_list.py,sha256=F2KUCdeiaBC3dn8ARNWqSz_kJcRyA0HC1nquhamN35Q,4187
|
|
274
|
-
pygeai/tests/integration/lab/agents/test_create_agent.py,sha256=
|
|
278
|
+
pygeai/tests/integration/lab/agents/test_create_agent.py,sha256=yL3owPJP0RoHSy3lEAdH06LJXqxgt3f2l2plk75d4cc,14206
|
|
275
279
|
pygeai/tests/integration/lab/agents/test_create_sharing_link.py,sha256=y-e8Q_TfuLz7XXMRERSKA_-OQJUMBIsJcK0lQ0Oh858,2467
|
|
276
280
|
pygeai/tests/integration/lab/agents/test_delete_agent.py,sha256=sb3RfoZJdzQvcVdNcXY2C2FO3yY1ZNiAZ_6Ay6f331E,2524
|
|
277
281
|
pygeai/tests/integration/lab/agents/test_get_agent.py,sha256=oW1F6SENvhL9jZC021Rj-f_Xek2DSTx3SsZBr3YT6Hk,3666
|
|
278
282
|
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=
|
|
283
|
+
pygeai/tests/integration/lab/agents/test_update_agent.py,sha256=1seho_GOtOHik_YJ9GPA4McSZorohhFRvuzY7UYXbxo,11726
|
|
280
284
|
pygeai/tests/integration/lab/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
281
|
-
pygeai/tests/integration/lab/tools/test_create_tool.py,sha256=
|
|
285
|
+
pygeai/tests/integration/lab/tools/test_create_tool.py,sha256=0Yzlu9ATnsxPVPa4vO4j-j5Hc6VyHQ2KoSaf0dfmqpk,12351
|
|
282
286
|
pygeai/tests/integration/lab/tools/test_delete_tool.py,sha256=wy979nZh8ERd-k3jhJTjHqG4wxWE4sx-r4yn2nBc7Aw,2913
|
|
283
287
|
pygeai/tests/integration/lab/tools/test_get_tool.py,sha256=3fVDQlklmvOUgYDp0ATv5RqRmApgD4Qw_YGqjBOaOOo,3437
|
|
288
|
+
pygeai/tests/integration/lab/tools/test_list_tools.py,sha256=KMLWXUmk_hKChKo4t5xEZtuIS1UmhAH6VdEq15KCrbY,3744
|
|
289
|
+
pygeai/tests/integration/lab/tools/test_update_tool.py,sha256=tZKZDoYS6RuTdRLgAmENq5tRvK-MohJGCt-s83QoBCA,11683
|
|
284
290
|
pygeai/tests/lab/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
285
291
|
pygeai/tests/lab/test_managers.py,sha256=AsOAvyCkRpbskEy214aV2TwrqilWH6bxOiTWDOb1twQ,29778
|
|
286
292
|
pygeai/tests/lab/test_mappers.py,sha256=2cLSggf168XWFpeZeBR7uJ-8C32TKb7qA91i_9fr_b0,11409
|
|
@@ -489,9 +495,9 @@ pygeai/vendor/a2a/utils/helpers.py,sha256=6Tbd8SVfXvdNEk6WYmLOjrAxkzFf1aIg8dkFfB
|
|
|
489
495
|
pygeai/vendor/a2a/utils/message.py,sha256=gc_EKO69CJ4HkR76IFgsy-kENJz1dn7CfSgWJWvt-gs,2197
|
|
490
496
|
pygeai/vendor/a2a/utils/task.py,sha256=BYRA_L1HpoUGJAVlyHML0lCM9Awhf2Ovjj7oPFXKbh0,1647
|
|
491
497
|
pygeai/vendor/a2a/utils/telemetry.py,sha256=VvSp1Ztqaobkmq9-3sNhhPEilJS32-JTSfKzegkj6FU,10861
|
|
492
|
-
pygeai-0.4.
|
|
493
|
-
pygeai-0.4.
|
|
494
|
-
pygeai-0.4.
|
|
495
|
-
pygeai-0.4.
|
|
496
|
-
pygeai-0.4.
|
|
497
|
-
pygeai-0.4.
|
|
498
|
+
pygeai-0.4.0b5.dist-info/licenses/LICENSE,sha256=eHfqo7-AWS8cMq0cg03lq7owsLeCmZA-xS5L0kuHnl8,1474
|
|
499
|
+
pygeai-0.4.0b5.dist-info/METADATA,sha256=nq2BlVTDBdPoui_6skUTV4HNP8QoBTuioiy6QyxPkqk,6940
|
|
500
|
+
pygeai-0.4.0b5.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
501
|
+
pygeai-0.4.0b5.dist-info/entry_points.txt,sha256=OAmwuXVCQBTCE3HeVegVd37hbhCcp9TPahvdrCuMYWw,178
|
|
502
|
+
pygeai-0.4.0b5.dist-info/top_level.txt,sha256=bJFwp2tURmCfB94yXDF7ylvdSJXFDDJsyUOb-7PJgwc,7
|
|
503
|
+
pygeai-0.4.0b5.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|