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