grasp_agents 0.4.4__py3-none-any.whl → 0.4.7__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.
grasp_agents/cloud_llm.py CHANGED
@@ -42,26 +42,28 @@ class APIProvider(TypedDict):
42
42
  struct_outputs_support: NotRequired[tuple[str, ...]]
43
43
 
44
44
 
45
- API_PROVIDERS: dict[APIProviderName, APIProvider] = {
46
- "openai": APIProvider(
47
- name="openai",
48
- base_url="https://api.openai.com/v1",
49
- api_key=os.getenv("OPENAI_API_KEY"),
50
- struct_outputs_support=("*",),
51
- ),
52
- "openrouter": APIProvider(
53
- name="openrouter",
54
- base_url="https://openrouter.ai/api/v1",
55
- api_key=os.getenv("OPENROUTER_API_KEY"),
56
- struct_outputs_support=(),
57
- ),
58
- "google_ai_studio": APIProvider(
59
- name="google_ai_studio",
60
- base_url="https://generativelanguage.googleapis.com/v1beta/openai/",
61
- api_key=os.getenv("GOOGLE_AI_STUDIO_API_KEY"),
62
- struct_outputs_support=("*",),
63
- ),
64
- }
45
+ def get_api_providers() -> dict[APIProviderName, APIProvider]:
46
+ """Returns a dictionary of available API providers."""
47
+ return {
48
+ "openai": APIProvider(
49
+ name="openai",
50
+ base_url="https://api.openai.com/v1",
51
+ api_key=os.getenv("OPENAI_API_KEY"),
52
+ struct_outputs_support=("*",),
53
+ ),
54
+ "openrouter": APIProvider(
55
+ name="openrouter",
56
+ base_url="https://openrouter.ai/api/v1",
57
+ api_key=os.getenv("OPENROUTER_API_KEY"),
58
+ struct_outputs_support=(),
59
+ ),
60
+ "google_ai_studio": APIProvider(
61
+ name="google_ai_studio",
62
+ base_url="https://generativelanguage.googleapis.com/v1beta/openai/",
63
+ api_key=os.getenv("GOOGLE_AI_STUDIO_API_KEY"),
64
+ struct_outputs_support=("*",),
65
+ ),
66
+ }
65
67
 
66
68
 
67
69
  def retry_error_callback(retry_state: RetryCallState) -> Completion:
@@ -142,12 +144,16 @@ class CloudLLM(LLM[SettingsT_co, ConvertT_co], Generic[SettingsT_co, ConvertT_co
142
144
  if len(model_name_parts) == 2:
143
145
  api_provider_name, api_model_name = model_name_parts
144
146
  self._api_model_name: str = api_model_name
145
- if api_provider_name not in API_PROVIDERS:
147
+
148
+ api_providers = get_api_providers()
149
+
150
+ if api_provider_name not in api_providers:
146
151
  raise ValueError(
147
152
  f"API provider '{api_provider_name}' is not supported. "
148
- f"Supported providers are: {', '.join(API_PROVIDERS.keys())}"
153
+ f"Supported providers are: {', '.join(api_providers.keys())}"
149
154
  )
150
- _api_provider = API_PROVIDERS[api_provider_name]
155
+
156
+ _api_provider = api_providers[api_provider_name]
151
157
  elif api_provider is not None:
152
158
  self._api_model_name: str = model_name
153
159
  _api_provider = api_provider
grasp_agents/utils.py CHANGED
@@ -90,10 +90,18 @@ def validate_obj_from_json_or_py_string(
90
90
  strip_language_markdown: bool = True,
91
91
  ) -> T | str:
92
92
  _selected_adapter: TypeAdapter[T] | None = None
93
+ _selected_tag: str | None = None
94
+ s_orig = s
95
+
93
96
  if isinstance(adapter, Mapping):
94
- for _marker, _adapter in adapter.items():
95
- if _marker in s:
96
- _selected_adapter = _adapter
97
+ for _tag, _adapter in adapter.items():
98
+ match = re.search(rf"<{_tag}>\s*(.*?)\s*</{_tag}>", s, re.DOTALL)
99
+ if not match:
100
+ continue
101
+ s = match.group(1).strip()
102
+ _selected_adapter = _adapter
103
+ _selected_tag = _tag
104
+ break
97
105
  if _selected_adapter is None:
98
106
  return s
99
107
  else:
@@ -126,9 +134,12 @@ def validate_obj_from_json_or_py_string(
126
134
  parsed = s
127
135
  return _selected_adapter.validate_python(parsed)
128
136
  except ValidationError as exc:
129
- raise OutputValidationError(
130
- f"Invalid JSON or Python string:\n{s}\nExpected type: {_type}"
131
- ) from exc
137
+ err_message = f"Invalid JSON or Python string:\n{s_orig}"
138
+ if _selected_tag:
139
+ err_message += f"\nExpected type {_type} within tag <{_selected_tag}>"
140
+ else:
141
+ err_message += f"\nExpected type {_type}"
142
+ raise OutputValidationError(err_message) from exc
132
143
 
133
144
 
134
145
  def extract_xml_list(text: str) -> list[str]:
@@ -170,6 +181,7 @@ async def asyncio_gather_with_pbar(
170
181
  no_tqdm: bool = False,
171
182
  desc: str | None = None,
172
183
  ) -> list[Any]:
184
+ # TODO: optimize
173
185
  pbar = tqdm(total=len(corouts), desc=desc, disable=no_tqdm)
174
186
 
175
187
  async def run_and_update(coro: Coroutine[Any, Any, Any]) -> Any:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: grasp_agents
3
- Version: 0.4.4
3
+ Version: 0.4.7
4
4
  Summary: Grasp Agents Library
5
5
  License-File: LICENSE.md
6
6
  Requires-Python: <4,>=3.11.4
@@ -1,5 +1,5 @@
1
1
  grasp_agents/__init__.py,sha256=CIsyUasb9HBC3M4olg6ATAwKXtVNmmtpyGJrt7hpZW4,947
2
- grasp_agents/cloud_llm.py,sha256=Pnvey9HaRCudbOCx8vtbRYVsiG-Fn-vIssyUafUSq-0,13641
2
+ grasp_agents/cloud_llm.py,sha256=DKzXkjBhmLHLTL7TLZJrdtXxp57NA77oXP9vxisu0So,13849
3
3
  grasp_agents/comm_processor.py,sha256=2xDZwv80velCyhK04xlQzlaAqj7sdnOfyYOHSaVC54g,7013
4
4
  grasp_agents/costs_dict.yaml,sha256=2MFNWtkv5W5WSCcv1Cj13B1iQLVv5Ot9pS_KW2Gu2DA,2510
5
5
  grasp_agents/errors.py,sha256=u-P8NZ3S7THQP5Bjv9SFC_JbHd3CKhX3dTWUObEBzmo,461
@@ -18,7 +18,7 @@ grasp_agents/processor.py,sha256=WZ7ps3b3knBaGrMAjEaIBUlOV1L_Dh4H6BUOf4CGWF8,112
18
18
  grasp_agents/prompt_builder.py,sha256=wDcB1UaOH8vdxw1tmWZwVZS_bCdWU0VKQvHLpI8SnCk,7970
19
19
  grasp_agents/run_context.py,sha256=pUi2a9WeHUg67cUTQ5T13mmJ3vzQfv-855fWLPeYRmo,1438
20
20
  grasp_agents/usage_tracker.py,sha256=3gmgPcB7qHAl5W5Ffnmu_8GOcKBSv3xM1NLy-HMuSlo,3691
21
- grasp_agents/utils.py,sha256=5WpMEZB42QmXGUwMJjtr3aJOMUZlQust3UtMGXs8Uq0,5501
21
+ grasp_agents/utils.py,sha256=fSi4nOwRezg4umzHVO23-mhuyjMAvJQLAfsmGjxxrKc,5928
22
22
  grasp_agents/openai/__init__.py,sha256=wpTeew6EjhM6esHCKrEKUpwq0kygMN2QQDxYtmbRG8Y,4201
23
23
  grasp_agents/openai/completion_chunk_converters.py,sha256=TFOA7MJniiSV6_lPZsPSg06GlfdWguTrYS2Hd45BjcU,2674
24
24
  grasp_agents/openai/completion_converters.py,sha256=vzPEkUOX4l2hobKxZjEk_dyWfzeYesO0DlvWvNVb-Sg,2656
@@ -44,7 +44,7 @@ grasp_agents/workflow/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3h
44
44
  grasp_agents/workflow/looped_workflow.py,sha256=eQkjCo6j3W5Xc7mw3AGmXpUhTkK2BmhrvCuht2UkZuI,4537
45
45
  grasp_agents/workflow/sequential_workflow.py,sha256=UCHZXvTy47S0UG0WwuKp2G7Az6dAcE5tIFPaOXhxcWM,2347
46
46
  grasp_agents/workflow/workflow_processor.py,sha256=lGW-Cy1QraU1AaCPVRs9-EtU5Z_3O3EAnuyIPzD6KQ8,3134
47
- grasp_agents-0.4.4.dist-info/METADATA,sha256=t3yTj29JJi4h2CHsIWTyZVTuyLu_PKlSRlGWJ0QtuyM,6868
48
- grasp_agents-0.4.4.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
49
- grasp_agents-0.4.4.dist-info/licenses/LICENSE.md,sha256=-nNNdWqGB8gJ2O-peFQ2Irshv5tW5pHKyTcYkwvH7CE,1201
50
- grasp_agents-0.4.4.dist-info/RECORD,,
47
+ grasp_agents-0.4.7.dist-info/METADATA,sha256=7tqiDpnb24hs8RWTTl81rw1ls3I8drnPVkFekRi4Le0,6868
48
+ grasp_agents-0.4.7.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
49
+ grasp_agents-0.4.7.dist-info/licenses/LICENSE.md,sha256=-nNNdWqGB8gJ2O-peFQ2Irshv5tW5pHKyTcYkwvH7CE,1201
50
+ grasp_agents-0.4.7.dist-info/RECORD,,