pygeai 0.4.0b10__py3-none-any.whl → 0.4.0b12__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/chat/ui.py CHANGED
@@ -1,5 +1,4 @@
1
1
  import logging
2
- from pathlib import Path
3
2
 
4
3
  import streamlit as st
5
4
  import argparse
@@ -362,7 +362,7 @@ def chat_with_agent(option_list: list):
362
362
  raise MissingRequirementException(f"Agent name must be specified.")
363
363
 
364
364
  project_id = get_project_id()
365
- agent_data = AgentClient().get_agent(project_id=project_id, agent_id=agent_name)
365
+ agent_data = AgentClient(project_id=project_id).get_agent(agent_id=agent_name)
366
366
  if 'errors' in agent_data:
367
367
  raise InvalidAgentException(f"There is no agent with that name: {agent_data.get('errors')}")
368
368
 
@@ -374,62 +374,54 @@ def chat_with_agent(option_list: list):
374
374
  Console.write_stderr("Streamlit is required for GUI mode. Install it with 'pip install streamlit'.")
375
375
  sys.exit(1)
376
376
 
377
- if use_gui:
378
- try:
379
- import streamlit
380
- except ImportError:
381
- logger.error("Streamlit not installed")
382
- Console.write_stderr("Streamlit is required for GUI mode. Install it with 'pip install streamlit'.")
383
- sys.exit(1)
377
+ try:
378
+ ui_path = resources.files("pygeai.chat").joinpath("ui.py")
379
+ ui_file_path = str(ui_path)
380
+
381
+ # Add the top-level project root to PYTHONPATH
382
+ package_root = str(Path(ui_file_path).resolve().parents[2])
383
+ env = os.environ.copy()
384
+ env["PYTHONPATH"] = package_root + os.pathsep + env.get("PYTHONPATH", "")
385
+
386
+ streamlit_cmd = [
387
+ sys.executable, "-m", "streamlit", "run", ui_file_path,
388
+ "--server.address", "127.0.0.1",
389
+ "--", "--agent-name", agent_name
390
+ ]
391
+
392
+ if platform.system() == "Linux":
393
+ streamlit_cmd.insert(5, "--server.headless=true")
394
+
395
+ process = subprocess.Popen(
396
+ streamlit_cmd,
397
+ stdout=subprocess.PIPE,
398
+ stderr=subprocess.PIPE,
399
+ text=True
400
+ )
384
401
 
385
- try:
386
- ui_path = resources.files("pygeai.chat").joinpath("ui.py")
387
- ui_file_path = str(ui_path)
388
-
389
- # Add the top-level project root to PYTHONPATH
390
- package_root = str(Path(ui_file_path).resolve().parents[2])
391
- env = os.environ.copy()
392
- env["PYTHONPATH"] = package_root + os.pathsep + env.get("PYTHONPATH", "")
393
-
394
- streamlit_cmd = [
395
- sys.executable, "-m", "streamlit", "run", ui_file_path,
396
- "--server.address", "127.0.0.1",
397
- "--", "--agent-name", agent_name
398
- ]
399
-
400
- if platform.system() == "Linux":
401
- streamlit_cmd.insert(5, "--server.headless=true")
402
-
403
- process = subprocess.Popen(
404
- streamlit_cmd,
405
- stdout=subprocess.PIPE,
406
- stderr=subprocess.PIPE,
407
- text=True
408
- )
409
-
410
- url = "http://localhost:8501"
411
- if platform.system() == "Linux":
412
- Console.write_stdout(f"Open Streamlit app at {url} (or next port like 8502 if 8501 is taken)")
413
-
414
- try:
415
- stdout, stderr = process.communicate()
416
- if stderr:
417
- logger.error(f"Streamlit stderr:\n{stderr}")
418
- Console.write_stderr(f"Streamlit error:\n{stderr}")
419
- except KeyboardInterrupt:
420
- process.terminate()
421
- Console.write_stdout("Streamlit stopped.")
422
- sys.exit(0)
402
+ url = "http://localhost:8501"
403
+ if platform.system() == "Linux":
404
+ Console.write_stdout(f"Open Streamlit app at {url} (or next port like 8502 if 8501 is taken)")
423
405
 
424
- except FileNotFoundError:
425
- logger.error("Could not locate pygeai/chat/ui.py")
426
- Console.write_stderr("Streamlit UI file not found. Ensure pygeai is installed correctly.")
427
- sys.exit(1)
428
- except Exception as e:
429
- logger.error(f"Streamlit error: {e}")
430
- Console.write_stderr(
431
- f"Failed to launch Streamlit. Check port with 'lsof -i :8501' and kill any process, or try {url}.")
432
- sys.exit(1)
406
+ try:
407
+ stdout, stderr = process.communicate()
408
+ if stderr:
409
+ logger.error(f"Streamlit stderr:\n{stderr}")
410
+ Console.write_stderr(f"Streamlit error:\n{stderr}")
411
+ except KeyboardInterrupt:
412
+ process.terminate()
413
+ Console.write_stdout("Streamlit stopped.")
414
+ sys.exit(0)
415
+
416
+ except FileNotFoundError:
417
+ logger.error("Could not locate pygeai/chat/ui.py")
418
+ Console.write_stderr("Streamlit UI file not found. Ensure pygeai is installed correctly.")
419
+ sys.exit(1)
420
+ except Exception as e:
421
+ logger.error(f"Streamlit error: {e}")
422
+ Console.write_stderr(
423
+ f"Failed to launch Streamlit. Check port with 'lsof -i :8501' and kill any process, or try {url}.")
424
+ sys.exit(1)
433
425
  else:
434
426
  chat_session = AgentChatSession(agent_name)
435
427
  messages = list()
@@ -15,7 +15,6 @@ from pygeai.lab.processes.clients import AgenticProcessClient
15
15
  from pygeai.lab.strategies.clients import ReasoningStrategyClient
16
16
  from pygeai.lab.tools.clients import ToolClient
17
17
  from pygeai.lab.constants import VALID_SCOPES
18
- from pygeai.tests.snippets.lab.crud_ui import project_id
19
18
 
20
19
 
21
20
  def show_help():
@@ -114,9 +114,7 @@ def get_settings():
114
114
 
115
115
  if __name__ == "__main__":
116
116
  settings = get_settings()
117
- geai_api_key = settings.get_api_key()
118
117
  geai_base_url = settings.get_base_url()
119
118
  geai_eval_url = settings.get_eval_url()
120
- print(f"api_key: {geai_api_key}")
121
119
  print(f"base_url: {geai_base_url}")
122
120
  print(f"eval_url: {geai_eval_url}")
pygeai/lab/managers.py CHANGED
@@ -559,7 +559,7 @@ class AILabManager:
559
559
  tool_id: Optional[str] = None,
560
560
  tool_public_name: Optional[str] = None,
561
561
  parameters: List[ToolParameter] = None
562
- ) -> Tool:
562
+ ) -> EmptyResponse:
563
563
  """
564
564
  Sets or updates parameters for a specific tool in the specified project.
565
565
 
@@ -591,7 +591,7 @@ class AILabManager:
591
591
  logger.error(f"Error received while setting tool parameters: {error}")
592
592
  raise APIError(f"Error received while setting tool parameters: {error}")
593
593
 
594
- result = ToolMapper.map_to_tool(response_data)
594
+ result = ResponseMapper.map_to_empty_response(response_data or "Parameter set successfully")
595
595
  return result
596
596
 
597
597
  def list_reasoning_strategies(
@@ -114,7 +114,8 @@ class ToolClient(AILabClient):
114
114
  headers=headers,
115
115
  data=data
116
116
  )
117
- if response.status_code != 200:
117
+
118
+ if response.status_code >= 300:
118
119
  logger.error(f"Invalid status code returned from the API endpoint: {response.text}")
119
120
  raise APIResponseError(f"API returned an error: {response.text}")
120
121
  try:
@@ -168,7 +169,7 @@ class ToolClient(AILabClient):
168
169
  "allowExternal": allow_external
169
170
  }
170
171
  )
171
- if response.status_code != 200:
172
+ if response.status_code >= 300:
172
173
  logger.error(f"Invalid status code returned from the API endpoint: {response.text}")
173
174
  raise APIResponseError(f"API returned an error: {response.text}")
174
175
  try:
@@ -212,7 +213,7 @@ class ToolClient(AILabClient):
212
213
  "allowDrafts": allow_drafts,
213
214
  }
214
215
  )
215
- if response.status_code != 200:
216
+ if response.status_code >= 300:
216
217
  logger.error(f"Invalid status code returned from the API endpoint: {response.text}")
217
218
  raise APIResponseError(f"API returned an error: {response.text}")
218
219
  try:
@@ -255,7 +256,7 @@ class ToolClient(AILabClient):
255
256
  endpoint=endpoint,
256
257
  headers=headers
257
258
  )
258
- if response.status_code != 200:
259
+ if response.status_code >= 300:
259
260
  logger.error(f"Invalid status code returned from the API endpoint: {response.text}")
260
261
  raise APIResponseError(f"API returned an error: {response.text}")
261
262
 
@@ -375,7 +376,7 @@ class ToolClient(AILabClient):
375
376
  headers=headers,
376
377
  data=data
377
378
  )
378
- if response.status_code != 200:
379
+ if response.status_code >= 300:
379
380
  logger.error(f"Invalid status code returned from the API endpoint: {response.text}")
380
381
  raise APIResponseError(f"API returned an error: {response.text}")
381
382
  try:
@@ -463,7 +464,7 @@ class ToolClient(AILabClient):
463
464
  "allowDrafts": allow_drafts,
464
465
  }
465
466
  )
466
- if response.status_code != 200:
467
+ if response.status_code >= 300:
467
468
  logger.error(f"Invalid status code returned from the API endpoint: {response.text}")
468
469
  raise APIResponseError(f"API returned an error: {response.text}")
469
470
  try:
@@ -520,16 +521,11 @@ class ToolClient(AILabClient):
520
521
  headers=headers,
521
522
  data=data
522
523
  )
523
- if response.status_code != 200:
524
- logger.error(f"Invalid status code returned from the API endpoint: {response.text}")
525
- raise APIResponseError(f"API returned an error: {response.text}")
526
- try:
527
- result = response.json()
528
- except JSONDecodeError as e:
529
- logger.error(f"Unable to set parameters for tool {tool_id or tool_public_name} in project {self.project_id}: JSON parsing error (status {response.status_code}): {e}. Response: {response.text}")
530
- raise InvalidAPIResponseException(f"Unable to set parameters for tool {tool_id or tool_public_name} in project {self.project_id}: {response.text}")
531
-
532
- return result
524
+ if response.status_code != 204:
525
+ logger.error(f"Unable to set parameter for tool {tool_id or tool_public_name} from project {self.project_id}: JSON parsing error (status {response.status_code}). Response: {response.text}")
526
+ raise InvalidAPIResponseException(f"Unable to set parameter for tool {tool_id or tool_public_name} from project {self.project_id}: {response.text}")
527
+ else:
528
+ return {}
533
529
 
534
530
  def export_tool(
535
531
  self,
@@ -559,7 +555,7 @@ class ToolClient(AILabClient):
559
555
  endpoint=endpoint,
560
556
  headers=headers,
561
557
  )
562
- if response.status_code != 200:
558
+ if response.status_code >= 300:
563
559
  logger.error(f"Invalid status code returned from the API endpoint: {response.text}")
564
560
  raise APIResponseError(f"API returned an error: {response.text}")
565
561
  try:
File without changes
File without changes
@@ -0,0 +1,72 @@
1
+ from unittest import TestCase
2
+ from pygeai.assistant.managers import AssistantManager
3
+ from pygeai.core.models import WelcomeData, LlmSettings
4
+ from pygeai.assistant.rag.models import (
5
+ Search,
6
+ RetrieverOptions,
7
+ SearchOptions,
8
+ ChunkOptions,
9
+ IndexOptions,
10
+ RAGAssistant,
11
+ )
12
+
13
+ assistant_manager = AssistantManager(alias="beta")
14
+
15
+ class TestAssistantCreateRagIntegration(TestCase):
16
+
17
+ def __load_rag(self):
18
+ llm_options = LlmSettings(
19
+ cache=False,
20
+ temperature=0.1,
21
+ max_tokens=999,
22
+ model_name="gpt-3.5-turbo-16k",
23
+ n=1,
24
+ presence_penalty=0,
25
+ frequency_penalty=0,
26
+ provider="OpenAI",
27
+ stream=False,
28
+ top_p=1.0,
29
+ type=None,
30
+ verbose=True,
31
+ )
32
+
33
+ retriever_options = RetrieverOptions(type="vectorStore")
34
+
35
+ search_options = SearchOptions(
36
+ history_count=2,
37
+ llm=llm_options,
38
+ search=Search(
39
+ k=5,
40
+ return_source_documents=False,
41
+ score_threshold=0,
42
+ prompt="Use {context} and {question}",
43
+ template="",
44
+ ),
45
+ retriever=retriever_options,
46
+ )
47
+
48
+ chunk_options = ChunkOptions(chunk_size=999, chunk_overlap=0)
49
+
50
+ index_options = IndexOptions(chunks=chunk_options)
51
+
52
+ welcome_data = WelcomeData(
53
+ title="Test Profile Welcome Data",
54
+ description="Test Profile with WelcomeData",
55
+ features=[],
56
+ examples_prompt=[],
57
+ )
58
+
59
+ return RAGAssistant(
60
+ name="Testaasdfasdfsasdfdfsdfsdf123in123g12355",
61
+ description="Test Profile with WelcomeData",
62
+ search_options=search_options,
63
+ index_options=index_options,
64
+ welcome_data=welcome_data,
65
+ )
66
+
67
+
68
+ def test_create_rag_assistant(self):
69
+ rag_assistant = self.__load_rag()
70
+ response = assistant_manager.create_assistant(rag_assistant)
71
+
72
+ self.assertIsInstance(response, RAGAssistant, "Failed to create RAG assistant")
@@ -33,7 +33,6 @@ class TestAILabCreateAgentIntegration(TestCase):
33
33
  access_scope="public",
34
34
  public_name=f"public_{random_str}",
35
35
  job_description="Translator",
36
- avatar_image="https://www.shareicon.net/data/128x128/2016/11/09/851442_logo_512x512.png",
37
36
  description="Agent that translates from any language to english.",
38
37
  agent_data=AgentData(
39
38
  prompt=Prompt(
@@ -28,7 +28,6 @@ class TestAILabPublishAgentRevisionIntegration(TestCase):
28
28
  access_scope="public",
29
29
  public_name=f"public_{random_str}",
30
30
  job_description=f"SummarizerAgent{random_str}",
31
- avatar_image="https://www.shareicon.net/data/128x128/2016/11/09/851442_logo_512x512.png",
32
31
  description=f"Agent that summarized documents. {random_str}",
33
32
  agent_data=AgentData(
34
33
  prompt=Prompt(
@@ -25,7 +25,6 @@ class TestAILabUpdateAgentIntegration(TestCase):
25
25
  access_scope="public",
26
26
  public_name=f"public_{random_str}",
27
27
  job_description=f"SummarizerAgent{random_str}",
28
- avatar_image="https://www.shareicon.net/data/128x128/2016/11/09/851442_logo_512x512.png",
29
28
  description=f"Agent that summarized documents. {random_str}",
30
29
  agent_data=AgentData(
31
30
  prompt=Prompt(
@@ -0,0 +1,98 @@
1
+ from unittest import TestCase
2
+ from pygeai.lab.managers import AILabManager
3
+ from pygeai.lab.models import FilterSettings, ToolParameter
4
+ from pygeai.core.common.exceptions import APIResponseError, MissingRequirementException
5
+ import copy
6
+
7
+ ai_lab_manager: AILabManager
8
+
9
+ class TestAILabGetParameterIntegration(TestCase):
10
+
11
+ def setUp(self):
12
+ self.ai_lab_manager = AILabManager(alias="beta")
13
+ self.tool_id = "42610b61-cb47-49bf-9475-36ee652f31f3"
14
+ self.filter_settings = FilterSettings(
15
+ revision="0",
16
+ version="0",
17
+ allow_drafts=True
18
+ )
19
+
20
+
21
+ def __get_parameter(self, tool_id: str = None, tool_public_name: str = None, filter_settings: FilterSettings = None):
22
+ return self.ai_lab_manager.get_parameter(
23
+ tool_id=self.tool_id if tool_id is None else tool_id,
24
+ tool_public_name=tool_public_name,
25
+ filter_settings=self.filter_settings if filter_settings is None else filter_settings
26
+ )
27
+
28
+
29
+ def test_get_parameter(self):
30
+ tool_parameters = self.__get_parameter()
31
+
32
+ for param in tool_parameters:
33
+ self.assertIsInstance(param, ToolParameter, "Expected a tool parameter")
34
+
35
+
36
+ def test_get_parameter_invalid_tool_id(self):
37
+ invalid_id = "0026e53d-ea78-4cac-af9f-12650invalid"
38
+
39
+ with self.assertRaises(APIResponseError) as exception:
40
+ self.__get_parameter(tool_id=invalid_id)
41
+ self.assertIn(
42
+ f"Tool not found [IdOrName= {invalid_id}]",
43
+ str(exception.exception),
44
+ "Expected error when trying to send an invalid tool id"
45
+ )
46
+
47
+
48
+ def test_get_parameter_no_tool_id(self):
49
+ with self.assertRaises(MissingRequirementException) as exception:
50
+ self.__get_parameter(tool_id="")
51
+ self.assertIn(
52
+ "Either tool_id or tool_public_name must be provided.",
53
+ str(exception.exception),
54
+ "Expected error when trying to send a request without tool_id"
55
+ )
56
+
57
+
58
+ def test_get_parameter_by_tool_public_name(self):
59
+ tool_parameters = self.__get_parameter(tool_public_name="test.sdk.beta.tool")
60
+
61
+ for param in tool_parameters:
62
+ self.assertIsInstance(param, ToolParameter, "Expected a tool parameter")
63
+
64
+
65
+ def test_get_parameter_by_invalid_public_name(self):
66
+ invalid_public_name = "test.sdk.beta.tool.invalid"
67
+
68
+ with self.assertRaises(APIResponseError) as exception:
69
+ self.__get_parameter(tool_public_name=invalid_public_name)
70
+ self.assertIn(
71
+ f"Tool not found [IdOrName= {invalid_public_name}]",
72
+ str(exception.exception),
73
+ "Expected error when trying to send a request without tool_id"
74
+ )
75
+
76
+
77
+ def test_get_parameter_by_past_revision(self):
78
+ filter_settings = copy.deepcopy(self.filter_settings)
79
+ filter_settings.revision = "3"
80
+
81
+ with self.assertRaises(APIResponseError) as exception:
82
+ self.__get_parameter(filter_settings=filter_settings)
83
+ self.assertIn(
84
+ "Requested revision not found [revision=3].",
85
+ str(exception.exception),
86
+ "Expected error when trying to send a request without tool_id"
87
+ )
88
+
89
+
90
+ def test_get_parameter_by_draft_revision(self):
91
+ filter_settings = copy.deepcopy(self.filter_settings)
92
+ filter_settings.revision = "10"
93
+ tool_parameters = self.__get_parameter(filter_settings=filter_settings)
94
+
95
+ for param in tool_parameters:
96
+ self.assertIsInstance(param, ToolParameter, "Expected a tool parameter")
97
+
98
+
@@ -0,0 +1,119 @@
1
+ from unittest import TestCase
2
+ import uuid
3
+ from pygeai.lab.managers import AILabManager
4
+ from pygeai.lab.models import Tool
5
+ from pygeai.core.common.exceptions import APIError
6
+
7
+ ai_lab_manager: AILabManager
8
+
9
+ class TestAILabPublishToolRevisionIntegration(TestCase):
10
+
11
+ def setUp(self):
12
+ self.ai_lab_manager = AILabManager(alias="beta")
13
+ self.tool_id = "c77e1f2e-0322-4dd0-b6ec-aff217f1cb32"
14
+
15
+
16
+ def __publish_tool_revision(self, revision: str, tool_id=None):
17
+ return self.ai_lab_manager.publish_tool_revision(
18
+ tool_id=self.tool_id if tool_id is None else tool_id,
19
+ revision=revision
20
+ )
21
+
22
+ def __load_tool(self):
23
+ self.random_str = str(uuid.uuid4())
24
+ return Tool(
25
+ id="c77e1f2e-0322-4dd0-b6ec-aff217f1cb32",
26
+ name=f"sdk_project_updated_tool_{self.random_str}",
27
+ description=f"Tool updated for sdk testing purposes {self.random_str}",
28
+ scope="builtin",
29
+ openApi="https://raw.usercontent.com//openapi.json",
30
+ openApiJson={"openapi": "3.0.0","info": {"title": f"Simple API overview {self.random_str}","version": "3.0.0"}},
31
+ accessScope="private",
32
+ reportEvents="None",
33
+ parameters=[{
34
+ "key": "param",
35
+ "description": f"param description {self.random_str}",
36
+ "type":"app",
37
+ "value": f"value {self.random_str}",
38
+ "data_type": "String",
39
+ "isRequired": False
40
+ }]
41
+ )
42
+
43
+
44
+ def __update_tool(self, tool: Tool = None, automatic_publish: bool = False, upsert: bool = False):
45
+ """
46
+ Helper method to update a tool.
47
+ """
48
+ tool = self.__load_tool()
49
+ return self.ai_lab_manager.update_tool(
50
+ tool = tool,
51
+ automatic_publish=False,
52
+ upsert=False
53
+ )
54
+
55
+
56
+ def test_publish_tool_revision(self):
57
+ updated_tool = self.__update_tool()
58
+ new_revision = updated_tool.revision
59
+
60
+ published_tool = self.__publish_tool_revision(revision=str(new_revision))
61
+
62
+ self.assertFalse(published_tool.is_draft, "Expected draft to be false after publishing the revision")
63
+ self.assertEqual(published_tool.revision, new_revision, "Expected last revision to be published")
64
+
65
+
66
+ def test_publish_tool_earlier_revision_with_newer_revision_published(self):
67
+ with self.assertRaises(APIError) as exception:
68
+ self.__publish_tool_revision(revision="1")
69
+ self.assertIn(
70
+ "There are newer published revisions.",
71
+ str(exception.exception),
72
+ "Expected error when trying to send a earlier revision"
73
+ )
74
+
75
+
76
+ def test_publish_tool_earlier_revision(self):
77
+ earlier_revision = (self.__update_tool()).revision
78
+ #update the tool to create a newer revision
79
+ self.__update_tool()
80
+
81
+ published_tool = self.__publish_tool_revision(revision=earlier_revision)
82
+
83
+ self.assertFalse(published_tool.is_draft, "Expected draft to be false after publishing the revision")
84
+ self.assertEqual(published_tool.revision, earlier_revision, "Expected last revision to be published")
85
+
86
+
87
+ def test_publish_tool_invalid_revision(self):
88
+ with self.assertRaises(APIError) as exception:
89
+ self.__publish_tool_revision(revision="10000000")
90
+ self.assertIn(
91
+ "Invalid revision [rev=10000000]",
92
+ str(exception.exception),
93
+ "Expected error when trying to send a revision that does not exist"
94
+ )
95
+
96
+
97
+ def test_publish_tool_string_revision(self):
98
+ with self.assertRaises(APIError) as exception:
99
+ self.__publish_tool_revision(revision="revision")
100
+ self.assertIn("Bad Request", str(exception.exception))
101
+ self.assertIn("400", str(exception.exception))
102
+
103
+
104
+ def test_publish_tool_invalid_tool_id(self):
105
+ invalid_id = "0026e53d-ea78-4cac-af9f-12650invalid"
106
+ with self.assertRaises(APIError) as exception:
107
+ self.__publish_tool_revision(revision="103", tool_id=invalid_id)
108
+ self.assertIn(
109
+ f"Tool not found [IdOrName= {invalid_id}].",
110
+ str(exception.exception),
111
+ "Expected error when sending and invalid agent id"
112
+ )
113
+
114
+
115
+ def test_publish_tool_no_tool_id(self):
116
+ with self.assertRaises(APIError) as exception:
117
+ self.__publish_tool_revision(revision="103", tool_id="")
118
+ self.assertIn("Not Found", str(exception.exception))
119
+ self.assertIn("404", str(exception.exception))
@@ -0,0 +1,114 @@
1
+ from unittest import TestCase
2
+ import uuid
3
+ from pygeai.lab.managers import AILabManager
4
+ from pygeai.lab.models import ToolParameter
5
+ from pygeai.core.common.exceptions import MissingRequirementException, InvalidAPIResponseException
6
+
7
+ ai_lab_manager: AILabManager
8
+
9
+ class TestAILabSetParameterIntegration(TestCase):
10
+ def setUp(self):
11
+ self.ai_lab_manager = AILabManager(alias="beta")
12
+ self.tool_id = "42610b61-cb47-49bf-9475-36ee652f31f3"
13
+ self.tool_parameters = self.__load_parameters()
14
+
15
+
16
+ def __set_parameter(self, tool_id: str = None, tool_public_name: str = None, parameters: list = None):
17
+ return self.ai_lab_manager.set_parameter(
18
+ tool_id = self.tool_id if tool_id is None else tool_id,
19
+ tool_public_name = tool_public_name,
20
+ parameters = self.tool_parameters if parameters is None else parameters,
21
+ )
22
+
23
+
24
+ def __load_parameters(self):
25
+ random_str = str(uuid.uuid4())
26
+ return [
27
+ ToolParameter(
28
+ key="param3",
29
+ data_type="String",
30
+ description=f"{random_str}_config",
31
+ is_required=True,
32
+ type="config",
33
+ value=random_str
34
+ )
35
+ ]
36
+
37
+
38
+ def test_set_parameter(self):
39
+ result = self.__set_parameter()
40
+ self.assertEqual(
41
+ result.content,
42
+ "Parameter set successfully",
43
+ "Expected successful parameter update"
44
+ )
45
+
46
+
47
+ def test_set_parameter_invalid_tool_id(self):
48
+ invalid_id = "0026e53d-ea78-4cac-af9f-12650invalid"
49
+
50
+ with self.assertRaises(InvalidAPIResponseException) as context:
51
+ self.__set_parameter(tool_id=invalid_id)
52
+
53
+ self.assertIn(
54
+ f"Unable to set parameter for tool {invalid_id}",
55
+ str(context.exception),
56
+ "Expected error for invalid tool ID"
57
+ )
58
+
59
+
60
+ def test_set_parameter_no_tool_id(self):
61
+ with self.assertRaises(MissingRequirementException) as context:
62
+ self.__set_parameter(tool_id="")
63
+
64
+ self.assertIn(
65
+ "Either tool_id or tool_public_name must be provided.",
66
+ str(context.exception),
67
+ "Expected error for invalid tool ID"
68
+ )
69
+
70
+
71
+ def test_set_parameter_by_tool_public_name(self):
72
+ self.tool_parameters[0].key = "Param1"
73
+
74
+ result = self.__set_parameter(tool_id = "", tool_public_name="test.sdk.beta.tool")
75
+ self.assertEqual(
76
+ result.content,
77
+ "Parameter set successfully",
78
+ "Expected successful parameter update"
79
+ )
80
+
81
+
82
+ def test_set_parameter_by_invalid_public_name(self):
83
+ invalid_public_name = "test.sdk.beta.tool.invalid"
84
+
85
+ with self.assertRaises(InvalidAPIResponseException) as exception:
86
+ self.__set_parameter(tool_id = "", tool_public_name=invalid_public_name)
87
+ self.assertIn(
88
+ f"Unable to set parameter for tool {invalid_public_name}",
89
+ str(exception.exception),
90
+ "Expected error when trying to send a request without tool_id"
91
+ )
92
+
93
+
94
+ def test_set_parameter_no_parameters(self):
95
+ self.tool_parameters = []
96
+
97
+ with self.assertRaises(MissingRequirementException) as exception:
98
+ self.__set_parameter()
99
+ self.assertIn(
100
+ "Parameters list must be provided and non-empty.",
101
+ str(exception.exception),
102
+ "Expected error when trying to send a request without parameters"
103
+ )
104
+
105
+
106
+ def test_set_parameter_not_added_parameters(self):
107
+ #param3 set on self.tool_parameters, does not exist in the public tool
108
+ with self.assertRaises(InvalidAPIResponseException) as exception:
109
+ self.__set_parameter(tool_id = "", tool_public_name = "test.sdk.beta.tool")
110
+ self.assertIn(
111
+ "Parameter param3 not found in this tool",
112
+ str(exception.exception),
113
+ "Expected error when trying to send a request without parameters"
114
+ )
@@ -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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pygeai
3
- Version: 0.4.0b10
3
+ Version: 0.4.0b12
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
@@ -25,7 +25,7 @@ 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
28
+ pygeai/chat/ui.py,sha256=-xvjCzBwWlvyq-C0kN2YPczl4Q0alyJamXULOlGjKRA,34595
29
29
  pygeai/cli/__init__.py,sha256=9fVRZ6_hmlv9adqGukFuS_s5Yb3jSyF8vv50-d4mbQo,117
30
30
  pygeai/cli/__main__.py,sha256=2RkQaX48mS2keTpv3-9rxk5dw35PL_deqxcKUUNhp6E,154
31
31
  pygeai/cli/geai.py,sha256=Smqxqc3XIy8RMuFVIsS9qNuYtqkNWba_CJJrhe7kW0E,4451
@@ -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=F9SOJWfW577y9lF6xR_LLpvVB2jevGvLH1KG7NqOdfc,25640
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,7 +57,7 @@ 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=Ecvp8E6tlEh56sPsmcAwYF0CjNn3zdJwggs-BmtdKqU,129292
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
62
  pygeai/cli/commands/lab/options.py,sha256=T13Vi97zochr0cU4yjyvvwWRPENILFDYpvqpU4uEBis,165
63
63
  pygeai/cli/commands/lab/spec.py,sha256=EjNdEnljKpYPQyT4d4ViAPrM1g7oIitv6ddnWVkWXPk,8301
@@ -76,7 +76,7 @@ pygeai/core/base/models.py,sha256=_h62nnMhJXr1BLNoaldT4d9oqCTSistfF3D2LQ3bvlg,38
76
76
  pygeai/core/base/responses.py,sha256=k-mrzNO_AtEsGTUJnyRT76FJ7gfYxQ_SAhB8MBNqPZI,763
77
77
  pygeai/core/base/session.py,sha256=WVb4MmptwdgK7paHOSvfEle_HPXRRXO8CHgi0qbgtOg,2990
78
78
  pygeai/core/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
79
- pygeai/core/common/config.py,sha256=zrlNF-0AE54qZ-XpR0RgYzM_7v8LtS0jUpM7UXrbSqQ,4475
79
+ pygeai/core/common/config.py,sha256=uEPqTTonya8IBX0KSRI927cjUJ39JvYExnkqep-5U6o,4395
80
80
  pygeai/core/common/decorators.py,sha256=X7Tv5XBmsuS7oZHSmI95eX8UkuukKoiOiNRl5w9lgR4,1227
81
81
  pygeai/core/common/exceptions.py,sha256=-eF4V0B-27zfp0aHMlZWqWRIty6P7TCOrzMRW87ZnlE,1251
82
82
  pygeai/core/embeddings/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -146,7 +146,7 @@ pygeai/health/endpoints.py,sha256=UAzMcqSXZtMj4r8M8B7a_a5LT6X_jMFNsCTvcsjNTYA,71
146
146
  pygeai/lab/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
147
147
  pygeai/lab/clients.py,sha256=5JebyNpKCVwAQpeOAkJPIHRf_6hoKA3uUm9xewm01UQ,816
148
148
  pygeai/lab/constants.py,sha256=ddgDnXP4GD0woi-FUJaJXzaWS3H6zmDN0B-v8utM95Q,170
149
- pygeai/lab/managers.py,sha256=_i9tQACTGblKkw05WMu5RLpCYlyL2PtLvNI42F11u8Y,70670
149
+ pygeai/lab/managers.py,sha256=EGU2NTpZyWtPo-VBX_wSrNOjLNPBIt7cxha9lIbuXgk,70725
150
150
  pygeai/lab/models.py,sha256=1m41gSqpXZVO9AcPVxzlsC-TgxZcCsgGUbpN5zoDMjU,71451
151
151
  pygeai/lab/runners.py,sha256=-uaCPHpFyiKtVOxlEjPjAc9h-onSdGAcYJ5IAZPqlb0,4147
152
152
  pygeai/lab/agents/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -165,7 +165,7 @@ pygeai/lab/strategies/clients.py,sha256=_a1yc8kwd50Yv4g1jqfa0gRnMiROR7Dn0gx3xqFU
165
165
  pygeai/lab/strategies/endpoints.py,sha256=LgEvUgeeN-X6VMl-tpl9_N12GRppLPScQmiMRk7Ri28,541
166
166
  pygeai/lab/strategies/mappers.py,sha256=6C_jubAVXMKLGQy5NUD0OX7SlrU2mLe2QsgzeJ1-WKw,2437
167
167
  pygeai/lab/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
168
- pygeai/lab/tools/clients.py,sha256=Jnc4AU_1fnEqhHOsey3AoKpNl1Pfw01qq_hDOmmDvE8,28394
168
+ pygeai/lab/tools/clients.py,sha256=3yESr0NQoO7qKi9s7VodxaV_4qjBlJ6cT_fBmEhyT48,28151
169
169
  pygeai/lab/tools/endpoints.py,sha256=HiGoMs4OVeCgH7EAERTtifFPl53NryA1Awh7D6AO8bA,699
170
170
  pygeai/lab/tools/mappers.py,sha256=bYi5k36h0k4mCvOnV-r8YOHKz0U9P0mH21GNs20w2eM,4998
171
171
  pygeai/man/__init__.py,sha256=gqGI92vUPt6RPweoWX3mTUYPWNDlm6aGUjQOnYXqthk,53
@@ -271,22 +271,28 @@ pygeai/tests/gam/test_clients.py,sha256=vNz-4ux0cubztTY-_fEPWEoMCt5VAmZLecd0V-sE
271
271
  pygeai/tests/health/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
272
272
  pygeai/tests/health/test_clients.py,sha256=kfakkZHFMfo2IAN-PzmtMGmgR4iNiN1RpRopI--0qHI,1525
273
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
274
277
  pygeai/tests/integration/chat/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
275
278
  pygeai/tests/integration/chat/test_generate_image.py,sha256=byCQQK6dIy68yPAhAa66bh7N0Xz5WnKSClx1vaIIzZA,5431
276
279
  pygeai/tests/integration/lab/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
277
280
  pygeai/tests/integration/lab/agents/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
278
281
  pygeai/tests/integration/lab/agents/test_agents_list.py,sha256=F2KUCdeiaBC3dn8ARNWqSz_kJcRyA0HC1nquhamN35Q,4187
279
- pygeai/tests/integration/lab/agents/test_create_agent.py,sha256=yL3owPJP0RoHSy3lEAdH06LJXqxgt3f2l2plk75d4cc,14206
282
+ pygeai/tests/integration/lab/agents/test_create_agent.py,sha256=JLCnrij_uS4wTvu06Ng3ODfLTikFQwmPep4HG0ebUKI,14104
280
283
  pygeai/tests/integration/lab/agents/test_create_sharing_link.py,sha256=y-e8Q_TfuLz7XXMRERSKA_-OQJUMBIsJcK0lQ0Oh858,2467
281
284
  pygeai/tests/integration/lab/agents/test_delete_agent.py,sha256=sb3RfoZJdzQvcVdNcXY2C2FO3yY1ZNiAZ_6Ay6f331E,2524
282
285
  pygeai/tests/integration/lab/agents/test_get_agent.py,sha256=oW1F6SENvhL9jZC021Rj-f_Xek2DSTx3SsZBr3YT6Hk,3666
283
- pygeai/tests/integration/lab/agents/test_publish_agent_revision.py,sha256=4vpuAVBenLCyWvaKTA2PQVLn_e-abGDscngUzZm3dMs,5284
284
- pygeai/tests/integration/lab/agents/test_update_agent.py,sha256=1seho_GOtOHik_YJ9GPA4McSZorohhFRvuzY7UYXbxo,11726
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
285
288
  pygeai/tests/integration/lab/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
286
289
  pygeai/tests/integration/lab/tools/test_create_tool.py,sha256=0Yzlu9ATnsxPVPa4vO4j-j5Hc6VyHQ2KoSaf0dfmqpk,12351
287
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
288
292
  pygeai/tests/integration/lab/tools/test_get_tool.py,sha256=3fVDQlklmvOUgYDp0ATv5RqRmApgD4Qw_YGqjBOaOOo,3437
289
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
290
296
  pygeai/tests/integration/lab/tools/test_update_tool.py,sha256=tZKZDoYS6RuTdRLgAmENq5tRvK-MohJGCt-s83QoBCA,11683
291
297
  pygeai/tests/lab/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
292
298
  pygeai/tests/lab/test_managers.py,sha256=AsOAvyCkRpbskEy214aV2TwrqilWH6bxOiTWDOb1twQ,29778
@@ -383,7 +389,7 @@ pygeai/tests/snippets/lab/agents/create_agent_edge_case.py,sha256=8dA9giNdsHjFZs
383
389
  pygeai/tests/snippets/lab/agents/create_agent_without_instructions.py,sha256=jd7HKhle_c0S0vI80AejOyLaNqBWkILlRF_znzyCGcQ,1879
384
390
  pygeai/tests/snippets/lab/agents/delete_agent.py,sha256=GfDX667_V3tZMz3vjsbrxoFZggzpwjZYH_PVO2Qjw5s,269
385
391
  pygeai/tests/snippets/lab/agents/get_agent.py,sha256=bcqloJHwmNsFjEfri6QIRaTuHzwLtfEqIQPIC5pdkWQ,516
386
- 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
387
393
  pygeai/tests/snippets/lab/agents/list_agents.py,sha256=gY5RBFUozhkk1uJO6opjkLmKmYpF9Ws-B7Oibhs99qQ,457
388
394
  pygeai/tests/snippets/lab/agents/publish_agent_revision.py,sha256=ATbFnnSLYRmFTC4GJJUyBwxKosoTWx661Q9FpuktREM,344
389
395
  pygeai/tests/snippets/lab/agents/update_agent.py,sha256=6qCnqkowCCygEl3tv_nvdlwXG8k0-LEloKYQUdIfkrs,1943
@@ -406,7 +412,7 @@ pygeai/tests/snippets/lab/strategies/get_reasoning_strategy.py,sha256=OxxXIRWH_c
406
412
  pygeai/tests/snippets/lab/strategies/list_reasoning_strategies.py,sha256=4pqsW16m-oiv_UUVLgZrkeWZESIfDq2nvcfNC0ZpAGo,485
407
413
  pygeai/tests/snippets/lab/strategies/update_reasoning_strategy.py,sha256=OIoHNkdnXbC9GacPgXUG1jKlVizVtWfRI-E8_3xF5b0,889
408
414
  pygeai/tests/snippets/lab/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
409
- 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
410
416
  pygeai/tests/snippets/lab/tools/create_tool_edge_case.py,sha256=8w4mvoRTMTyc70yYm2bgV2dr_Rh5QpPJR8VoqX-eY-s,1465
411
417
  pygeai/tests/snippets/lab/tools/delete_tool.py,sha256=pnIkYvdP7X7Gx79AMK5MSVliIXdHSpyVwRhH3kgi7ys,452
412
418
  pygeai/tests/snippets/lab/tools/get_parameter.py,sha256=dXdlHhoWxzZIYdsvHKnLLT5Vff2Tip46XCoOo-B8Gf0,490
@@ -496,9 +502,9 @@ pygeai/vendor/a2a/utils/helpers.py,sha256=6Tbd8SVfXvdNEk6WYmLOjrAxkzFf1aIg8dkFfB
496
502
  pygeai/vendor/a2a/utils/message.py,sha256=gc_EKO69CJ4HkR76IFgsy-kENJz1dn7CfSgWJWvt-gs,2197
497
503
  pygeai/vendor/a2a/utils/task.py,sha256=BYRA_L1HpoUGJAVlyHML0lCM9Awhf2Ovjj7oPFXKbh0,1647
498
504
  pygeai/vendor/a2a/utils/telemetry.py,sha256=VvSp1Ztqaobkmq9-3sNhhPEilJS32-JTSfKzegkj6FU,10861
499
- pygeai-0.4.0b10.dist-info/licenses/LICENSE,sha256=eHfqo7-AWS8cMq0cg03lq7owsLeCmZA-xS5L0kuHnl8,1474
500
- pygeai-0.4.0b10.dist-info/METADATA,sha256=v2dh0SCr1-9mioQuxBd4PjRxun1SntD_QHjMJZUjO-w,6941
501
- pygeai-0.4.0b10.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
502
- pygeai-0.4.0b10.dist-info/entry_points.txt,sha256=OAmwuXVCQBTCE3HeVegVd37hbhCcp9TPahvdrCuMYWw,178
503
- pygeai-0.4.0b10.dist-info/top_level.txt,sha256=bJFwp2tURmCfB94yXDF7ylvdSJXFDDJsyUOb-7PJgwc,7
504
- pygeai-0.4.0b10.dist-info/RECORD,,
505
+ pygeai-0.4.0b12.dist-info/licenses/LICENSE,sha256=eHfqo7-AWS8cMq0cg03lq7owsLeCmZA-xS5L0kuHnl8,1474
506
+ pygeai-0.4.0b12.dist-info/METADATA,sha256=4GKLJjLWFsGzD8vMzbE90o9HKovdZsG4_Ip_EBAOBU0,6941
507
+ pygeai-0.4.0b12.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
508
+ pygeai-0.4.0b12.dist-info/entry_points.txt,sha256=OAmwuXVCQBTCE3HeVegVd37hbhCcp9TPahvdrCuMYWw,178
509
+ pygeai-0.4.0b12.dist-info/top_level.txt,sha256=bJFwp2tURmCfB94yXDF7ylvdSJXFDDJsyUOb-7PJgwc,7
510
+ pygeai-0.4.0b12.dist-info/RECORD,,