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..6ca96dc --- /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", email="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)