projectdavid 1.32.7__py3-none-any.whl → 1.32.9__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,16 +11,12 @@ LOG = UtilsInterface.LoggingUtility()
11
11
 
12
12
 
13
13
  class SynchronousInferenceStream:
14
- """Wrap an async token/JSON stream in a synchronous iterator while
15
- hiding function-call payloads from the UI.
16
- """
17
-
18
14
  _GLOBAL_LOOP = asyncio.new_event_loop()
19
15
  asyncio.set_event_loop(_GLOBAL_LOOP)
20
16
 
21
- # ------------------------------------------------------------------ #
22
- # construction / setup
23
- # ------------------------------------------------------------------ #
17
+ # --------------------------------------------------------------
18
+ # ctor / setup
19
+ # --------------------------------------------------------------
24
20
  def __init__(self, inference) -> None:
25
21
  self.inference_client = inference
26
22
  self.user_id: Optional[str] = None
@@ -46,9 +42,9 @@ class SynchronousInferenceStream:
46
42
  self.run_id = run_id
47
43
  self.api_key = api_key
48
44
 
49
- # ------------------------------------------------------------------ #
45
+ # --------------------------------------------------------------
50
46
  # main streaming entry-point
51
- # ------------------------------------------------------------------ #
47
+ # --------------------------------------------------------------
52
48
  def stream_chunks(
53
49
  self,
54
50
  provider: str,
@@ -58,23 +54,14 @@ class SynchronousInferenceStream:
58
54
  timeout_per_chunk: float = 280.0,
59
55
  suppress_fc: bool = True,
60
56
  ) -> Generator[dict, None, None]:
61
- """
62
- Yield provider chunks synchronously.
63
-
64
- When *suppress_fc* is True:
65
57
 
66
- `{"type":"function_call", …}` chunks are dropped.
67
- • Inline `<fc> … </fc>` text is stripped.
68
- • *Everything else* is forwarded unchanged.
69
- """
58
+ resolved_api_key = api_key or self.api_key
70
59
 
71
- resolved_key = api_key or self.api_key
72
-
73
- async def _async_gen():
60
+ async def _stream_chunks_async():
74
61
  async for chk in self.inference_client.stream_inference_response(
75
62
  provider=provider,
76
63
  model=model,
77
- api_key=resolved_key,
64
+ api_key=resolved_api_key,
78
65
  thread_id=self.thread_id,
79
66
  message_id=self.message_id,
80
67
  run_id=self.run_id,
@@ -82,9 +69,9 @@ class SynchronousInferenceStream:
82
69
  ):
83
70
  yield chk
84
71
 
85
- agen = _async_gen().__aiter__()
72
+ agen = _stream_chunks_async().__aiter__()
86
73
 
87
- # ---------- inline suppressor chain ----------------------------
74
+ # ---------- suppression chain ----------
88
75
  if suppress_fc:
89
76
  _suppressor = FunctionCallSuppressor()
90
77
  _peek_gate = PeekGate(_suppressor)
@@ -94,27 +81,33 @@ class SynchronousInferenceStream:
94
81
 
95
82
  else:
96
83
 
97
- def _filter_text(txt: str) -> str: # noqa: D401
98
- return txt # pass-through
84
+ def _filter_text(txt: str) -> str: # no-op
85
+ return txt
86
+
87
+ # ---------------------------------------
99
88
 
100
- # ---------- main loop ------------------------------------------
101
89
  while True:
102
90
  try:
103
91
  chunk = self._GLOBAL_LOOP.run_until_complete(
104
92
  asyncio.wait_for(agen.__anext__(), timeout=timeout_per_chunk)
105
93
  )
106
94
 
107
- # provider-labelled function_call → drop
95
+ # provider-labelled function_call
108
96
  if suppress_fc and chunk.get("type") == "function_call":
109
- LOG.debug("[SUPPRESSOR] dropped provider function_call chunk")
97
+ LOG.debug("[SUPPRESSOR] blocked provider-labelled function_call")
110
98
  continue
111
99
 
112
- # never touch hot_code
100
+ # allow hot_code to bypass suppression
113
101
  if chunk.get("type") == "hot_code":
114
102
  yield chunk
115
103
  continue
116
104
 
117
- # never touch code_interpreter_stream previews
105
+ # allow hot_code_output to bypass suppression
106
+ if chunk.get("type") == "hot_code_output":
107
+ yield chunk
108
+ continue
109
+
110
+ # allow code_interpreter_stream to bypass suppression
118
111
  if (
119
112
  chunk.get("stream_type") == "code_execution"
120
113
  and chunk.get("chunk", {}).get("type") == "code_interpreter_stream"
@@ -122,32 +115,35 @@ class SynchronousInferenceStream:
122
115
  yield chunk
123
116
  continue
124
117
 
125
- # ④ scrub inline <fc> tags in plain-text content
118
+ # inline content
126
119
  if isinstance(chunk.get("content"), str):
127
120
  chunk["content"] = _filter_text(chunk["content"])
128
121
  if chunk["content"] == "":
129
- # completely removed (or still buffering) – skip emit
122
+ continue # fully suppressed (or still peeking)
123
+
124
+ if (
125
+ suppress_fc
126
+ and '"name": "code_interpreter"' in chunk["content"]
127
+ and '"arguments": {"code"' in chunk["content"]
128
+ ):
129
+ LOG.debug("[SUPPRESSOR] inline code_interpreter match blocked")
130
130
  continue
131
131
 
132
- # ⑤ forward every other chunk verbatim
133
132
  yield chunk
134
133
 
135
134
  except StopAsyncIteration:
136
135
  LOG.info("Stream completed normally.")
137
136
  break
138
137
  except asyncio.TimeoutError:
139
- LOG.error(
140
- "[TimeoutError] no chunk received for %.1f s – aborting",
141
- timeout_per_chunk,
142
- )
138
+ LOG.error("[TimeoutError] Timeout occurred, stopping stream.")
143
139
  break
144
- except Exception as exc: # pylint: disable=broad-except
145
- LOG.error("Streaming error: %s", exc, exc_info=True)
140
+ except Exception as e:
141
+ LOG.error("Unexpected error during streaming completions: %s", e)
146
142
  break
147
143
 
148
- # ------------------------------------------------------------------ #
144
+ # --------------------------------------------------------------
149
145
  # housekeeping
150
- # ------------------------------------------------------------------ #
146
+ # --------------------------------------------------------------
151
147
  @classmethod
152
148
  def shutdown_loop(cls) -> None:
153
149
  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.7
3
+ Version: 1.32.9
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=-J21v2hDEP2yz343Gx0a05UW9sGUeAFq9eNT9iGP4Pc,5517
18
+ projectdavid/clients/synchronous_inference_wrapper.py,sha256=5G2AhUlfQ5hWzUwtlaiy8K063bQFNhEpJfxrUZU8uE8,5330
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.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,,
37
+ projectdavid-1.32.9.dist-info/licenses/LICENSE,sha256=_8yjiEGttpS284BkfhXxfERqTRZW_tUaHiBB0GTJTMg,4563
38
+ projectdavid-1.32.9.dist-info/METADATA,sha256=D2FjSoU4yYLQYkIiplainIQtmBww4KmrglQBBos2fBQ,10781
39
+ projectdavid-1.32.9.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
40
+ projectdavid-1.32.9.dist-info/top_level.txt,sha256=kil8GU4s7qYRfNnzGnFHhZnSNRSxgNG-J4HLgQMmMtw,13
41
+ projectdavid-1.32.9.dist-info/RECORD,,