sunholo 0.95.1__py3-none-any.whl → 0.95.3__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.
- sunholo/agents/flask/vac_routes.py +55 -58
- sunholo/agents/route.py +2 -2
- sunholo/genai/process_funcs_cls.py +6 -6
- sunholo/invoke/async_class.py +8 -9
- sunholo/streaming/content_buffer.py +81 -1
- sunholo/streaming/streaming.py +10 -0
- {sunholo-0.95.1.dist-info → sunholo-0.95.3.dist-info}/METADATA +2 -2
- {sunholo-0.95.1.dist-info → sunholo-0.95.3.dist-info}/RECORD +12 -12
- {sunholo-0.95.1.dist-info → sunholo-0.95.3.dist-info}/LICENSE.txt +0 -0
- {sunholo-0.95.1.dist-info → sunholo-0.95.3.dist-info}/WHEEL +0 -0
- {sunholo-0.95.1.dist-info → sunholo-0.95.3.dist-info}/entry_points.txt +0 -0
- {sunholo-0.95.1.dist-info → sunholo-0.95.3.dist-info}/top_level.txt +0 -0
|
@@ -185,11 +185,9 @@ if __name__ == "__main__":
|
|
|
185
185
|
|
|
186
186
|
log.info(f"OpenAI response: {openai_response}")
|
|
187
187
|
return jsonify(openai_response)
|
|
188
|
-
|
|
188
|
+
|
|
189
189
|
def handle_stream_vac(self, vector_name):
|
|
190
190
|
observed_stream_interpreter = self.stream_interpreter
|
|
191
|
-
|
|
192
|
-
# Determine if the stream interpreter is async or sync
|
|
193
191
|
is_async = inspect.iscoroutinefunction(self.stream_interpreter)
|
|
194
192
|
|
|
195
193
|
if is_async:
|
|
@@ -219,52 +217,53 @@ if __name__ == "__main__":
|
|
|
219
217
|
def generate_response_content():
|
|
220
218
|
try:
|
|
221
219
|
if is_async:
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
220
|
+
from queue import Queue, Empty
|
|
221
|
+
result_queue = Queue()
|
|
222
|
+
import threading
|
|
223
|
+
|
|
224
|
+
def run_async():
|
|
225
|
+
async def process_async():
|
|
226
|
+
try:
|
|
227
|
+
async_gen = start_streaming_chat_async(
|
|
228
|
+
question=all_input["user_input"],
|
|
229
|
+
vector_name=vector_name,
|
|
230
|
+
qna_func_async=observed_stream_interpreter,
|
|
231
|
+
chat_history=all_input["chat_history"],
|
|
232
|
+
wait_time=all_input["stream_wait_time"],
|
|
233
|
+
timeout=all_input["stream_timeout"],
|
|
234
|
+
trace_id=trace.id if trace else None,
|
|
235
|
+
**all_input["kwargs"]
|
|
236
|
+
)
|
|
237
|
+
log.info(f"{async_gen=}")
|
|
238
|
+
async for chunk in async_gen:
|
|
239
|
+
if isinstance(chunk, dict) and 'answer' in chunk:
|
|
240
|
+
if trace:
|
|
241
|
+
chunk["trace_id"] = trace.id
|
|
242
|
+
chunk["trace_url"] = trace.get_trace_url()
|
|
243
|
+
generation.end(output=json.dumps(chunk))
|
|
244
|
+
span.end(output=json.dumps(chunk))
|
|
245
|
+
trace.update(output=json.dumps(chunk))
|
|
246
|
+
archive_qa(chunk, vector_name)
|
|
247
|
+
result_queue.put(json.dumps(chunk))
|
|
248
|
+
else:
|
|
249
|
+
result_queue.put(chunk)
|
|
250
|
+
except Exception as e:
|
|
251
|
+
result_queue.put(f"Streaming Error: {str(e)} {traceback.format_exc()}")
|
|
252
|
+
finally:
|
|
253
|
+
result_queue.put(None) # Sentinel
|
|
254
|
+
asyncio.run(process_async())
|
|
255
|
+
|
|
256
|
+
thread = threading.Thread(target=run_async)
|
|
257
|
+
thread.start()
|
|
258
|
+
|
|
259
|
+
# Read from the queue and yield results
|
|
260
|
+
while True:
|
|
261
|
+
chunk = result_queue.get()
|
|
262
|
+
if chunk is None:
|
|
263
|
+
break
|
|
264
|
+
yield chunk
|
|
265
|
+
|
|
266
|
+
thread.join()
|
|
268
267
|
else:
|
|
269
268
|
log.info("sync streaming response")
|
|
270
269
|
for chunk in start_streaming_chat(
|
|
@@ -286,16 +285,16 @@ if __name__ == "__main__":
|
|
|
286
285
|
generation.end(output=json.dumps(chunk))
|
|
287
286
|
span.end(output=json.dumps(chunk))
|
|
288
287
|
trace.update(output=json.dumps(chunk))
|
|
289
|
-
|
|
288
|
+
yield json.dumps(chunk)
|
|
290
289
|
else:
|
|
291
290
|
yield chunk
|
|
292
291
|
|
|
293
292
|
except Exception as e:
|
|
294
293
|
yield f"Streaming Error: {str(e)} {traceback.format_exc()}"
|
|
295
|
-
|
|
294
|
+
|
|
296
295
|
# Here, the generator function will handle streaming the content to the client.
|
|
297
296
|
response = Response(generate_response_content(), content_type='text/plain; charset=utf-8')
|
|
298
|
-
response.headers['Transfer-Encoding'] = 'chunked'
|
|
297
|
+
response.headers['Transfer-Encoding'] = 'chunked'
|
|
299
298
|
|
|
300
299
|
log.debug(f"streaming response: {response}")
|
|
301
300
|
if trace:
|
|
@@ -307,12 +306,10 @@ if __name__ == "__main__":
|
|
|
307
306
|
return response
|
|
308
307
|
|
|
309
308
|
@staticmethod
|
|
310
|
-
async def
|
|
311
|
-
"""Helper function to
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
result.append(item)
|
|
315
|
-
return result
|
|
309
|
+
async def _async_generator_to_stream(async_gen_func):
|
|
310
|
+
"""Helper function to stream the async generator's values to the client."""
|
|
311
|
+
async for item in async_gen_func():
|
|
312
|
+
yield item
|
|
316
313
|
|
|
317
314
|
def langfuse_eval_response(self, trace_id, eval_percent=0.01):
|
|
318
315
|
"""
|
sunholo/agents/route.py
CHANGED
|
@@ -65,14 +65,14 @@ def route_endpoint(vector_name=None, method = 'post', override_endpoint=None, co
|
|
|
65
65
|
|
|
66
66
|
agents_config = config.agentConfig(agent_type)
|
|
67
67
|
|
|
68
|
-
log.
|
|
68
|
+
log.debug(f"agents_config: {agents_config}")
|
|
69
69
|
if method not in agents_config:
|
|
70
70
|
raise ValueError(f"Invalid method '{method}' for agent configuration.")
|
|
71
71
|
|
|
72
72
|
# 'post' or 'get'
|
|
73
73
|
endpoints_config = agents_config[method]
|
|
74
74
|
|
|
75
|
-
log.
|
|
75
|
+
log.debug(f"endpoints_config: {endpoints_config}")
|
|
76
76
|
# Replace placeholders in the config
|
|
77
77
|
endpoints = {}
|
|
78
78
|
for key, value in endpoints_config.items():
|
|
@@ -351,7 +351,7 @@ class GenAIFunctionProcessor:
|
|
|
351
351
|
log.error(f"Error initializing model: {str(err)}")
|
|
352
352
|
return None
|
|
353
353
|
|
|
354
|
-
def run_agent_loop(self, chat, content, callback, guardrail_max=10):
|
|
354
|
+
def run_agent_loop(self, chat, content, callback, guardrail_max=10, loop_return=3):
|
|
355
355
|
"""
|
|
356
356
|
Runs the agent loop, sending messages to the orchestrator, processing responses, and executing functions.
|
|
357
357
|
|
|
@@ -360,12 +360,13 @@ class GenAIFunctionProcessor:
|
|
|
360
360
|
content: The initial content to send to the agent.
|
|
361
361
|
callback: The callback object for handling intermediate responses.
|
|
362
362
|
guardrail_max (int): The maximum number of iterations for the loop.
|
|
363
|
+
loop_return (int): The number of last loop iterations to return. Default 3 will return last 3 iterations. If loop_return > guardrail_max then all iterations are returned.
|
|
363
364
|
|
|
364
365
|
Returns:
|
|
365
366
|
tuple: (big_text, usage_metadata) from the loop execution.
|
|
366
367
|
"""
|
|
367
368
|
guardrail = 0
|
|
368
|
-
|
|
369
|
+
big_result = []
|
|
369
370
|
usage_metadata = {
|
|
370
371
|
"prompt_token_count": 0,
|
|
371
372
|
"candidates_token_count": 0,
|
|
@@ -422,7 +423,6 @@ class GenAIFunctionProcessor:
|
|
|
422
423
|
if hasattr(chunk, 'text') and isinstance(chunk.text, str):
|
|
423
424
|
token = chunk.text
|
|
424
425
|
token_queue.append(token)
|
|
425
|
-
big_text += token
|
|
426
426
|
this_text += token
|
|
427
427
|
else:
|
|
428
428
|
log.info("skipping chunk with no text")
|
|
@@ -486,18 +486,17 @@ class GenAIFunctionProcessor:
|
|
|
486
486
|
else:
|
|
487
487
|
token += f"{fn_result}\n--- end ---\n"
|
|
488
488
|
|
|
489
|
-
big_text += token
|
|
490
489
|
this_text += token
|
|
491
490
|
token_queue.append(token)
|
|
492
491
|
else:
|
|
493
492
|
token = "\nNo function executions were found\n"
|
|
494
493
|
token_queue.append(token)
|
|
495
|
-
big_text += token
|
|
496
494
|
this_text += token
|
|
497
495
|
|
|
498
496
|
if this_text:
|
|
499
497
|
content.append(f"Agent: {this_text}")
|
|
500
498
|
log.info(f"[{guardrail}] Updated content:\n{this_text}")
|
|
499
|
+
big_result.append(this_text)
|
|
501
500
|
else:
|
|
502
501
|
log.warning(f"[{guardrail}] No content created this loop")
|
|
503
502
|
content.append(f"Agent: No response was found for loop [{guardrail}]")
|
|
@@ -523,7 +522,8 @@ class GenAIFunctionProcessor:
|
|
|
523
522
|
callback.on_llm_new_token(token=token)
|
|
524
523
|
|
|
525
524
|
usage_metadata["functions_called"] = functions_called
|
|
526
|
-
|
|
525
|
+
|
|
526
|
+
big_text = "\n".join(big_result[loop_return:])
|
|
527
527
|
|
|
528
528
|
return big_text, usage_metadata
|
|
529
529
|
|
sunholo/invoke/async_class.py
CHANGED
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
import asyncio
|
|
2
|
-
import
|
|
2
|
+
from ..custom_logging import log
|
|
3
3
|
import traceback
|
|
4
4
|
from typing import Callable, List, Any, AsyncGenerator, Dict
|
|
5
5
|
from tenacity import AsyncRetrying, retry_if_exception_type, wait_random_exponential, stop_after_attempt
|
|
6
6
|
|
|
7
|
-
logger = logging.getLogger(__name__)
|
|
8
|
-
|
|
9
7
|
class AsyncTaskRunner:
|
|
10
8
|
def __init__(self, retry_enabled=False, retry_kwargs=None):
|
|
11
9
|
self.tasks = []
|
|
@@ -14,18 +12,19 @@ class AsyncTaskRunner:
|
|
|
14
12
|
|
|
15
13
|
def add_task(self, func: Callable[..., Any], *args: Any):
|
|
16
14
|
"""Adds a task to the list of tasks to be executed."""
|
|
17
|
-
|
|
15
|
+
log.info(f"Adding task: {func.__name__} with args: {args}")
|
|
18
16
|
self.tasks.append((func.__name__, func, args))
|
|
19
17
|
|
|
20
18
|
async def run_async_as_completed(self) -> AsyncGenerator[Dict[str, Any], None]:
|
|
21
19
|
"""Runs all tasks concurrently and yields results as they complete."""
|
|
22
|
-
|
|
20
|
+
log.info("Running tasks asynchronously and yielding results as they complete")
|
|
23
21
|
tasks = {}
|
|
24
22
|
for name, func, args in self.tasks:
|
|
25
23
|
coro = self._task_wrapper(name, func, args)
|
|
26
24
|
task = asyncio.create_task(coro)
|
|
27
25
|
tasks[task] = name
|
|
28
26
|
|
|
27
|
+
log.info(f"Start async run with {len(self.tasks)} runners")
|
|
29
28
|
while tasks:
|
|
30
29
|
done, _ = await asyncio.wait(tasks.keys(), return_when=asyncio.FIRST_COMPLETED)
|
|
31
30
|
for task in done:
|
|
@@ -34,7 +33,7 @@ class AsyncTaskRunner:
|
|
|
34
33
|
result = await task
|
|
35
34
|
yield {name: result}
|
|
36
35
|
except Exception as e:
|
|
37
|
-
|
|
36
|
+
log.error(f"Task {name} resulted in an error: {e}\n{traceback.format_exc()}")
|
|
38
37
|
yield {name: e}
|
|
39
38
|
|
|
40
39
|
async def _task_wrapper(self, name: str, func: Callable[..., Any], args: Any) -> Any:
|
|
@@ -65,13 +64,13 @@ class AsyncTaskRunner:
|
|
|
65
64
|
try:
|
|
66
65
|
return await run_func()
|
|
67
66
|
except Exception as e:
|
|
68
|
-
|
|
67
|
+
log.error(f"Error in task {name}: {e}\n{traceback.format_exc()}")
|
|
69
68
|
raise
|
|
70
69
|
|
|
71
70
|
def _log_results(self, results: List[Any]):
|
|
72
71
|
"""Logs the results of the task executions."""
|
|
73
72
|
for result in results:
|
|
74
73
|
if isinstance(result, Exception):
|
|
75
|
-
|
|
74
|
+
log.error(f"Task resulted in an error: {result}")
|
|
76
75
|
else:
|
|
77
|
-
|
|
76
|
+
log.info(f"Task completed successfully: {result}")
|
|
@@ -51,6 +51,17 @@ class ContentBuffer:
|
|
|
51
51
|
Adds the given text to the existing content of the buffer.
|
|
52
52
|
"""
|
|
53
53
|
self.content += text
|
|
54
|
+
|
|
55
|
+
async def async_write(self, text: str):
|
|
56
|
+
"""
|
|
57
|
+
Asynchronously writes text to the content buffer.
|
|
58
|
+
|
|
59
|
+
Args:
|
|
60
|
+
text (str): The text to be added to the buffer.
|
|
61
|
+
|
|
62
|
+
Adds the given text to the existing content of the buffer.
|
|
63
|
+
"""
|
|
64
|
+
self.content += text
|
|
54
65
|
|
|
55
66
|
def read(self) -> str:
|
|
56
67
|
"""
|
|
@@ -63,6 +74,15 @@ class ContentBuffer:
|
|
|
63
74
|
"""
|
|
64
75
|
return self.content
|
|
65
76
|
|
|
77
|
+
async def async_read(self) -> str:
|
|
78
|
+
"""
|
|
79
|
+
Asynchronously reads the entire content from the buffer.
|
|
80
|
+
|
|
81
|
+
Returns:
|
|
82
|
+
str: The content of the buffer.
|
|
83
|
+
"""
|
|
84
|
+
return self.content
|
|
85
|
+
|
|
66
86
|
def clear(self):
|
|
67
87
|
"""
|
|
68
88
|
Clears the content buffer.
|
|
@@ -71,7 +91,15 @@ class ContentBuffer:
|
|
|
71
91
|
"""
|
|
72
92
|
self.content = ""
|
|
73
93
|
|
|
74
|
-
|
|
94
|
+
async def async_clear(self):
|
|
95
|
+
"""
|
|
96
|
+
Asynchronously clears the content buffer.
|
|
97
|
+
|
|
98
|
+
Empties the buffer content, resetting it to an empty string.
|
|
99
|
+
"""
|
|
100
|
+
self.content = ""
|
|
101
|
+
|
|
102
|
+
|
|
75
103
|
class BufferStreamingStdOutCallbackHandler(StreamingStdOutCallbackHandler):
|
|
76
104
|
"""
|
|
77
105
|
A callback handler for streaming LLM output to a content buffer.
|
|
@@ -136,6 +164,24 @@ class BufferStreamingStdOutCallbackHandler(StreamingStdOutCallbackHandler):
|
|
|
136
164
|
if not self.in_code_block:
|
|
137
165
|
self._process_buffer()
|
|
138
166
|
|
|
167
|
+
async def async_on_llm_new_token(self, token: str, **kwargs: Any) -> None:
|
|
168
|
+
"""
|
|
169
|
+
Asynchronously processes a new token from the LLM output.
|
|
170
|
+
|
|
171
|
+
Args:
|
|
172
|
+
token (str): The new token generated by the LLM.
|
|
173
|
+
**kwargs: Additional keyword arguments.
|
|
174
|
+
"""
|
|
175
|
+
log.debug(f"async_on_llm_new_token: {token}")
|
|
176
|
+
|
|
177
|
+
self.buffer += token
|
|
178
|
+
|
|
179
|
+
if '```' in token:
|
|
180
|
+
self.in_code_block = not self.in_code_block
|
|
181
|
+
|
|
182
|
+
if not self.in_code_block:
|
|
183
|
+
await self._async_process_buffer()
|
|
184
|
+
|
|
139
185
|
def _process_buffer(self):
|
|
140
186
|
"""
|
|
141
187
|
Processes the buffer content and writes to the content buffer.
|
|
@@ -154,6 +200,24 @@ class BufferStreamingStdOutCallbackHandler(StreamingStdOutCallbackHandler):
|
|
|
154
200
|
self.content_buffer.write(self.buffer)
|
|
155
201
|
self.buffer = ""
|
|
156
202
|
|
|
203
|
+
async def _async_process_buffer(self):
|
|
204
|
+
"""
|
|
205
|
+
Asynchronously processes the buffer content and writes to the content buffer.
|
|
206
|
+
|
|
207
|
+
If the buffer ends with a numbered list pattern or specified tokens, the buffer is flushed
|
|
208
|
+
to the content buffer. Otherwise, the buffer is left intact for further accumulation.
|
|
209
|
+
"""
|
|
210
|
+
matches = list(re.finditer(r'\n(\d+\.\s)', self.buffer))
|
|
211
|
+
if matches:
|
|
212
|
+
last_match = matches[-1]
|
|
213
|
+
start_of_last_match = last_match.start() + 1
|
|
214
|
+
await self.content_buffer.async_write(self.buffer[:start_of_last_match])
|
|
215
|
+
self.buffer = self.buffer[start_of_last_match:]
|
|
216
|
+
else:
|
|
217
|
+
if any(self.buffer.endswith(t) for t in self.tokens):
|
|
218
|
+
await self.content_buffer.async_write(self.buffer)
|
|
219
|
+
self.buffer = ""
|
|
220
|
+
|
|
157
221
|
def on_llm_end(self, response: LLMResult, **kwargs: Any) -> None:
|
|
158
222
|
"""
|
|
159
223
|
Handles the end of LLM streaming.
|
|
@@ -172,3 +236,19 @@ class BufferStreamingStdOutCallbackHandler(StreamingStdOutCallbackHandler):
|
|
|
172
236
|
|
|
173
237
|
self.stream_finished.set()
|
|
174
238
|
log.info("Streaming LLM response ended successfully")
|
|
239
|
+
|
|
240
|
+
async def async_on_llm_end(self, response: LLMResult, **kwargs: Any) -> None:
|
|
241
|
+
"""
|
|
242
|
+
Asynchronously handles the end of LLM streaming.
|
|
243
|
+
|
|
244
|
+
Args:
|
|
245
|
+
response (LLMResult): The result returned by the LLM.
|
|
246
|
+
**kwargs: Additional keyword arguments.
|
|
247
|
+
"""
|
|
248
|
+
if self.buffer:
|
|
249
|
+
await self.content_buffer.async_write(self.buffer)
|
|
250
|
+
self.buffer = ""
|
|
251
|
+
log.info("Flushing remaining LLM response buffer")
|
|
252
|
+
|
|
253
|
+
self.stream_finished.set()
|
|
254
|
+
log.info("Streaming LLM response ended successfully")
|
sunholo/streaming/streaming.py
CHANGED
|
@@ -175,6 +175,16 @@ async def start_streaming_chat_async(question, vector_name, qna_func_async, chat
|
|
|
175
175
|
# Run start_chat asynchronously
|
|
176
176
|
chat_task = asyncio.create_task(start_chat())
|
|
177
177
|
|
|
178
|
+
# Allow the event loop to process the scheduled tasks
|
|
179
|
+
await asyncio.sleep(0)
|
|
180
|
+
|
|
181
|
+
# Read and yield any initial content from the content buffer
|
|
182
|
+
content_to_send = content_buffer.read()
|
|
183
|
+
if content_to_send:
|
|
184
|
+
log.info(f"Initial content: {content_to_send}")
|
|
185
|
+
yield content_to_send
|
|
186
|
+
content_buffer.clear()
|
|
187
|
+
|
|
178
188
|
start = time.time()
|
|
179
189
|
|
|
180
190
|
while not chat_callback_handler.stream_finished.is_set() and not stop_event.is_set():
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: sunholo
|
|
3
|
-
Version: 0.95.
|
|
3
|
+
Version: 0.95.3
|
|
4
4
|
Summary: Large Language Model DevOps - a package to help deploy LLMs to the Cloud.
|
|
5
5
|
Home-page: https://github.com/sunholo-data/sunholo-py
|
|
6
|
-
Download-URL: https://github.com/sunholo-data/sunholo-py/archive/refs/tags/v0.95.
|
|
6
|
+
Download-URL: https://github.com/sunholo-data/sunholo-py/archive/refs/tags/v0.95.3.tar.gz
|
|
7
7
|
Author: Holosun ApS
|
|
8
8
|
Author-email: multivac@sunholo.com
|
|
9
9
|
License: Apache License, Version 2.0
|
|
@@ -5,7 +5,7 @@ sunholo/agents/chat_history.py,sha256=Gph_CdlP2otYnNdR1q1Umyyyvcad2F6K3LxU5yBQ9l
|
|
|
5
5
|
sunholo/agents/dispatch_to_qa.py,sha256=Z2q0ygYxfgBr-EGydq_H5y4Y-bKlY4ZCBCwkGpYwjFY,8766
|
|
6
6
|
sunholo/agents/langserve.py,sha256=C46ph2mnygr6bdHijYWYyfQDI9ylAF0_9Kx2PfcCJpU,4414
|
|
7
7
|
sunholo/agents/pubsub.py,sha256=TscZN_6am6DfaQkC-Yl18ZIBOoLE-0nDSiil6GpQEh4,1344
|
|
8
|
-
sunholo/agents/route.py,sha256=
|
|
8
|
+
sunholo/agents/route.py,sha256=mV8tGABbSqcg3PQL02MgQOs41gKEHLMyIJJJcTuFdbE,2988
|
|
9
9
|
sunholo/agents/special_commands.py,sha256=YhN8_E4cGZVvagN5_fouaxZiVbxr7PEhSzoFcvTKH54,6501
|
|
10
10
|
sunholo/agents/swagger.py,sha256=2tzGmpveUMmTREykZvVnDj3j295wyOMu7mUFDnXdY3c,10671
|
|
11
11
|
sunholo/agents/fastapi/__init__.py,sha256=S_pj4_bTUmDGoq_exaREHlOKThi0zTuGT0VZY0YfODQ,88
|
|
@@ -14,7 +14,7 @@ sunholo/agents/fastapi/qna_routes.py,sha256=lKHkXPmwltu9EH3RMwmD153-J6pE7kWQ4BhB
|
|
|
14
14
|
sunholo/agents/flask/__init__.py,sha256=poJDKMr2qj8qMb99JqCvCPSiEt1tj2tLQ3hKW3f2aVw,107
|
|
15
15
|
sunholo/agents/flask/base.py,sha256=FgSaCODyoTtlstJtsqlLPScdgRUtv9_plxftdzHdVFo,809
|
|
16
16
|
sunholo/agents/flask/qna_routes.py,sha256=uwUD1yrzOPH27m2AXpiQrPk_2VfJOQOM6dAynOWQtoQ,22532
|
|
17
|
-
sunholo/agents/flask/vac_routes.py,sha256=
|
|
17
|
+
sunholo/agents/flask/vac_routes.py,sha256=6DzeqPzZV3U_djm1SNaWZbNaGelRtrZjMtrOF4T7MJs,27119
|
|
18
18
|
sunholo/archive/__init__.py,sha256=qNHWm5rGPVOlxZBZCpA1wTYPbalizRT7f8X4rs2t290,31
|
|
19
19
|
sunholo/archive/archive.py,sha256=PxVfDtO2_2ZEEbnhXSCbXLdeoHoQVImo4y3Jr2XkCFY,1204
|
|
20
20
|
sunholo/auth/__init__.py,sha256=TeP-OY0XGxYV_8AQcVGoh35bvyWhNUcMRfhuD5l44Sk,91
|
|
@@ -86,10 +86,10 @@ sunholo/gcs/download_url.py,sha256=q1NiJSvEhdNrmU5ZJ-sBCMC_J5CxzrajY8LRgdPOV_M,6
|
|
|
86
86
|
sunholo/gcs/metadata.py,sha256=oQLcXi4brsZ74aegWyC1JZmhlaEV270HS5_UWtAYYWE,898
|
|
87
87
|
sunholo/genai/__init__.py,sha256=dBl6IA3-Fx6-Vx81r0XqxHlUq6WeW1iDX188dpChu8s,115
|
|
88
88
|
sunholo/genai/init.py,sha256=yG8E67TduFCTQPELo83OJuWfjwTnGZsyACospahyEaY,687
|
|
89
|
-
sunholo/genai/process_funcs_cls.py,sha256=
|
|
89
|
+
sunholo/genai/process_funcs_cls.py,sha256=OCLa_yPjVlE7wY1v54SY0M6b5lpU2l3guRHb-qYOk2A,24359
|
|
90
90
|
sunholo/genai/safety.py,sha256=mkFDO_BeEgiKjQd9o2I4UxB6XI7a9U-oOFjZ8LGRUC4,1238
|
|
91
91
|
sunholo/invoke/__init__.py,sha256=VOpsfhNf98az3at7bMaY1Fiw4UIZAS6zMmSqWd6_ksI,141
|
|
92
|
-
sunholo/invoke/async_class.py,sha256=
|
|
92
|
+
sunholo/invoke/async_class.py,sha256=NYuQU-LIhnJEmierbSwmwxXfNzmEhqDZCSx5BZDEYA8,3225
|
|
93
93
|
sunholo/invoke/direct_vac_func.py,sha256=fuTJlH5PsqWhN_yVMaWisHCTZU1JEUz8I8yVbWsNUFE,4268
|
|
94
94
|
sunholo/invoke/invoke_vac_utils.py,sha256=sJc1edHTHMzMGXjji1N67c3iUaP7BmAL5nj82Qof63M,2053
|
|
95
95
|
sunholo/langfuse/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -114,10 +114,10 @@ sunholo/qna/__init__.py,sha256=F8q1uR_HreoSX0IfmKY1qoSwIgXhO2Q8kuDSxh9_-EE,28
|
|
|
114
114
|
sunholo/qna/parsers.py,sha256=YpOaK5S_LxJ6FbliSYDc3AVOJ62RVduayoNnzi_p8CM,2494
|
|
115
115
|
sunholo/qna/retry.py,sha256=yMw7RTkw-RXCzfENPJOt8c32mXlpvOR589EGkvK-6yI,2028
|
|
116
116
|
sunholo/streaming/__init__.py,sha256=MpbydI2UYo_adttPQFkxNM33b-QRyNEbrKJx0C2AGPc,241
|
|
117
|
-
sunholo/streaming/content_buffer.py,sha256=
|
|
117
|
+
sunholo/streaming/content_buffer.py,sha256=HLj-EJcCxxFwPcEZ4Xu3Ns0tDT6awkTe5QY9S7bMnjg,9162
|
|
118
118
|
sunholo/streaming/langserve.py,sha256=hi7q8WY8DPKrALl9m_dOMxWOdE-iEuk7YW05SVDFIX8,6514
|
|
119
119
|
sunholo/streaming/stream_lookup.py,sha256=hYg1DbdSE_QNJ8ZB-ynXJlWgvFjrGvwoUsGJu_E0pRQ,360
|
|
120
|
-
sunholo/streaming/streaming.py,sha256=
|
|
120
|
+
sunholo/streaming/streaming.py,sha256=Z_M6rn6XZUMfQggiQ79dw5HD7xaodvq0UGS34C5dHbQ,16549
|
|
121
121
|
sunholo/summarise/__init__.py,sha256=MZk3dblUMODcPb1crq4v-Z508NrFIpkSWNf9FIO8BcU,38
|
|
122
122
|
sunholo/summarise/summarise.py,sha256=95A-6PXFGanjona8DvZPnnIHLbzZ2ip5hO0wOAJQhfw,3791
|
|
123
123
|
sunholo/terraform/__init__.py,sha256=yixxEltc3n9UpZaVi05GlgS-YRq_DVGjUc37I9ajeP4,76
|
|
@@ -144,9 +144,9 @@ sunholo/vertex/init.py,sha256=1OQwcPBKZYBTDPdyU7IM4X4OmiXLdsNV30C-fee2scQ,2875
|
|
|
144
144
|
sunholo/vertex/memory_tools.py,sha256=x3_ESOhgMpf-gNpiOzmP7YQI0l0FAoLtbAVP2K2N0OA,7724
|
|
145
145
|
sunholo/vertex/safety.py,sha256=S9PgQT1O_BQAkcqauWncRJaydiP8Q_Jzmu9gxYfy1VA,2482
|
|
146
146
|
sunholo/vertex/type_dict_to_json.py,sha256=uTzL4o9tJRao4u-gJOFcACgWGkBOtqACmb6ihvCErL8,4694
|
|
147
|
-
sunholo-0.95.
|
|
148
|
-
sunholo-0.95.
|
|
149
|
-
sunholo-0.95.
|
|
150
|
-
sunholo-0.95.
|
|
151
|
-
sunholo-0.95.
|
|
152
|
-
sunholo-0.95.
|
|
147
|
+
sunholo-0.95.3.dist-info/LICENSE.txt,sha256=SdE3QjnD3GEmqqg9EX3TM9f7WmtOzqS1KJve8rhbYmU,11345
|
|
148
|
+
sunholo-0.95.3.dist-info/METADATA,sha256=BIKn4TOl_j1DzdCYb_MLEfd-3nI3aUhaofHrGXlDSbc,7889
|
|
149
|
+
sunholo-0.95.3.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
|
|
150
|
+
sunholo-0.95.3.dist-info/entry_points.txt,sha256=bZuN5AIHingMPt4Ro1b_T-FnQvZ3teBes-3OyO0asl4,49
|
|
151
|
+
sunholo-0.95.3.dist-info/top_level.txt,sha256=wt5tadn5--5JrZsjJz2LceoUvcrIvxjHJe-RxuudxAk,8
|
|
152
|
+
sunholo-0.95.3.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|