projectdavid 1.32.12__tar.gz → 1.32.14__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.

Files changed (68) hide show
  1. {projectdavid-1.32.12 → projectdavid-1.32.14}/CHANGELOG.md +14 -0
  2. {projectdavid-1.32.12/src/projectdavid.egg-info → projectdavid-1.32.14}/PKG-INFO +1 -1
  3. {projectdavid-1.32.12 → projectdavid-1.32.14}/pyproject.toml +1 -1
  4. {projectdavid-1.32.12 → projectdavid-1.32.14}/src/projectdavid/clients/synchronous_inference_wrapper.py +40 -64
  5. {projectdavid-1.32.12 → projectdavid-1.32.14/src/projectdavid.egg-info}/PKG-INFO +1 -1
  6. {projectdavid-1.32.12 → projectdavid-1.32.14}/LICENSE +0 -0
  7. {projectdavid-1.32.12 → projectdavid-1.32.14}/MANIFEST.in +0 -0
  8. {projectdavid-1.32.12 → projectdavid-1.32.14}/README.md +0 -0
  9. {projectdavid-1.32.12 → projectdavid-1.32.14}/docs/assistants.md +0 -0
  10. {projectdavid-1.32.12 → projectdavid-1.32.14}/docs/code_interpretation.md +0 -0
  11. {projectdavid-1.32.12 → projectdavid-1.32.14}/docs/database.md +0 -0
  12. {projectdavid-1.32.12 → projectdavid-1.32.14}/docs/database_assistant_example.md +0 -0
  13. {projectdavid-1.32.12 → projectdavid-1.32.14}/docs/docker_comtainers.md +0 -0
  14. {projectdavid-1.32.12 → projectdavid-1.32.14}/docs/file_search.md +0 -0
  15. {projectdavid-1.32.12 → projectdavid-1.32.14}/docs/files.md +0 -0
  16. {projectdavid-1.32.12 → projectdavid-1.32.14}/docs/function_call_definition.md +0 -0
  17. {projectdavid-1.32.12 → projectdavid-1.32.14}/docs/function_calls.md +0 -0
  18. {projectdavid-1.32.12 → projectdavid-1.32.14}/docs/handling_function_calls.md +0 -0
  19. {projectdavid-1.32.12 → projectdavid-1.32.14}/docs/inference.md +0 -0
  20. {projectdavid-1.32.12 → projectdavid-1.32.14}/docs/messages.md +0 -0
  21. {projectdavid-1.32.12 → projectdavid-1.32.14}/docs/runs.md +0 -0
  22. {projectdavid-1.32.12 → projectdavid-1.32.14}/docs/streams.md +0 -0
  23. {projectdavid-1.32.12 → projectdavid-1.32.14}/docs/threads.md +0 -0
  24. {projectdavid-1.32.12 → projectdavid-1.32.14}/docs/tools.md +0 -0
  25. {projectdavid-1.32.12 → projectdavid-1.32.14}/docs/users.md +0 -0
  26. {projectdavid-1.32.12 → projectdavid-1.32.14}/docs/vector_store.md +0 -0
  27. {projectdavid-1.32.12 → projectdavid-1.32.14}/docs/versioning.md +0 -0
  28. {projectdavid-1.32.12 → projectdavid-1.32.14}/setup.cfg +0 -0
  29. {projectdavid-1.32.12 → projectdavid-1.32.14}/src/projectdavid/__init__.py +0 -0
  30. {projectdavid-1.32.12 → projectdavid-1.32.14}/src/projectdavid/_version.py +0 -0
  31. {projectdavid-1.32.12 → projectdavid-1.32.14}/src/projectdavid/clients/actions_client.py +0 -0
  32. {projectdavid-1.32.12 → projectdavid-1.32.14}/src/projectdavid/clients/api_key_client.py +0 -0
  33. {projectdavid-1.32.12 → projectdavid-1.32.14}/src/projectdavid/clients/assistants_client.py +0 -0
  34. {projectdavid-1.32.12 → projectdavid-1.32.14}/src/projectdavid/clients/base_client.py +0 -0
  35. {projectdavid-1.32.12 → projectdavid-1.32.14}/src/projectdavid/clients/base_vector_store.py +0 -0
  36. {projectdavid-1.32.12 → projectdavid-1.32.14}/src/projectdavid/clients/event_handler.py +0 -0
  37. {projectdavid-1.32.12 → projectdavid-1.32.14}/src/projectdavid/clients/file_processor.py +0 -0
  38. {projectdavid-1.32.12 → projectdavid-1.32.14}/src/projectdavid/clients/file_search.py +0 -0
  39. {projectdavid-1.32.12 → projectdavid-1.32.14}/src/projectdavid/clients/files_client.py +0 -0
  40. {projectdavid-1.32.12 → projectdavid-1.32.14}/src/projectdavid/clients/inference_client.py +0 -0
  41. {projectdavid-1.32.12 → projectdavid-1.32.14}/src/projectdavid/clients/messages_client.py +0 -0
  42. {projectdavid-1.32.12 → projectdavid-1.32.14}/src/projectdavid/clients/runs.py +0 -0
  43. {projectdavid-1.32.12 → projectdavid-1.32.14}/src/projectdavid/clients/threads_client.py +0 -0
  44. {projectdavid-1.32.12 → projectdavid-1.32.14}/src/projectdavid/clients/tools_client.py +0 -0
  45. {projectdavid-1.32.12 → projectdavid-1.32.14}/src/projectdavid/clients/users_client.py +0 -0
  46. {projectdavid-1.32.12 → projectdavid-1.32.14}/src/projectdavid/clients/vector_store_manager.py +0 -0
  47. {projectdavid-1.32.12 → projectdavid-1.32.14}/src/projectdavid/clients/vectors.py +0 -0
  48. {projectdavid-1.32.12 → projectdavid-1.32.14}/src/projectdavid/constants/platform.py +0 -0
  49. {projectdavid-1.32.12 → projectdavid-1.32.14}/src/projectdavid/entity.py +0 -0
  50. {projectdavid-1.32.12 → projectdavid-1.32.14}/src/projectdavid/events.py +0 -0
  51. {projectdavid-1.32.12 → projectdavid-1.32.14}/src/projectdavid/serializers.py +0 -0
  52. {projectdavid-1.32.12 → projectdavid-1.32.14}/src/projectdavid/services/logging_service.py +0 -0
  53. {projectdavid-1.32.12 → projectdavid-1.32.14}/src/projectdavid/synthesis/__init__.py +0 -0
  54. {projectdavid-1.32.12 → projectdavid-1.32.14}/src/projectdavid/synthesis/llm_synthesizer.py +0 -0
  55. {projectdavid-1.32.12 → projectdavid-1.32.14}/src/projectdavid/synthesis/prompt.py +0 -0
  56. {projectdavid-1.32.12 → projectdavid-1.32.14}/src/projectdavid/synthesis/reranker.py +0 -0
  57. {projectdavid-1.32.12 → projectdavid-1.32.14}/src/projectdavid/synthesis/retriever.py +0 -0
  58. {projectdavid-1.32.12 → projectdavid-1.32.14}/src/projectdavid/utils/__init__.py +0 -0
  59. {projectdavid-1.32.12 → projectdavid-1.32.14}/src/projectdavid/utils/function_call_suppressor.py +0 -0
  60. {projectdavid-1.32.12 → projectdavid-1.32.14}/src/projectdavid/utils/monitor_launcher.py +0 -0
  61. {projectdavid-1.32.12 → projectdavid-1.32.14}/src/projectdavid/utils/peek_gate.py +0 -0
  62. {projectdavid-1.32.12 → projectdavid-1.32.14}/src/projectdavid/utils/run_monitor.py +0 -0
  63. {projectdavid-1.32.12 → projectdavid-1.32.14}/src/projectdavid/utils/vector_search_formatter.py +0 -0
  64. {projectdavid-1.32.12 → projectdavid-1.32.14}/src/projectdavid.egg-info/SOURCES.txt +0 -0
  65. {projectdavid-1.32.12 → projectdavid-1.32.14}/src/projectdavid.egg-info/dependency_links.txt +0 -0
  66. {projectdavid-1.32.12 → projectdavid-1.32.14}/src/projectdavid.egg-info/requires.txt +0 -0
  67. {projectdavid-1.32.12 → projectdavid-1.32.14}/src/projectdavid.egg-info/top_level.txt +0 -0
  68. {projectdavid-1.32.12 → projectdavid-1.32.14}/tests/test_clients.py +0 -0
@@ -1,3 +1,17 @@
1
+ ## [1.32.14](https://github.com/frankie336/projectdavid/compare/v1.32.13...v1.32.14) (2025-06-09)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * Filter and supress file_search inline-5 ([2ed7419](https://github.com/frankie336/projectdavid/commit/2ed7419d9d2ff8d73559b40b29942a3d2319734c))
7
+
8
+ ## [1.32.13](https://github.com/frankie336/projectdavid/compare/v1.32.12...v1.32.13) (2025-06-09)
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * Filter and supress file_search inline-4 ([c255c3b](https://github.com/frankie336/projectdavid/commit/c255c3b2ef93c784ca90504d34d523c32457223e))
14
+
1
15
  ## [1.32.12](https://github.com/frankie336/projectdavid/compare/v1.32.11...v1.32.12) (2025-06-09)
2
16
 
3
17
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: projectdavid
3
- Version: 1.32.12
3
+ Version: 1.32.14
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
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "projectdavid"
7
- version = "1.32.12"
7
+ version = "1.32.14"
8
8
  description = "Python SDK for interacting with the Entities Assistant API."
9
9
  readme = "README.md"
10
10
  authors = [
@@ -14,9 +14,7 @@ class SynchronousInferenceStream:
14
14
  _GLOBAL_LOOP = asyncio.new_event_loop()
15
15
  asyncio.set_event_loop(_GLOBAL_LOOP)
16
16
 
17
- # --------------------------------------------------------------
18
- # ctor / setup
19
- # --------------------------------------------------------------
17
+ # ────────────────────────────────────────────────────────────
20
18
  def __init__(self, inference) -> None:
21
19
  self.inference_client = inference
22
20
  self.user_id: Optional[str] = None
@@ -26,6 +24,7 @@ class SynchronousInferenceStream:
26
24
  self.run_id: Optional[str] = None
27
25
  self.api_key: Optional[str] = None
28
26
 
27
+ # ────────────────────────────────────────────────────────────
29
28
  def setup(
30
29
  self,
31
30
  user_id: str,
@@ -42,9 +41,7 @@ class SynchronousInferenceStream:
42
41
  self.run_id = run_id
43
42
  self.api_key = api_key
44
43
 
45
- # --------------------------------------------------------------
46
- # main streaming entry-point
47
- # --------------------------------------------------------------
44
+ # ────────────────────────────────────────────────────────────
48
45
  def stream_chunks(
49
46
  self,
50
47
  provider: str,
@@ -71,60 +68,49 @@ class SynchronousInferenceStream:
71
68
 
72
69
  agen = _stream_chunks_async().__aiter__()
73
70
 
74
- # ---------- suppression chain ----------
71
+ # ── build the <fc> suppressor chain ─────────────────────────
75
72
  if suppress_fc:
76
73
  _suppressor = FunctionCallSuppressor()
77
74
  _peek_gate = PeekGate(_suppressor)
78
75
 
79
- def _filter_text(txt: str) -> str:
76
+ def _filter_text(txt: str) -> str: # noqa: D401
80
77
  return _peek_gate.feed(txt)
81
78
 
82
79
  else:
83
80
 
84
- def _filter_text(txt: str) -> str: # no-op
81
+ def _filter_text(txt: str) -> str: # noqa: D401
85
82
  return txt
86
83
 
87
- # ---------------------------------------
88
-
84
+ # helper – drain any leftover bytes still buffered
85
+ def _flush_tail() -> Optional[dict]:
86
+ """
87
+ Force-flush PeekGate / FunctionCallSuppressor so the last few
88
+ characters (kept for safety-margin) reach the frontend.
89
+ Returns a ready-to-stream chunk or None.
90
+ """
91
+ if suppress_fc:
92
+ tail = _filter_text("") # empty feed ⇒ flush
93
+ if tail:
94
+ return {"type": "content", "content": tail}
95
+ return None
96
+
97
+ # ── main loop ─────────────────────────────────────────────
89
98
  while True:
90
99
  try:
91
100
  chunk = self._GLOBAL_LOOP.run_until_complete(
92
101
  asyncio.wait_for(agen.__anext__(), timeout=timeout_per_chunk)
93
102
  )
94
103
 
95
- # provider-labelled function_call
104
+ # ① drop provider-labelled function_call objects
96
105
  if suppress_fc and chunk.get("type") == "function_call":
97
- LOG.debug("[SUPPRESSOR] blocked provider-labelled function_call")
98
- continue
99
-
100
- if suppress_fc and isinstance(chunk.get("content"), str):
101
- chunk["content"] = _filter_text(chunk["content"])
102
- if chunk["content"] == "":
103
- # fully suppressed (either buffering or an <fc> block)
104
- continue
105
-
106
- # ------------------------------------------------------
107
- # allow the assistants response1 to bypass suppression
108
- # -------------------------------------------------------
109
- if chunk.get("type") == "content":
110
- yield chunk
111
- continue
112
-
113
- # -------------------------------------
114
- # allow hot_code to bypass suppression
115
- # ------------------------------------
116
- if chunk.get("type") == "hot_code":
117
- yield chunk
106
+ LOG.debug("[SUPPRESS] provider function_call dropped")
118
107
  continue
119
108
 
120
- # allow hot_code_output to bypass suppression
121
- if chunk.get("type") == "hot_code_output":
109
+ # hot-code & file-preview payloads always pass
110
+ if chunk.get("type") in ("hot_code", "hot_code_output"):
122
111
  yield chunk
123
112
  continue
124
113
 
125
- # -------------------------------------------------------
126
- # allow code_interpreter_stream to bypass suppression
127
- # --------------------------------------------------------
128
114
  if (
129
115
  chunk.get("stream_type") == "code_execution"
130
116
  and chunk.get("chunk", {}).get("type") == "code_interpreter_stream"
@@ -132,45 +118,35 @@ class SynchronousInferenceStream:
132
118
  yield chunk
133
119
  continue
134
120
 
135
- # ---------------------------------
136
- # inline content
137
- # ----------------------------------
121
+ # ③ ordinary TEXT content — run through the <fc> filter
138
122
  if isinstance(chunk.get("content"), str):
139
123
  chunk["content"] = _filter_text(chunk["content"])
140
124
  if chunk["content"] == "":
141
- continue # fully suppressed (or still peeking)
142
-
143
- if (
144
- suppress_fc
145
- and '"name": "code_interpreter"' in chunk["content"]
146
- and '"arguments": {"code"' in chunk["content"]
147
- ):
148
- LOG.debug("[SUPPRESSOR] inline code_interpreter match blocked")
149
- continue
150
-
151
- if (
152
- suppress_fc
153
- and '"name": "file_search"' in chunk["content"]
154
- and '"arguments": {"query_text"' in chunk["content"]
155
- ):
156
- LOG.debug("[SUPPRESSOR] inline file_search match blocked")
157
- continue
125
+ continue # fully suppressed / still buffering
158
126
 
127
+ # ④ everything else streams unchanged
159
128
  yield chunk
160
129
 
130
+ # ─────────── graceful endings ───────────
161
131
  except StopAsyncIteration:
132
+ if tail := _flush_tail():
133
+ yield tail
162
134
  LOG.info("Stream completed normally.")
163
135
  break
136
+
164
137
  except asyncio.TimeoutError:
165
- LOG.error("[TimeoutError] Timeout occurred, stopping stream.")
138
+ if tail := _flush_tail():
139
+ yield tail
140
+ LOG.error("[TimeoutError] Chunk wait expired – aborting stream.")
166
141
  break
167
- except Exception as e:
168
- LOG.error("Unexpected error during streaming completions: %s", e)
142
+
143
+ except Exception as exc: # noqa: BLE001
144
+ if tail := _flush_tail():
145
+ yield tail
146
+ LOG.error("Unexpected streaming error: %s", exc, exc_info=True)
169
147
  break
170
148
 
171
- # --------------------------------------------------------------
172
- # housekeeping
173
- # --------------------------------------------------------------
149
+ # ────────────────────────────────────────────────────────────
174
150
  @classmethod
175
151
  def shutdown_loop(cls) -> None:
176
152
  if cls._GLOBAL_LOOP and not cls._GLOBAL_LOOP.is_closed():
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: projectdavid
3
- Version: 1.32.12
3
+ Version: 1.32.14
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