projectdavid 1.32.7__py3-none-any.whl → 1.32.8__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 +32 -41
- {projectdavid-1.32.7.dist-info → projectdavid-1.32.8.dist-info}/METADATA +1 -1
- {projectdavid-1.32.7.dist-info → projectdavid-1.32.8.dist-info}/RECORD +6 -6
- {projectdavid-1.32.7.dist-info → projectdavid-1.32.8.dist-info}/WHEEL +0 -0
- {projectdavid-1.32.7.dist-info → projectdavid-1.32.8.dist-info}/licenses/LICENSE +0 -0
- {projectdavid-1.32.7.dist-info → projectdavid-1.32.8.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
|
-
|
|
66
|
-
• `{"type":"function_call", …}` chunks are dropped.
|
|
67
|
-
• Inline `<fc> … </fc>` text is stripped.
|
|
68
|
-
• *Everything else* is forwarded unchanged.
|
|
69
|
-
"""
|
|
70
57
|
|
|
71
|
-
|
|
58
|
+
resolved_api_key = api_key or self.api_key
|
|
72
59
|
|
|
73
|
-
async def
|
|
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,28 @@ 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 code_interpreter_stream to bypass suppression
|
|
118
106
|
if (
|
|
119
107
|
chunk.get("stream_type") == "code_execution"
|
|
120
108
|
and chunk.get("chunk", {}).get("type") == "code_interpreter_stream"
|
|
@@ -122,32 +110,35 @@ class SynchronousInferenceStream:
|
|
|
122
110
|
yield chunk
|
|
123
111
|
continue
|
|
124
112
|
|
|
125
|
-
#
|
|
113
|
+
# inline content
|
|
126
114
|
if isinstance(chunk.get("content"), str):
|
|
127
115
|
chunk["content"] = _filter_text(chunk["content"])
|
|
128
116
|
if chunk["content"] == "":
|
|
129
|
-
#
|
|
117
|
+
continue # fully suppressed (or still peeking)
|
|
118
|
+
|
|
119
|
+
if (
|
|
120
|
+
suppress_fc
|
|
121
|
+
and '"name": "code_interpreter"' in chunk["content"]
|
|
122
|
+
and '"arguments": {"code"' in chunk["content"]
|
|
123
|
+
):
|
|
124
|
+
LOG.debug("[SUPPRESSOR] inline code_interpreter match blocked")
|
|
130
125
|
continue
|
|
131
126
|
|
|
132
|
-
# ⑤ forward every other chunk verbatim
|
|
133
127
|
yield chunk
|
|
134
128
|
|
|
135
129
|
except StopAsyncIteration:
|
|
136
130
|
LOG.info("Stream completed normally.")
|
|
137
131
|
break
|
|
138
132
|
except asyncio.TimeoutError:
|
|
139
|
-
LOG.error(
|
|
140
|
-
"[TimeoutError] no chunk received for %.1f s – aborting",
|
|
141
|
-
timeout_per_chunk,
|
|
142
|
-
)
|
|
133
|
+
LOG.error("[TimeoutError] Timeout occurred, stopping stream.")
|
|
143
134
|
break
|
|
144
|
-
except Exception as
|
|
145
|
-
LOG.error("
|
|
135
|
+
except Exception as e:
|
|
136
|
+
LOG.error("Unexpected error during streaming completions: %s", e)
|
|
146
137
|
break
|
|
147
138
|
|
|
148
|
-
#
|
|
139
|
+
# --------------------------------------------------------------
|
|
149
140
|
# housekeeping
|
|
150
|
-
#
|
|
141
|
+
# --------------------------------------------------------------
|
|
151
142
|
@classmethod
|
|
152
143
|
def shutdown_loop(cls) -> None:
|
|
153
144
|
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.8
|
|
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=Ztax5IwGRVHWtftkzUxp0WWvYsUBAPIpjzmmpkFYIoY,5147
|
|
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.8.dist-info/licenses/LICENSE,sha256=_8yjiEGttpS284BkfhXxfERqTRZW_tUaHiBB0GTJTMg,4563
|
|
38
|
+
projectdavid-1.32.8.dist-info/METADATA,sha256=bkO8aPxmxSWz5KXlelKCePgCaA5s-ZlPm-0MY49gboE,10781
|
|
39
|
+
projectdavid-1.32.8.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
40
|
+
projectdavid-1.32.8.dist-info/top_level.txt,sha256=kil8GU4s7qYRfNnzGnFHhZnSNRSxgNG-J4HLgQMmMtw,13
|
|
41
|
+
projectdavid-1.32.8.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|