projectdavid 1.32.12__py3-none-any.whl → 1.32.13__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 +16 -62
- {projectdavid-1.32.12.dist-info → projectdavid-1.32.13.dist-info}/METADATA +1 -1
- {projectdavid-1.32.12.dist-info → projectdavid-1.32.13.dist-info}/RECORD +6 -6
- {projectdavid-1.32.12.dist-info → projectdavid-1.32.13.dist-info}/WHEEL +0 -0
- {projectdavid-1.32.12.dist-info → projectdavid-1.32.13.dist-info}/licenses/LICENSE +0 -0
- {projectdavid-1.32.12.dist-info → projectdavid-1.32.13.dist-info}/top_level.txt +0 -0
|
@@ -14,9 +14,7 @@ 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
|
-
# --------------------------------------------------------------
|
|
17
|
+
# ────────────────────────────────────────────────────────────────
|
|
20
18
|
def __init__(self, inference) -> None:
|
|
21
19
|
self.inference_client = inference
|
|
22
20
|
self.user_id: Optional[str] = None
|
|
@@ -42,9 +40,7 @@ class SynchronousInferenceStream:
|
|
|
42
40
|
self.run_id = run_id
|
|
43
41
|
self.api_key = api_key
|
|
44
42
|
|
|
45
|
-
#
|
|
46
|
-
# main streaming entry-point
|
|
47
|
-
# --------------------------------------------------------------
|
|
43
|
+
# ────────────────────────────────────────────────────────────────
|
|
48
44
|
def stream_chunks(
|
|
49
45
|
self,
|
|
50
46
|
provider: str,
|
|
@@ -71,7 +67,7 @@ class SynchronousInferenceStream:
|
|
|
71
67
|
|
|
72
68
|
agen = _stream_chunks_async().__aiter__()
|
|
73
69
|
|
|
74
|
-
#
|
|
70
|
+
# ── build the <fc> suppressor chain ─────────────────────────
|
|
75
71
|
if suppress_fc:
|
|
76
72
|
_suppressor = FunctionCallSuppressor()
|
|
77
73
|
_peek_gate = PeekGate(_suppressor)
|
|
@@ -81,50 +77,26 @@ class SynchronousInferenceStream:
|
|
|
81
77
|
|
|
82
78
|
else:
|
|
83
79
|
|
|
84
|
-
def _filter_text(txt: str) -> str:
|
|
80
|
+
def _filter_text(txt: str) -> str:
|
|
85
81
|
return txt
|
|
86
82
|
|
|
87
|
-
#
|
|
88
|
-
|
|
83
|
+
# ── main loop ───────────────────────────────────────────────
|
|
89
84
|
while True:
|
|
90
85
|
try:
|
|
91
86
|
chunk = self._GLOBAL_LOOP.run_until_complete(
|
|
92
87
|
asyncio.wait_for(agen.__anext__(), timeout=timeout_per_chunk)
|
|
93
88
|
)
|
|
94
89
|
|
|
95
|
-
# provider-labelled function_call
|
|
90
|
+
# ① drop provider-labelled function_call objects
|
|
96
91
|
if suppress_fc and chunk.get("type") == "function_call":
|
|
97
|
-
LOG.debug("[
|
|
98
|
-
continue
|
|
99
|
-
|
|
100
|
-
if suppress_fc and isinstance(chunk.get("content"), str):
|
|
101
|
-
chunk["content"] = _filter_text(chunk["content"])
|
|
102
|
-
if chunk["content"] == "":
|
|
103
|
-
# fully suppressed (either buffering or an <fc> block)
|
|
104
|
-
continue
|
|
105
|
-
|
|
106
|
-
# ------------------------------------------------------
|
|
107
|
-
# allow the assistants response1 to bypass suppression
|
|
108
|
-
# -------------------------------------------------------
|
|
109
|
-
if chunk.get("type") == "content":
|
|
110
|
-
yield chunk
|
|
111
|
-
continue
|
|
112
|
-
|
|
113
|
-
# -------------------------------------
|
|
114
|
-
# allow hot_code to bypass suppression
|
|
115
|
-
# ------------------------------------
|
|
116
|
-
if chunk.get("type") == "hot_code":
|
|
117
|
-
yield chunk
|
|
92
|
+
LOG.debug("[SUPPRESS] provider function_call dropped")
|
|
118
93
|
continue
|
|
119
94
|
|
|
120
|
-
#
|
|
121
|
-
if chunk.get("type")
|
|
95
|
+
# ② hot-code & file-preview payloads always pass
|
|
96
|
+
if chunk.get("type") in ("hot_code", "hot_code_output"):
|
|
122
97
|
yield chunk
|
|
123
98
|
continue
|
|
124
99
|
|
|
125
|
-
# -------------------------------------------------------
|
|
126
|
-
# allow code_interpreter_stream to bypass suppression
|
|
127
|
-
# --------------------------------------------------------
|
|
128
100
|
if (
|
|
129
101
|
chunk.get("stream_type") == "code_execution"
|
|
130
102
|
and chunk.get("chunk", {}).get("type") == "code_interpreter_stream"
|
|
@@ -132,45 +104,27 @@ class SynchronousInferenceStream:
|
|
|
132
104
|
yield chunk
|
|
133
105
|
continue
|
|
134
106
|
|
|
135
|
-
#
|
|
136
|
-
# inline content
|
|
137
|
-
# ----------------------------------
|
|
107
|
+
# ③ ordinary TEXT content — run through the <fc> filter
|
|
138
108
|
if isinstance(chunk.get("content"), str):
|
|
139
109
|
chunk["content"] = _filter_text(chunk["content"])
|
|
140
110
|
if chunk["content"] == "":
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
if (
|
|
144
|
-
suppress_fc
|
|
145
|
-
and '"name": "code_interpreter"' in chunk["content"]
|
|
146
|
-
and '"arguments": {"code"' in chunk["content"]
|
|
147
|
-
):
|
|
148
|
-
LOG.debug("[SUPPRESSOR] inline code_interpreter match blocked")
|
|
149
|
-
continue
|
|
150
|
-
|
|
151
|
-
if (
|
|
152
|
-
suppress_fc
|
|
153
|
-
and '"name": "file_search"' in chunk["content"]
|
|
154
|
-
and '"arguments": {"query_text"' in chunk["content"]
|
|
155
|
-
):
|
|
156
|
-
LOG.debug("[SUPPRESSOR] inline file_search match blocked")
|
|
111
|
+
# fully suppressed (either buffering or an <fc> block)
|
|
157
112
|
continue
|
|
158
113
|
|
|
114
|
+
# ④ everything else streams unchanged
|
|
159
115
|
yield chunk
|
|
160
116
|
|
|
161
117
|
except StopAsyncIteration:
|
|
162
118
|
LOG.info("Stream completed normally.")
|
|
163
119
|
break
|
|
164
120
|
except asyncio.TimeoutError:
|
|
165
|
-
LOG.error("[TimeoutError]
|
|
121
|
+
LOG.error("[TimeoutError] Chunk wait expired – aborting stream.")
|
|
166
122
|
break
|
|
167
|
-
except Exception as
|
|
168
|
-
LOG.error("Unexpected
|
|
123
|
+
except Exception as exc: # noqa: BLE001
|
|
124
|
+
LOG.error("Unexpected streaming error: %s", exc, exc_info=True)
|
|
169
125
|
break
|
|
170
126
|
|
|
171
|
-
#
|
|
172
|
-
# housekeeping
|
|
173
|
-
# --------------------------------------------------------------
|
|
127
|
+
# ────────────────────────────────────────────────────────────────
|
|
174
128
|
@classmethod
|
|
175
129
|
def shutdown_loop(cls) -> None:
|
|
176
130
|
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.
|
|
3
|
+
Version: 1.32.13
|
|
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=
|
|
18
|
+
projectdavid/clients/synchronous_inference_wrapper.py,sha256=K6AQVrMBRBDqGn-rzoKsdFnOGvKHmFrlPplW8tCpUIM,5218
|
|
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.
|
|
38
|
-
projectdavid-1.32.
|
|
39
|
-
projectdavid-1.32.
|
|
40
|
-
projectdavid-1.32.
|
|
41
|
-
projectdavid-1.32.
|
|
37
|
+
projectdavid-1.32.13.dist-info/licenses/LICENSE,sha256=_8yjiEGttpS284BkfhXxfERqTRZW_tUaHiBB0GTJTMg,4563
|
|
38
|
+
projectdavid-1.32.13.dist-info/METADATA,sha256=s7CvoID0lYqa_kHmguh-bpsz7egmADoi4LJThWLgpOk,10782
|
|
39
|
+
projectdavid-1.32.13.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
40
|
+
projectdavid-1.32.13.dist-info/top_level.txt,sha256=kil8GU4s7qYRfNnzGnFHhZnSNRSxgNG-J4HLgQMmMtw,13
|
|
41
|
+
projectdavid-1.32.13.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|