projectdavid 1.32.13__py3-none-any.whl → 1.32.15__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.

Potentially problematic release.


This version of projectdavid might be problematic. Click here for more details.

@@ -14,7 +14,7 @@ class SynchronousInferenceStream:
14
14
  _GLOBAL_LOOP = asyncio.new_event_loop()
15
15
  asyncio.set_event_loop(_GLOBAL_LOOP)
16
16
 
17
- # ────────────────────────────────────────────────────────────────
17
+ # ────────────────────────────────────────────────────────────
18
18
  def __init__(self, inference) -> None:
19
19
  self.inference_client = inference
20
20
  self.user_id: Optional[str] = None
@@ -24,6 +24,7 @@ class SynchronousInferenceStream:
24
24
  self.run_id: Optional[str] = None
25
25
  self.api_key: Optional[str] = None
26
26
 
27
+ # ────────────────────────────────────────────────────────────
27
28
  def setup(
28
29
  self,
29
30
  user_id: str,
@@ -40,7 +41,7 @@ class SynchronousInferenceStream:
40
41
  self.run_id = run_id
41
42
  self.api_key = api_key
42
43
 
43
- # ────────────────────────────────────────────────────────────────
44
+ # ────────────────────────────────────────────────────────────
44
45
  def stream_chunks(
45
46
  self,
46
47
  provider: str,
@@ -72,15 +73,29 @@ class SynchronousInferenceStream:
72
73
  _suppressor = FunctionCallSuppressor()
73
74
  _peek_gate = PeekGate(_suppressor)
74
75
 
75
- def _filter_text(txt: str) -> str:
76
+ def _filter_text(txt: str) -> str: # noqa: D401
76
77
  return _peek_gate.feed(txt)
77
78
 
78
79
  else:
79
80
 
80
- def _filter_text(txt: str) -> str:
81
+ def _filter_text(txt: str) -> str: # noqa: D401
81
82
  return txt
82
83
 
83
- # ── main loop ───────────────────────────────────────────────
84
+ # helper drain **all** residual bytes from the chain
85
+ def _drain_filters() -> Optional[dict]:
86
+ if not suppress_fc:
87
+ return None
88
+ parts: list[str] = []
89
+ while True:
90
+ out = _filter_text("") # empty feed ⇒ “give me whatever’s left”
91
+ if not out:
92
+ break
93
+ parts.append(out)
94
+ if parts:
95
+ return {"type": "content", "content": "".join(parts)}
96
+ return None
97
+
98
+ # ── main loop ─────────────────────────────────────────────
84
99
  while True:
85
100
  try:
86
101
  chunk = self._GLOBAL_LOOP.run_until_complete(
@@ -108,23 +123,31 @@ class SynchronousInferenceStream:
108
123
  if isinstance(chunk.get("content"), str):
109
124
  chunk["content"] = _filter_text(chunk["content"])
110
125
  if chunk["content"] == "":
111
- # fully suppressed (either buffering or an <fc> block)
112
- continue
126
+ continue # fully suppressed / still buffering
113
127
 
114
128
  # ④ everything else streams unchanged
115
129
  yield chunk
116
130
 
131
+ # ─────────── graceful endings ───────────
117
132
  except StopAsyncIteration:
133
+ if tail := _drain_filters():
134
+ yield tail
118
135
  LOG.info("Stream completed normally.")
119
136
  break
137
+
120
138
  except asyncio.TimeoutError:
139
+ if tail := _drain_filters():
140
+ yield tail
121
141
  LOG.error("[TimeoutError] Chunk wait expired – aborting stream.")
122
142
  break
143
+
123
144
  except Exception as exc: # noqa: BLE001
145
+ if tail := _drain_filters():
146
+ yield tail
124
147
  LOG.error("Unexpected streaming error: %s", exc, exc_info=True)
125
148
  break
126
149
 
127
- # ────────────────────────────────────────────────────────────────
150
+ # ────────────────────────────────────────────────────────────
128
151
  @classmethod
129
152
  def shutdown_loop(cls) -> None:
130
153
  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.13
3
+ Version: 1.32.15
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
@@ -15,7 +15,7 @@ projectdavid/clients/files_client.py,sha256=XkIDzbQFGDrd88taf0Kouc_4YJOPIYEHiIyW
15
15
  projectdavid/clients/inference_client.py,sha256=xz4ACPv5Tkis604QxO5mJX1inH_TGDfQP-31geETYpE,6609
16
16
  projectdavid/clients/messages_client.py,sha256=467xeIt3VYs6cG8-bl-eDRi_auWOPmfd5tSJDmQSJUI,17232
17
17
  projectdavid/clients/runs.py,sha256=-fXOq5L9w2efDPmZkNxb0s2yjl6oN0XN4_aLXqaeceo,25270
18
- projectdavid/clients/synchronous_inference_wrapper.py,sha256=K6AQVrMBRBDqGn-rzoKsdFnOGvKHmFrlPplW8tCpUIM,5218
18
+ projectdavid/clients/synchronous_inference_wrapper.py,sha256=smbKBkwJZHX2LCqb0pO9RS7N7GFmruzCfmxrQsmJv_o,6204
19
19
  projectdavid/clients/threads_client.py,sha256=ekzU5w14zftmtmFkiec3NC90Of-_KVSUY1qH9cmfSFg,6771
20
20
  projectdavid/clients/tools_client.py,sha256=GkCVOmwpAoPqVt6aYmH0G1HIFha3iEwR9IIf9teR0j8,11487
21
21
  projectdavid/clients/users_client.py,sha256=eCuUb9qvyH1GUFhZu6TRL9zdoK-qzHSs8-Vmrk_0mmg,13729
@@ -34,8 +34,8 @@ projectdavid/utils/monitor_launcher.py,sha256=3YAgJdeuaUvq3JGvpA4ymqFsAnk29nH5q9
34
34
  projectdavid/utils/peek_gate.py,sha256=5whMRnDOQjATRpThWDJkvY9ScXuJ7Sd_-9rvGgXeTAQ,2532
35
35
  projectdavid/utils/run_monitor.py,sha256=F_WkqIP-qnWH-4llIbileWWLfRj2Q1Cg-ni23SR1rec,3786
36
36
  projectdavid/utils/vector_search_formatter.py,sha256=YTe3HPGec26qGY7uxY8_GS8lc4QaN6aNXMzkl29nZpI,1735
37
- projectdavid-1.32.13.dist-info/licenses/LICENSE,sha256=_8yjiEGttpS284BkfhXxfERqTRZW_tUaHiBB0GTJTMg,4563
38
- projectdavid-1.32.13.dist-info/METADATA,sha256=s7CvoID0lYqa_kHmguh-bpsz7egmADoi4LJThWLgpOk,10782
39
- projectdavid-1.32.13.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
40
- projectdavid-1.32.13.dist-info/top_level.txt,sha256=kil8GU4s7qYRfNnzGnFHhZnSNRSxgNG-J4HLgQMmMtw,13
41
- projectdavid-1.32.13.dist-info/RECORD,,
37
+ projectdavid-1.32.15.dist-info/licenses/LICENSE,sha256=_8yjiEGttpS284BkfhXxfERqTRZW_tUaHiBB0GTJTMg,4563
38
+ projectdavid-1.32.15.dist-info/METADATA,sha256=R88sPhtHzsDQpwMr_WDtHLyynLKvGJNV2vxODJBEyIw,10782
39
+ projectdavid-1.32.15.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
40
+ projectdavid-1.32.15.dist-info/top_level.txt,sha256=kil8GU4s7qYRfNnzGnFHhZnSNRSxgNG-J4HLgQMmMtw,13
41
+ projectdavid-1.32.15.dist-info/RECORD,,