projectdavid 1.32.18__py3-none-any.whl → 1.32.20__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 +13 -23
- {projectdavid-1.32.18.dist-info → projectdavid-1.32.20.dist-info}/METADATA +1 -1
- {projectdavid-1.32.18.dist-info → projectdavid-1.32.20.dist-info}/RECORD +6 -6
- {projectdavid-1.32.18.dist-info → projectdavid-1.32.20.dist-info}/WHEEL +0 -0
- {projectdavid-1.32.18.dist-info → projectdavid-1.32.20.dist-info}/licenses/LICENSE +0 -0
- {projectdavid-1.32.18.dist-info → projectdavid-1.32.20.dist-info}/top_level.txt +0 -0
|
@@ -14,7 +14,6 @@ class SynchronousInferenceStream:
|
|
|
14
14
|
_GLOBAL_LOOP = asyncio.new_event_loop()
|
|
15
15
|
asyncio.set_event_loop(_GLOBAL_LOOP)
|
|
16
16
|
|
|
17
|
-
# ────────────────────────────────────────────────────────────
|
|
18
17
|
def __init__(self, inference) -> None:
|
|
19
18
|
self.inference_client = inference
|
|
20
19
|
self.user_id: Optional[str] = None
|
|
@@ -24,7 +23,6 @@ class SynchronousInferenceStream:
|
|
|
24
23
|
self.run_id: Optional[str] = None
|
|
25
24
|
self.api_key: Optional[str] = None
|
|
26
25
|
|
|
27
|
-
# ────────────────────────────────────────────────────────────
|
|
28
26
|
def setup(
|
|
29
27
|
self,
|
|
30
28
|
user_id: str,
|
|
@@ -41,7 +39,6 @@ class SynchronousInferenceStream:
|
|
|
41
39
|
self.run_id = run_id
|
|
42
40
|
self.api_key = api_key
|
|
43
41
|
|
|
44
|
-
# ────────────────────────────────────────────────────────────
|
|
45
42
|
def stream_chunks(
|
|
46
43
|
self,
|
|
47
44
|
provider: str,
|
|
@@ -68,54 +65,51 @@ class SynchronousInferenceStream:
|
|
|
68
65
|
|
|
69
66
|
agen = _stream_chunks_async().__aiter__()
|
|
70
67
|
|
|
71
|
-
# ── build the <fc> suppressor chain ─────────────────────────
|
|
72
68
|
if suppress_fc:
|
|
73
69
|
_suppressor = FunctionCallSuppressor()
|
|
74
70
|
_peek_gate = PeekGate(_suppressor)
|
|
75
71
|
|
|
76
|
-
def _filter_text(txt: str) -> str:
|
|
72
|
+
def _filter_text(txt: str) -> str:
|
|
77
73
|
return _peek_gate.feed(txt)
|
|
78
74
|
|
|
79
75
|
else:
|
|
80
76
|
|
|
81
|
-
def _filter_text(txt: str) -> str:
|
|
77
|
+
def _filter_text(txt: str) -> str:
|
|
82
78
|
return txt
|
|
83
79
|
|
|
84
|
-
# helper – drain **all** residual bytes from the chain
|
|
85
80
|
def _drain_filters() -> Optional[dict]:
|
|
86
81
|
if not suppress_fc:
|
|
87
82
|
return None
|
|
88
83
|
parts: list[str] = []
|
|
89
|
-
# 1) normal draining loop
|
|
90
84
|
while True:
|
|
91
85
|
out = _filter_text("")
|
|
92
86
|
if not out:
|
|
93
87
|
break
|
|
94
88
|
parts.append(out)
|
|
95
|
-
# 2) force-drain the ≤ 8 safety-margin tail
|
|
96
89
|
if not _peek_gate.suppressing and _peek_gate.buf:
|
|
97
90
|
parts.append(_peek_gate.buf)
|
|
98
91
|
_peek_gate.buf = ""
|
|
99
92
|
if parts:
|
|
100
|
-
return {
|
|
93
|
+
return {
|
|
94
|
+
"type": "content",
|
|
95
|
+
"content": "".join(parts),
|
|
96
|
+
"run_id": self.run_id,
|
|
97
|
+
}
|
|
101
98
|
return None
|
|
102
99
|
|
|
103
|
-
# ── main loop ─────────────────────────────────────────────
|
|
104
100
|
while True:
|
|
105
101
|
try:
|
|
106
102
|
chunk = self._GLOBAL_LOOP.run_until_complete(
|
|
107
103
|
asyncio.wait_for(agen.__anext__(), timeout=timeout_per_chunk)
|
|
108
104
|
)
|
|
109
105
|
|
|
110
|
-
#
|
|
111
|
-
|
|
112
|
-
# LOG.debug("[SUPPRESS] provider function_call dropped")
|
|
113
|
-
# continue
|
|
106
|
+
# Always attach run_id
|
|
107
|
+
chunk["run_id"] = self.run_id
|
|
114
108
|
|
|
115
|
-
|
|
116
|
-
if chunk.get("type") in ("hot_code", "hot_code_output"):
|
|
109
|
+
if chunk.get("type") in ("hot_code", "hot_code_output", "status"):
|
|
117
110
|
yield chunk
|
|
118
111
|
continue
|
|
112
|
+
|
|
119
113
|
if (
|
|
120
114
|
chunk.get("stream_type") == "code_execution"
|
|
121
115
|
and chunk.get("chunk", {}).get("type") == "code_interpreter_stream"
|
|
@@ -123,16 +117,13 @@ class SynchronousInferenceStream:
|
|
|
123
117
|
yield chunk
|
|
124
118
|
continue
|
|
125
119
|
|
|
126
|
-
# ③ ordinary TEXT content — run through the <fc> filter
|
|
127
120
|
if isinstance(chunk.get("content"), str):
|
|
128
121
|
chunk["content"] = _filter_text(chunk["content"])
|
|
129
122
|
if chunk["content"] == "":
|
|
130
|
-
continue
|
|
123
|
+
continue
|
|
131
124
|
|
|
132
|
-
# ④ everything else streams unchanged
|
|
133
125
|
yield chunk
|
|
134
126
|
|
|
135
|
-
# graceful endings ------------------------------------------------
|
|
136
127
|
except StopAsyncIteration:
|
|
137
128
|
if tail := _drain_filters():
|
|
138
129
|
yield tail
|
|
@@ -145,13 +136,12 @@ class SynchronousInferenceStream:
|
|
|
145
136
|
LOG.error("[TimeoutError] Chunk wait expired – aborting stream.")
|
|
146
137
|
break
|
|
147
138
|
|
|
148
|
-
except Exception as exc:
|
|
139
|
+
except Exception as exc:
|
|
149
140
|
if tail := _drain_filters():
|
|
150
141
|
yield tail
|
|
151
142
|
LOG.error("Unexpected streaming error: %s", exc, exc_info=True)
|
|
152
143
|
break
|
|
153
144
|
|
|
154
|
-
# ────────────────────────────────────────────────────────────
|
|
155
145
|
@classmethod
|
|
156
146
|
def shutdown_loop(cls) -> None:
|
|
157
147
|
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.20
|
|
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=M0Z8YvOIcYQsYKZ7m5U7edq-OwY1wU9BKH6EIlG3WHI,4769
|
|
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.20.dist-info/licenses/LICENSE,sha256=_8yjiEGttpS284BkfhXxfERqTRZW_tUaHiBB0GTJTMg,4563
|
|
38
|
+
projectdavid-1.32.20.dist-info/METADATA,sha256=OpxxEI8F42M3uCPtloApoabA5c_AG4Yvnb_81ix0aHE,10782
|
|
39
|
+
projectdavid-1.32.20.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
40
|
+
projectdavid-1.32.20.dist-info/top_level.txt,sha256=kil8GU4s7qYRfNnzGnFHhZnSNRSxgNG-J4HLgQMmMtw,13
|
|
41
|
+
projectdavid-1.32.20.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|