projectdavid 1.33.18__tar.gz → 1.33.20__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.
Potentially problematic release.
This version of projectdavid might be problematic. Click here for more details.
- {projectdavid-1.33.18 → projectdavid-1.33.20}/CHANGELOG.md +15 -0
- {projectdavid-1.33.18/src/projectdavid.egg-info → projectdavid-1.33.20}/PKG-INFO +1 -1
- {projectdavid-1.33.18 → projectdavid-1.33.20}/pyproject.toml +1 -1
- {projectdavid-1.33.18 → projectdavid-1.33.20}/src/projectdavid/clients/vector_store_manager.py +34 -29
- {projectdavid-1.33.18 → projectdavid-1.33.20}/src/projectdavid/clients/vectors.py +22 -22
- {projectdavid-1.33.18 → projectdavid-1.33.20/src/projectdavid.egg-info}/PKG-INFO +1 -1
- {projectdavid-1.33.18 → projectdavid-1.33.20}/LICENSE +0 -0
- {projectdavid-1.33.18 → projectdavid-1.33.20}/MANIFEST.in +0 -0
- {projectdavid-1.33.18 → projectdavid-1.33.20}/README.md +0 -0
- {projectdavid-1.33.18 → projectdavid-1.33.20}/docs/assistants.md +0 -0
- {projectdavid-1.33.18 → projectdavid-1.33.20}/docs/code_interpretation.md +0 -0
- {projectdavid-1.33.18 → projectdavid-1.33.20}/docs/database.md +0 -0
- {projectdavid-1.33.18 → projectdavid-1.33.20}/docs/database_assistant_example.md +0 -0
- {projectdavid-1.33.18 → projectdavid-1.33.20}/docs/docker_comtainers.md +0 -0
- {projectdavid-1.33.18 → projectdavid-1.33.20}/docs/file_search.md +0 -0
- {projectdavid-1.33.18 → projectdavid-1.33.20}/docs/files.md +0 -0
- {projectdavid-1.33.18 → projectdavid-1.33.20}/docs/function_call_definition.md +0 -0
- {projectdavid-1.33.18 → projectdavid-1.33.20}/docs/function_calls.md +0 -0
- {projectdavid-1.33.18 → projectdavid-1.33.20}/docs/handling_function_calls.md +0 -0
- {projectdavid-1.33.18 → projectdavid-1.33.20}/docs/inference.md +0 -0
- {projectdavid-1.33.18 → projectdavid-1.33.20}/docs/messages.md +0 -0
- {projectdavid-1.33.18 → projectdavid-1.33.20}/docs/runs.md +0 -0
- {projectdavid-1.33.18 → projectdavid-1.33.20}/docs/streams.md +0 -0
- {projectdavid-1.33.18 → projectdavid-1.33.20}/docs/threads.md +0 -0
- {projectdavid-1.33.18 → projectdavid-1.33.20}/docs/tools.md +0 -0
- {projectdavid-1.33.18 → projectdavid-1.33.20}/docs/users.md +0 -0
- {projectdavid-1.33.18 → projectdavid-1.33.20}/docs/vector_store.md +0 -0
- {projectdavid-1.33.18 → projectdavid-1.33.20}/docs/versioning.md +0 -0
- {projectdavid-1.33.18 → projectdavid-1.33.20}/setup.cfg +0 -0
- {projectdavid-1.33.18 → projectdavid-1.33.20}/src/projectdavid/__init__.py +0 -0
- {projectdavid-1.33.18 → projectdavid-1.33.20}/src/projectdavid/_version.py +0 -0
- {projectdavid-1.33.18 → projectdavid-1.33.20}/src/projectdavid/clients/actions_client.py +0 -0
- {projectdavid-1.33.18 → projectdavid-1.33.20}/src/projectdavid/clients/api_key_client.py +0 -0
- {projectdavid-1.33.18 → projectdavid-1.33.20}/src/projectdavid/clients/assistants_client.py +0 -0
- {projectdavid-1.33.18 → projectdavid-1.33.20}/src/projectdavid/clients/base_client.py +0 -0
- {projectdavid-1.33.18 → projectdavid-1.33.20}/src/projectdavid/clients/base_vector_store.py +0 -0
- {projectdavid-1.33.18 → projectdavid-1.33.20}/src/projectdavid/clients/event_handler.py +0 -0
- {projectdavid-1.33.18 → projectdavid-1.33.20}/src/projectdavid/clients/file_processor.py +0 -0
- {projectdavid-1.33.18 → projectdavid-1.33.20}/src/projectdavid/clients/file_search.py +0 -0
- {projectdavid-1.33.18 → projectdavid-1.33.20}/src/projectdavid/clients/files_client.py +0 -0
- {projectdavid-1.33.18 → projectdavid-1.33.20}/src/projectdavid/clients/inference_client.py +0 -0
- {projectdavid-1.33.18 → projectdavid-1.33.20}/src/projectdavid/clients/messages_client.py +0 -0
- {projectdavid-1.33.18 → projectdavid-1.33.20}/src/projectdavid/clients/runs.py +0 -0
- {projectdavid-1.33.18 → projectdavid-1.33.20}/src/projectdavid/clients/synchronous_inference_wrapper.py +0 -0
- {projectdavid-1.33.18 → projectdavid-1.33.20}/src/projectdavid/clients/threads_client.py +0 -0
- {projectdavid-1.33.18 → projectdavid-1.33.20}/src/projectdavid/clients/tools_client.py +0 -0
- {projectdavid-1.33.18 → projectdavid-1.33.20}/src/projectdavid/clients/users_client.py +0 -0
- {projectdavid-1.33.18 → projectdavid-1.33.20}/src/projectdavid/clients/vision-file_processor.py +0 -0
- {projectdavid-1.33.18 → projectdavid-1.33.20}/src/projectdavid/clients/vision_vectors.py +0 -0
- {projectdavid-1.33.18 → projectdavid-1.33.20}/src/projectdavid/constants/platform.py +0 -0
- {projectdavid-1.33.18 → projectdavid-1.33.20}/src/projectdavid/decorators.py +0 -0
- {projectdavid-1.33.18 → projectdavid-1.33.20}/src/projectdavid/entity.py +0 -0
- {projectdavid-1.33.18 → projectdavid-1.33.20}/src/projectdavid/events.py +0 -0
- {projectdavid-1.33.18 → projectdavid-1.33.20}/src/projectdavid/serializers.py +0 -0
- {projectdavid-1.33.18 → projectdavid-1.33.20}/src/projectdavid/services/logging_service.py +0 -0
- {projectdavid-1.33.18 → projectdavid-1.33.20}/src/projectdavid/synthesis/__init__.py +0 -0
- {projectdavid-1.33.18 → projectdavid-1.33.20}/src/projectdavid/synthesis/llm_synthesizer.py +0 -0
- {projectdavid-1.33.18 → projectdavid-1.33.20}/src/projectdavid/synthesis/prompt.py +0 -0
- {projectdavid-1.33.18 → projectdavid-1.33.20}/src/projectdavid/synthesis/reranker.py +0 -0
- {projectdavid-1.33.18 → projectdavid-1.33.20}/src/projectdavid/synthesis/retriever.py +0 -0
- {projectdavid-1.33.18 → projectdavid-1.33.20}/src/projectdavid/utils/__init__.py +0 -0
- {projectdavid-1.33.18 → projectdavid-1.33.20}/src/projectdavid/utils/function_call_suppressor.py +0 -0
- {projectdavid-1.33.18 → projectdavid-1.33.20}/src/projectdavid/utils/monitor_launcher.py +0 -0
- {projectdavid-1.33.18 → projectdavid-1.33.20}/src/projectdavid/utils/peek_gate.py +0 -0
- {projectdavid-1.33.18 → projectdavid-1.33.20}/src/projectdavid/utils/run_monitor.py +0 -0
- {projectdavid-1.33.18 → projectdavid-1.33.20}/src/projectdavid/utils/vector_search_formatter.py +0 -0
- {projectdavid-1.33.18 → projectdavid-1.33.20}/src/projectdavid.egg-info/SOURCES.txt +0 -0
- {projectdavid-1.33.18 → projectdavid-1.33.20}/src/projectdavid.egg-info/dependency_links.txt +0 -0
- {projectdavid-1.33.18 → projectdavid-1.33.20}/src/projectdavid.egg-info/requires.txt +0 -0
- {projectdavid-1.33.18 → projectdavid-1.33.20}/src/projectdavid.egg-info/top_level.txt +0 -0
- {projectdavid-1.33.18 → projectdavid-1.33.20}/tests/test_clients.py +0 -0
|
@@ -1,3 +1,18 @@
|
|
|
1
|
+
## [1.33.20](https://github.com/frankie336/projectdavid/compare/v1.33.19...v1.33.20) (2025-06-16)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Bug Fixes
|
|
5
|
+
|
|
6
|
+
* Back out from vision support - resource issue. Revisit in grand plan-11 ([a40b74e](https://github.com/frankie336/projectdavid/commit/a40b74ecadb38df56134d722c1edd000f9d06537))
|
|
7
|
+
|
|
8
|
+
## [1.33.19](https://github.com/frankie336/projectdavid/compare/v1.33.18...v1.33.19) (2025-06-16)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Bug Fixes
|
|
12
|
+
|
|
13
|
+
* Back out from vision support - resource issue. Revisit in grand plan-8 ([5740d62](https://github.com/frankie336/projectdavid/commit/5740d6270d511a92b05a14105157c07c1f0be609))
|
|
14
|
+
* Back out from vision support - resource issue. Revisit in grand plan-9 ([421aba8](https://github.com/frankie336/projectdavid/commit/421aba8e8e1eef0fc6aa873b3686e660747172da))
|
|
15
|
+
|
|
1
16
|
## [1.33.18](https://github.com/frankie336/projectdavid/compare/v1.33.17...v1.33.18) (2025-06-16)
|
|
2
17
|
|
|
3
18
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: projectdavid
|
|
3
|
-
Version: 1.33.
|
|
3
|
+
Version: 1.33.20
|
|
4
4
|
Summary: Python SDK for interacting with the Entities Assistant API.
|
|
5
5
|
Author-email: Francis Neequaye Armah <francis.neequaye@projectdavid.co.uk>
|
|
6
6
|
License: PolyForm Noncommercial License 1.0.0
|
{projectdavid-1.33.18 → projectdavid-1.33.20}/src/projectdavid/clients/vector_store_manager.py
RENAMED
|
@@ -7,6 +7,7 @@ details from the higher‑level SDK.
|
|
|
7
7
|
|
|
8
8
|
from __future__ import annotations
|
|
9
9
|
|
|
10
|
+
import inspect
|
|
10
11
|
import time
|
|
11
12
|
import uuid
|
|
12
13
|
from pathlib import Path
|
|
@@ -129,48 +130,45 @@ class VectorStoreManager(BaseVectorStore):
|
|
|
129
130
|
log.error("Store info failed: %s", e)
|
|
130
131
|
raise VectorStoreError(f"Info retrieval failed: {e}") from e
|
|
131
132
|
|
|
132
|
-
# ------------------------------------------------------------------ #
|
|
133
|
-
# ingestion helpers
|
|
134
|
-
# ------------------------------------------------------------------ #
|
|
135
133
|
def add_to_store(
|
|
136
134
|
self,
|
|
135
|
+
*,
|
|
137
136
|
store_name: str,
|
|
138
137
|
texts: List[str],
|
|
139
138
|
vectors: List[List[float]],
|
|
140
139
|
metadata: List[dict],
|
|
141
|
-
*,
|
|
142
140
|
vector_name: Optional[str] = None,
|
|
143
|
-
):
|
|
141
|
+
) -> Dict[str, Any]:
|
|
142
|
+
"""Upsert vectors + payloads into *store_name*.
|
|
143
|
+
|
|
144
|
+
If *vector_name* is omitted, the manager auto‑detects the sole vector
|
|
145
|
+
field. If multiple fields exist it raises a clear error.
|
|
146
|
+
"""
|
|
147
|
+
|
|
148
|
+
# ---- validate input ------------------------------------------------
|
|
144
149
|
if not vectors:
|
|
145
150
|
raise ValueError("Empty vectors list")
|
|
146
151
|
expected = len(vectors[0])
|
|
147
152
|
for i, vec in enumerate(vectors):
|
|
148
153
|
if len(vec) != expected or not all(isinstance(v, float) for v in vec):
|
|
149
|
-
raise ValueError(f"Vector {i} malformed")
|
|
154
|
+
raise ValueError(f"Vector {i} malformed: expected {expected} floats")
|
|
150
155
|
|
|
151
|
-
#
|
|
156
|
+
# ---- auto‑detect vector field --------------------------------------
|
|
152
157
|
if vector_name is None:
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
# Qdrant 1.x vs 2.x compatibility
|
|
157
|
-
if isinstance(vectors_config, dict):
|
|
158
|
-
vector_fields = list(vectors_config.keys())
|
|
159
|
-
else:
|
|
160
|
-
vector_fields = [vectors_config]
|
|
161
|
-
|
|
158
|
+
coll_info = self.client.get_collection(collection_name=store_name)
|
|
159
|
+
v_cfg = coll_info.config.params.vectors
|
|
160
|
+
vector_fields = list(v_cfg.keys()) if isinstance(v_cfg, dict) else [v_cfg]
|
|
162
161
|
if len(vector_fields) == 1:
|
|
163
162
|
vector_name = vector_fields[0]
|
|
164
163
|
log.debug(
|
|
165
|
-
"Auto
|
|
166
|
-
vector_name,
|
|
167
|
-
store_name,
|
|
164
|
+
"Auto‑detected vector_name=%r for store=%s", vector_name, store_name
|
|
168
165
|
)
|
|
169
166
|
else:
|
|
170
167
|
raise ValueError(
|
|
171
|
-
f"Multiple vector fields
|
|
168
|
+
f"Multiple vector fields {vector_fields}; please specify vector_name"
|
|
172
169
|
)
|
|
173
170
|
|
|
171
|
+
# ---- build points ---------------------------------------------------
|
|
174
172
|
points = [
|
|
175
173
|
qdrant.PointStruct(
|
|
176
174
|
id=self._generate_vector_id(),
|
|
@@ -180,17 +178,24 @@ class VectorStoreManager(BaseVectorStore):
|
|
|
180
178
|
for txt, vec, meta in zip(texts, vectors, metadata)
|
|
181
179
|
]
|
|
182
180
|
|
|
181
|
+
# ---- upsert with backward‑compat for old clients --------------------
|
|
182
|
+
upsert_sig = inspect.signature(self.client.upsert)
|
|
183
|
+
supports_vector_name = "vector_name" in upsert_sig.parameters
|
|
184
|
+
|
|
185
|
+
upsert_kwargs: Dict[str, Any] = {
|
|
186
|
+
"collection_name": store_name,
|
|
187
|
+
"points": points,
|
|
188
|
+
"wait": True,
|
|
189
|
+
}
|
|
190
|
+
if supports_vector_name:
|
|
191
|
+
upsert_kwargs["vector_name"] = vector_name
|
|
192
|
+
|
|
183
193
|
try:
|
|
184
|
-
self.client.upsert(
|
|
185
|
-
collection_name=store_name,
|
|
186
|
-
points=points,
|
|
187
|
-
wait=True,
|
|
188
|
-
vector_name=vector_name,
|
|
189
|
-
)
|
|
194
|
+
self.client.upsert(**upsert_kwargs)
|
|
190
195
|
return {"status": "success", "points_inserted": len(points)}
|
|
191
|
-
except Exception as
|
|
192
|
-
log.error("Add‑to‑store failed: %s",
|
|
193
|
-
raise VectorStoreError(f"Insertion failed: {
|
|
196
|
+
except Exception as exc: # noqa: BLE001
|
|
197
|
+
log.error("Add‑to‑store failed: %s", exc, exc_info=True)
|
|
198
|
+
raise VectorStoreError(f"Insertion failed: {exc}") from exc
|
|
194
199
|
|
|
195
200
|
# ------------------------------------------------------------------ #
|
|
196
201
|
# search / query
|
|
@@ -245,32 +245,31 @@ class VectorStoreClient:
|
|
|
245
245
|
) -> ValidationInterface.VectorStoreFileRead:
|
|
246
246
|
processed = await self.file_processor.process_file(p)
|
|
247
247
|
texts, vectors = processed["chunks"], processed["vectors"]
|
|
248
|
-
line_data = processed.get("line_data") or []
|
|
249
|
-
|
|
250
|
-
base_md = meta or {}
|
|
251
|
-
base_md.update({"source": str(p), "file_name": p.name})
|
|
248
|
+
line_data = processed.get("line_data") or []
|
|
252
249
|
|
|
250
|
+
base_md = (meta or {}) | {"source": str(p), "file_name": p.name}
|
|
253
251
|
file_record_id = f"vsf_{uuid.uuid4()}"
|
|
254
252
|
|
|
255
|
-
# Build per‑chunk payload, now including page/lines if present
|
|
256
253
|
chunk_md = []
|
|
257
|
-
for i in
|
|
258
|
-
payload = {
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
"file_id": file_record_id,
|
|
262
|
-
}
|
|
263
|
-
if i < len(line_data): # ← NEW
|
|
264
|
-
payload.update(line_data[i]) # {'page': …, 'lines': …}
|
|
254
|
+
for i, txt in enumerate(texts):
|
|
255
|
+
payload = {**base_md, "chunk_index": i, "file_id": file_record_id}
|
|
256
|
+
if i < len(line_data):
|
|
257
|
+
payload.update(line_data[i]) # {'page':…, 'lines':…}
|
|
265
258
|
chunk_md.append(payload)
|
|
266
259
|
|
|
260
|
+
# 🔑 1. look up the backend store to get its *collection* name
|
|
261
|
+
store = self.retrieve_vector_store_sync(vector_store_id)
|
|
262
|
+
collection_name = store.collection_name
|
|
263
|
+
|
|
264
|
+
# 🔑 2. upsert via VectorStoreManager (auto-detects vector field)
|
|
267
265
|
self.vector_manager.add_to_store(
|
|
268
|
-
store_name=
|
|
266
|
+
store_name=collection_name,
|
|
269
267
|
texts=texts,
|
|
270
268
|
vectors=vectors,
|
|
271
269
|
metadata=chunk_md,
|
|
272
270
|
)
|
|
273
271
|
|
|
272
|
+
# 3. register the file with the API
|
|
274
273
|
resp = await self._request(
|
|
275
274
|
"POST",
|
|
276
275
|
f"/v1/vector-stores/{vector_store_id}/files",
|
|
@@ -318,10 +317,10 @@ class VectorStoreClient:
|
|
|
318
317
|
vector_field=vector_field,
|
|
319
318
|
)
|
|
320
319
|
|
|
321
|
-
async def _delete_vs_async(
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
qres = self.vector_manager.delete_store(
|
|
320
|
+
async def _delete_vs_async(self, vector_store_id: str, permanent: bool):
|
|
321
|
+
# collection deletion must use the *collection* name
|
|
322
|
+
store = self.retrieve_vector_store_sync(vector_store_id)
|
|
323
|
+
qres = self.vector_manager.delete_store(store.collection_name)
|
|
325
324
|
await self._request(
|
|
326
325
|
"DELETE",
|
|
327
326
|
f"/v1/vector-stores/{vector_store_id}",
|
|
@@ -334,10 +333,11 @@ class VectorStoreClient:
|
|
|
334
333
|
"qdrant_result": qres,
|
|
335
334
|
}
|
|
336
335
|
|
|
337
|
-
async def _delete_file_async(
|
|
338
|
-
self
|
|
339
|
-
|
|
340
|
-
|
|
336
|
+
async def _delete_file_async(self, vector_store_id: str, file_path: str):
|
|
337
|
+
store = self.retrieve_vector_store_sync(vector_store_id)
|
|
338
|
+
fres = self.vector_manager.delete_file_from_store(
|
|
339
|
+
store.collection_name, file_path
|
|
340
|
+
)
|
|
341
341
|
await self._request(
|
|
342
342
|
"DELETE",
|
|
343
343
|
f"/v1/vector-stores/{vector_store_id}/files",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: projectdavid
|
|
3
|
-
Version: 1.33.
|
|
3
|
+
Version: 1.33.20
|
|
4
4
|
Summary: Python SDK for interacting with the Entities Assistant API.
|
|
5
5
|
Author-email: Francis Neequaye Armah <francis.neequaye@projectdavid.co.uk>
|
|
6
6
|
License: PolyForm Noncommercial License 1.0.0
|
|
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
|
{projectdavid-1.33.18 → projectdavid-1.33.20}/src/projectdavid/clients/vision-file_processor.py
RENAMED
|
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
|
{projectdavid-1.33.18 → projectdavid-1.33.20}/src/projectdavid/utils/function_call_suppressor.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{projectdavid-1.33.18 → projectdavid-1.33.20}/src/projectdavid/utils/vector_search_formatter.py
RENAMED
|
File without changes
|
|
File without changes
|
{projectdavid-1.33.18 → projectdavid-1.33.20}/src/projectdavid.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|