projectdavid 1.32.13__py3-none-any.whl → 1.32.15__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 +31 -8
- {projectdavid-1.32.13.dist-info → projectdavid-1.32.15.dist-info}/METADATA +1 -1
- {projectdavid-1.32.13.dist-info → projectdavid-1.32.15.dist-info}/RECORD +6 -6
- {projectdavid-1.32.13.dist-info → projectdavid-1.32.15.dist-info}/WHEEL +0 -0
- {projectdavid-1.32.13.dist-info → projectdavid-1.32.15.dist-info}/licenses/LICENSE +0 -0
- {projectdavid-1.32.13.dist-info → projectdavid-1.32.15.dist-info}/top_level.txt +0 -0
|
@@ -14,7 +14,7 @@ class SynchronousInferenceStream:
|
|
|
14
14
|
_GLOBAL_LOOP = asyncio.new_event_loop()
|
|
15
15
|
asyncio.set_event_loop(_GLOBAL_LOOP)
|
|
16
16
|
|
|
17
|
-
#
|
|
17
|
+
# ────────────────────────────────────────────────────────────
|
|
18
18
|
def __init__(self, inference) -> None:
|
|
19
19
|
self.inference_client = inference
|
|
20
20
|
self.user_id: Optional[str] = None
|
|
@@ -24,6 +24,7 @@ class SynchronousInferenceStream:
|
|
|
24
24
|
self.run_id: Optional[str] = None
|
|
25
25
|
self.api_key: Optional[str] = None
|
|
26
26
|
|
|
27
|
+
# ────────────────────────────────────────────────────────────
|
|
27
28
|
def setup(
|
|
28
29
|
self,
|
|
29
30
|
user_id: str,
|
|
@@ -40,7 +41,7 @@ class SynchronousInferenceStream:
|
|
|
40
41
|
self.run_id = run_id
|
|
41
42
|
self.api_key = api_key
|
|
42
43
|
|
|
43
|
-
#
|
|
44
|
+
# ────────────────────────────────────────────────────────────
|
|
44
45
|
def stream_chunks(
|
|
45
46
|
self,
|
|
46
47
|
provider: str,
|
|
@@ -72,15 +73,29 @@ class SynchronousInferenceStream:
|
|
|
72
73
|
_suppressor = FunctionCallSuppressor()
|
|
73
74
|
_peek_gate = PeekGate(_suppressor)
|
|
74
75
|
|
|
75
|
-
def _filter_text(txt: str) -> str:
|
|
76
|
+
def _filter_text(txt: str) -> str: # noqa: D401
|
|
76
77
|
return _peek_gate.feed(txt)
|
|
77
78
|
|
|
78
79
|
else:
|
|
79
80
|
|
|
80
|
-
def _filter_text(txt: str) -> str:
|
|
81
|
+
def _filter_text(txt: str) -> str: # noqa: D401
|
|
81
82
|
return txt
|
|
82
83
|
|
|
83
|
-
#
|
|
84
|
+
# helper – drain **all** residual bytes from the chain
|
|
85
|
+
def _drain_filters() -> Optional[dict]:
|
|
86
|
+
if not suppress_fc:
|
|
87
|
+
return None
|
|
88
|
+
parts: list[str] = []
|
|
89
|
+
while True:
|
|
90
|
+
out = _filter_text("") # empty feed ⇒ “give me whatever’s left”
|
|
91
|
+
if not out:
|
|
92
|
+
break
|
|
93
|
+
parts.append(out)
|
|
94
|
+
if parts:
|
|
95
|
+
return {"type": "content", "content": "".join(parts)}
|
|
96
|
+
return None
|
|
97
|
+
|
|
98
|
+
# ── main loop ─────────────────────────────────────────────
|
|
84
99
|
while True:
|
|
85
100
|
try:
|
|
86
101
|
chunk = self._GLOBAL_LOOP.run_until_complete(
|
|
@@ -108,23 +123,31 @@ class SynchronousInferenceStream:
|
|
|
108
123
|
if isinstance(chunk.get("content"), str):
|
|
109
124
|
chunk["content"] = _filter_text(chunk["content"])
|
|
110
125
|
if chunk["content"] == "":
|
|
111
|
-
# fully suppressed
|
|
112
|
-
continue
|
|
126
|
+
continue # fully suppressed / still buffering
|
|
113
127
|
|
|
114
128
|
# ④ everything else streams unchanged
|
|
115
129
|
yield chunk
|
|
116
130
|
|
|
131
|
+
# ─────────── graceful endings ───────────
|
|
117
132
|
except StopAsyncIteration:
|
|
133
|
+
if tail := _drain_filters():
|
|
134
|
+
yield tail
|
|
118
135
|
LOG.info("Stream completed normally.")
|
|
119
136
|
break
|
|
137
|
+
|
|
120
138
|
except asyncio.TimeoutError:
|
|
139
|
+
if tail := _drain_filters():
|
|
140
|
+
yield tail
|
|
121
141
|
LOG.error("[TimeoutError] Chunk wait expired – aborting stream.")
|
|
122
142
|
break
|
|
143
|
+
|
|
123
144
|
except Exception as exc: # noqa: BLE001
|
|
145
|
+
if tail := _drain_filters():
|
|
146
|
+
yield tail
|
|
124
147
|
LOG.error("Unexpected streaming error: %s", exc, exc_info=True)
|
|
125
148
|
break
|
|
126
149
|
|
|
127
|
-
#
|
|
150
|
+
# ────────────────────────────────────────────────────────────
|
|
128
151
|
@classmethod
|
|
129
152
|
def shutdown_loop(cls) -> None:
|
|
130
153
|
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.15
|
|
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=smbKBkwJZHX2LCqb0pO9RS7N7GFmruzCfmxrQsmJv_o,6204
|
|
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.15.dist-info/licenses/LICENSE,sha256=_8yjiEGttpS284BkfhXxfERqTRZW_tUaHiBB0GTJTMg,4563
|
|
38
|
+
projectdavid-1.32.15.dist-info/METADATA,sha256=R88sPhtHzsDQpwMr_WDtHLyynLKvGJNV2vxODJBEyIw,10782
|
|
39
|
+
projectdavid-1.32.15.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
40
|
+
projectdavid-1.32.15.dist-info/top_level.txt,sha256=kil8GU4s7qYRfNnzGnFHhZnSNRSxgNG-J4HLgQMmMtw,13
|
|
41
|
+
projectdavid-1.32.15.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|