projectdavid 1.32.7__py3-none-any.whl → 1.32.9__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 +37 -41
- {projectdavid-1.32.7.dist-info → projectdavid-1.32.9.dist-info}/METADATA +1 -1
- {projectdavid-1.32.7.dist-info → projectdavid-1.32.9.dist-info}/RECORD +6 -6
- {projectdavid-1.32.7.dist-info → projectdavid-1.32.9.dist-info}/WHEEL +0 -0
- {projectdavid-1.32.7.dist-info → projectdavid-1.32.9.dist-info}/licenses/LICENSE +0 -0
- {projectdavid-1.32.7.dist-info → projectdavid-1.32.9.dist-info}/top_level.txt +0 -0
|
@@ -11,16 +11,12 @@ LOG = UtilsInterface.LoggingUtility()
|
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
class SynchronousInferenceStream:
|
|
14
|
-
"""Wrap an async token/JSON stream in a synchronous iterator while
|
|
15
|
-
hiding function-call payloads from the UI.
|
|
16
|
-
"""
|
|
17
|
-
|
|
18
14
|
_GLOBAL_LOOP = asyncio.new_event_loop()
|
|
19
15
|
asyncio.set_event_loop(_GLOBAL_LOOP)
|
|
20
16
|
|
|
21
|
-
#
|
|
22
|
-
#
|
|
23
|
-
#
|
|
17
|
+
# --------------------------------------------------------------
|
|
18
|
+
# ctor / setup
|
|
19
|
+
# --------------------------------------------------------------
|
|
24
20
|
def __init__(self, inference) -> None:
|
|
25
21
|
self.inference_client = inference
|
|
26
22
|
self.user_id: Optional[str] = None
|
|
@@ -46,9 +42,9 @@ class SynchronousInferenceStream:
|
|
|
46
42
|
self.run_id = run_id
|
|
47
43
|
self.api_key = api_key
|
|
48
44
|
|
|
49
|
-
#
|
|
45
|
+
# --------------------------------------------------------------
|
|
50
46
|
# main streaming entry-point
|
|
51
|
-
#
|
|
47
|
+
# --------------------------------------------------------------
|
|
52
48
|
def stream_chunks(
|
|
53
49
|
self,
|
|
54
50
|
provider: str,
|
|
@@ -58,23 +54,14 @@ class SynchronousInferenceStream:
|
|
|
58
54
|
timeout_per_chunk: float = 280.0,
|
|
59
55
|
suppress_fc: bool = True,
|
|
60
56
|
) -> Generator[dict, None, None]:
|
|
61
|
-
"""
|
|
62
|
-
Yield provider chunks synchronously.
|
|
63
|
-
|
|
64
|
-
When *suppress_fc* is True:
|
|
65
57
|
|
|
66
|
-
|
|
67
|
-
• Inline `<fc> … </fc>` text is stripped.
|
|
68
|
-
• *Everything else* is forwarded unchanged.
|
|
69
|
-
"""
|
|
58
|
+
resolved_api_key = api_key or self.api_key
|
|
70
59
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
async def _async_gen():
|
|
60
|
+
async def _stream_chunks_async():
|
|
74
61
|
async for chk in self.inference_client.stream_inference_response(
|
|
75
62
|
provider=provider,
|
|
76
63
|
model=model,
|
|
77
|
-
api_key=
|
|
64
|
+
api_key=resolved_api_key,
|
|
78
65
|
thread_id=self.thread_id,
|
|
79
66
|
message_id=self.message_id,
|
|
80
67
|
run_id=self.run_id,
|
|
@@ -82,9 +69,9 @@ class SynchronousInferenceStream:
|
|
|
82
69
|
):
|
|
83
70
|
yield chk
|
|
84
71
|
|
|
85
|
-
agen =
|
|
72
|
+
agen = _stream_chunks_async().__aiter__()
|
|
86
73
|
|
|
87
|
-
# ----------
|
|
74
|
+
# ---------- suppression chain ----------
|
|
88
75
|
if suppress_fc:
|
|
89
76
|
_suppressor = FunctionCallSuppressor()
|
|
90
77
|
_peek_gate = PeekGate(_suppressor)
|
|
@@ -94,27 +81,33 @@ class SynchronousInferenceStream:
|
|
|
94
81
|
|
|
95
82
|
else:
|
|
96
83
|
|
|
97
|
-
def _filter_text(txt: str) -> str: #
|
|
98
|
-
return txt
|
|
84
|
+
def _filter_text(txt: str) -> str: # no-op
|
|
85
|
+
return txt
|
|
86
|
+
|
|
87
|
+
# ---------------------------------------
|
|
99
88
|
|
|
100
|
-
# ---------- main loop ------------------------------------------
|
|
101
89
|
while True:
|
|
102
90
|
try:
|
|
103
91
|
chunk = self._GLOBAL_LOOP.run_until_complete(
|
|
104
92
|
asyncio.wait_for(agen.__anext__(), timeout=timeout_per_chunk)
|
|
105
93
|
)
|
|
106
94
|
|
|
107
|
-
#
|
|
95
|
+
# provider-labelled function_call
|
|
108
96
|
if suppress_fc and chunk.get("type") == "function_call":
|
|
109
|
-
LOG.debug("[SUPPRESSOR]
|
|
97
|
+
LOG.debug("[SUPPRESSOR] blocked provider-labelled function_call")
|
|
110
98
|
continue
|
|
111
99
|
|
|
112
|
-
#
|
|
100
|
+
# allow hot_code to bypass suppression
|
|
113
101
|
if chunk.get("type") == "hot_code":
|
|
114
102
|
yield chunk
|
|
115
103
|
continue
|
|
116
104
|
|
|
117
|
-
#
|
|
105
|
+
# allow hot_code_output to bypass suppression
|
|
106
|
+
if chunk.get("type") == "hot_code_output":
|
|
107
|
+
yield chunk
|
|
108
|
+
continue
|
|
109
|
+
|
|
110
|
+
# allow code_interpreter_stream to bypass suppression
|
|
118
111
|
if (
|
|
119
112
|
chunk.get("stream_type") == "code_execution"
|
|
120
113
|
and chunk.get("chunk", {}).get("type") == "code_interpreter_stream"
|
|
@@ -122,32 +115,35 @@ class SynchronousInferenceStream:
|
|
|
122
115
|
yield chunk
|
|
123
116
|
continue
|
|
124
117
|
|
|
125
|
-
#
|
|
118
|
+
# inline content
|
|
126
119
|
if isinstance(chunk.get("content"), str):
|
|
127
120
|
chunk["content"] = _filter_text(chunk["content"])
|
|
128
121
|
if chunk["content"] == "":
|
|
129
|
-
#
|
|
122
|
+
continue # fully suppressed (or still peeking)
|
|
123
|
+
|
|
124
|
+
if (
|
|
125
|
+
suppress_fc
|
|
126
|
+
and '"name": "code_interpreter"' in chunk["content"]
|
|
127
|
+
and '"arguments": {"code"' in chunk["content"]
|
|
128
|
+
):
|
|
129
|
+
LOG.debug("[SUPPRESSOR] inline code_interpreter match blocked")
|
|
130
130
|
continue
|
|
131
131
|
|
|
132
|
-
# ⑤ forward every other chunk verbatim
|
|
133
132
|
yield chunk
|
|
134
133
|
|
|
135
134
|
except StopAsyncIteration:
|
|
136
135
|
LOG.info("Stream completed normally.")
|
|
137
136
|
break
|
|
138
137
|
except asyncio.TimeoutError:
|
|
139
|
-
LOG.error(
|
|
140
|
-
"[TimeoutError] no chunk received for %.1f s – aborting",
|
|
141
|
-
timeout_per_chunk,
|
|
142
|
-
)
|
|
138
|
+
LOG.error("[TimeoutError] Timeout occurred, stopping stream.")
|
|
143
139
|
break
|
|
144
|
-
except Exception as
|
|
145
|
-
LOG.error("
|
|
140
|
+
except Exception as e:
|
|
141
|
+
LOG.error("Unexpected error during streaming completions: %s", e)
|
|
146
142
|
break
|
|
147
143
|
|
|
148
|
-
#
|
|
144
|
+
# --------------------------------------------------------------
|
|
149
145
|
# housekeeping
|
|
150
|
-
#
|
|
146
|
+
# --------------------------------------------------------------
|
|
151
147
|
@classmethod
|
|
152
148
|
def shutdown_loop(cls) -> None:
|
|
153
149
|
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.9
|
|
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=5G2AhUlfQ5hWzUwtlaiy8K063bQFNhEpJfxrUZU8uE8,5330
|
|
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.9.dist-info/licenses/LICENSE,sha256=_8yjiEGttpS284BkfhXxfERqTRZW_tUaHiBB0GTJTMg,4563
|
|
38
|
+
projectdavid-1.32.9.dist-info/METADATA,sha256=D2FjSoU4yYLQYkIiplainIQtmBww4KmrglQBBos2fBQ,10781
|
|
39
|
+
projectdavid-1.32.9.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
40
|
+
projectdavid-1.32.9.dist-info/top_level.txt,sha256=kil8GU4s7qYRfNnzGnFHhZnSNRSxgNG-J4HLgQMmMtw,13
|
|
41
|
+
projectdavid-1.32.9.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|