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

@@ -11,14 +11,12 @@ LOG = UtilsInterface.LoggingUtility()
11
11
 
12
12
 
13
13
  class SynchronousInferenceStream:
14
- """Wrap an async streaming generator and expose it synchronously."""
15
-
16
14
  _GLOBAL_LOOP = asyncio.new_event_loop()
17
15
  asyncio.set_event_loop(_GLOBAL_LOOP)
18
16
 
19
- # ------------------------------------------------------------------ #
20
- # construction / setup
21
- # ------------------------------------------------------------------ #
17
+ # --------------------------------------------------------------
18
+ # ctor / setup
19
+ # --------------------------------------------------------------
22
20
  def __init__(self, inference) -> None:
23
21
  self.inference_client = inference
24
22
  self.user_id: Optional[str] = None
@@ -44,9 +42,9 @@ class SynchronousInferenceStream:
44
42
  self.run_id = run_id
45
43
  self.api_key = api_key
46
44
 
47
- # ------------------------------------------------------------------ #
45
+ # --------------------------------------------------------------
48
46
  # main streaming entry-point
49
- # ------------------------------------------------------------------ #
47
+ # --------------------------------------------------------------
50
48
  def stream_chunks(
51
49
  self,
52
50
  provider: str,
@@ -56,13 +54,6 @@ class SynchronousInferenceStream:
56
54
  timeout_per_chunk: float = 280.0,
57
55
  suppress_fc: bool = True,
58
56
  ) -> Generator[dict, None, None]:
59
- """
60
- Yield provider chunks synchronously. When *suppress_fc* is True we
61
-
62
- 1. completely drop top-level `type="function_call"` chunks, and
63
- 2. scrub inline `<fc> … </fc>` sections inside text using the
64
- PeekGate + FunctionCallSuppressor chain.
65
- """
66
57
 
67
58
  resolved_api_key = api_key or self.api_key
68
59
 
@@ -80,36 +71,38 @@ class SynchronousInferenceStream:
80
71
 
81
72
  agen = _stream_chunks_async().__aiter__()
82
73
 
83
- # ---------- build inline filter --------------------------------
74
+ # ---------- suppression chain ----------
84
75
  if suppress_fc:
85
- suppressor = FunctionCallSuppressor()
86
- peek_gate = PeekGate(suppressor)
76
+ _suppressor = FunctionCallSuppressor()
77
+ _peek_gate = PeekGate(_suppressor)
87
78
 
88
79
  def _filter_text(txt: str) -> str:
89
- return peek_gate.feed(txt)
80
+ return _peek_gate.feed(txt)
90
81
 
91
82
  else:
92
83
 
93
84
  def _filter_text(txt: str) -> str: # no-op
94
85
  return txt
95
86
 
96
- # ---------- main loop ------------------------------------------
87
+ # ---------------------------------------
88
+
97
89
  while True:
98
90
  try:
99
91
  chunk = self._GLOBAL_LOOP.run_until_complete(
100
92
  asyncio.wait_for(agen.__anext__(), timeout=timeout_per_chunk)
101
93
  )
102
94
 
103
- # ① drop provider-labelled function_call objects
95
+ # provider-labelled function_call
104
96
  if suppress_fc and chunk.get("type") == "function_call":
105
- LOG.debug("[SUPPRESSOR] stripped top-level function_call chunk")
97
+ LOG.debug("[SUPPRESSOR] blocked provider-labelled function_call")
106
98
  continue
107
99
 
108
- # never touch hot-code or code-interpreter file previews
100
+ # allow hot_code to bypass suppression
109
101
  if chunk.get("type") == "hot_code":
110
102
  yield chunk
111
103
  continue
112
104
 
105
+ # allow code_interpreter_stream to bypass suppression
113
106
  if (
114
107
  chunk.get("stream_type") == "code_execution"
115
108
  and chunk.get("chunk", {}).get("type") == "code_interpreter_stream"
@@ -117,12 +110,18 @@ class SynchronousInferenceStream:
117
110
  yield chunk
118
111
  continue
119
112
 
120
- # ③ filter inline text (<fc> blocks) *only* when content is str
113
+ # inline content
121
114
  if isinstance(chunk.get("content"), str):
122
115
  chunk["content"] = _filter_text(chunk["content"])
123
116
  if chunk["content"] == "":
124
- # Either the text is still in PeekGate’s buffer
125
- # or it was fully suppressed – skip for now.
117
+ continue # fully suppressed (or still peeking)
118
+
119
+ if (
120
+ suppress_fc
121
+ and '"name": "code_interpreter"' in chunk["content"]
122
+ and '"arguments": {"code"' in chunk["content"]
123
+ ):
124
+ LOG.debug("[SUPPRESSOR] inline code_interpreter match blocked")
126
125
  continue
127
126
 
128
127
  yield chunk
@@ -131,17 +130,15 @@ class SynchronousInferenceStream:
131
130
  LOG.info("Stream completed normally.")
132
131
  break
133
132
  except asyncio.TimeoutError:
134
- LOG.error(
135
- "[Timeout] chunk wait exceeded %.1f s – aborting", timeout_per_chunk
136
- )
133
+ LOG.error("[TimeoutError] Timeout occurred, stopping stream.")
137
134
  break
138
- except Exception as exc: # pylint: disable=broad-except
139
- LOG.error("Unexpected streaming error: %s", exc, exc_info=True)
135
+ except Exception as e:
136
+ LOG.error("Unexpected error during streaming completions: %s", e)
140
137
  break
141
138
 
142
- # ------------------------------------------------------------------ #
139
+ # --------------------------------------------------------------
143
140
  # housekeeping
144
- # ------------------------------------------------------------------ #
141
+ # --------------------------------------------------------------
145
142
  @classmethod
146
143
  def shutdown_loop(cls) -> None:
147
144
  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.6
3
+ Version: 1.32.8
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=msshrx_sJxi0Zn-RJpLTPF1HImK7FFHNBTF9m-g2kKE,5463
18
+ projectdavid/clients/synchronous_inference_wrapper.py,sha256=Ztax5IwGRVHWtftkzUxp0WWvYsUBAPIpjzmmpkFYIoY,5147
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.6.dist-info/licenses/LICENSE,sha256=_8yjiEGttpS284BkfhXxfERqTRZW_tUaHiBB0GTJTMg,4563
38
- projectdavid-1.32.6.dist-info/METADATA,sha256=pz7BV3J79Ot0hDnTo0jEBPSARuUo-ohc3FAVEZh2-3Q,10781
39
- projectdavid-1.32.6.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
40
- projectdavid-1.32.6.dist-info/top_level.txt,sha256=kil8GU4s7qYRfNnzGnFHhZnSNRSxgNG-J4HLgQMmMtw,13
41
- projectdavid-1.32.6.dist-info/RECORD,,
37
+ projectdavid-1.32.8.dist-info/licenses/LICENSE,sha256=_8yjiEGttpS284BkfhXxfERqTRZW_tUaHiBB0GTJTMg,4563
38
+ projectdavid-1.32.8.dist-info/METADATA,sha256=bkO8aPxmxSWz5KXlelKCePgCaA5s-ZlPm-0MY49gboE,10781
39
+ projectdavid-1.32.8.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
40
+ projectdavid-1.32.8.dist-info/top_level.txt,sha256=kil8GU4s7qYRfNnzGnFHhZnSNRSxgNG-J4HLgQMmMtw,13
41
+ projectdavid-1.32.8.dist-info/RECORD,,