projectdavid 1.33.10__py3-none-any.whl → 1.33.12__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,9 +14,6 @@ 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
- # --------------------------------------------------------------
20
17
  def __init__(self, inference) -> None:
21
18
  self.inference_client = inference
22
19
  self.user_id: Optional[str] = None
@@ -42,9 +39,6 @@ class SynchronousInferenceStream:
42
39
  self.run_id = run_id
43
40
  self.api_key = api_key
44
41
 
45
- # --------------------------------------------------------------
46
- # main streaming entry-point
47
- # --------------------------------------------------------------
48
42
  def stream_chunks(
49
43
  self,
50
44
  provider: str,
@@ -71,7 +65,6 @@ class SynchronousInferenceStream:
71
65
 
72
66
  agen = _stream_chunks_async().__aiter__()
73
67
 
74
- # ---------- suppression chain ----------
75
68
  if suppress_fc:
76
69
  _suppressor = FunctionCallSuppressor()
77
70
  _peek_gate = PeekGate(_suppressor)
@@ -81,10 +74,28 @@ class SynchronousInferenceStream:
81
74
 
82
75
  else:
83
76
 
84
- def _filter_text(txt: str) -> str: # no-op
77
+ def _filter_text(txt: str) -> str:
85
78
  return txt
86
79
 
87
- # ---------------------------------------
80
+ def _drain_filters() -> Optional[dict]:
81
+ if not suppress_fc:
82
+ return None
83
+ parts: list[str] = []
84
+ while True:
85
+ out = _filter_text("")
86
+ if not out:
87
+ break
88
+ parts.append(out)
89
+ if not _peek_gate.suppressing and _peek_gate.buf:
90
+ parts.append(_peek_gate.buf)
91
+ _peek_gate.buf = ""
92
+ if parts:
93
+ return {
94
+ "type": "content",
95
+ "content": "".join(parts),
96
+ "run_id": self.run_id,
97
+ }
98
+ return None
88
99
 
89
100
  while True:
90
101
  try:
@@ -92,40 +103,52 @@ class SynchronousInferenceStream:
92
103
  asyncio.wait_for(agen.__anext__(), timeout=timeout_per_chunk)
93
104
  )
94
105
 
95
- # provider-labelled function_call
96
- if suppress_fc and chunk.get("type") == "function_call":
97
- LOG.debug("[SUPPRESSOR] blocked provider-labelled function_call")
106
+ # Always attach run_id
107
+ chunk["run_id"] = self.run_id
108
+
109
+ # ------------------------------------------------------
110
+ # allow status chunks to bypass suppression suppression
111
+ # -------------------------------------------------------
112
+ if chunk.get("type") == "status":
113
+ yield chunk
114
+ continue
115
+
116
+ if chunk.get("type") in ("hot_code", "hot_code_output"):
117
+ yield chunk
118
+ continue
119
+
120
+ if (
121
+ chunk.get("stream_type") == "code_execution"
122
+ and chunk.get("chunk", {}).get("type") == "code_interpreter_stream"
123
+ ):
124
+ yield chunk
98
125
  continue
99
126
 
100
- # inline content
101
127
  if isinstance(chunk.get("content"), str):
102
128
  chunk["content"] = _filter_text(chunk["content"])
103
129
  if chunk["content"] == "":
104
- continue # fully suppressed (or still peeking)
105
-
106
- # additional raw inline suppression for partial JSON
107
- if (
108
- '"name": "code_interpreter"' in chunk["content"]
109
- and '"arguments": {"code"' in chunk["content"]
110
- ):
111
- LOG.debug("[SUPPRESSOR] inline code_interpreter match blocked")
112
130
  continue
113
131
 
114
132
  yield chunk
115
133
 
116
134
  except StopAsyncIteration:
135
+ if tail := _drain_filters():
136
+ yield tail
117
137
  LOG.info("Stream completed normally.")
118
138
  break
139
+
119
140
  except asyncio.TimeoutError:
120
- LOG.error("[TimeoutError] Timeout occurred, stopping stream.")
141
+ if tail := _drain_filters():
142
+ yield tail
143
+ LOG.error("[TimeoutError] Chunk wait expired – aborting stream.")
121
144
  break
122
- except Exception as e:
123
- LOG.error("Unexpected error during streaming completions: %s", e)
145
+
146
+ except Exception as exc:
147
+ if tail := _drain_filters():
148
+ yield tail
149
+ LOG.error("Unexpected streaming error: %s", exc, exc_info=True)
124
150
  break
125
151
 
126
- # --------------------------------------------------------------
127
- # housekeeping
128
- # --------------------------------------------------------------
129
152
  @classmethod
130
153
  def shutdown_loop(cls) -> None:
131
154
  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.33.10
3
+ Version: 1.33.12
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
@@ -16,7 +16,7 @@ projectdavid/clients/files_client.py,sha256=XkIDzbQFGDrd88taf0Kouc_4YJOPIYEHiIyW
16
16
  projectdavid/clients/inference_client.py,sha256=xz4ACPv5Tkis604QxO5mJX1inH_TGDfQP-31geETYpE,6609
17
17
  projectdavid/clients/messages_client.py,sha256=467xeIt3VYs6cG8-bl-eDRi_auWOPmfd5tSJDmQSJUI,17232
18
18
  projectdavid/clients/runs.py,sha256=-fXOq5L9w2efDPmZkNxb0s2yjl6oN0XN4_aLXqaeceo,25270
19
- projectdavid/clients/synchronous_inference_wrapper.py,sha256=Rv7TGZBnzMOBDw3BwguDOHcVmwLvcjHp7j6V8OAqpwM,4686
19
+ projectdavid/clients/synchronous_inference_wrapper.py,sha256=mN5WAHmv0aRoeMIb7XPgv3cuqrMPzu378UsZ02jEvRY,5090
20
20
  projectdavid/clients/threads_client.py,sha256=ekzU5w14zftmtmFkiec3NC90Of-_KVSUY1qH9cmfSFg,6771
21
21
  projectdavid/clients/tools_client.py,sha256=GkCVOmwpAoPqVt6aYmH0G1HIFha3iEwR9IIf9teR0j8,11487
22
22
  projectdavid/clients/users_client.py,sha256=eCuUb9qvyH1GUFhZu6TRL9zdoK-qzHSs8-Vmrk_0mmg,13729
@@ -35,8 +35,8 @@ projectdavid/utils/monitor_launcher.py,sha256=3YAgJdeuaUvq3JGvpA4ymqFsAnk29nH5q9
35
35
  projectdavid/utils/peek_gate.py,sha256=5whMRnDOQjATRpThWDJkvY9ScXuJ7Sd_-9rvGgXeTAQ,2532
36
36
  projectdavid/utils/run_monitor.py,sha256=F_WkqIP-qnWH-4llIbileWWLfRj2Q1Cg-ni23SR1rec,3786
37
37
  projectdavid/utils/vector_search_formatter.py,sha256=YTe3HPGec26qGY7uxY8_GS8lc4QaN6aNXMzkl29nZpI,1735
38
- projectdavid-1.33.10.dist-info/licenses/LICENSE,sha256=_8yjiEGttpS284BkfhXxfERqTRZW_tUaHiBB0GTJTMg,4563
39
- projectdavid-1.33.10.dist-info/METADATA,sha256=fLLv7ywPdpBY5QMaooyy9CEFhx2cnVIY_Z8E-rvfgvk,11555
40
- projectdavid-1.33.10.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
41
- projectdavid-1.33.10.dist-info/top_level.txt,sha256=kil8GU4s7qYRfNnzGnFHhZnSNRSxgNG-J4HLgQMmMtw,13
42
- projectdavid-1.33.10.dist-info/RECORD,,
38
+ projectdavid-1.33.12.dist-info/licenses/LICENSE,sha256=_8yjiEGttpS284BkfhXxfERqTRZW_tUaHiBB0GTJTMg,4563
39
+ projectdavid-1.33.12.dist-info/METADATA,sha256=NmKw2v_K20Uq-H0yEjxkDpAGdMi4wQdIjLrtP-Sthr8,11555
40
+ projectdavid-1.33.12.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
41
+ projectdavid-1.33.12.dist-info/top_level.txt,sha256=kil8GU4s7qYRfNnzGnFHhZnSNRSxgNG-J4HLgQMmMtw,13
42
+ projectdavid-1.33.12.dist-info/RECORD,,