projectdavid 1.33.10__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 +50 -27
- {projectdavid-1.33.10.dist-info → projectdavid-1.33.12.dist-info}/METADATA +1 -1
- {projectdavid-1.33.10.dist-info → projectdavid-1.33.12.dist-info}/RECORD +6 -6
- {projectdavid-1.33.10.dist-info → projectdavid-1.33.12.dist-info}/WHEEL +0 -0
- {projectdavid-1.33.10.dist-info → projectdavid-1.33.12.dist-info}/licenses/LICENSE +0 -0
- {projectdavid-1.33.10.dist-info → projectdavid-1.33.12.dist-info}/top_level.txt +0 -0
|
@@ -14,9 +14,6 @@ class SynchronousInferenceStream:
|
|
|
14
14
|
_GLOBAL_LOOP = asyncio.new_event_loop()
|
|
15
15
|
asyncio.set_event_loop(_GLOBAL_LOOP)
|
|
16
16
|
|
|
17
|
-
# --------------------------------------------------------------
|
|
18
|
-
# ctor / setup
|
|
19
|
-
# --------------------------------------------------------------
|
|
20
17
|
def __init__(self, inference) -> None:
|
|
21
18
|
self.inference_client = inference
|
|
22
19
|
self.user_id: Optional[str] = None
|
|
@@ -42,9 +39,6 @@ class SynchronousInferenceStream:
|
|
|
42
39
|
self.run_id = run_id
|
|
43
40
|
self.api_key = api_key
|
|
44
41
|
|
|
45
|
-
# --------------------------------------------------------------
|
|
46
|
-
# main streaming entry-point
|
|
47
|
-
# --------------------------------------------------------------
|
|
48
42
|
def stream_chunks(
|
|
49
43
|
self,
|
|
50
44
|
provider: str,
|
|
@@ -71,7 +65,6 @@ class SynchronousInferenceStream:
|
|
|
71
65
|
|
|
72
66
|
agen = _stream_chunks_async().__aiter__()
|
|
73
67
|
|
|
74
|
-
# ---------- suppression chain ----------
|
|
75
68
|
if suppress_fc:
|
|
76
69
|
_suppressor = FunctionCallSuppressor()
|
|
77
70
|
_peek_gate = PeekGate(_suppressor)
|
|
@@ -81,10 +74,28 @@ class SynchronousInferenceStream:
|
|
|
81
74
|
|
|
82
75
|
else:
|
|
83
76
|
|
|
84
|
-
def _filter_text(txt: str) -> str:
|
|
77
|
+
def _filter_text(txt: str) -> str:
|
|
85
78
|
return txt
|
|
86
79
|
|
|
87
|
-
|
|
80
|
+
def _drain_filters() -> Optional[dict]:
|
|
81
|
+
if not suppress_fc:
|
|
82
|
+
return None
|
|
83
|
+
parts: list[str] = []
|
|
84
|
+
while True:
|
|
85
|
+
out = _filter_text("")
|
|
86
|
+
if not out:
|
|
87
|
+
break
|
|
88
|
+
parts.append(out)
|
|
89
|
+
if not _peek_gate.suppressing and _peek_gate.buf:
|
|
90
|
+
parts.append(_peek_gate.buf)
|
|
91
|
+
_peek_gate.buf = ""
|
|
92
|
+
if parts:
|
|
93
|
+
return {
|
|
94
|
+
"type": "content",
|
|
95
|
+
"content": "".join(parts),
|
|
96
|
+
"run_id": self.run_id,
|
|
97
|
+
}
|
|
98
|
+
return None
|
|
88
99
|
|
|
89
100
|
while True:
|
|
90
101
|
try:
|
|
@@ -92,40 +103,52 @@ class SynchronousInferenceStream:
|
|
|
92
103
|
asyncio.wait_for(agen.__anext__(), timeout=timeout_per_chunk)
|
|
93
104
|
)
|
|
94
105
|
|
|
95
|
-
#
|
|
96
|
-
|
|
97
|
-
|
|
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
|
|
114
|
+
continue
|
|
115
|
+
|
|
116
|
+
if chunk.get("type") in ("hot_code", "hot_code_output"):
|
|
117
|
+
yield chunk
|
|
118
|
+
continue
|
|
119
|
+
|
|
120
|
+
if (
|
|
121
|
+
chunk.get("stream_type") == "code_execution"
|
|
122
|
+
and chunk.get("chunk", {}).get("type") == "code_interpreter_stream"
|
|
123
|
+
):
|
|
124
|
+
yield chunk
|
|
98
125
|
continue
|
|
99
126
|
|
|
100
|
-
# inline content
|
|
101
127
|
if isinstance(chunk.get("content"), str):
|
|
102
128
|
chunk["content"] = _filter_text(chunk["content"])
|
|
103
129
|
if chunk["content"] == "":
|
|
104
|
-
continue # fully suppressed (or still peeking)
|
|
105
|
-
|
|
106
|
-
# additional raw inline suppression for partial JSON
|
|
107
|
-
if (
|
|
108
|
-
'"name": "code_interpreter"' in chunk["content"]
|
|
109
|
-
and '"arguments": {"code"' in chunk["content"]
|
|
110
|
-
):
|
|
111
|
-
LOG.debug("[SUPPRESSOR] inline code_interpreter match blocked")
|
|
112
130
|
continue
|
|
113
131
|
|
|
114
132
|
yield chunk
|
|
115
133
|
|
|
116
134
|
except StopAsyncIteration:
|
|
135
|
+
if tail := _drain_filters():
|
|
136
|
+
yield tail
|
|
117
137
|
LOG.info("Stream completed normally.")
|
|
118
138
|
break
|
|
139
|
+
|
|
119
140
|
except asyncio.TimeoutError:
|
|
120
|
-
|
|
141
|
+
if tail := _drain_filters():
|
|
142
|
+
yield tail
|
|
143
|
+
LOG.error("[TimeoutError] Chunk wait expired – aborting stream.")
|
|
121
144
|
break
|
|
122
|
-
|
|
123
|
-
|
|
145
|
+
|
|
146
|
+
except Exception as exc:
|
|
147
|
+
if tail := _drain_filters():
|
|
148
|
+
yield tail
|
|
149
|
+
LOG.error("Unexpected streaming error: %s", exc, exc_info=True)
|
|
124
150
|
break
|
|
125
151
|
|
|
126
|
-
# --------------------------------------------------------------
|
|
127
|
-
# housekeeping
|
|
128
|
-
# --------------------------------------------------------------
|
|
129
152
|
@classmethod
|
|
130
153
|
def shutdown_loop(cls) -> None:
|
|
131
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
|