diff --git a/dist/yura-14.3.7/PKG-INFO b/dist/yura-14.3.7/PKG-INFO new file mode 100644 index 0000000..b4c3c69 --- /dev/null +++ b/dist/yura-14.3.7/PKG-INFO @@ -0,0 +1,42 @@ +Metadata-Version: 2.1 +Name: yura +Version: 14.3.7 +Summary: Yura async AI client +Author: retoor +Author-email: retoor@retoor.io +License: MIT +Requires-Python: >=3.7 +Description-Content-Type: text/markdown +Requires-Dist: websockets + +# Yura LLM Client for Katya server + +Part of project with as target replacing the native ollama protocol. This protocol supports streaming and is usable trough https and it is possible to directly attach a web client to the backend. + +## Install +```bash +pip install -e . +``` + +## Build +```bash +make build +``` + +## Command line usage +```bash +yura ws://[host]:[port]/[path]/ +``` + +## Python +```python +import asyncio +from yura.client import AsyncClient + +async def communicate(): + client = AsyncClient("ws://[host]:[port]/[path]/") + async for response in client.chat("Your prompt"): + print(response) + +asyncio.run(communicate()) +``` diff --git a/dist/yura-14.3.7/README.md b/dist/yura-14.3.7/README.md new file mode 100644 index 0000000..a523dd6 --- /dev/null +++ b/dist/yura-14.3.7/README.md @@ -0,0 +1,31 @@ +# Yura LLM Client for Katya server + +Part of project with as target replacing the native ollama protocol. This protocol supports streaming and is usable trough https and it is possible to directly attach a web client to the backend. + +## Install +```bash +pip install -e . +``` + +## Build +```bash +make build +``` + +## Command line usage +```bash +yura ws://[host]:[port]/[path]/ +``` + +## Python +```python +import asyncio +from yura.client import AsyncClient + +async def communicate(): + client = AsyncClient("ws://[host]:[port]/[path]/") + async for response in client.chat("Your prompt"): + print(response) + +asyncio.run(communicate()) +``` diff --git a/dist/yura-14.3.7/pyproject.toml b/dist/yura-14.3.7/pyproject.toml new file mode 100644 index 0000000..07de284 --- /dev/null +++ b/dist/yura-14.3.7/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["setuptools", "wheel"] +build-backend = "setuptools.build_meta" \ No newline at end of file diff --git a/dist/yura-14.3.7/setup.cfg b/dist/yura-14.3.7/setup.cfg new file mode 100644 index 0000000..1457f98 --- /dev/null +++ b/dist/yura-14.3.7/setup.cfg @@ -0,0 +1,25 @@ +[metadata] +name = yura +version = 14.3.7 +description = Yura async AI client +author = retoor +author_email = retoor@retoor.io +license = MIT +long_description = file: README.md +long_description_content_type = text/markdown + +[options] +packages = find: +package_dir = + = src +python_requires = >=3.7 +install_requires = + websockets + +[options.packages.find] +where = src + +[egg_info] +tag_build = +tag_date = 0 + diff --git a/dist/yura-14.3.7/src/yura.egg-info/PKG-INFO b/dist/yura-14.3.7/src/yura.egg-info/PKG-INFO new file mode 100644 index 0000000..b4c3c69 --- /dev/null +++ b/dist/yura-14.3.7/src/yura.egg-info/PKG-INFO @@ -0,0 +1,42 @@ +Metadata-Version: 2.1 +Name: yura +Version: 14.3.7 +Summary: Yura async AI client +Author: retoor +Author-email: retoor@retoor.io +License: MIT +Requires-Python: >=3.7 +Description-Content-Type: text/markdown +Requires-Dist: websockets + +# Yura LLM Client for Katya server + +Part of project with as target replacing the native ollama protocol. This protocol supports streaming and is usable trough https and it is possible to directly attach a web client to the backend. + +## Install +```bash +pip install -e . +``` + +## Build +```bash +make build +``` + +## Command line usage +```bash +yura ws://[host]:[port]/[path]/ +``` + +## Python +```python +import asyncio +from yura.client import AsyncClient + +async def communicate(): + client = AsyncClient("ws://[host]:[port]/[path]/") + async for response in client.chat("Your prompt"): + print(response) + +asyncio.run(communicate()) +``` diff --git a/dist/yura-14.3.7/src/yura.egg-info/SOURCES.txt b/dist/yura-14.3.7/src/yura.egg-info/SOURCES.txt new file mode 100644 index 0000000..79c79b9 --- /dev/null +++ b/dist/yura-14.3.7/src/yura.egg-info/SOURCES.txt @@ -0,0 +1,11 @@ +README.md +pyproject.toml +setup.cfg +src/yura/__init__.py +src/yura/__main__.py +src/yura/client.py +src/yura.egg-info/PKG-INFO +src/yura.egg-info/SOURCES.txt +src/yura.egg-info/dependency_links.txt +src/yura.egg-info/requires.txt +src/yura.egg-info/top_level.txt \ No newline at end of file diff --git a/dist/yura-14.3.7/src/yura.egg-info/dependency_links.txt b/dist/yura-14.3.7/src/yura.egg-info/dependency_links.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/dist/yura-14.3.7/src/yura.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/dist/yura-14.3.7/src/yura.egg-info/requires.txt b/dist/yura-14.3.7/src/yura.egg-info/requires.txt new file mode 100644 index 0000000..14774b4 --- /dev/null +++ b/dist/yura-14.3.7/src/yura.egg-info/requires.txt @@ -0,0 +1 @@ +websockets diff --git a/dist/yura-14.3.7/src/yura.egg-info/top_level.txt b/dist/yura-14.3.7/src/yura.egg-info/top_level.txt new file mode 100644 index 0000000..6951fbf --- /dev/null +++ b/dist/yura-14.3.7/src/yura.egg-info/top_level.txt @@ -0,0 +1 @@ +yura diff --git a/dist/yura-14.3.7/src/yura/client.py b/dist/yura-14.3.7/src/yura/client.py new file mode 100644 index 0000000..5cea3d5 --- /dev/null +++ b/dist/yura-14.3.7/src/yura/client.py @@ -0,0 +1,106 @@ +import asyncio +import websockets +import json +import sys + + +class AsyncClient: + + def __init__(self, url="ws://127.0.0.1:8470"): + + self.url = url + self.ws = None + self.queue_in = asyncio.Queue() + self.queue_out = asyncio.Queue() + self.communication_task = None + + async def ensure_connection(): + + if not self.ws: + self.ws = await websockets.connect(self.url) + + return self.ws + + async def ensure_communication(self): + + if not self.communication_task: + self.communication_task = asyncio.create_task(self.communicate()) + + return self.communication_task + + async def chat(self, message): + await self.ensure_communication() + await self.queue_out.put(message) + while True: + + while True: + try: + response = await asyncio.wait_for(self.queue_in.get(), 0.1) + + except asyncio.TimeoutError: + continue + break + + yield response + + if response["done"]: + break + + async def communicate(self): + loop = asyncio.get_event_loop() + async with websockets.connect(self.url) as websocket: + while True: + message_content = None + while not message_content: + try: + message_content = await asyncio.wait_for( + self.queue_out.get(), 0.1 + ) + except asyncio.TimeoutError: + continue + + response = await websocket.send(json.dumps(message_content)) + + while True: + response = json.loads(await websocket.recv()) + + if response["done"]: + break + + await self.queue_in.put(response) + + await self.queue_in.put(response) + + +async def cli_client(url="ws://127.0.0.1:8470"): + + loop = asyncio.get_event_loop() + async_client = AsyncClient(url) + + while True: + + sys.stdout.write("> ") + sys.stdout.flush() + message_content = await loop.run_in_executor(None, sys.stdin.readline) + + async for response in async_client.chat(message_content): + + print(response["content"], end="", flush=True) + + if response["done"]: + break + + print("") + + +def main(): + url = "ws://127.0.0.1:8470" + try: + url = sys.argv[1] + except IndexError: + pass + asyncio.run(cli_client(url)) + + +if __name__ == "__main__": + main() diff --git a/src/yura.egg-info/entry_points.txt b/src/yura.egg-info/entry_points.txt new file mode 100644 index 0000000..f906f34 --- /dev/null +++ b/src/yura.egg-info/entry_points.txt @@ -0,0 +1,2 @@ +[console_scripts] +yura = yura.cli:run diff --git a/src/yura/cli.py b/src/yura/cli.py new file mode 100644 index 0000000..4035b50 --- /dev/null +++ b/src/yura/cli.py @@ -0,0 +1,12 @@ +from yura.client import cli_client +import asyncio +import sys + + +def run(): + try: + path = sys.argv[1] + except IndexError: + print("Usage: yura [ws://your-server]") + exit(1) + asyncio.run(cli_client(path))