projectdavid 1.32.18__py3-none-any.whl → 1.32.20__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,6 @@ class SynchronousInferenceStream:
14
14
  _GLOBAL_LOOP = asyncio.new_event_loop()
15
15
  asyncio.set_event_loop(_GLOBAL_LOOP)
16
16
 
17
- # ────────────────────────────────────────────────────────────
18
17
  def __init__(self, inference) -> None:
19
18
  self.inference_client = inference
20
19
  self.user_id: Optional[str] = None
@@ -24,7 +23,6 @@ class SynchronousInferenceStream:
24
23
  self.run_id: Optional[str] = None
25
24
  self.api_key: Optional[str] = None
26
25
 
27
- # ────────────────────────────────────────────────────────────
28
26
  def setup(
29
27
  self,
30
28
  user_id: str,
@@ -41,7 +39,6 @@ class SynchronousInferenceStream:
41
39
  self.run_id = run_id
42
40
  self.api_key = api_key
43
41
 
44
- # ────────────────────────────────────────────────────────────
45
42
  def stream_chunks(
46
43
  self,
47
44
  provider: str,
@@ -68,54 +65,51 @@ class SynchronousInferenceStream:
68
65
 
69
66
  agen = _stream_chunks_async().__aiter__()
70
67
 
71
- # ── build the <fc> suppressor chain ─────────────────────────
72
68
  if suppress_fc:
73
69
  _suppressor = FunctionCallSuppressor()
74
70
  _peek_gate = PeekGate(_suppressor)
75
71
 
76
- def _filter_text(txt: str) -> str: # noqa: D401
72
+ def _filter_text(txt: str) -> str:
77
73
  return _peek_gate.feed(txt)
78
74
 
79
75
  else:
80
76
 
81
- def _filter_text(txt: str) -> str: # noqa: D401
77
+ def _filter_text(txt: str) -> str:
82
78
  return txt
83
79
 
84
- # helper – drain **all** residual bytes from the chain
85
80
  def _drain_filters() -> Optional[dict]:
86
81
  if not suppress_fc:
87
82
  return None
88
83
  parts: list[str] = []
89
- # 1) normal draining loop
90
84
  while True:
91
85
  out = _filter_text("")
92
86
  if not out:
93
87
  break
94
88
  parts.append(out)
95
- # 2) force-drain the ≤ 8 safety-margin tail
96
89
  if not _peek_gate.suppressing and _peek_gate.buf:
97
90
  parts.append(_peek_gate.buf)
98
91
  _peek_gate.buf = ""
99
92
  if parts:
100
- return {"type": "content", "content": "".join(parts)}
93
+ return {
94
+ "type": "content",
95
+ "content": "".join(parts),
96
+ "run_id": self.run_id,
97
+ }
101
98
  return None
102
99
 
103
- # ── main loop ─────────────────────────────────────────────
104
100
  while True:
105
101
  try:
106
102
  chunk = self._GLOBAL_LOOP.run_until_complete(
107
103
  asyncio.wait_for(agen.__anext__(), timeout=timeout_per_chunk)
108
104
  )
109
105
 
110
- # drop provider-labelled function_call objects
111
- # if suppress_fc and chunk.get("type") == "function_call":
112
- # LOG.debug("[SUPPRESS] provider function_call dropped")
113
- # continue
106
+ # Always attach run_id
107
+ chunk["run_id"] = self.run_id
114
108
 
115
- # hot-code & file-preview payloads always pass
116
- if chunk.get("type") in ("hot_code", "hot_code_output"):
109
+ if chunk.get("type") in ("hot_code", "hot_code_output", "status"):
117
110
  yield chunk
118
111
  continue
112
+
119
113
  if (
120
114
  chunk.get("stream_type") == "code_execution"
121
115
  and chunk.get("chunk", {}).get("type") == "code_interpreter_stream"
@@ -123,16 +117,13 @@ class SynchronousInferenceStream:
123
117
  yield chunk
124
118
  continue
125
119
 
126
- # ③ ordinary TEXT content — run through the <fc> filter
127
120
  if isinstance(chunk.get("content"), str):
128
121
  chunk["content"] = _filter_text(chunk["content"])
129
122
  if chunk["content"] == "":
130
- continue # fully suppressed / still buffering
123
+ continue
131
124
 
132
- # ④ everything else streams unchanged
133
125
  yield chunk
134
126
 
135
- # graceful endings ------------------------------------------------
136
127
  except StopAsyncIteration:
137
128
  if tail := _drain_filters():
138
129
  yield tail
@@ -145,13 +136,12 @@ class SynchronousInferenceStream:
145
136
  LOG.error("[TimeoutError] Chunk wait expired – aborting stream.")
146
137
  break
147
138
 
148
- except Exception as exc: # noqa: BLE001
139
+ except Exception as exc:
149
140
  if tail := _drain_filters():
150
141
  yield tail
151
142
  LOG.error("Unexpected streaming error: %s", exc, exc_info=True)
152
143
  break
153
144
 
154
- # ────────────────────────────────────────────────────────────
155
145
  @classmethod
156
146
  def shutdown_loop(cls) -> None:
157
147
  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.18
3
+ Version: 1.32.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
@@ -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=iVmkAO74p6qygeO7Lu_VgORCl0r_Xu9l8vb4EkJWgyg,6371
18
+ projectdavid/clients/synchronous_inference_wrapper.py,sha256=M0Z8YvOIcYQsYKZ7m5U7edq-OwY1wU9BKH6EIlG3WHI,4769
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.18.dist-info/licenses/LICENSE,sha256=_8yjiEGttpS284BkfhXxfERqTRZW_tUaHiBB0GTJTMg,4563
38
- projectdavid-1.32.18.dist-info/METADATA,sha256=KrgrmDU0AW4vO_kcOlLGHYuwpzl4Hcl0pSdFZ2Tq2q0,10782
39
- projectdavid-1.32.18.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
40
- projectdavid-1.32.18.dist-info/top_level.txt,sha256=kil8GU4s7qYRfNnzGnFHhZnSNRSxgNG-J4HLgQMmMtw,13
41
- projectdavid-1.32.18.dist-info/RECORD,,
37
+ projectdavid-1.32.20.dist-info/licenses/LICENSE,sha256=_8yjiEGttpS284BkfhXxfERqTRZW_tUaHiBB0GTJTMg,4563
38
+ projectdavid-1.32.20.dist-info/METADATA,sha256=OpxxEI8F42M3uCPtloApoabA5c_AG4Yvnb_81ix0aHE,10782
39
+ projectdavid-1.32.20.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
40
+ projectdavid-1.32.20.dist-info/top_level.txt,sha256=kil8GU4s7qYRfNnzGnFHhZnSNRSxgNG-J4HLgQMmMtw,13
41
+ projectdavid-1.32.20.dist-info/RECORD,,