projectdavid 1.32.6__py3-none-any.whl → 1.32.7__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 +29 -23
- {projectdavid-1.32.6.dist-info → projectdavid-1.32.7.dist-info}/METADATA +1 -1
- {projectdavid-1.32.6.dist-info → projectdavid-1.32.7.dist-info}/RECORD +6 -6
- {projectdavid-1.32.6.dist-info → projectdavid-1.32.7.dist-info}/WHEEL +0 -0
- {projectdavid-1.32.6.dist-info → projectdavid-1.32.7.dist-info}/licenses/LICENSE +0 -0
- {projectdavid-1.32.6.dist-info → projectdavid-1.32.7.dist-info}/top_level.txt +0 -0
|
@@ -11,7 +11,9 @@ LOG = UtilsInterface.LoggingUtility()
|
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
class SynchronousInferenceStream:
|
|
14
|
-
"""Wrap an async
|
|
14
|
+
"""Wrap an async token/JSON stream in a synchronous iterator while
|
|
15
|
+
hiding function-call payloads from the UI.
|
|
16
|
+
"""
|
|
15
17
|
|
|
16
18
|
_GLOBAL_LOOP = asyncio.new_event_loop()
|
|
17
19
|
asyncio.set_event_loop(_GLOBAL_LOOP)
|
|
@@ -57,20 +59,22 @@ class SynchronousInferenceStream:
|
|
|
57
59
|
suppress_fc: bool = True,
|
|
58
60
|
) -> Generator[dict, None, None]:
|
|
59
61
|
"""
|
|
60
|
-
Yield provider chunks synchronously.
|
|
62
|
+
Yield provider chunks synchronously.
|
|
61
63
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
64
|
+
When *suppress_fc* is True:
|
|
65
|
+
|
|
66
|
+
• `{"type":"function_call", …}` chunks are dropped.
|
|
67
|
+
• Inline `<fc> … </fc>` text is stripped.
|
|
68
|
+
• *Everything else* is forwarded unchanged.
|
|
65
69
|
"""
|
|
66
70
|
|
|
67
|
-
|
|
71
|
+
resolved_key = api_key or self.api_key
|
|
68
72
|
|
|
69
|
-
async def
|
|
73
|
+
async def _async_gen():
|
|
70
74
|
async for chk in self.inference_client.stream_inference_response(
|
|
71
75
|
provider=provider,
|
|
72
76
|
model=model,
|
|
73
|
-
api_key=
|
|
77
|
+
api_key=resolved_key,
|
|
74
78
|
thread_id=self.thread_id,
|
|
75
79
|
message_id=self.message_id,
|
|
76
80
|
run_id=self.run_id,
|
|
@@ -78,20 +82,20 @@ class SynchronousInferenceStream:
|
|
|
78
82
|
):
|
|
79
83
|
yield chk
|
|
80
84
|
|
|
81
|
-
agen =
|
|
85
|
+
agen = _async_gen().__aiter__()
|
|
82
86
|
|
|
83
|
-
# ----------
|
|
87
|
+
# ---------- inline suppressor chain ----------------------------
|
|
84
88
|
if suppress_fc:
|
|
85
|
-
|
|
86
|
-
|
|
89
|
+
_suppressor = FunctionCallSuppressor()
|
|
90
|
+
_peek_gate = PeekGate(_suppressor)
|
|
87
91
|
|
|
88
92
|
def _filter_text(txt: str) -> str:
|
|
89
|
-
return
|
|
93
|
+
return _peek_gate.feed(txt)
|
|
90
94
|
|
|
91
95
|
else:
|
|
92
96
|
|
|
93
|
-
def _filter_text(txt: str) -> str: #
|
|
94
|
-
return txt
|
|
97
|
+
def _filter_text(txt: str) -> str: # noqa: D401
|
|
98
|
+
return txt # pass-through
|
|
95
99
|
|
|
96
100
|
# ---------- main loop ------------------------------------------
|
|
97
101
|
while True:
|
|
@@ -100,16 +104,17 @@ class SynchronousInferenceStream:
|
|
|
100
104
|
asyncio.wait_for(agen.__anext__(), timeout=timeout_per_chunk)
|
|
101
105
|
)
|
|
102
106
|
|
|
103
|
-
# ①
|
|
107
|
+
# ① provider-labelled function_call → drop
|
|
104
108
|
if suppress_fc and chunk.get("type") == "function_call":
|
|
105
|
-
LOG.debug("[SUPPRESSOR]
|
|
109
|
+
LOG.debug("[SUPPRESSOR] dropped provider function_call chunk")
|
|
106
110
|
continue
|
|
107
111
|
|
|
108
|
-
# ② never touch
|
|
112
|
+
# ② never touch hot_code
|
|
109
113
|
if chunk.get("type") == "hot_code":
|
|
110
114
|
yield chunk
|
|
111
115
|
continue
|
|
112
116
|
|
|
117
|
+
# ③ never touch code_interpreter_stream previews
|
|
113
118
|
if (
|
|
114
119
|
chunk.get("stream_type") == "code_execution"
|
|
115
120
|
and chunk.get("chunk", {}).get("type") == "code_interpreter_stream"
|
|
@@ -117,14 +122,14 @@ class SynchronousInferenceStream:
|
|
|
117
122
|
yield chunk
|
|
118
123
|
continue
|
|
119
124
|
|
|
120
|
-
#
|
|
125
|
+
# ④ scrub inline <fc> tags in plain-text content
|
|
121
126
|
if isinstance(chunk.get("content"), str):
|
|
122
127
|
chunk["content"] = _filter_text(chunk["content"])
|
|
123
128
|
if chunk["content"] == "":
|
|
124
|
-
#
|
|
125
|
-
# or it was fully suppressed – skip for now.
|
|
129
|
+
# completely removed (or still buffering) – skip emit
|
|
126
130
|
continue
|
|
127
131
|
|
|
132
|
+
# ⑤ forward every other chunk verbatim
|
|
128
133
|
yield chunk
|
|
129
134
|
|
|
130
135
|
except StopAsyncIteration:
|
|
@@ -132,11 +137,12 @@ class SynchronousInferenceStream:
|
|
|
132
137
|
break
|
|
133
138
|
except asyncio.TimeoutError:
|
|
134
139
|
LOG.error(
|
|
135
|
-
"[
|
|
140
|
+
"[TimeoutError] no chunk received for %.1f s – aborting",
|
|
141
|
+
timeout_per_chunk,
|
|
136
142
|
)
|
|
137
143
|
break
|
|
138
144
|
except Exception as exc: # pylint: disable=broad-except
|
|
139
|
-
LOG.error("
|
|
145
|
+
LOG.error("Streaming error: %s", exc, exc_info=True)
|
|
140
146
|
break
|
|
141
147
|
|
|
142
148
|
# ------------------------------------------------------------------ #
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: projectdavid
|
|
3
|
-
Version: 1.32.
|
|
3
|
+
Version: 1.32.7
|
|
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=-J21v2hDEP2yz343Gx0a05UW9sGUeAFq9eNT9iGP4Pc,5517
|
|
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.7.dist-info/licenses/LICENSE,sha256=_8yjiEGttpS284BkfhXxfERqTRZW_tUaHiBB0GTJTMg,4563
|
|
38
|
+
projectdavid-1.32.7.dist-info/METADATA,sha256=8SMqcudaTwLDg6B7m27v_U0mUAKjCFEHs9wtnt7W7Bg,10781
|
|
39
|
+
projectdavid-1.32.7.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
40
|
+
projectdavid-1.32.7.dist-info/top_level.txt,sha256=kil8GU4s7qYRfNnzGnFHhZnSNRSxgNG-J4HLgQMmMtw,13
|
|
41
|
+
projectdavid-1.32.7.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|