projectdavid 1.32.11__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 -58
- {projectdavid-1.32.11.dist-info → projectdavid-1.32.13.dist-info}/METADATA +1 -1
- {projectdavid-1.32.11.dist-info → projectdavid-1.32.13.dist-info}/RECORD +6 -6
- {projectdavid-1.32.11.dist-info → projectdavid-1.32.13.dist-info}/WHEEL +0 -0
- {projectdavid-1.32.11.dist-info → projectdavid-1.32.13.dist-info}/licenses/LICENSE +0 -0
- {projectdavid-1.32.11.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,44 +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
|
-
# ------------------------------------------------------
|
|
101
|
-
# allow the assistants response1 to bypass suppression
|
|
102
|
-
# -------------------------------------------------------
|
|
103
|
-
if chunk.get("type") == "content":
|
|
104
|
-
yield chunk
|
|
92
|
+
LOG.debug("[SUPPRESS] provider function_call dropped")
|
|
105
93
|
continue
|
|
106
94
|
|
|
107
|
-
#
|
|
108
|
-
|
|
109
|
-
# ------------------------------------
|
|
110
|
-
if chunk.get("type") == "hot_code":
|
|
95
|
+
# ② hot-code & file-preview payloads always pass
|
|
96
|
+
if chunk.get("type") in ("hot_code", "hot_code_output"):
|
|
111
97
|
yield chunk
|
|
112
98
|
continue
|
|
113
99
|
|
|
114
|
-
# allow hot_code_output to bypass suppression
|
|
115
|
-
if chunk.get("type") == "hot_code_output":
|
|
116
|
-
yield chunk
|
|
117
|
-
continue
|
|
118
|
-
|
|
119
|
-
# -------------------------------------------------------
|
|
120
|
-
# allow code_interpreter_stream to bypass suppression
|
|
121
|
-
# --------------------------------------------------------
|
|
122
100
|
if (
|
|
123
101
|
chunk.get("stream_type") == "code_execution"
|
|
124
102
|
and chunk.get("chunk", {}).get("type") == "code_interpreter_stream"
|
|
@@ -126,47 +104,27 @@ class SynchronousInferenceStream:
|
|
|
126
104
|
yield chunk
|
|
127
105
|
continue
|
|
128
106
|
|
|
129
|
-
#
|
|
130
|
-
# inline content
|
|
131
|
-
# ----------------------------------
|
|
107
|
+
# ③ ordinary TEXT content — run through the <fc> filter
|
|
132
108
|
if isinstance(chunk.get("content"), str):
|
|
133
109
|
chunk["content"] = _filter_text(chunk["content"])
|
|
134
110
|
if chunk["content"] == "":
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
if (
|
|
138
|
-
suppress_fc
|
|
139
|
-
and '"name": "code_interpreter"' in chunk["content"]
|
|
140
|
-
and '"arguments": {"code"' in chunk["content"]
|
|
141
|
-
):
|
|
142
|
-
LOG.debug("[SUPPRESSOR] inline code_interpreter match blocked")
|
|
143
|
-
continue
|
|
144
|
-
# ---------------------------------------------------------------
|
|
145
|
-
# Filter and supress file_search inline
|
|
146
|
-
# ---------------------------------------------------------------
|
|
147
|
-
if (
|
|
148
|
-
suppress_fc
|
|
149
|
-
and '"name": "file_search"' in chunk["content"]
|
|
150
|
-
and '"arguments": {"query_text"' in chunk["content"]
|
|
151
|
-
):
|
|
152
|
-
LOG.debug("[SUPPRESSOR] inline file_search match blocked")
|
|
111
|
+
# fully suppressed (either buffering or an <fc> block)
|
|
153
112
|
continue
|
|
154
113
|
|
|
114
|
+
# ④ everything else streams unchanged
|
|
155
115
|
yield chunk
|
|
156
116
|
|
|
157
117
|
except StopAsyncIteration:
|
|
158
118
|
LOG.info("Stream completed normally.")
|
|
159
119
|
break
|
|
160
120
|
except asyncio.TimeoutError:
|
|
161
|
-
LOG.error("[TimeoutError]
|
|
121
|
+
LOG.error("[TimeoutError] Chunk wait expired – aborting stream.")
|
|
162
122
|
break
|
|
163
|
-
except Exception as
|
|
164
|
-
LOG.error("Unexpected
|
|
123
|
+
except Exception as exc: # noqa: BLE001
|
|
124
|
+
LOG.error("Unexpected streaming error: %s", exc, exc_info=True)
|
|
165
125
|
break
|
|
166
126
|
|
|
167
|
-
#
|
|
168
|
-
# housekeeping
|
|
169
|
-
# --------------------------------------------------------------
|
|
127
|
+
# ────────────────────────────────────────────────────────────────
|
|
170
128
|
@classmethod
|
|
171
129
|
def shutdown_loop(cls) -> None:
|
|
172
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
|