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