versionhq 1.1.11.7__tar.gz → 1.1.11.8__tar.gz
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.
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/.gitignore +2 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/PKG-INFO +1 -1
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/pyproject.toml +1 -1
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/src/versionhq/__init__.py +1 -1
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/src/versionhq/agent/model.py +36 -77
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/src/versionhq/knowledge/source_docling.py +13 -10
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/src/versionhq/llm/llm_vars.py +17 -2
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/src/versionhq/llm/model.py +87 -55
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/src/versionhq/task/model.py +1 -1
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/src/versionhq.egg-info/PKG-INFO +1 -1
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/tests/agent/agent_test.py +0 -5
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/tests/llm/llm_test.py +1 -2
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/tests/task/__init__.py +0 -8
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/tests/task/task_test.py +7 -57
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/uv.lock +34 -23
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/.github/workflows/publish.yml +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/.github/workflows/publish_testpypi.yml +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/.github/workflows/run_tests.yml +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/.github/workflows/security_check.yml +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/.pre-commit-config.yaml +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/.python-version +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/LICENSE +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/README.md +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/SECURITY.md +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/db/preprocess.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/requirements-dev.txt +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/requirements.txt +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/runtime.txt +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/setup.cfg +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/src/versionhq/_utils/__init__.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/src/versionhq/_utils/i18n.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/src/versionhq/_utils/logger.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/src/versionhq/_utils/process_config.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/src/versionhq/_utils/usage_metrics.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/src/versionhq/_utils/vars.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/src/versionhq/agent/TEMPLATES/Backstory.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/src/versionhq/agent/TEMPLATES/__init__.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/src/versionhq/agent/__init__.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/src/versionhq/agent/default_agents.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/src/versionhq/agent/parser.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/src/versionhq/agent/rpm_controller.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/src/versionhq/cli/__init__.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/src/versionhq/clients/__init__.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/src/versionhq/clients/customer/__init__.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/src/versionhq/clients/customer/model.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/src/versionhq/clients/product/__init__.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/src/versionhq/clients/product/model.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/src/versionhq/clients/workflow/__init__.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/src/versionhq/clients/workflow/model.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/src/versionhq/knowledge/__init__.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/src/versionhq/knowledge/_utils.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/src/versionhq/knowledge/embedding.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/src/versionhq/knowledge/model.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/src/versionhq/knowledge/source.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/src/versionhq/knowledge/storage.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/src/versionhq/llm/__init__.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/src/versionhq/memory/__init__.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/src/versionhq/memory/contextual_memory.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/src/versionhq/memory/model.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/src/versionhq/storage/__init__.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/src/versionhq/storage/base.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/src/versionhq/storage/ltm_sqlite_storage.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/src/versionhq/storage/mem0_storage.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/src/versionhq/storage/rag_storage.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/src/versionhq/storage/task_output_storage.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/src/versionhq/storage/utils.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/src/versionhq/task/TEMPLATES/Description.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/src/versionhq/task/__init__.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/src/versionhq/task/evaluate.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/src/versionhq/task/formatter.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/src/versionhq/task/log_handler.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/src/versionhq/task/structured_response.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/src/versionhq/team/__init__.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/src/versionhq/team/model.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/src/versionhq/team/team_planner.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/src/versionhq/tool/__init__.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/src/versionhq/tool/cache_handler.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/src/versionhq/tool/composio_tool.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/src/versionhq/tool/composio_tool_vars.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/src/versionhq/tool/decorator.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/src/versionhq/tool/model.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/src/versionhq/tool/tool_handler.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/src/versionhq.egg-info/SOURCES.txt +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/src/versionhq.egg-info/dependency_links.txt +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/src/versionhq.egg-info/requires.txt +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/src/versionhq.egg-info/top_level.txt +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/tests/__init__.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/tests/agent/__init__.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/tests/cli/__init__.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/tests/clients/customer_test.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/tests/clients/product_test.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/tests/clients/workflow_test.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/tests/conftest.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/tests/knowledge/__init__.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/tests/knowledge/knowledge_test.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/tests/knowledge/mock_report_compressed.pdf +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/tests/llm/__init__.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/tests/memory/__init__.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/tests/memory/memory_test.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/tests/team/Prompts/Demo_test.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/tests/team/__init__.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/tests/team/team_test.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/tests/tool/__init__.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/tests/tool/composio_test.py +0 -0
- {versionhq-1.1.11.7 → versionhq-1.1.11.8}/tests/tool/tool_test.py +0 -0
@@ -15,7 +15,7 @@ exclude = ["test*", "__pycache__", "*.egg-info"]
|
|
15
15
|
|
16
16
|
[project]
|
17
17
|
name = "versionhq"
|
18
|
-
version = "1.1.11.
|
18
|
+
version = "1.1.11.8"
|
19
19
|
authors = [{ name = "Kuriko Iwai", email = "kuriko@versi0n.io" }]
|
20
20
|
description = "LLM orchestration frameworks for model-agnostic AI agents that handle complex outbound workflows"
|
21
21
|
readme = "README.md"
|
@@ -6,10 +6,10 @@ from typing_extensions import Self
|
|
6
6
|
from dotenv import load_dotenv
|
7
7
|
import litellm
|
8
8
|
|
9
|
-
from pydantic import UUID4, BaseModel, Field, InstanceOf, PrivateAttr, model_validator, field_validator
|
9
|
+
from pydantic import UUID4, BaseModel, Field, InstanceOf, PrivateAttr, model_validator, field_validator
|
10
10
|
from pydantic_core import PydanticCustomError
|
11
11
|
|
12
|
-
from versionhq.llm.model import LLM, DEFAULT_CONTEXT_WINDOW_SIZE, DEFAULT_MODEL_NAME
|
12
|
+
from versionhq.llm.model import LLM, DEFAULT_CONTEXT_WINDOW_SIZE, DEFAULT_MODEL_NAME, PROVIDERS
|
13
13
|
from versionhq.tool.model import Tool, ToolSet
|
14
14
|
from versionhq.knowledge.model import BaseKnowledgeSource, Knowledge
|
15
15
|
from versionhq.memory.contextual_memory import ContextualMemory
|
@@ -162,90 +162,44 @@ class Agent(BaseModel):
|
|
162
162
|
@model_validator(mode="after")
|
163
163
|
def set_up_llm(self) -> Self:
|
164
164
|
"""
|
165
|
-
Set up
|
166
|
-
Pass the model config params: `llm`, `max_tokens`, `max_execution_time`, `callbacks`,`respect_context_window` to the LLM class.
|
167
|
-
The base model is selected on the client app, else use the default model.
|
165
|
+
Set up `llm` and `function_calling_llm` as valid LLM objects using the given values.
|
168
166
|
"""
|
169
|
-
|
170
167
|
self.agent_ops_agent_name = self.role
|
168
|
+
self.llm = self._set_llm(llm=self.llm)
|
169
|
+
function_calling_llm = self.function_calling_llm if self.function_calling_llm else self.llm if self.llm else None
|
170
|
+
self.function_calling_llm = self._set_llm(llm=function_calling_llm)
|
171
|
+
return self
|
171
172
|
|
172
|
-
if isinstance(self.llm, LLM):
|
173
|
-
llm = self._set_llm_params(self.llm)
|
174
|
-
self.llm = llm
|
175
173
|
|
176
|
-
|
177
|
-
|
178
|
-
llm = LLM(model=model_name)
|
179
|
-
updated_llm = self._set_llm_params(llm)
|
180
|
-
self.llm = updated_llm
|
174
|
+
def _set_llm(self, llm: Any | None) -> LLM:
|
175
|
+
llm = llm if llm is not None else DEFAULT_MODEL_NAME
|
181
176
|
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
llm = LLM(model=model_name if model_name is not None else DEFAULT_MODEL_NAME)
|
186
|
-
updated_llm = self._set_llm_params(llm, { k: v for k, v in self.llm.items() if v is not None })
|
187
|
-
self.llm = updated_llm
|
177
|
+
match llm:
|
178
|
+
case LLM():
|
179
|
+
return self._set_llm_params(llm=llm)
|
188
180
|
|
189
|
-
|
181
|
+
case str():
|
182
|
+
llm_obj = LLM(model=llm)
|
183
|
+
return self._set_llm_params(llm=llm_obj)
|
184
|
+
|
185
|
+
case dict():
|
186
|
+
model_name = llm.pop("model_name", llm.pop("deployment_name", str(llm)))
|
187
|
+
llm_obj = LLM(model=model_name if model_name else DEFAULT_MODEL_NAME)
|
188
|
+
return self._set_llm_params(llm_obj, { k: v for k, v in llm.items() if v is not None })
|
189
|
+
|
190
|
+
case _:
|
190
191
|
model_name = (getattr(self.llm, "model_name") or getattr(self.llm, "deployment_name") or str(self.llm))
|
191
|
-
|
192
|
+
llm_obj = LLM(model=model_name)
|
192
193
|
llm_params = {
|
193
|
-
"max_tokens": (getattr(
|
194
|
-
"timeout": getattr(
|
195
|
-
"callbacks": getattr(
|
196
|
-
"temperature": getattr(
|
197
|
-
"logprobs": getattr(
|
198
|
-
"api_key": getattr(
|
199
|
-
"base_url": getattr(
|
194
|
+
"max_tokens": (getattr(llm, "max_tokens") or self.max_tokens or 3000),
|
195
|
+
"timeout": getattr(llm, "timeout", self.max_execution_time),
|
196
|
+
"callbacks": getattr(llm, "callbacks", None),
|
197
|
+
"temperature": getattr(llm, "temperature", None),
|
198
|
+
"logprobs": getattr(llm, "logprobs", None),
|
199
|
+
"api_key": getattr(llm, "api_key", os.environ.get("LITELLM_API_KEY", None)),
|
200
|
+
"base_url": getattr(llm, "base_url", None),
|
200
201
|
}
|
201
|
-
|
202
|
-
self.llm = updated_llm
|
203
|
-
|
204
|
-
|
205
|
-
"""
|
206
|
-
Set up funcion_calling LLM as well.
|
207
|
-
Check if the model supports function calling, setup LLM instance accordingly, using the same params with the LLM.
|
208
|
-
"""
|
209
|
-
if self.function_calling_llm:
|
210
|
-
if isinstance(self.function_calling_llm, LLM):
|
211
|
-
if self.function_calling_llm._supports_function_calling() == False:
|
212
|
-
self.function_calling_llm = LLM(model=DEFAULT_MODEL_NAME)
|
213
|
-
|
214
|
-
updated_llm = self._set_llm_params(self.function_calling_llm)
|
215
|
-
self.function_calling_llm = updated_llm
|
216
|
-
|
217
|
-
elif isinstance(self.function_calling_llm, str):
|
218
|
-
llm = LLM(model=self.function_calling_llm)
|
219
|
-
|
220
|
-
if llm._supports_function_calling() == False:
|
221
|
-
llm = LLM(model=DEFAULT_MODEL_NAME)
|
222
|
-
|
223
|
-
updated_llm = self._set_llm_params(llm)
|
224
|
-
self.function_calling_llm = updated_llm
|
225
|
-
|
226
|
-
else:
|
227
|
-
if isinstance(self.function_calling_llm, dict):
|
228
|
-
model_name = self.function_calling_llm.pop("model_name", self.function_calling_llm.pop("deployment_name", str(self.function_calling_llm)))
|
229
|
-
llm = LLM(model=model_name)
|
230
|
-
updated_llm = self._set_llm_params(llm, { k: v for k, v in self.function_calling_llm.items() if v is not None })
|
231
|
-
self.function_calling_llm = updated_llm
|
232
|
-
|
233
|
-
else:
|
234
|
-
model_name = (getattr(self.function_calling_llm, "model_name") or getattr(self.function_calling_llm, "deployment_name") or str(self.function_calling_llm))
|
235
|
-
llm = LLM(model=model_name)
|
236
|
-
llm_params = {
|
237
|
-
"max_tokens": (getattr(self.function_calling_llm, "max_tokens") or self.max_tokens or 3000),
|
238
|
-
"timeout": getattr(self.function_calling_llm, "timeout", self.max_execution_time),
|
239
|
-
"callbacks": getattr(self.function_calling_llm, "callbacks", None),
|
240
|
-
"temperature": getattr(self.function_calling_llm, "temperature", None),
|
241
|
-
"logprobs": getattr(self.function_calling_llm, "logprobs", None),
|
242
|
-
"api_key": getattr(self.function_calling_llm, "api_key", os.environ.get("LITELLM_API_KEY", None)),
|
243
|
-
"base_url": getattr(self.function_calling_llm, "base_url", None),
|
244
|
-
}
|
245
|
-
updated_llm = self._set_llm_params(llm, llm_params)
|
246
|
-
self.function_calling_llm = updated_llm
|
247
|
-
|
248
|
-
return self
|
202
|
+
return self._set_llm_params(llm=llm_obj, config=llm_params)
|
249
203
|
|
250
204
|
|
251
205
|
def _set_llm_params(self, llm: LLM, config: Dict[str, Any] = None) -> LLM:
|
@@ -257,6 +211,11 @@ class Agent(BaseModel):
|
|
257
211
|
llm.timeout = self.max_execution_time if llm.timeout is None else llm.timeout
|
258
212
|
llm.max_tokens = self.max_tokens if self.max_tokens else llm.max_tokens
|
259
213
|
|
214
|
+
if llm.provider is None:
|
215
|
+
provider_name = llm.model.split("/")[0]
|
216
|
+
valid_provider = provider_name if provider_name in PROVIDERS else None
|
217
|
+
llm.provider = valid_provider
|
218
|
+
|
260
219
|
if self.callbacks:
|
261
220
|
llm.callbacks = self.callbacks
|
262
221
|
llm._set_callbacks(llm.callbacks)
|
@@ -12,17 +12,11 @@ try:
|
|
12
12
|
except ImportError:
|
13
13
|
import envoy
|
14
14
|
envoy.run("uv add docling --optional docling")
|
15
|
-
|
16
|
-
from docling.datamodel.base_models import InputFormat
|
17
|
-
from docling.document_converter import DocumentConverter
|
18
|
-
from docling.exceptions import ConversionError
|
19
|
-
from docling_core.transforms.chunker.hierarchical_chunker import HierarchicalChunker
|
20
|
-
from docling_core.types.doc.document import DoclingDocument
|
21
15
|
DOCLING_AVAILABLE = True
|
22
16
|
except:
|
23
17
|
DOCLING_AVAILABLE = False
|
24
18
|
|
25
|
-
from pydantic import Field
|
19
|
+
from pydantic import Field
|
26
20
|
|
27
21
|
from versionhq.knowledge.source import BaseKnowledgeSource
|
28
22
|
from versionhq.storage.utils import fetch_db_storage_path
|
@@ -52,11 +46,20 @@ class DoclingSource(BaseKnowledgeSource):
|
|
52
46
|
))
|
53
47
|
|
54
48
|
def __init__(self, *args, **kwargs):
|
55
|
-
if
|
56
|
-
|
57
|
-
|
49
|
+
if DOCLING_AVAILABLE:
|
50
|
+
from docling.datamodel.base_models import InputFormat
|
51
|
+
from docling.document_converter import DocumentConverter
|
52
|
+
from docling.exceptions import ConversionError
|
53
|
+
from docling_core.transforms.chunker.hierarchical_chunker import HierarchicalChunker
|
54
|
+
from docling_core.types.doc.document import DoclingDocument
|
55
|
+
|
58
56
|
super().__init__(*args, **kwargs)
|
59
57
|
|
58
|
+
else:
|
59
|
+
raise ImportError("The docling package is required. Please install the package using: $ uv add docling.")
|
60
|
+
# else:
|
61
|
+
# super().__init__(*args, **kwargs)
|
62
|
+
|
60
63
|
|
61
64
|
def _convert_source_to_docling_documents(self) -> List["DoclingDocument"]:
|
62
65
|
conv_results_iter = self.document_converter.convert_all(self.valid_file_paths)
|
@@ -7,7 +7,7 @@ PROVIDERS = [
|
|
7
7
|
"openai",
|
8
8
|
"gemini",
|
9
9
|
"sagemaker",
|
10
|
-
|
10
|
+
"huggingface", # need api base
|
11
11
|
"anthropic",
|
12
12
|
"ollama",
|
13
13
|
"watson",
|
@@ -17,6 +17,19 @@ PROVIDERS = [
|
|
17
17
|
"llama",
|
18
18
|
]
|
19
19
|
|
20
|
+
ENDPOINT_PROVIDERS = [
|
21
|
+
# "openai",
|
22
|
+
# "gemini",
|
23
|
+
# "sagemaker",
|
24
|
+
"huggingface",
|
25
|
+
# "anthropic",
|
26
|
+
# "ollama",
|
27
|
+
# "watson",
|
28
|
+
# "bedrock",
|
29
|
+
# "azure",
|
30
|
+
# "cerebras",
|
31
|
+
# "llama",
|
32
|
+
]
|
20
33
|
|
21
34
|
"""
|
22
35
|
List of models available on the framework.
|
@@ -48,6 +61,9 @@ MODELS = {
|
|
48
61
|
"claude-3-opus-20240229",
|
49
62
|
"claude-3-haiku-20240307",
|
50
63
|
],
|
64
|
+
"huggingface": [
|
65
|
+
"huggingface/qwen/qwen2.5-VL-72B-Instruct",
|
66
|
+
],
|
51
67
|
# "sagemaker": [
|
52
68
|
# "sagemaker/huggingface-text2text-flan-t5-base",
|
53
69
|
# "sagemaker/huggingface-llm-gemma-7b",
|
@@ -61,7 +77,6 @@ MODELS = {
|
|
61
77
|
"ollama/llama3.1",
|
62
78
|
"ollama/mixtral",
|
63
79
|
"ollama/mixtral-8x22B-Instruct-v0.1",
|
64
|
-
|
65
80
|
],
|
66
81
|
"deepseek": [
|
67
82
|
"deepseek/deepseek-reasoner",
|
@@ -10,10 +10,10 @@ from litellm import get_supported_openai_params, JSONSchemaValidationError
|
|
10
10
|
from contextlib import contextmanager
|
11
11
|
from typing import Any, Dict, List, Optional
|
12
12
|
from typing_extensions import Self
|
13
|
-
from pydantic import
|
13
|
+
from pydantic import BaseModel, Field, PrivateAttr, field_validator, model_validator, create_model, InstanceOf, ConfigDict
|
14
14
|
from pydantic_core import PydanticCustomError
|
15
15
|
|
16
|
-
from versionhq.llm.llm_vars import LLM_CONTEXT_WINDOW_SIZES, MODELS, PARAMS
|
16
|
+
from versionhq.llm.llm_vars import LLM_CONTEXT_WINDOW_SIZES, MODELS, PARAMS, PROVIDERS, ENDPOINT_PROVIDERS
|
17
17
|
from versionhq.tool.model import Tool, ToolSet
|
18
18
|
from versionhq._utils.logger import Logger
|
19
19
|
|
@@ -22,7 +22,8 @@ load_dotenv(override=True)
|
|
22
22
|
LITELLM_API_KEY = os.environ.get("LITELLM_API_KEY")
|
23
23
|
LITELLM_API_BASE = os.environ.get("LITELLM_API_BASE")
|
24
24
|
DEFAULT_CONTEXT_WINDOW_SIZE = int(8192 * 0.75)
|
25
|
-
DEFAULT_MODEL_NAME = os.environ.get("DEFAULT_MODEL_NAME")
|
25
|
+
DEFAULT_MODEL_NAME = os.environ.get("DEFAULT_MODEL_NAME", "gpt-4o-mini")
|
26
|
+
DEFAULT_MODEL_PROVIDER_NAME = os.environ.get("DEFAULT_MODEL_PROVIDER_NAME", "openai")
|
26
27
|
|
27
28
|
# proxy_openai_client = OpenAI(api_key=os.environ.get("OPENAI_API_KEY"), organization="versionhq", base_url=LITELLM_API_BASE)
|
28
29
|
# openai_client = OpenAI(api_key=os.environ.get("OPENAI_API_KEY"))
|
@@ -67,10 +68,7 @@ def suppress_warnings():
|
|
67
68
|
|
68
69
|
class LLM(BaseModel):
|
69
70
|
"""
|
70
|
-
An LLM class to store params
|
71
|
-
Use LiteLLM to connect with the model of choice.
|
72
|
-
Some optional params are passed by the agent, else follow the default settings of the model provider.
|
73
|
-
Ref. https://docs.litellm.ai/docs/completion/input
|
71
|
+
An LLM class to store params to send to the LLM. Use LiteLLM or custom providers for the endpoint.
|
74
72
|
"""
|
75
73
|
|
76
74
|
_logger: Logger = PrivateAttr(default_factory=lambda: Logger(verbose=True))
|
@@ -78,10 +76,11 @@ class LLM(BaseModel):
|
|
78
76
|
_tokens: int = PrivateAttr(default=0) # accumulate total tokens used for the call
|
79
77
|
model_config = ConfigDict(extra="allow")
|
80
78
|
|
81
|
-
model: str = Field(default=
|
82
|
-
provider: Optional[str] = Field(default=None, description="model provider
|
83
|
-
|
84
|
-
|
79
|
+
model: str = Field(default=None)
|
80
|
+
provider: Optional[str] = Field(default=None, description="model provider")
|
81
|
+
endpoint_provider: Optional[str] = Field(default=None, description="custom endpoint provider for pass through llm call. must need base_url")
|
82
|
+
base_url: Optional[str] = Field(default=None, description="api base url for endpoint provider")
|
83
|
+
api_key: Optional[str] = Field(default=None, description="api key to access the model")
|
85
84
|
|
86
85
|
# optional params
|
87
86
|
timeout: Optional[float | int] = Field(default=None)
|
@@ -114,54 +113,89 @@ class LLM(BaseModel):
|
|
114
113
|
litellm.set_verbose = True
|
115
114
|
os.environ['LITELLM_LOG'] = 'DEBUG'
|
116
115
|
|
116
|
+
|
117
117
|
@model_validator(mode="after")
|
118
|
-
def
|
118
|
+
def validate_model_providers(self) -> Self:
|
119
119
|
"""
|
120
|
-
|
121
|
-
* Assign a default model and provider based on the given information when no model key is found in the MODEL list.
|
122
|
-
|
123
|
-
2) Set up other base parameters for the model and LiteLLM.
|
120
|
+
Validate the given model, provider, interface provider.
|
124
121
|
"""
|
125
122
|
|
126
|
-
|
127
|
-
self._logger.log(level="error", message="Model name is missing.", color="red")
|
128
|
-
raise PydanticCustomError("model_missing", "The model name must be provided.", {})
|
123
|
+
self._init_model_name = self.model
|
129
124
|
|
125
|
+
if self.model is None and self.provider is None:
|
126
|
+
self.model = DEFAULT_MODEL_NAME
|
127
|
+
self.provider = DEFAULT_MODEL_PROVIDER_NAME
|
130
128
|
|
131
|
-
self.
|
132
|
-
|
133
|
-
|
129
|
+
elif self.model is None and self.provider:
|
130
|
+
if self.provider not in PROVIDERS:
|
131
|
+
self._logger.log(level="warning", message=f"Invalid model provider is provided. We will assign a default model.", color="yellow")
|
132
|
+
self.model = DEFAULT_MODEL_NAME
|
133
|
+
self.provider = DEFAULT_MODEL_PROVIDER_NAME
|
134
134
|
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
135
|
+
else:
|
136
|
+
provider_model_list = MODELS.get(self.provider)
|
137
|
+
if provider_model_list:
|
138
|
+
self.model = provider_model_list[0]
|
139
|
+
self.provider = self.provider
|
140
|
+
else:
|
141
|
+
self._logger.log(level="warning", message=f"This provider has not models to be called. We will assign a default model.", color="yellow")
|
142
|
+
self.model = DEFAULT_MODEL_NAME
|
143
|
+
self.provider = DEFAULT_MODEL_PROVIDER_NAME
|
144
|
+
|
145
|
+
elif self.model and self.provider is None:
|
146
|
+
model_match = [
|
147
|
+
item for item in [
|
148
|
+
[val for val in v if val == self.model][0] for k, v in MODELS.items() if [val for val in v if val == self.model]
|
149
|
+
] if item
|
150
|
+
]
|
151
|
+
model_partial_match = [
|
152
|
+
item for item in [
|
153
|
+
[val for val in v if val.find(self.model) != -1][0] for k, v in MODELS.items() if [val for val in v if val.find(self.model) != -1]
|
154
|
+
] if item
|
155
|
+
]
|
156
|
+
provider_match = [k for k, v in MODELS.items() if k == self.model]
|
157
|
+
|
158
|
+
if model_match:
|
159
|
+
self.model = model_match[0]
|
160
|
+
self.provider = [k for k, v in MODELS.items() if self.model in v][0]
|
161
|
+
|
162
|
+
elif model_partial_match:
|
163
|
+
self.model = model_partial_match[0]
|
164
|
+
self.provider = [k for k, v in MODELS.items() if [item for item in v if item.find(self.model) != -1]][0]
|
165
|
+
|
166
|
+
elif provider_match:
|
167
|
+
provider = provider_match[0]
|
168
|
+
if self.MODELS.get(provider):
|
169
|
+
self.provider = provider
|
170
|
+
self.model = self.MODELS.get(provider)[0]
|
171
|
+
else:
|
172
|
+
self.provider = DEFAULT_MODEL_PROVIDER_NAME
|
173
|
+
self.model = DEFAULT_MODEL_NAME
|
174
|
+
|
175
|
+
else:
|
176
|
+
self.model = DEFAULT_MODEL_NAME
|
177
|
+
self.provider = DEFAULT_MODEL_PROVIDER_NAME
|
147
178
|
|
148
179
|
else:
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
if self._init_model_name == item:
|
153
|
-
self.model = item
|
154
|
-
self.provider = k
|
155
|
-
|
156
|
-
elif self.model is None and self._init_model_name in item:
|
157
|
-
self.model = item
|
158
|
-
self.provider = k
|
159
|
-
|
160
|
-
if self.model is None:
|
161
|
-
self._logger.log(level="warning", message=f"The provided model \'{self.model}\' is not in the list. We'll assign a default model.", color="yellow")
|
180
|
+
provider_model_list = MODELS.get(self.provider)
|
181
|
+
if self.model not in provider_model_list:
|
182
|
+
self._logger.log(level="warning", message=f"The provided model: {self._init_model_name} is not in the list. We will assign a default model.", color="yellow")
|
162
183
|
self.model = DEFAULT_MODEL_NAME
|
163
|
-
self.provider =
|
184
|
+
self.provider = DEFAULT_MODEL_PROVIDER_NAME
|
185
|
+
|
186
|
+
# trigger pass-through custom endpoint.
|
187
|
+
if self.provider in ENDPOINT_PROVIDERS:
|
188
|
+
self.endpoint_provider = self.provider
|
189
|
+
|
190
|
+
return self
|
191
|
+
|
164
192
|
|
193
|
+
@model_validator(mode="after")
|
194
|
+
def validate_model_params(self) -> Self:
|
195
|
+
"""
|
196
|
+
After setting up a valid model, provider, interface provider, add params to the model.
|
197
|
+
"""
|
198
|
+
self._tokens = 0
|
165
199
|
|
166
200
|
if self.callbacks:
|
167
201
|
self._set_callbacks(self.callbacks)
|
@@ -173,7 +207,8 @@ class LLM(BaseModel):
|
|
173
207
|
self.api_key = os.environ.get(api_key_name, None)
|
174
208
|
|
175
209
|
|
176
|
-
base_url_key_name = self.
|
210
|
+
base_url_key_name = self.endpoint_provider.upper() + "_API_BASE" if self.endpoint_provider else None
|
211
|
+
|
177
212
|
if base_url_key_name:
|
178
213
|
self.base_url = os.environ.get(base_url_key_name)
|
179
214
|
self.api_base = self.base_url
|
@@ -184,11 +219,8 @@ class LLM(BaseModel):
|
|
184
219
|
def _create_valid_params(self, config: Dict[str, Any], provider: str = None) -> Dict[str, Any]:
|
185
220
|
params = dict()
|
186
221
|
valid_keys = list()
|
187
|
-
|
188
|
-
if
|
189
|
-
valid_keys = PARAMS.get("litellm") + PARAMS.get("common") + PARAMS.get(self.provider) if self.provider else PARAMS.get("litellm") + PARAMS.get("common")
|
190
|
-
else:
|
191
|
-
valid_keys = PARAMS.get("common") + PARAMS.get(self.provider)
|
222
|
+
provider = provider if provider else self.provider if self.provider else None
|
223
|
+
valid_keys = PARAMS.get("litellm") + PARAMS.get("common") + PARAMS.get(provider) if provider and PARAMS.get(provider) else PARAMS.get("litellm") + PARAMS.get("common")
|
192
224
|
|
193
225
|
for item in valid_keys:
|
194
226
|
if hasattr(self, item) and getattr(self, item):
|
@@ -218,7 +250,7 @@ class LLM(BaseModel):
|
|
218
250
|
self._set_callbacks(self.callbacks) # passed by agent
|
219
251
|
|
220
252
|
try:
|
221
|
-
provider = self.provider if self.provider else
|
253
|
+
provider = self.provider if self.provider else DEFAULT_MODEL_PROVIDER_NAME
|
222
254
|
self.response_format = { "type": "json_object" } if tool_res_as_final == True else response_format
|
223
255
|
|
224
256
|
if not tools:
|
@@ -639,7 +639,7 @@ Ref. Output image: {output_formats_to_follow}
|
|
639
639
|
|
640
640
|
if self.tool_res_as_final == True:
|
641
641
|
tool_output = agent.execute_task(task=self, context=context, task_tools=task_tools)
|
642
|
-
task_output = TaskOutput(task_id=self.id, tool_output=tool_output, raw=tool_output)
|
642
|
+
task_output = TaskOutput(task_id=self.id, tool_output=tool_output, raw=str(tool_output) if tool_output else "")
|
643
643
|
|
644
644
|
else:
|
645
645
|
raw_output = agent.execute_task(task=self, context=context, task_tools=task_tools)
|
@@ -312,8 +312,3 @@ def test_agent_with_memory_config():
|
|
312
312
|
assert agent_2.short_term_memory.memory_provider == "mem0" and agent_2.short_term_memory.storage.memory_type == "stm"
|
313
313
|
assert agent_2.long_term_memory and isinstance(agent_2.long_term_memory.storage, LTMSQLiteStorage)
|
314
314
|
assert agent_2.user_memory and agent_2.user_memory.storage and agent_2.user_memory.storage.memory_type == "user"
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
if __name__ == "__main__":
|
319
|
-
test_agent_with_knowledge_sources()
|
@@ -47,10 +47,9 @@ def test_create_llm_from_invalid_name():
|
|
47
47
|
def test_create_llm_from_provider():
|
48
48
|
llm = LLM(provider="gemini", callbacks=[dummy_func,])
|
49
49
|
|
50
|
-
assert llm._init_model_name == DEFAULT_MODEL_NAME
|
51
50
|
assert llm.model == "gemini/gemini-1.5-flash"
|
52
51
|
assert llm.provider == "gemini"
|
53
|
-
assert llm.context_window_size == int(LLM_CONTEXT_WINDOW_SIZES.get(llm.model) *0.75)
|
52
|
+
assert llm.context_window_size == int(LLM_CONTEXT_WINDOW_SIZES.get(llm.model) *0.75)
|
54
53
|
assert llm._supports_function_calling() == True
|
55
54
|
assert llm._supports_stop_words() == True
|
56
55
|
assert litellm.callbacks == [dummy_func,]
|
@@ -43,11 +43,3 @@ demo_response_fields = [
|
|
43
43
|
ResponseField(title="test6", data_type=list, items=Any, required=False),
|
44
44
|
# ResponseField(title="children", data_type=list, items=type(DemoChild)),
|
45
45
|
]
|
46
|
-
|
47
|
-
|
48
|
-
def create_base_agent(model: str | LLM | Dict[str, Any]) -> Agent:
|
49
|
-
agent = Agent(role="demo", goal="My amazing goals", llm=model, max_tokens=3000, maxit=1)
|
50
|
-
return agent
|
51
|
-
|
52
|
-
|
53
|
-
base_agent = create_base_agent(model=DEFAULT_MODEL_NAME)
|
@@ -1,23 +1,24 @@
|
|
1
|
-
import os
|
2
|
-
import pytest
|
3
1
|
import sys
|
4
2
|
import threading
|
5
3
|
from unittest.mock import patch
|
6
|
-
from typing import Dict, Any,
|
4
|
+
from typing import Dict, Any, Callable
|
7
5
|
|
8
|
-
from pydantic import BaseModel, Field
|
6
|
+
from pydantic import BaseModel, Field
|
9
7
|
|
10
|
-
from versionhq.agent.model import Agent
|
8
|
+
from versionhq.agent.model import Agent, DEFAULT_MODEL_NAME
|
11
9
|
from versionhq.agent.rpm_controller import RPMController
|
12
10
|
from versionhq.task.model import Task, ResponseField, TaskOutput, ConditionalTask
|
13
11
|
from versionhq.task.evaluate import Evaluation, EvaluationItem
|
14
12
|
from versionhq.tool.model import Tool, ToolSet
|
15
13
|
from versionhq.tool.decorator import tool
|
16
|
-
from tests.task import DemoOutcome, demo_response_fields
|
14
|
+
from tests.task import DemoOutcome, demo_response_fields
|
17
15
|
|
18
16
|
sys.setrecursionlimit(2097152)
|
19
17
|
threading.stack_size(134217728)
|
20
18
|
|
19
|
+
|
20
|
+
base_agent = Agent(role="demo", goal="My amazing goals", llm=DEFAULT_MODEL_NAME, max_tokens=3000, maxit=1)
|
21
|
+
|
21
22
|
def test_sync_execute_task_with_pydantic_outcome():
|
22
23
|
task = Task(
|
23
24
|
description="Output random values strictly following the data type defined in the given response format.",
|
@@ -365,54 +366,3 @@ def test_evaluation():
|
|
365
366
|
assert [isinstance(item, EvaluationItem) and item.criteria in task.eval_criteria for item in res.evaluation.items]
|
366
367
|
assert res.evaluation.latency and res.evaluation.tokens and res.evaluation.responsible_agent == task_evaluator
|
367
368
|
assert res.evaluation.aggregate_score is not None and res.evaluation.suggestion_summary
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
def test_gemini_schema():
|
372
|
-
"""
|
373
|
-
See if response schema and tools (func_calling) works.
|
374
|
-
"""
|
375
|
-
from tests.task import DemoOutcome
|
376
|
-
agent = Agent(role="demo", goal="demo", llm="gemini/gemini-1.5-pro")
|
377
|
-
task = Task(
|
378
|
-
description="return random values strictly following the given response format.",
|
379
|
-
pydantic_output=DemoOutcome
|
380
|
-
)
|
381
|
-
res = task.execute_sync(agent=agent, context="We are running a test.")
|
382
|
-
assert [
|
383
|
-
getattr(res.pydantic, k) and type(getattr(res.pydantic, k)) == v for k, v in DemoOutcome.__annotations__.items()
|
384
|
-
]
|
385
|
-
|
386
|
-
|
387
|
-
def test_gemini_res_fields():
|
388
|
-
from tests.task import demo_response_fields
|
389
|
-
agent = Agent(role="demo", goal="demo", llm="gemini/gemini-1.5-pro")
|
390
|
-
task = Task(
|
391
|
-
description="return random values strictly following the given response format.",
|
392
|
-
response_fields=demo_response_fields
|
393
|
-
)
|
394
|
-
res = task.execute_sync(agent=agent, context="We are running a test.")
|
395
|
-
assert [k in item.title for item in demo_response_fields for k, v in res.json_dict.items()]
|
396
|
-
|
397
|
-
|
398
|
-
def test_gemini_func():
|
399
|
-
from tests.task import demo_response_fields
|
400
|
-
from versionhq.tool.model import Tool
|
401
|
-
|
402
|
-
class DemoTool(Tool):
|
403
|
-
func: Callable[..., Any] = lambda x: "Gemini"
|
404
|
-
|
405
|
-
agent = Agent(role="demo", goal="demo", llm="gemini/gemini-1.5-pro")
|
406
|
-
task = Task(
|
407
|
-
description="Simply execute the given tools.",
|
408
|
-
tools=[DemoTool,],
|
409
|
-
tool_res_as_final=True
|
410
|
-
)
|
411
|
-
res = task.execute_sync(agent=agent, context="We are running a test.")
|
412
|
-
assert res.tool_output and res.raw
|
413
|
-
|
414
|
-
|
415
|
-
if __name__ == "__main__":
|
416
|
-
from dotenv import load_dotenv
|
417
|
-
load_dotenv(override=True)
|
418
|
-
test_gemini_func()
|
@@ -225,14 +225,15 @@ wheels = [
|
|
225
225
|
|
226
226
|
[[package]]
|
227
227
|
name = "beautifulsoup4"
|
228
|
-
version = "4.
|
228
|
+
version = "4.13.0"
|
229
229
|
source = { registry = "https://pypi.org/simple" }
|
230
230
|
dependencies = [
|
231
231
|
{ name = "soupsieve" },
|
232
|
+
{ name = "typing-extensions" },
|
232
233
|
]
|
233
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
234
|
+
sdist = { url = "https://files.pythonhosted.org/packages/4b/d3/6f4047d1de55b7a290ef8d4b4ebf59dcc24742920ebbed0909f823424205/beautifulsoup4-4.13.0.tar.gz", hash = "sha256:b6e5afb3a2b1472c8db751a92eabf7834e5c7099f990c5e4b35f1f16b60bae64", size = 558514 }
|
234
235
|
wheels = [
|
235
|
-
{ url = "https://files.pythonhosted.org/packages/
|
236
|
+
{ url = "https://files.pythonhosted.org/packages/6e/74/d53cf0c527b20fc87351e6fd9d51aac9b5d1e32ec5a3a32b84671806ab40/beautifulsoup4-4.13.0-py3-none-any.whl", hash = "sha256:9c4c3dfa67aba55f6cd03769c441b21e6a369797fd6766e4b4c6b3399aae2735", size = 184993 },
|
236
237
|
]
|
237
238
|
|
238
239
|
[[package]]
|
@@ -693,11 +694,12 @@ wheels = [
|
|
693
694
|
|
694
695
|
[[package]]
|
695
696
|
name = "docling-core"
|
696
|
-
version = "2.
|
697
|
+
version = "2.17.0"
|
697
698
|
source = { registry = "https://pypi.org/simple" }
|
698
699
|
dependencies = [
|
699
700
|
{ name = "jsonref" },
|
700
701
|
{ name = "jsonschema" },
|
702
|
+
{ name = "latex2mathml" },
|
701
703
|
{ name = "pandas" },
|
702
704
|
{ name = "pillow" },
|
703
705
|
{ name = "pydantic" },
|
@@ -706,9 +708,9 @@ dependencies = [
|
|
706
708
|
{ name = "typer" },
|
707
709
|
{ name = "typing-extensions" },
|
708
710
|
]
|
709
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
711
|
+
sdist = { url = "https://files.pythonhosted.org/packages/0c/b4/144e8f388097ab170519fa5fdccebf4a701ba902016533bf414aa01ebd07/docling_core-2.17.0.tar.gz", hash = "sha256:cfcba8d173730baf244f279369f68e3cb5ddc7680769841afd254b61e432133e", size = 74005 }
|
710
712
|
wheels = [
|
711
|
-
{ url = "https://files.pythonhosted.org/packages/
|
713
|
+
{ url = "https://files.pythonhosted.org/packages/da/c4/2700972ce7633ba48613fce9ed2e9c99ee52828cbf37a22f119fc33dee33/docling_core-2.17.0-py3-none-any.whl", hash = "sha256:5c3015e0eed8e939069bdfd566761dc9f39239647893ae42c53d1333dd0a4749", size = 94026 },
|
712
714
|
]
|
713
715
|
|
714
716
|
[package.optional-dependencies]
|
@@ -745,7 +747,7 @@ wheels = [
|
|
745
747
|
|
746
748
|
[[package]]
|
747
749
|
name = "docling-parse"
|
748
|
-
version = "3.
|
750
|
+
version = "3.2.0"
|
749
751
|
source = { registry = "https://pypi.org/simple" }
|
750
752
|
dependencies = [
|
751
753
|
{ name = "docling-core" },
|
@@ -754,23 +756,23 @@ dependencies = [
|
|
754
756
|
{ name = "pywin32", marker = "sys_platform == 'win32'" },
|
755
757
|
{ name = "tabulate" },
|
756
758
|
]
|
757
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
759
|
+
sdist = { url = "https://files.pythonhosted.org/packages/a0/2e/10ccfba4ac03605ee31d3ef3940a8428c644fb28566aeb90029266ec92f2/docling_parse-3.2.0.tar.gz", hash = "sha256:d45e34860a2f845d1726d87af77e8deff17e0c6fb876707a7cf390492d408c2f", size = 44333140 }
|
758
760
|
wheels = [
|
759
|
-
{ url = "https://files.pythonhosted.org/packages/
|
760
|
-
{ url = "https://files.pythonhosted.org/packages/
|
761
|
-
{ url = "https://files.pythonhosted.org/packages/
|
762
|
-
{ url = "https://files.pythonhosted.org/packages/
|
763
|
-
{ url = "https://files.pythonhosted.org/packages/
|
764
|
-
{ url = "https://files.pythonhosted.org/packages/
|
765
|
-
{ url = "https://files.pythonhosted.org/packages/
|
766
|
-
{ url = "https://files.pythonhosted.org/packages/
|
767
|
-
{ url = "https://files.pythonhosted.org/packages/
|
768
|
-
{ url = "https://files.pythonhosted.org/packages/
|
769
|
-
{ url = "https://files.pythonhosted.org/packages/
|
770
|
-
{ url = "https://files.pythonhosted.org/packages/
|
771
|
-
{ url = "https://files.pythonhosted.org/packages/
|
772
|
-
{ url = "https://files.pythonhosted.org/packages/
|
773
|
-
{ url = "https://files.pythonhosted.org/packages/
|
761
|
+
{ url = "https://files.pythonhosted.org/packages/80/bc/dd5bd1b8c9780c6817f83a438e0891d2eb3975379b9a20ad3bfc524774da/docling_parse-3.2.0-cp311-cp311-macosx_13_0_x86_64.whl", hash = "sha256:f3616a3fb3dacc87307b6794dc81e6aec09f59afbb42f487b0100f39571e7442", size = 22049513 },
|
762
|
+
{ url = "https://files.pythonhosted.org/packages/0e/6a/e2acbfd2418cd42365c88994388865fb8624aa6ab2e70b7fb72c6a07c2c6/docling_parse-3.2.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:9df9d892d8206cc2a0091bb1e2e3ce6f3ab881342980c53bc7f4bf7c831bf057", size = 21930790 },
|
763
|
+
{ url = "https://files.pythonhosted.org/packages/4f/83/d5d89c86a15bd9b9724c9414ea6642eb0d4bbfa97bc2580854f0325fba18/docling_parse-3.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e90e9c2b21e732b3e1af697abb5e7bca9c23a3be8e25a6cc4d92221d526953c", size = 22373807 },
|
764
|
+
{ url = "https://files.pythonhosted.org/packages/bf/eb/1c122ec31b84d7513dcff725e102f66d54a9a8334cfec261be8b4d21b45f/docling_parse-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:71595399283ecacb255cf1768d1840177f7c33aedd58195530505f9aa8cd5a24", size = 22441982 },
|
765
|
+
{ url = "https://files.pythonhosted.org/packages/ff/af/b1955551315eb540d5d780a3c61bb88bab6353baf3997184fa3e6eba40ec/docling_parse-3.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:0f2a7801d6fa843cd3243aab38cd944e2f4ff386fb5e6fb7b27be1dfa69845c7", size = 23234869 },
|
766
|
+
{ url = "https://files.pythonhosted.org/packages/61/db/ab6f2e0aa5907e3b4e5e464aabe53a53a4371bf1bf44ccea74d9137657be/docling_parse-3.2.0-cp312-cp312-macosx_13_0_x86_64.whl", hash = "sha256:a83458692c607a393b2f5858d47509342274920553775db5c8d0072ad6aaa0fa", size = 22049762 },
|
767
|
+
{ url = "https://files.pythonhosted.org/packages/65/eb/3301fd3e73877a1816e7394975ff43533b96a60b3542c186755d3d6bd10d/docling_parse-3.2.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:2d17bf3dffbc2fb565c5fa8347ae7715fc091f4f94228b4ece4f8ab5c3fb428a", size = 21930638 },
|
768
|
+
{ url = "https://files.pythonhosted.org/packages/89/f8/7a310ed4c1f1eb590993fcee0b1bb19bb2bc788ba84b9d76f822bde5c9ee/docling_parse-3.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f54881ebcd87384b29f7a6475b308034a9ecba0dfa85dd1d2569ef59e2f37e97", size = 22372609 },
|
769
|
+
{ url = "https://files.pythonhosted.org/packages/50/54/387fa23ca2b2522b4c0aa48c8c8739d6c18e50def50db45f3f1b8262f840/docling_parse-3.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:27de3b28946a615f16e6824bede965f8df5f3b2552e17560415922c79fa8546f", size = 22441245 },
|
770
|
+
{ url = "https://files.pythonhosted.org/packages/53/01/21ba457089d7e1a4af6618793e609caca1f598d945813636fa36c0ccea6a/docling_parse-3.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:20265d7d51b3f4a3bb03e3de694f395d0403bde92915eb5df32f4d67adf93477", size = 23235159 },
|
771
|
+
{ url = "https://files.pythonhosted.org/packages/d1/7b/38f318bb73b59e4f74b6ffcc72d886dd4d4eeb192186ba3cfa65412c0116/docling_parse-3.2.0-cp313-cp313-macosx_13_0_x86_64.whl", hash = "sha256:feecbef5b8593dcd9a35ceb06b29feb879515b5b900bcaa5d9be0c7a3a0ca599", size = 22049844 },
|
772
|
+
{ url = "https://files.pythonhosted.org/packages/34/d1/48aeb30ec761daa39d79d1361ac4e6cf0952c791affa9027926c6b3a8b14/docling_parse-3.2.0-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:6fc65d623e80d8d63f4a6f542408b7f88c0dc8b2842c2523858536d4607d33d5", size = 21930709 },
|
773
|
+
{ url = "https://files.pythonhosted.org/packages/02/1d/a383ddbd80180e84958669737c5bcdb996791d41f312a2a81c857cd6cd77/docling_parse-3.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c06851f88b5edaa7115871100608b9d68bc804b28434b90e57879e178098aed2", size = 22372245 },
|
774
|
+
{ url = "https://files.pythonhosted.org/packages/21/84/733eff29384d204f53a3752292e8ed77b0732389f1e7342b92ff47199b7a/docling_parse-3.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a2fdb3993f7affc73ce19f1202a2f28f3d8cf1716163d9e978ee9c834312c31", size = 22441879 },
|
775
|
+
{ url = "https://files.pythonhosted.org/packages/e2/96/14735f503e2d50d61ce35c9889efb1343dc26cbb0b4410fd56fc7725bc4c/docling_parse-3.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:1b9e32989ff58e0bac85d6cffb3a523dd2373d350b26d46e1f8daff0110595fa", size = 23234594 },
|
774
776
|
]
|
775
777
|
|
776
778
|
[[package]]
|
@@ -1616,6 +1618,15 @@ wheels = [
|
|
1616
1618
|
{ url = "https://files.pythonhosted.org/packages/47/3b/02313e378f6328ada43ee43ecc81a398b4f68e207c94770d1ed6aac6cca2/langsmith-0.3.4-py3-none-any.whl", hash = "sha256:f3b818ce31dc3bdf1f797e75bf32a8a7b062a411f146bd4ffdfc2be0b4b03233", size = 333291 },
|
1617
1619
|
]
|
1618
1620
|
|
1621
|
+
[[package]]
|
1622
|
+
name = "latex2mathml"
|
1623
|
+
version = "3.77.0"
|
1624
|
+
source = { registry = "https://pypi.org/simple" }
|
1625
|
+
sdist = { url = "https://files.pythonhosted.org/packages/a3/dc/6630656e3aa7430b61acefcc3d8a9c23110790193cde0eed1c27a31e4187/latex2mathml-3.77.0.tar.gz", hash = "sha256:e2f501d1878f2e489c3f6f12786bef74c62f712d2770f7f3c837eb20a55d0a1e", size = 74064 }
|
1626
|
+
wheels = [
|
1627
|
+
{ url = "https://files.pythonhosted.org/packages/f2/0a/181ed55562ce90179aedf33b09fcd79db31c868a5d480f3cb71a31d19692/latex2mathml-3.77.0-py3-none-any.whl", hash = "sha256:5531e18a2a9eae7c24e257118b6a444cbba253cd27ff3e81f1bd6c41e88e786e", size = 73722 },
|
1628
|
+
]
|
1629
|
+
|
1619
1630
|
[[package]]
|
1620
1631
|
name = "lazy-loader"
|
1621
1632
|
version = "0.4"
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|