From 8f1e914b23894ae0b7b1b60a31abcbd831515b2b Mon Sep 17 00:00:00 2001 From: sahanruwantha Date: Fri, 10 Jan 2025 21:57:29 +0530 Subject: [PATCH 1/2] uv integration and minor changes in gemini support --- api/routes/openai_route.py | 2 +- async_llm/__init__.py | 1 + {src => async_llm}/providers/__init__.py | 0 .../providers/abstract_basellm.py | 0 .../providers/anthropic_provider.py | 2 +- .../providers/google_provider.py | 20 +++++++------- .../providers/openai_provider.py | 4 +-- {src => async_llm}/utils/__init__.py | 0 {src => async_llm}/utils/pydantic_to_json.py | 0 examples/anthropic_provider.py | 2 +- examples/openai_provider.py | 2 +- pyproject.toml | 26 +++++++++++++++++++ setup.py | 2 +- src/main.py | 0 test/test_chat_completion_test.py | 8 +++--- test/test_google.py | 5 ++-- 16 files changed, 52 insertions(+), 22 deletions(-) create mode 100644 async_llm/__init__.py rename {src => async_llm}/providers/__init__.py (100%) rename {src => async_llm}/providers/abstract_basellm.py (100%) rename {src => async_llm}/providers/anthropic_provider.py (97%) rename {src => async_llm}/providers/google_provider.py (68%) rename {src => async_llm}/providers/openai_provider.py (96%) rename {src => async_llm}/utils/__init__.py (100%) rename {src => async_llm}/utils/pydantic_to_json.py (100%) create mode 100644 pyproject.toml delete mode 100644 src/main.py diff --git a/api/routes/openai_route.py b/api/routes/openai_route.py index 78b4e9c..2344660 100644 --- a/api/routes/openai_route.py +++ b/api/routes/openai_route.py @@ -1,5 +1,5 @@ from fastapi import APIRouter, Depends, HTTPException -from src.providers import get_provider +from async_llm.providers import get_provider from models.openai_request_models import ChatCompletionRequest , FunctionCallRequest import json import os diff --git a/async_llm/__init__.py b/async_llm/__init__.py new file mode 100644 index 0000000..07ae5ce --- /dev/null +++ b/async_llm/__init__.py @@ -0,0 +1 @@ +from async_llm import providers \ No newline at end of file diff --git a/src/providers/__init__.py b/async_llm/providers/__init__.py similarity index 100% rename from src/providers/__init__.py rename to async_llm/providers/__init__.py diff --git a/src/providers/abstract_basellm.py b/async_llm/providers/abstract_basellm.py similarity index 100% rename from src/providers/abstract_basellm.py rename to async_llm/providers/abstract_basellm.py diff --git a/src/providers/anthropic_provider.py b/async_llm/providers/anthropic_provider.py similarity index 97% rename from src/providers/anthropic_provider.py rename to async_llm/providers/anthropic_provider.py index a2a678f..292484b 100644 --- a/src/providers/anthropic_provider.py +++ b/async_llm/providers/anthropic_provider.py @@ -1,4 +1,4 @@ -from src.providers.abstract_basellm import BaseLLMProvider +from async_llm.providers.abstract_basellm import BaseLLMProvider import httpx from typing import List, Dict import json diff --git a/src/providers/google_provider.py b/async_llm/providers/google_provider.py similarity index 68% rename from src/providers/google_provider.py rename to async_llm/providers/google_provider.py index b51f90b..0fc25fb 100644 --- a/src/providers/google_provider.py +++ b/async_llm/providers/google_provider.py @@ -1,24 +1,26 @@ -from src.providers.abstract_basellm import BaseLLMProvider +from async_llm.providers.abstract_basellm import BaseLLMProvider import httpx from typing import List, Dict -import json from urllib.parse import urljoin, urlencode class GoogleProvider(BaseLLMProvider): def __init__(self, api_key: str) -> None: super().__init__() - base_url = "https://generativelanguage.googleapis.com/v1beta/" - endpoint = "models/gemini-1.5-flash:generateContent" - query_params = {"key": api_key} - - self.base_url = urljoin(base_url, endpoint) + "?" + urlencode(query_params) self.api_key = api_key self.headers = { "Content-Type": "application/json", } - async def chat_completion(self, messages: List[Dict[str, str]]): - url = self.base_url + def _create_base_url(self, model:str="gemini-1.5-flash"): + base_url = "https://generativelanguage.googleapis.com/v1beta/" + endpoint = f"models/{model}:generateContent" + query_params = {"key": self.api_key} + base_url = urljoin(base_url, endpoint) + "?" + urlencode(query_params) + return base_url + + async def chat_completion(self, model:str, messages: List[Dict[str, str]]): + self.model = model + url = self._create_base_url(model) headers = self.headers data = { "contents": [ diff --git a/src/providers/openai_provider.py b/async_llm/providers/openai_provider.py similarity index 96% rename from src/providers/openai_provider.py rename to async_llm/providers/openai_provider.py index 6018d31..28b3c57 100644 --- a/src/providers/openai_provider.py +++ b/async_llm/providers/openai_provider.py @@ -1,5 +1,5 @@ -from src.providers.abstract_basellm import BaseLLMProvider -from src.utils.pydantic_to_json import transform_schema +from async_llm.providers.abstract_basellm import BaseLLMProvider +from async_llm.utils.pydantic_to_json import transform_schema import httpx from typing import List , Dict import json diff --git a/src/utils/__init__.py b/async_llm/utils/__init__.py similarity index 100% rename from src/utils/__init__.py rename to async_llm/utils/__init__.py diff --git a/src/utils/pydantic_to_json.py b/async_llm/utils/pydantic_to_json.py similarity index 100% rename from src/utils/pydantic_to_json.py rename to async_llm/utils/pydantic_to_json.py diff --git a/examples/anthropic_provider.py b/examples/anthropic_provider.py index 2f4b28d..eb73298 100644 --- a/examples/anthropic_provider.py +++ b/examples/anthropic_provider.py @@ -2,7 +2,7 @@ import logging import os from dotenv import load_dotenv -from src.providers import get_provider # Adjust this import based on your project structure +from async_llm.providers import get_provider # Adjust this import based on your project structure logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') logger = logging.getLogger(__name__) diff --git a/examples/openai_provider.py b/examples/openai_provider.py index c0d7884..4ffe3de 100644 --- a/examples/openai_provider.py +++ b/examples/openai_provider.py @@ -1,7 +1,7 @@ import asyncio import os from dotenv import load_dotenv -from src.providers import get_provider +from async_llm.providers import get_provider import logging from pydantic import BaseModel import sys diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..b837488 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,26 @@ +[build-system] +requires = ["setuptools", "wheel"] +build-backend = "setuptools.build_meta" + +[project] +name = "async_llm" +version = "0.0.1" +description = "A Python package for asynchronous LLM integration." +readme = "README.md" +authors = [{ name = "Shamal De Silva", email = "shamalgithub@gmail.com" }, {name = "Sahan Ruwantha", "sahanr.silva@proton.me"}] +classifiers = [ + "Programming Language :: Python :: 3", + "License :: OSI Approved :: MIT License", + "Operating System :: OS Independent" +] +dependencies = [ + "fastapi>=0.112.2", + "httpx>=0.27.2", + "pydantic>=2.8.2", + "pytest>=8.3.2", + "python-dotenv>=1.0.1", + "setuptools>=58.1.0", + "pipreqs>=0.5.0", + "httpx[http2]>=0.27.2", + "pytest-asyncio>=0.24.0" +] diff --git a/setup.py b/setup.py index b1a04cc..c00ce11 100644 --- a/setup.py +++ b/setup.py @@ -1,3 +1,3 @@ from setuptools import setup , find_packages -setup(name="AsyncLLM" , version="0.0.1" , packages=find_packages()) \ No newline at end of file +setup(name="async_llm" , version="0.0.1" , packages=find_packages()) \ No newline at end of file diff --git a/src/main.py b/src/main.py deleted file mode 100644 index e69de29..0000000 diff --git a/test/test_chat_completion_test.py b/test/test_chat_completion_test.py index 2e93726..4159726 100644 --- a/test/test_chat_completion_test.py +++ b/test/test_chat_completion_test.py @@ -1,10 +1,10 @@ import pytest import os from dotenv import load_dotenv -from src.providers import get_provider -from src.providers.openai_provider import OpenAIProvider -from src.providers.anthropic_provider import ClaudeProvider -from src.providers.google_provider import GoogleProvider +from async_llm.providers import get_provider +from async_llm.providers.openai_provider import OpenAIProvider +from async_llm.providers.anthropic_provider import ClaudeProvider +from async_llm.providers.google_provider import GoogleProvider load_dotenv() diff --git a/test/test_google.py b/test/test_google.py index 8124c00..df99a8e 100644 --- a/test/test_google.py +++ b/test/test_google.py @@ -1,4 +1,4 @@ -from src.providers import get_provider +from async_llm.providers import get_provider import os from dotenv import load_dotenv import pytest @@ -7,10 +7,11 @@ @pytest.mark.asyncio async def test_google_chat_completion(): + model = "gemini-2.0-flash-exp" messages = [ {"role": "user", "content": "What's the capital of France?"} ] provider = get_provider("google", api_key=os.getenv("GOOGLE_API_KEY")) - result = await provider.chat_completion(messages=messages) + result = await provider.chat_completion(model=model, messages=messages) print(result) assert isinstance(result, dict) From b71c9c67c73070c3f910508f7dd815a5d144c542 Mon Sep 17 00:00:00 2001 From: sahanruwantha Date: Fri, 10 Jan 2025 22:02:39 +0530 Subject: [PATCH 2/2] uv integration and minor changes in gemini support --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index b837488..6ca96dc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,7 +7,7 @@ name = "async_llm" version = "0.0.1" description = "A Python package for asynchronous LLM integration." readme = "README.md" -authors = [{ name = "Shamal De Silva", email = "shamalgithub@gmail.com" }, {name = "Sahan Ruwantha", "sahanr.silva@proton.me"}] +authors = [{ name = "Shamal De Silva", email = "shamalgithub@gmail.com" }, {name = "Sahan Ruwantha", email="sahanr.silva@proton.me"}] classifiers = [ "Programming Language :: Python :: 3", "License :: OSI Approved :: MIT License",