projectdavid 1.32.6__py3-none-any.whl → 1.32.7__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,7 +11,9 @@ LOG = UtilsInterface.LoggingUtility()
11
11
 
12
12
 
13
13
  class SynchronousInferenceStream:
14
- """Wrap an async streaming generator and expose it synchronously."""
14
+ """Wrap an async token/JSON stream in a synchronous iterator while
15
+ hiding function-call payloads from the UI.
16
+ """
15
17
 
16
18
  _GLOBAL_LOOP = asyncio.new_event_loop()
17
19
  asyncio.set_event_loop(_GLOBAL_LOOP)
@@ -57,20 +59,22 @@ class SynchronousInferenceStream:
57
59
  suppress_fc: bool = True,
58
60
  ) -> Generator[dict, None, None]:
59
61
  """
60
- Yield provider chunks synchronously. When *suppress_fc* is True we
62
+ Yield provider chunks synchronously.
61
63
 
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.
64
+ When *suppress_fc* is True:
65
+
66
+ `{"type":"function_call", …}` chunks are dropped.
67
+ • Inline `<fc> … </fc>` text is stripped.
68
+ • *Everything else* is forwarded unchanged.
65
69
  """
66
70
 
67
- resolved_api_key = api_key or self.api_key
71
+ resolved_key = api_key or self.api_key
68
72
 
69
- async def _stream_chunks_async():
73
+ async def _async_gen():
70
74
  async for chk in self.inference_client.stream_inference_response(
71
75
  provider=provider,
72
76
  model=model,
73
- api_key=resolved_api_key,
77
+ api_key=resolved_key,
74
78
  thread_id=self.thread_id,
75
79
  message_id=self.message_id,
76
80
  run_id=self.run_id,
@@ -78,20 +82,20 @@ class SynchronousInferenceStream:
78
82
  ):
79
83
  yield chk
80
84
 
81
- agen = _stream_chunks_async().__aiter__()
85
+ agen = _async_gen().__aiter__()
82
86
 
83
- # ---------- build inline filter --------------------------------
87
+ # ---------- inline suppressor chain ----------------------------
84
88
  if suppress_fc:
85
- suppressor = FunctionCallSuppressor()
86
- peek_gate = PeekGate(suppressor)
89
+ _suppressor = FunctionCallSuppressor()
90
+ _peek_gate = PeekGate(_suppressor)
87
91
 
88
92
  def _filter_text(txt: str) -> str:
89
- return peek_gate.feed(txt)
93
+ return _peek_gate.feed(txt)
90
94
 
91
95
  else:
92
96
 
93
- def _filter_text(txt: str) -> str: # no-op
94
- return txt
97
+ def _filter_text(txt: str) -> str: # noqa: D401
98
+ return txt # pass-through
95
99
 
96
100
  # ---------- main loop ------------------------------------------
97
101
  while True:
@@ -100,16 +104,17 @@ class SynchronousInferenceStream:
100
104
  asyncio.wait_for(agen.__anext__(), timeout=timeout_per_chunk)
101
105
  )
102
106
 
103
- # ① drop provider-labelled function_call objects
107
+ # ① provider-labelled function_call drop
104
108
  if suppress_fc and chunk.get("type") == "function_call":
105
- LOG.debug("[SUPPRESSOR] stripped top-level function_call chunk")
109
+ LOG.debug("[SUPPRESSOR] dropped provider function_call chunk")
106
110
  continue
107
111
 
108
- # ② never touch hot-code or code-interpreter file previews
112
+ # ② never touch hot_code
109
113
  if chunk.get("type") == "hot_code":
110
114
  yield chunk
111
115
  continue
112
116
 
117
+ # ③ never touch code_interpreter_stream previews
113
118
  if (
114
119
  chunk.get("stream_type") == "code_execution"
115
120
  and chunk.get("chunk", {}).get("type") == "code_interpreter_stream"
@@ -117,14 +122,14 @@ class SynchronousInferenceStream:
117
122
  yield chunk
118
123
  continue
119
124
 
120
- # filter inline text (<fc> blocks) *only* when content is str
125
+ # scrub inline <fc> tags in plain-text content
121
126
  if isinstance(chunk.get("content"), str):
122
127
  chunk["content"] = _filter_text(chunk["content"])
123
128
  if chunk["content"] == "":
124
- # Either the text is still in PeekGate’s buffer
125
- # or it was fully suppressed – skip for now.
129
+ # completely removed (or still buffering) skip emit
126
130
  continue
127
131
 
132
+ # ⑤ forward every other chunk verbatim
128
133
  yield chunk
129
134
 
130
135
  except StopAsyncIteration:
@@ -132,11 +137,12 @@ class SynchronousInferenceStream:
132
137
  break
133
138
  except asyncio.TimeoutError:
134
139
  LOG.error(
135
- "[Timeout] chunk wait exceeded %.1f s – aborting", timeout_per_chunk
140
+ "[TimeoutError] no chunk received for %.1f s – aborting",
141
+ timeout_per_chunk,
136
142
  )
137
143
  break
138
144
  except Exception as exc: # pylint: disable=broad-except
139
- LOG.error("Unexpected streaming error: %s", exc, exc_info=True)
145
+ LOG.error("Streaming error: %s", exc, exc_info=True)
140
146
  break
141
147
 
142
148
  # ------------------------------------------------------------------ #
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: projectdavid
3
- Version: 1.32.6
3
+ Version: 1.32.7
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=-J21v2hDEP2yz343Gx0a05UW9sGUeAFq9eNT9iGP4Pc,5517
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.7.dist-info/licenses/LICENSE,sha256=_8yjiEGttpS284BkfhXxfERqTRZW_tUaHiBB0GTJTMg,4563
38
+ projectdavid-1.32.7.dist-info/METADATA,sha256=8SMqcudaTwLDg6B7m27v_U0mUAKjCFEHs9wtnt7W7Bg,10781
39
+ projectdavid-1.32.7.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
40
+ projectdavid-1.32.7.dist-info/top_level.txt,sha256=kil8GU4s7qYRfNnzGnFHhZnSNRSxgNG-J4HLgQMmMtw,13
41
+ projectdavid-1.32.7.dist-info/RECORD,,