feat: add psagentai agent with deployment and configuration
Initial project setup including the main agent script, configuration files, profile JSON state, systemd service unit, startup script, deployment documentation, and Python dependencies. Includes .env, venv/, and __pycache__/ which should likely be excluded via .gitignore to avoid committing secrets and artifacts.
This commit is contained in:
@@ -0,0 +1,103 @@
|
||||
"""
|
||||
Asynchronous progress bar decorator for iterators.
|
||||
Includes a default `range` iterator printing to `stderr`.
|
||||
|
||||
Usage:
|
||||
>>> from tqdm.asyncio import trange, tqdm
|
||||
>>> async for i in trange(10):
|
||||
... ...
|
||||
"""
|
||||
import asyncio
|
||||
from sys import version_info
|
||||
|
||||
from .std import tqdm as std_tqdm
|
||||
|
||||
__author__ = {"github.com/": ["casperdcl"]}
|
||||
__all__ = ['tqdm_asyncio', 'tarange', 'tqdm', 'trange']
|
||||
|
||||
|
||||
class tqdm_asyncio(std_tqdm):
|
||||
"""
|
||||
Asynchronous-friendly version of tqdm.
|
||||
"""
|
||||
def __init__(self, iterable=None, *args, **kwargs):
|
||||
super().__init__(iterable, *args, **kwargs)
|
||||
self.iterable_awaitable = False
|
||||
if iterable is not None:
|
||||
if hasattr(iterable, "__anext__"):
|
||||
self.iterable_next = iterable.__anext__
|
||||
self.iterable_awaitable = True
|
||||
elif hasattr(iterable, "__aiter__"):
|
||||
self.iterable_iterator = iterable.__aiter__()
|
||||
self.iterable_next = self.iterable_iterator.__anext__
|
||||
self.iterable_awaitable = True
|
||||
elif hasattr(iterable, "__next__"):
|
||||
self.iterable_next = iterable.__next__
|
||||
else:
|
||||
self.iterable_iterator = iter(iterable)
|
||||
self.iterable_next = self.iterable_iterator.__next__
|
||||
|
||||
def __aiter__(self):
|
||||
return self
|
||||
|
||||
async def __anext__(self):
|
||||
try:
|
||||
if self.iterable_awaitable:
|
||||
res = await self.iterable_next()
|
||||
else:
|
||||
res = self.iterable_next()
|
||||
self.update()
|
||||
return res
|
||||
except StopIteration:
|
||||
self.close()
|
||||
raise StopAsyncIteration
|
||||
except BaseException:
|
||||
self.close()
|
||||
raise
|
||||
|
||||
def send(self, *args, **kwargs):
|
||||
return self.iterable.send(*args, **kwargs)
|
||||
|
||||
@classmethod
|
||||
def as_completed(cls, fs, *, loop=None, timeout=None, total=None, **tqdm_kwargs):
|
||||
"""
|
||||
Wrapper for `asyncio.as_completed`.
|
||||
"""
|
||||
if total is None:
|
||||
total = len(fs)
|
||||
kwargs = {}
|
||||
if version_info[:2] < (3, 10):
|
||||
kwargs['loop'] = loop
|
||||
yield from cls(asyncio.as_completed(fs, timeout=timeout, **kwargs),
|
||||
total=total, **tqdm_kwargs)
|
||||
|
||||
@classmethod
|
||||
async def gather(cls, *fs, loop=None, timeout=None, total=None, return_exceptions=False,
|
||||
**tqdm_kwargs):
|
||||
"""
|
||||
Wrapper for `asyncio.gather`.
|
||||
"""
|
||||
async def wrap_awaitable(i, f):
|
||||
try:
|
||||
return i, await f
|
||||
except Exception as e: # noqa: BLE001
|
||||
if return_exceptions:
|
||||
return i, e
|
||||
raise
|
||||
|
||||
ifs = [wrap_awaitable(i, f) for i, f in enumerate(fs)]
|
||||
res = [await f for f in cls.as_completed(ifs, loop=loop, timeout=timeout,
|
||||
total=total, **tqdm_kwargs)]
|
||||
return [i for _, i in sorted(res)]
|
||||
|
||||
|
||||
def tarange(*args, **kwargs):
|
||||
"""
|
||||
A shortcut for `tqdm.asyncio.tqdm(range(*args), **kwargs)`.
|
||||
"""
|
||||
return tqdm_asyncio(range(*args), **kwargs)
|
||||
|
||||
|
||||
# Aliases
|
||||
tqdm = tqdm_asyncio
|
||||
trange = tarange
|
||||
Reference in New Issue
Block a user