From 71892f4582209182239e352ca38d2e98e0e6bd18 Mon Sep 17 00:00:00 2001 From: reeyank Date: Fri, 10 Jan 2025 23:13:53 -0500 Subject: [PATCH 1/4] Added Github and Pinecone connection for FastAPI support --- agents/eternalai-example.json | 4 + agents/example.json | 26 +--- src/agent.py | 36 +++++ src/api.py | 54 +++++++ src/cli.py | 26 +++- src/connection_manager.py | 6 + src/connections/api.py | 14 ++ src/connections/github_connection.py | 208 +++++++++++++++++++++++++ src/connections/openai_connection.py | 32 ++++ src/connections/pinecone_connection.py | 93 +++++++++++ 10 files changed, 475 insertions(+), 24 deletions(-) create mode 100644 src/api.py create mode 100644 src/connections/api.py create mode 100644 src/connections/github_connection.py create mode 100644 src/connections/pinecone_connection.py diff --git a/agents/eternalai-example.json b/agents/eternalai-example.json index 0106f228..c885fd7c 100644 --- a/agents/eternalai-example.json +++ b/agents/eternalai-example.json @@ -29,6 +29,10 @@ "name": "eternalai", "model": "NousResearch/Hermes-3-Llama-3.1-70B-FP8", "chain_id": "45762" + }, + { + "name": "openai", + "model": "gpt-3.5-turbo" } ], "tasks": [ diff --git a/agents/example.json b/agents/example.json index 213e7323..1ddd9621 100644 --- a/agents/example.json +++ b/agents/example.json @@ -26,36 +26,16 @@ "own_tweet_replies_count":2, "tweet_interval": 5400 }, - { - "name": "farcaster", - "timeline_read_count": 10, - "cast_interval": 60 - }, { "name": "openai", "model": "gpt-3.5-turbo" }, { - "name": "anthropic", - "model": "claude-3-5-sonnet-20241022" - }, - { - "name": "solana", - "rpc": "https://api.mainnet-beta.solana.com" - }, - { - "name": "eternalai", - "model": "NousResearch/Hermes-3-Llama-3.1-70B-FP8", - "chain_id": "45762" - }, - { - "name": "ollama", - "base_url": "http://localhost:11434", - "model": "llama3.2" + "name": "pinecone" }, { - "name": "hyperbolic", - "model": "meta-llama/Meta-Llama-3-70B-Instruct" + "name": "github", + "repository": "blorm-network/ZerePy" } ], "tasks": [ diff --git a/src/agent.py b/src/agent.py index f5e21a9d..e131baf0 100644 --- a/src/agent.py +++ b/src/agent.py @@ -3,6 +3,7 @@ import time import logging import os +import tiktoken from pathlib import Path from dotenv import load_dotenv from src.connection_manager import ConnectionManager @@ -138,6 +139,9 @@ def prompt_llm(self, prompt: str, system_prompt: str = None) -> str: """Generate text using the configured LLM provider""" system_prompt = system_prompt or self._construct_system_prompt() + if not self.is_llm_set: + self._setup_llm_provider() + return self.connection_manager.perform_action( connection_name=self.model_provider, action_name="generate-text", @@ -155,6 +159,38 @@ def select_action(self, use_time_based_weights: bool = False) -> dict: task_weights = self._adjust_weights_for_time(current_hour, task_weights) return random.choices(self.tasks, weights=task_weights, k=1)[0] + + def generate_embeddings(self, chunks): + """Create embeddings using the configured LLM provider""" + return self.connection_manager.perform_action( + connection_name="openai", + action_name="generate-embeddings", + params=[chunks] + ) + + def upload_embeddings(self, index_name, embeddings, chunks): + """Upload embeddings to Pinecone""" + return self.connection_manager.perform_action( + connection_name="pinecone", + action_name="upload-embeddings", + params=[index_name, embeddings, chunks] + ) + + def query_embeddings(self, index_name, query_vector, top_k=3): + """Query embeddings from Pinecone""" + return self.connection_manager.perform_action( + connection_name="pinecone", + action_name="query-embeddings", + params=[index_name, query_vector, top_k] + ) + + def chunk_text(self, text: str, max_tokens=300): + words = text.split() + chunks = [] + for i in range(0, len(words), max_tokens): + chunk = ' '.join(words[i:i + max_tokens]) + chunks.append(chunk) + return chunks def loop(self): """Main agent loop for autonomous behavior""" diff --git a/src/api.py b/src/api.py new file mode 100644 index 00000000..c244183c --- /dev/null +++ b/src/api.py @@ -0,0 +1,54 @@ +from fastapi import FastAPI +from src.agent import ZerePyAgent +from venv import logger +import uvicorn +import asyncio + +class API: + def __init__(self, agent: ZerePyAgent): + self.app = FastAPI() + self._setup_routes() + self.agent = agent + + async def initialize(self): + try: + repo_data: str = await self.agent.connection_manager.perform_action("github", "get-repo", []) + chunk_text = self.agent.chunk_text(repo_data) + logger.info(len(chunk_text)) + embeddings = self.agent.generate_embeddings(chunk_text) + logger.info("All embeddings have been created") + self.agent.upload_embeddings(self.agent.connection_manager.connections["github"].repo, embeddings, chunk_text) + except Exception as e: + logger.error(f"Error initializing API: {e}") + raise + + def _setup_routes(self): + @self.app.get("/query/{query}") + async def query_chatbot(query: str): + logger.info(self.agent.connection_manager.list_connections()) + + async def getQueryVector(query): + return self.agent.generate_embeddings([query]) + + logger.info(query) + res = await getQueryVector(query) + res = res[0] + + index_name = self.agent.connection_manager.connections["github"].repo.replace('/', '-').lower() + + pinecone_results = self.agent.query_embeddings(index_name, res) + logger.info(pinecone_results) + + openai_response = self.agent.prompt_llm(query, pinecone_results) + + return {"response": openai_response} + + async def run(self, host="0.0.0.0", port=8000): + await self.initialize() + config = uvicorn.Config(self.app, host=host, port=port) + server = uvicorn.Server(config) + await server.serve() + +if __name__ == "__main__": + api = API() + asyncio.run(api.run()) \ No newline at end of file diff --git a/src/cli.py b/src/cli.py index ba2430f1..07d081fb 100644 --- a/src/cli.py +++ b/src/cli.py @@ -2,6 +2,7 @@ import json import logging import os +import asyncio from dataclasses import dataclass from typing import Callable, Dict, List from pathlib import Path @@ -11,6 +12,7 @@ from prompt_toolkit.formatted_text import HTML from prompt_toolkit.history import FileHistory from src.agent import ZerePyAgent +from src.api import API from src.helpers import print_h_bar # Configure logging @@ -60,6 +62,16 @@ def _initialize_commands(self) -> None: ) ) + self._register_command( + Command( + name="start-api", + description="Start the FastAPI server for chatbot operations.", + tips=["Use this command to start the API server."], + handler=self.start_api, + aliases=['api'] + ) + ) + # Clear command self._register_command( Command( @@ -248,7 +260,10 @@ def _handle_command(self, input_string: str) -> None: try: command = self.commands.get(command_string) if command: - command.handler(input_list) + if asyncio.iscoroutinefunction(command.handler): + asyncio.run(command.handler(input_list)) + else: + command.handler(input_list) else: self._handle_unknown_command(command_string) except Exception as e: @@ -380,6 +395,15 @@ def clear_screen(self, input_list: List[str]) -> None: os.system('cls' if os.name == 'nt' else 'clear') self._print_welcome_message(clearing=True) + async def start_api(self, host="0.0.0.0", port=8000): + """Start the FastAPI server""" + try: + api = API(self.agent) + await api.run() + except Exception as e: + logger.error(f"Error starting API. Error: {e}") + + def agent_action(self, input_list: List[str]) -> None: """Handle agent action command""" if self.agent is None: diff --git a/src/connection_manager.py b/src/connection_manager.py index 77684b5b..42a3cc1e 100644 --- a/src/connection_manager.py +++ b/src/connection_manager.py @@ -10,6 +10,8 @@ from src.connections.echochambers_connection import EchochambersConnection from src.connections.solana_connection import SolanaConnection from src.connections.hyperbolic_connection import HyperbolicConnection +from src.connections.pinecone_connection import PineconeConnection +from src.connections.github_connection import GitHubConnection logger = logging.getLogger("connection_manager") @@ -37,6 +39,10 @@ def _class_name_to_type(class_name: str) -> Type[BaseConnection]: return EchochambersConnection elif class_name == "solana": return SolanaConnection + elif class_name == "github": + return GitHubConnection + elif class_name == "pinecone": + return PineconeConnection elif class_name == "hyperbolic": return HyperbolicConnection diff --git a/src/connections/api.py b/src/connections/api.py new file mode 100644 index 00000000..de924a6d --- /dev/null +++ b/src/connections/api.py @@ -0,0 +1,14 @@ +from fastapi import FastAPI + +@app.get("/query/{query}") +def query_chatbot(query: str): + # Query Pinecone + pinecone_results = pinecone_conn.query_pinecone(query) + + # Query OpenAI + openai_response = OpenAIConnection.generate_text(prompt=query, system_prompt=pinecone_results) + + return {"response": openai_response} + +if __name__ == "__main__": + uvicorn.run(app, host="0.0.0.0", port=8000) \ No newline at end of file diff --git a/src/connections/github_connection.py b/src/connections/github_connection.py new file mode 100644 index 00000000..12a2ddb3 --- /dev/null +++ b/src/connections/github_connection.py @@ -0,0 +1,208 @@ +import os +import logging +from datetime import datetime, timedelta +from typing import Dict, Any +import aiohttp +from dotenv import load_dotenv +from pathlib import Path +from src.connections.base_connection import BaseConnection, Action + + +logger = logging.getLogger("github_connection") +MAX_TOKENS = 300 + +class GitHubConnection(BaseConnection): + def __init__(self, config: Dict[str, Any]): + super().__init__(config) + + # Try loading from different locations + load_dotenv() # Try current directory + load_dotenv(Path('../.env')) # Try parent directory + load_dotenv(Path('../../.env')) # Try two levels up + + self.token = os.getenv('GITHUB_TOKEN') + if not self.token: + raise ValueError("GitHub token not found in environment variables") + + self.repo = config.get('repository') + if not self.repo: + raise ValueError("GitHub repository not specified in config") + + self.headers = { + 'Authorization': f'token {self.token}', + 'Accept': 'application/vnd.github.v3+json' + } + self.base_url = 'https://api.github.com' + self.session = None + self.stats_cache = {} + self.last_update = None + + @property + def is_llm_provider(self) -> bool: + return False + + async def setup(self): + """Initialize aiohttp session""" + if not self.session: + self.session = aiohttp.ClientSession(headers=self.headers) + + async def close(self): + """Close aiohttp session""" + if self.session: + await self.session.close() + self.session = None + + + async def get_repo(self) -> str: + """Get current repository statistics and process repository content""" + await self.setup() + + def is_allowed_filetype(filename): + allowed_extensions = ['.py', '.txt', '.js', '.tsx', '.ts', '.md', '.cjs', '.html', '.json', '.ipynb', '.h', '.sh', '.yaml'] + return any(filename.endswith(ext) for ext in allowed_extensions) + + try: + # Only update cache every hour + current_time = datetime.now() + if (self.last_update and + current_time - self.last_update < timedelta(hours=1) and + self.stats_cache): + logger.info("Returning cached GitHub stats") + return self.stats_cache['content'] + + logger.info(f"Fetching fresh stats for repository: {self.repo}") + + # Get repository info + logger.info("Fetching repository info...") + async with self.session.get(f'{self.base_url}/repos/{self.repo}') as response: + if response.status != 200: + logger.error(f"Failed to fetch repository info: {response.status}") + logger.error(f"Response: {await response.text()}") + return "" + repo_data = await response.json() + logger.debug(f"Repository info received: {repo_data}") + + # Process repository content + repo_content = [f''] + repo_content.append(f'') + + async def process_directory(url, repo_content): + async with self.session.get(url) as response: + response.raise_for_status() + files = await response.json() + + for file in files: + if file["type"] == "file" and is_allowed_filetype(file["name"]): + logger.info(f"Processing {file['path']}...") + async with self.session.get(file["download_url"]) as file_response: + file_content = await file_response.text() + repo_content.append(f'') + repo_content.append(file_content) + repo_content.append('') + + elif file["type"] == "dir": + await process_directory(file["url"], repo_content) + + async def process_pulls(repo_content): + async with self.session.get(f'{self.base_url}/repos/{self.repo}/pulls') as response: + response.raise_for_status() + pulls = await response.json() + repo_content.append('') + for pr in pulls: + repo_content.append(f'') + repo_content.append(f' {pr["body"]}') + repo_content.append('') + repo_content.append('') + + async def process_commits(repo_content): + async with self.session.get(f'{self.base_url}/repos/{self.repo}/commits') as response: + response.raise_for_status() + commits = await response.json() + repo_content.append('') + for commit in commits: + repo_content.append(f'') + repo_content.append(f' {commit["commit"]["committer"]["name"]}') + repo_content.append('') + repo_content.append('') + + contents_url = f'{self.base_url}/repos/{self.repo}/contents' + await process_directory(contents_url, repo_content) + await process_pulls(repo_content) + await process_commits(repo_content) + + repo_content.append('') + logger.info("All files processed.") + + # Update stats cache + self.stats_cache = { + 'stars': repo_data.get('stargazers_count', 0), + 'new_stars': 0, # This would need to be calculated as before + 'forks': repo_data.get('forks_count', 0), + 'open_issues': repo_data.get('open_issues_count', 0), + 'recent_commits': 0, # This would need to be calculated as before + 'open_prs': 0, + 'watchers': repo_data.get('subscribers_count', 0), + 'content': "\n".join(repo_content) + } + self.last_update = current_time + + repo_content = " ".join(str(element) for element in repo_content) + return repo_content + + except Exception as e: + logger.error(f"Error fetching GitHub stats: {e}") + logger.exception("Full traceback:") + return "" + + def configure(self) -> bool: + """Sets up GitHub API authentication""" + load_dotenv() # Load environment variables from .env file + self.token = os.getenv('GITHUB_TOKEN') + if not self.token: + logger.error("GitHub token not found in environment variables.") + return False + + self.headers = { + 'Authorization': f'token {self.token}', + 'Accept': 'application/vnd.github.v3+json' + } + logger.info("GitHub client configured successfully.") + return True + + def register_actions(self) -> None: + """Register available Github actions""" + self.actions = { + "get-repo": Action( + name="get-repo", + parameters=[], + description="Gets all the current repo information including stats, code, and readme files." + ) + } + + def is_configured(self) -> bool: + """Checks if the GitHub connection is configured by verifying the presence of the API key""" + return self.token is not None + + def validate_config(self, config: Dict[str, Any]) -> Dict[str, Any]: + """Validate Github configuration from JSON""" + required_fields = ["repository"] + missing_fields = [field for field in required_fields if field not in config] + + if missing_fields: + raise ValueError(f"Missing required configuration fields: {', '.join(missing_fields)}") + + return config + + async def perform_action(self, action_name: str, kwargs) -> Any: + """Execute a Github action with validation""" + if action_name not in self.actions: + raise KeyError(f"Unknown action: {action_name}") + + action = self.actions[action_name] + errors = action.validate_params(kwargs) + if errors: + raise ValueError(f"Invalid parameters: {', '.join(errors)}") + + method_name = action_name.replace("-", "_") + method = getattr(self, method_name) + return await method(**kwargs) \ No newline at end of file diff --git a/src/connections/openai_connection.py b/src/connections/openai_connection.py index dd255a68..6c24d881 100644 --- a/src/connections/openai_connection.py +++ b/src/connections/openai_connection.py @@ -65,6 +65,13 @@ def register_actions(self) -> None: name="list-models", parameters=[], description="List all available OpenAI models" + ), + "generate-embeddings": Action( + name="generate-embeddings", + parameters=[ + ActionParameter("chunks", True, list, "The list of chunks to create embeddings for.") + ], + description="Create embeddings for the chunks of texts provided" ) } @@ -151,6 +158,31 @@ def generate_text(self, prompt: str, system_prompt: str, model: str = None, **kw except Exception as e: raise OpenAIAPIError(f"Text generation failed: {e}") + + def generate_embeddings(self, chunks: list, model: str = None): + """Generate embeddings using OpenAI models""" + try: + client = self._get_client() + embeddings = [] + + if not model: + model = "text-embedding-ada-002" + + for index, chunk in enumerate(chunks): + try: + logger.debug(f"Processing chunk index {index}: {chunk[:100]}...") # Log part of the chunk + response = client.embeddings.create(input=chunk, model=model) + embeddings.append(response.data[0].embedding) + logger.info(f"Processed chunk index: {index}") + except Exception as e: + logger.error(f"Error processing chunk index {index}: {e}") + continue # Skip to the next chunk if an error occurs + + return embeddings + + except Exception as e: + raise OpenAIAPIError(f"Embedding generation failed: {e}") + def check_model(self, model, **kwargs): try: diff --git a/src/connections/pinecone_connection.py b/src/connections/pinecone_connection.py new file mode 100644 index 00000000..9c1bce23 --- /dev/null +++ b/src/connections/pinecone_connection.py @@ -0,0 +1,93 @@ +import os +from venv import logger +from pinecone import Pinecone +from typing import Any, Dict, List +from dotenv import load_dotenv +from pathlib import Path +from src.connections.base_connection import Action, ActionParameter, BaseConnection + +class PineconeConnection(BaseConnection): + def __init__(self, config): + logger.info("Initializing Pinecone connection....") + super().__init__(config) + + load_dotenv() # Try current directory + load_dotenv(Path('../.env')) # Try parent directory + load_dotenv(Path('../../.env')) # Try two levels up + self.api_key = os.getenv("PINECONE_API_KEY") + self.client = Pinecone(api_key=self.api_key) + + @property + def is_llm_provider(self) -> bool: + return False + + def register_actions(self) -> None: + """Register available Pinecone actions""" + self.actions = { + "upload-embeddings": Action( + name="upload-embeddings", + parameters=[ + ActionParameter("index_name", True, str, "Index name for the Pinecone connection."), + ActionParameter("embeddings", True, list, "List of all embeddings that need to be uploaded."), + ActionParameter("chunk_texts", True, list, "List of all the chunks of text that need to be uploaded to Pinecone.") + ], + description="Upload embeddings on Pinecone" + ), + "query-embeddings": Action( + name="query-embeddings", + parameters=[ + ActionParameter("index_name", True, str, "Index name for the Pinecone connection."), + ActionParameter("query_vector", True, list, "Vector that needs to be queried in pinecone."), + ActionParameter("top_k", False, int, "Top K results to be pulled from the pinecone db.") + ], + description="Query embeddings on Pinecone" + ) + } + + def upload_embeddings(self, index_name, embeddings, chunk_texts): + index_name = index_name.replace('/', '-').lower() + vectors = [(f"chunk-{i}", embedding, {"text": chunk_texts[i]}) for i, embedding in enumerate(embeddings)] + self.client.Index(index_name).upsert(vectors) + + def query_embeddings(self, index_name, query_vector, top_k=3): + index = self.client.Index(index_name) + results = index.query(vector=query_vector, top_k=top_k, include_metadata=True) + return [result['metadata']['text'] for result in results['matches']] + + def configure(self) -> bool: + """Sets up Pinecone API""" + if not self.api_key: + logger.error("Pinecone API key not found in environment variables.") + return False + + try: + # Assuming Pinecone has a client setup method + if (self.client is not None): + logger.info("Pinecone client configured successfully.") + return True + except Exception as e: + logger.error(f"Failed to configure Pinecone client: {e}") + return False + + def is_configured(self) -> bool: + """Checks if the Pinecone connection is configured""" + return self.client is not None + + def validate_config(self, config: Dict[str, Any]) -> Dict[str, Any]: + """Validate Pinecone configuration from JSON""" + return config + + def perform_action(self, action_name: str, kwargs) -> Any: + """Execute a action with validation""" + if action_name not in self.actions: + raise KeyError(f"Unknown action: {action_name}") + + action = self.actions[action_name] + errors = action.validate_params(kwargs) + if errors: + raise ValueError(f"Invalid parameters: {', '.join(errors)}") + + # Call the appropriate method based on action name + method_name = action_name.replace('-', '_') + method = getattr(self, method_name) + return method(**kwargs) \ No newline at end of file From 12f3e7ed4e3d850abdd55c93a29bb9d7a41dd5b6 Mon Sep 17 00:00:00 2001 From: reeyank Date: Sat, 11 Jan 2025 12:49:28 -0500 Subject: [PATCH 2/4] added sample docker file --- dockerfile | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 dockerfile diff --git a/dockerfile b/dockerfile new file mode 100644 index 00000000..bcf2f07a --- /dev/null +++ b/dockerfile @@ -0,0 +1,45 @@ +# Use an official Python runtime as a parent image +FROM python:3.11-slim + +# Set environment variables +ENV PYTHONUNBUFFERED=1 \ + PYTHONDONTWRITEBYTECODE=1 \ + PIP_NO_CACHE_DIR=off \ + PIP_DISABLE_PIP_VERSION_CHECK=on \ + POETRY_VERSION=1.7.1 \ + POETRY_HOME="/opt/poetry" \ + POETRY_VIRTUALENVS_IN_PROJECT=true \ + POETRY_NO_INTERACTION=1 \ + PYSETUP_PATH="/opt/pysetup" \ + VENV_PATH="/opt/pysetup/.venv" + +# prepend poetry and venv to path +ENV PATH="$POETRY_HOME/bin:$VENV_PATH/bin:$PATH" + +# Install system dependencies +RUN apt-get update \ + && apt-get install -y --no-install-recommends \ + curl \ + build-essential \ + && rm -rf /var/lib/apt/lists/* + +# Install Poetry +RUN curl -sSL https://install.python-poetry.org | python3 - + +# Set working directory +WORKDIR $PYSETUP_PATH + +# Copy poetry.lock* in case it doesn't exist in the repo +COPY ./pyproject.toml ./poetry.lock* ./ + +# Install runtime deps - uses $POETRY_VIRTUALENVS_IN_PROJECT internally +RUN poetry install --no-dev --no-root + +# Copy the project files +COPY . . + +# Install the project +RUN poetry install --no-dev + +# Run the application +CMD ["poetry", "run", "python", "your_app.py"] \ No newline at end of file From 80b165ae3a301497e9592c54dc8b800fe1b70cf2 Mon Sep 17 00:00:00 2001 From: reeyank Date: Sat, 11 Jan 2025 13:26:17 -0500 Subject: [PATCH 3/4] Update poetry.lock file --- poetry.lock | 159 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 156 insertions(+), 3 deletions(-) diff --git a/poetry.lock b/poetry.lock index 41ad1293..a2106257 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.5 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.0.0 and should not be changed by hand. [[package]] name = "aiohappyeyeballs" @@ -6,6 +6,7 @@ version = "2.4.4" description = "Happy Eyeballs for asyncio" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "aiohappyeyeballs-2.4.4-py3-none-any.whl", hash = "sha256:a980909d50efcd44795c4afeca523296716d50cd756ddca6af8c65b996e27de8"}, {file = "aiohappyeyeballs-2.4.4.tar.gz", hash = "sha256:5fdd7d87889c63183afc18ce9271f9b0a7d32c2303e394468dd45d514a757745"}, @@ -17,6 +18,7 @@ version = "3.11.11" description = "Async http client/server framework (asyncio)" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "aiohttp-3.11.11-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a60804bff28662cbcf340a4d61598891f12eea3a66af48ecfdc975ceec21e3c8"}, {file = "aiohttp-3.11.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4b4fa1cb5f270fb3eab079536b764ad740bb749ce69a94d4ec30ceee1b5940d5"}, @@ -115,6 +117,7 @@ version = "1.3.2" description = "aiosignal: a list of registered asynchronous callbacks" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "aiosignal-1.3.2-py2.py3-none-any.whl", hash = "sha256:45cde58e409a301715980c2b01d0c28bdde3770d8290b5eb2173759d9acb31a5"}, {file = "aiosignal-1.3.2.tar.gz", hash = "sha256:a8c255c66fafb1e499c9351d0bf32ff2d8a0321595ebac3b93713656d2436f54"}, @@ -129,6 +132,7 @@ version = "0.20.1" description = "The Python Anchor client." optional = false python-versions = "<4.0,>=3.9" +groups = ["main"] files = [ {file = "anchorpy-0.20.1-py3-none-any.whl", hash = "sha256:78c82b56e340240fd00697cde08cd63f84ccc48b34532f0eed4a570f7054aec9"}, {file = "anchorpy-0.20.1.tar.gz", hash = "sha256:e4ac7e3e742a4a31165da2cdded44bfec8d03802488beb36f6735d1c9351fe08"}, @@ -157,6 +161,7 @@ version = "0.2.0" description = "Python bindings for Anchor Rust code" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "anchorpy_core-0.2.0-cp37-abi3-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:f04928c0916e8a5cba5986a85db682df19e204bb424bdea49b8a46fc45f2fc66"}, {file = "anchorpy_core-0.2.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e37373336fa735f7f3f5eab8f3b090c8a39ef48f3f4f367ad703c7643260560"}, @@ -180,6 +185,7 @@ version = "0.7.0" description = "Reusable constraint types to use with typing.Annotated" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, @@ -191,6 +197,7 @@ version = "0.42.0" description = "The official Python library for the anthropic API" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "anthropic-0.42.0-py3-none-any.whl", hash = "sha256:46775f65b723c078a2ac9e9de44a46db5c6a4fabeacfd165e5ea78e6817f4eff"}, {file = "anthropic-0.42.0.tar.gz", hash = "sha256:bf8b0ed8c8cb2c2118038f29c58099d2f99f7847296cafdaa853910bfff4edf4"}, @@ -215,6 +222,7 @@ version = "4.8.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "anyio-4.8.0-py3-none-any.whl", hash = "sha256:b5011f270ab5eb0abf13385f851315585cc37ef330dd88e27ec3d34d651fd47a"}, {file = "anyio-4.8.0.tar.gz", hash = "sha256:1d9fe889df5212298c0c0723fa20479d1b94883a2df44bd3897aa91083316f7a"}, @@ -237,6 +245,8 @@ version = "5.0.1" description = "Timeout context manager for asyncio programs" optional = false python-versions = ">=3.8" +groups = ["main"] +markers = "python_version < \"3.11\"" files = [ {file = "async_timeout-5.0.1-py3-none-any.whl", hash = "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c"}, {file = "async_timeout-5.0.1.tar.gz", hash = "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3"}, @@ -248,6 +258,7 @@ version = "24.3.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "attrs-24.3.0-py3-none-any.whl", hash = "sha256:ac96cd038792094f438ad1f6ff80837353805ac950cd2aa0e0625ef19850c308"}, {file = "attrs-24.3.0.tar.gz", hash = "sha256:8f5c07333d543103541ba7be0e2ce16eeee8130cb0b3f9238ab904ce1e85baff"}, @@ -267,6 +278,7 @@ version = "2.1.1" description = "Base58 and Base58Check implementation." optional = false python-versions = ">=3.5" +groups = ["main"] files = [ {file = "base58-2.1.1-py3-none-any.whl", hash = "sha256:11a36f4d3ce51dfc1043f3218591ac4eb1ceb172919cebe05b52a5bcc8d245c2"}, {file = "base58-2.1.1.tar.gz", hash = "sha256:c5d0cb3f5b6e81e8e35da5754388ddcc6d0d14b6c6a132cb93d69ed580a7278c"}, @@ -281,6 +293,7 @@ version = "0.1.1" description = "A fast Python library for Base58 and Base58Check" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "based58-0.1.1-cp37-abi3-macosx_10_7_x86_64.whl", hash = "sha256:745851792ce5fada615f05ec61d7f360d19c76950d1e86163b2293c63a5d43bc"}, {file = "based58-0.1.1-cp37-abi3-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:f8448a71678bd1edc0a464033695686461ab9d6d0bc3282cb29b94f883583572"}, @@ -306,6 +319,7 @@ version = "3.0.0" description = "efficient arrays of booleans -- C extension" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "bitarray-3.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5ddbf71a97ad1d6252e6e93d2d703b624d0a5b77c153b12f9ea87d83e1250e0c"}, {file = "bitarray-3.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0e7f24a0b01e6e6a0191c50b06ca8edfdec1988d9d2b264d669d2487f4f4680"}, @@ -452,6 +466,7 @@ version = "0.1.0" description = "Python implementation of Borsh serialization, built on the Construct library." optional = false python-versions = ">=3.8.3,<4.0.0" +groups = ["main"] files = [ {file = "borsh-construct-0.1.0.tar.gz", hash = "sha256:c916758ceba70085d8f456a1cc26991b88cb64233d347767766473b651b37263"}, {file = "borsh_construct-0.1.0-py3-none-any.whl", hash = "sha256:f584c791e2a03f8fc36e6c13011a27bcaf028c9c54ba89cd70f485a7d1c687ed"}, @@ -467,6 +482,7 @@ version = "2.0.0" description = "Canonical JSON" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "canonicaljson-2.0.0-py3-none-any.whl", hash = "sha256:c38a315de3b5a0532f1ec1f9153cd3d716abfc565a558d00a4835428a34fca5b"}, {file = "canonicaljson-2.0.0.tar.gz", hash = "sha256:e2fdaef1d7fadc5d9cb59bd3d0d41b064ddda697809ac4325dced721d12f113f"}, @@ -478,6 +494,7 @@ version = "2024.12.14" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {file = "certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56"}, {file = "certifi-2024.12.14.tar.gz", hash = "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db"}, @@ -489,6 +506,7 @@ version = "3.4.1" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de"}, {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176"}, @@ -590,6 +608,8 @@ version = "0.4.6" description = "Cross-platform colored terminal text." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +groups = ["main"] +markers = "platform_system == \"Windows\"" files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, @@ -601,6 +621,7 @@ version = "2.10.68" description = "A powerful declarative symmetric parser/builder for binary data" optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {file = "construct-2.10.68.tar.gz", hash = "sha256:7b2a3fd8e5f597a5aa1d614c3bd516fa065db01704c72a1efaaeec6ef23d8b45"}, ] @@ -614,6 +635,7 @@ version = "0.5.6" description = "Extension for the python package 'construct' that adds typing features" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "construct-typing-0.5.6.tar.gz", hash = "sha256:0dc501351cd6b308f15ec54e5fe7c0fbc07cc1530a1b77b4303062a0a93c1297"}, {file = "construct_typing-0.5.6-py3-none-any.whl", hash = "sha256:39c948329e880564e33521cba497b21b07967c465b9c9037d6334e2cffa1ced9"}, @@ -628,6 +650,8 @@ version = "1.0.1" description = "Cython implementation of Toolz: High performance functional utilities" optional = false python-versions = ">=3.8" +groups = ["main"] +markers = "implementation_name == \"cpython\"" files = [ {file = "cytoolz-1.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cec9af61f71fc3853eb5dca3d42eb07d1f48a4599fa502cbe92adde85f74b042"}, {file = "cytoolz-1.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:140bbd649dbda01e91add7642149a5987a7c3ccc251f2263de894b89f50b6608"}, @@ -743,6 +767,7 @@ version = "1.9.0" description = "Distro - an OS platform information API" optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {file = "distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2"}, {file = "distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed"}, @@ -754,6 +779,7 @@ version = "5.0.1" description = "eth_abi: Python utilities for working with Ethereum ABI definitions, especially encoding and decoding" optional = false python-versions = ">=3.8, <4" +groups = ["main"] files = [ {file = "eth_abi-5.0.1-py3-none-any.whl", hash = "sha256:521960d8b4beee514958e1774951dc6b48176aa274e3bd8b166f6921453047ef"}, {file = "eth_abi-5.0.1.tar.gz", hash = "sha256:e9425110c6120c585c9f0db2e8a33d76c4b886b148a65e68fc0035d3917a3b9c"}, @@ -776,6 +802,7 @@ version = "0.10.0" description = "eth-account: Sign Ethereum transactions and messages with local private keys" optional = false python-versions = ">=3.7, <4" +groups = ["main"] files = [ {file = "eth-account-0.10.0.tar.gz", hash = "sha256:474a2fccf7286230cf66502565f03b536921d7e1fdfceba198e42160e5ac4bc1"}, {file = "eth_account-0.10.0-py3-none-any.whl", hash = "sha256:b7a83f506a8edf57926569e5f04471ce3f1700e572d3421b4ad0dad7a26c0978"}, @@ -803,6 +830,7 @@ version = "0.7.0" description = "eth-hash: The Ethereum hashing function, keccak256, sometimes (erroneously) called sha3" optional = false python-versions = ">=3.8, <4" +groups = ["main"] files = [ {file = "eth-hash-0.7.0.tar.gz", hash = "sha256:bacdc705bfd85dadd055ecd35fd1b4f846b671add101427e089a4ca2e8db310a"}, {file = "eth_hash-0.7.0-py3-none-any.whl", hash = "sha256:b8d5a230a2b251f4a291e3164a23a14057c4a6de4b0aa4a16fa4dc9161b57e2f"}, @@ -821,6 +849,7 @@ version = "0.8.1" description = "eth-keyfile: A library for handling the encrypted keyfiles used to store ethereum private keys" optional = false python-versions = "<4,>=3.8" +groups = ["main"] files = [ {file = "eth_keyfile-0.8.1-py3-none-any.whl", hash = "sha256:65387378b82fe7e86d7cb9f8d98e6d639142661b2f6f490629da09fddbef6d64"}, {file = "eth_keyfile-0.8.1.tar.gz", hash = "sha256:9708bc31f386b52cca0969238ff35b1ac72bd7a7186f2a84b86110d3c973bec1"}, @@ -842,6 +871,7 @@ version = "0.6.0" description = "eth-keys: Common API for Ethereum key operations" optional = false python-versions = "<4,>=3.8" +groups = ["main"] files = [ {file = "eth_keys-0.6.0-py3-none-any.whl", hash = "sha256:b396fdfe048a5bba3ef3990739aec64901eb99901c03921caa774be668b1db6e"}, {file = "eth_keys-0.6.0.tar.gz", hash = "sha256:ba33230f851d02c894e83989185b21d76152c49b37e35b61b1d8a6d9f1d20430"}, @@ -863,6 +893,7 @@ version = "1.0.1" description = "eth-rlp: RLP definitions for common Ethereum objects in Python" optional = false python-versions = ">=3.8, <4" +groups = ["main"] files = [ {file = "eth-rlp-1.0.1.tar.gz", hash = "sha256:d61dbda892ee1220f28fb3663c08f6383c305db9f1f5624dc585c9cd05115027"}, {file = "eth_rlp-1.0.1-py3-none-any.whl", hash = "sha256:dd76515d71654277377d48876b88e839d61553aaf56952e580bb7cebef2b1517"}, @@ -885,6 +916,7 @@ version = "5.1.0" description = "eth-typing: Common type annotations for ethereum python packages" optional = false python-versions = "<4,>=3.8" +groups = ["main"] files = [ {file = "eth_typing-5.1.0-py3-none-any.whl", hash = "sha256:c0d6b93f5385aa84efc4b47ae2bd478da069bc0ffda8b67e0ccb573f43defd29"}, {file = "eth_typing-5.1.0.tar.gz", hash = "sha256:8581f212ee6252aaa285377a77620f6e5f6e16ac3f144c61f098fafd47967b1a"}, @@ -904,6 +936,7 @@ version = "5.1.0" description = "eth-utils: Common utility functions for python code that interacts with Ethereum" optional = false python-versions = "<4,>=3.8" +groups = ["main"] files = [ {file = "eth_utils-5.1.0-py3-none-any.whl", hash = "sha256:a99f1f01b51206620904c5af47fac65abc143aebd0a76bdec860381c5a3230f8"}, {file = "eth_utils-5.1.0.tar.gz", hash = "sha256:84c6314b9cf1fcd526107464bbf487e3f87097a2e753360d5ed319f7d42e3f20"}, @@ -926,6 +959,8 @@ version = "1.2.2" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" +groups = ["main"] +markers = "python_version < \"3.11\"" files = [ {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, @@ -940,6 +975,7 @@ version = "0.7.11" description = "farcaster-py is a Python SDK for the Farcaster Protocol" optional = false python-versions = ">=3.8.0,<4.0.0" +groups = ["main"] files = [ {file = "farcaster-0.7.11-py3-none-any.whl", hash = "sha256:b830b8f7683fd01a8d828cac71c59bc3410aa7758c73bdfa391610f9f2bb1517"}, {file = "farcaster-0.7.11.tar.gz", hash = "sha256:45746e3d1718bed6dd231764da0ad5805f643a23e1a4a07907a8970c4e28e6bf"}, @@ -960,6 +996,7 @@ version = "1.5.0" description = "A list-like structure which implements collections.abc.MutableSequence" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "frozenlist-1.5.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5b6a66c18b5b9dd261ca98dffcb826a525334b2f29e7caa54e182255c5f6a65a"}, {file = "frozenlist-1.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d1b3eb7b05ea246510b43a7e53ed1653e55c2121019a97e60cad7efb881a97bb"}, @@ -1061,6 +1098,7 @@ version = "0.14.0" description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, @@ -1072,6 +1110,7 @@ version = "0.3.1" description = "hexbytes: Python `bytes` subclass that decodes hex, with a readable console output" optional = false python-versions = ">=3.7, <4" +groups = ["main"] files = [ {file = "hexbytes-0.3.1-py3-none-any.whl", hash = "sha256:383595ad75026cf00abd570f44b368c6cdac0c6becfae5c39ff88829877f8a59"}, {file = "hexbytes-0.3.1.tar.gz", hash = "sha256:a3fe35c6831ee8fafd048c4c086b986075fc14fd46258fa24ecb8d65745f9a9d"}, @@ -1089,6 +1128,7 @@ version = "1.0.7" description = "A minimal low-level HTTP client." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd"}, {file = "httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c"}, @@ -1110,6 +1150,7 @@ version = "0.28.1" description = "The next generation HTTP client." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad"}, {file = "httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc"}, @@ -1134,6 +1175,7 @@ version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, @@ -1148,6 +1190,7 @@ version = "0.8.2" description = "Fast iterable JSON parser." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "jiter-0.8.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:ca8577f6a413abe29b079bc30f907894d7eb07a865c4df69475e868d73e71c7b"}, {file = "jiter-0.8.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b25bd626bde7fb51534190c7e3cb97cee89ee76b76d7585580e22f34f5e3f393"}, @@ -1233,6 +1276,7 @@ version = "0.1.1" description = "A microlibrary that defines a Json type alias for Python." optional = false python-versions = ">=3.7,<4.0" +groups = ["main"] files = [ {file = "jsonalias-0.1.1-py3-none-any.whl", hash = "sha256:a56d2888e6397812c606156504e861e8ec00e188005af149f003c787db3d3f18"}, {file = "jsonalias-0.1.1.tar.gz", hash = "sha256:64f04d935397d579fc94509e1fcb6212f2d081235d9d6395bd10baedf760a769"}, @@ -1244,6 +1288,7 @@ version = "0.0.2.0" description = "Jupiter Python SDK" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "jupiter-python-sdk-0.0.2.0.tar.gz", hash = "sha256:5e055106f62cdbe33e7867bbcfcab8b15486be92543555b40dc84113685551f6"}, {file = "jupiter_python_sdk-0.0.2.0-py3-none-any.whl", hash = "sha256:a4fc7bd3cd663c9bb9f35a1710555e9392ebe48ca0417c16fe8a701b28777a00"}, @@ -1262,6 +1307,7 @@ version = "8.14.0" description = "More routines for operating on iterables, beyond itertools" optional = false python-versions = ">=3.5" +groups = ["main"] files = [ {file = "more-itertools-8.14.0.tar.gz", hash = "sha256:c09443cd3d5438b8dafccd867a6bc1cb0894389e90cb53d227456b0b0bccb750"}, {file = "more_itertools-8.14.0-py3-none-any.whl", hash = "sha256:1bc4f91ee5b1b31ac7ceacc17c09befe6a40a503907baf9c839c229b5095cfd2"}, @@ -1273,6 +1319,7 @@ version = "6.1.0" description = "multidict implementation" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3380252550e372e8511d49481bd836264c009adb826b23fefcc5dd3c69692f60"}, {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:99f826cbf970077383d7de805c0681799491cb939c25450b9b5b3ced03ca99f1"}, @@ -1377,6 +1424,7 @@ version = "3.2.2" description = "A generic, spec-compliant, thorough implementation of the OAuth request-signing logic" optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {file = "oauthlib-3.2.2-py3-none-any.whl", hash = "sha256:8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca"}, {file = "oauthlib-3.2.2.tar.gz", hash = "sha256:9859c40929662bec5d64f34d01c99e093149682a3f38915dc0655d5a633dd918"}, @@ -1393,6 +1441,7 @@ version = "1.59.6" description = "The official Python library for the openai API" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "openai-1.59.6-py3-none-any.whl", hash = "sha256:b28ed44eee3d5ebe1a3ea045ee1b4b50fea36ecd50741aaa5ce5a5559c900cb6"}, {file = "openai-1.59.6.tar.gz", hash = "sha256:c7670727c2f1e4473f62fea6fa51475c8bc098c9ffb47bfb9eef5be23c747934"}, @@ -1418,6 +1467,7 @@ version = "0.9.0" description = "(Soon to be) the fastest pure-Python PEG parser I could muster" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "parsimonious-0.9.0.tar.gz", hash = "sha256:b2ad1ae63a2f65bd78f5e0a8ac510a98f3607a43f1db2a8d46636a5d9e4a30c1"}, ] @@ -1425,12 +1475,64 @@ files = [ [package.dependencies] regex = ">=2022.3.15" +[[package]] +name = "pinecone" +version = "5.4.2" +description = "Pinecone client and SDK" +optional = false +python-versions = "<4.0,>=3.8" +groups = ["main"] +files = [ + {file = "pinecone-5.4.2-py3-none-any.whl", hash = "sha256:1fad082c66a50a229b58cda0c3a1fa0083532dc9de8303015fe4071cb25c19a8"}, + {file = "pinecone-5.4.2.tar.gz", hash = "sha256:23e8aaa73b400bb11a3b626c4129284fb170f19025b82f65bd89cbb0dab2b873"}, +] + +[package.dependencies] +certifi = ">=2019.11.17" +pinecone-plugin-inference = ">=2.0.0,<4.0.0" +pinecone-plugin-interface = ">=0.0.7,<0.0.8" +python-dateutil = ">=2.5.3" +tqdm = ">=4.64.1" +typing-extensions = ">=3.7.4" +urllib3 = {version = ">=1.26.0", markers = "python_version >= \"3.8\" and python_version < \"3.12\""} + +[package.extras] +grpc = ["googleapis-common-protos (>=1.53.0)", "grpcio (>=1.44.0)", "grpcio (>=1.59.0)", "lz4 (>=3.1.3)", "protobuf (>=4.25,<5.0)", "protoc-gen-openapiv2 (>=0.0.1,<0.0.2)"] + +[[package]] +name = "pinecone-plugin-inference" +version = "3.1.0" +description = "Embeddings plugin for Pinecone SDK" +optional = false +python-versions = "<4.0,>=3.8" +groups = ["main"] +files = [ + {file = "pinecone_plugin_inference-3.1.0-py3-none-any.whl", hash = "sha256:96e861527bd41e90d58b7e76abd4e713d9af28f63e76a51864dfb9cf7180e3df"}, + {file = "pinecone_plugin_inference-3.1.0.tar.gz", hash = "sha256:eff826178e1fe448577be2ff3d8dbb072befbbdc2d888e214624523a1c37cd8d"}, +] + +[package.dependencies] +pinecone-plugin-interface = ">=0.0.7,<0.0.8" + +[[package]] +name = "pinecone-plugin-interface" +version = "0.0.7" +description = "Plugin interface for the Pinecone python client" +optional = false +python-versions = "<4.0,>=3.8" +groups = ["main"] +files = [ + {file = "pinecone_plugin_interface-0.0.7-py3-none-any.whl", hash = "sha256:875857ad9c9fc8bbc074dbe780d187a2afd21f5bfe0f3b08601924a61ef1bba8"}, + {file = "pinecone_plugin_interface-0.0.7.tar.gz", hash = "sha256:b8e6675e41847333aa13923cc44daa3f85676d7157324682dc1640588a982846"}, +] + [[package]] name = "prompt-toolkit" version = "3.0.48" description = "Library for building powerful interactive command lines in Python" optional = false python-versions = ">=3.7.0" +groups = ["main"] files = [ {file = "prompt_toolkit-3.0.48-py3-none-any.whl", hash = "sha256:f49a827f90062e411f1ce1f854f2aedb3c23353244f8108b89283587397ac10e"}, {file = "prompt_toolkit-3.0.48.tar.gz", hash = "sha256:d6623ab0477a80df74e646bdbc93621143f5caf104206aa29294d53de1a03d90"}, @@ -1445,6 +1547,7 @@ version = "0.2.1" description = "Accelerated property cache" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "propcache-0.2.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6b3f39a85d671436ee3d12c017f8fdea38509e4f25b28eb25877293c98c243f6"}, {file = "propcache-0.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d51fbe4285d5db5d92a929e3e21536ea3dd43732c5b177c7ef03f918dff9f2"}, @@ -1536,6 +1639,7 @@ version = "3.21.0" description = "Cryptographic library for Python" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +groups = ["main"] files = [ {file = "pycryptodome-3.21.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:dad9bf36eda068e89059d1f07408e397856be9511d7113ea4b586642a429a4fd"}, {file = "pycryptodome-3.21.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:a1752eca64c60852f38bb29e2c86fca30d7672c024128ef5d70cc15868fa10f4"}, @@ -1577,6 +1681,7 @@ version = "2.10.5" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "pydantic-2.10.5-py3-none-any.whl", hash = "sha256:4dd4e322dbe55472cb7ca7e73f4b63574eecccf2835ffa2af9021ce113c83c53"}, {file = "pydantic-2.10.5.tar.gz", hash = "sha256:278b38dbbaec562011d659ee05f63346951b3a248a6f3642e1bc68894ea2b4ff"}, @@ -1597,6 +1702,7 @@ version = "2.27.2" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "pydantic_core-2.27.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2d367ca20b2f14095a8f4fa1210f5a7b78b8a20009ecced6b12818f455b1e9fa"}, {file = "pydantic_core-2.27.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:491a2b73db93fab69731eaee494f320faa4e093dbed776be1a829c2eb222c34c"}, @@ -1709,6 +1815,7 @@ version = "0.1.5" description = "Python bindings for heck, the Rust case conversion library" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "pyheck-0.1.5-cp37-abi3-macosx_10_7_x86_64.whl", hash = "sha256:44caf2b7a49d71fdeb0469e9f35886987ad815a8638b3c5b5c83f351d6aed413"}, {file = "pyheck-0.1.5-cp37-abi3-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:316a842b94beff6e59a97dbcc590e9be92a932e59126b0faa9ac750384f27eaf"}, @@ -1734,17 +1841,34 @@ version = "3.8.0" description = "🐫 Convert strings (and dictionary keys) between snake case, camel case and pascal case in Python. Inspired by Humps for Node" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "pyhumps-3.8.0-py3-none-any.whl", hash = "sha256:060e1954d9069f428232a1adda165db0b9d8dfdce1d265d36df7fbff540acfd6"}, {file = "pyhumps-3.8.0.tar.gz", hash = "sha256:498026258f7ee1a8e447c2e28526c0bea9407f9a59c03260aee4bd6c04d681a3"}, ] +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["main"] +files = [ + {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, +] + +[package.dependencies] +six = ">=1.5" + [[package]] name = "python-dotenv" version = "1.0.1" description = "Read key-value pairs from a .env file and set them as environment variables" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, @@ -1759,6 +1883,7 @@ version = "2024.11.6" description = "Alternative regular expression module, to replace re." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff590880083d60acc0433f9c3f713c51f7ac6ebb9adf889c79a261ecf541aa91"}, {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:658f90550f38270639e83ce492f27d2c8d2cd63805c65a13a14d36ca126753f0"}, @@ -1862,6 +1987,7 @@ version = "2.32.3" description = "Python HTTP for Humans." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, @@ -1883,6 +2009,7 @@ version = "1.3.1" description = "OAuthlib authentication support for Requests." optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +groups = ["main"] files = [ {file = "requests-oauthlib-1.3.1.tar.gz", hash = "sha256:75beac4a47881eeb94d5ea5d6ad31ef88856affe2332b9aafb52c6452ccf0d7a"}, {file = "requests_oauthlib-1.3.1-py2.py3-none-any.whl", hash = "sha256:2577c501a2fb8d05a304c09d090d6e47c306fef15809d102b327cf8364bddab5"}, @@ -1901,6 +2028,7 @@ version = "4.0.1" description = "rlp: A package for Recursive Length Prefix encoding and decoding" optional = false python-versions = "<4,>=3.8" +groups = ["main"] files = [ {file = "rlp-4.0.1-py3-none-any.whl", hash = "sha256:ff6846c3c27b97ee0492373aa074a7c3046aadd973320f4fffa7ac45564b0258"}, {file = "rlp-4.0.1.tar.gz", hash = "sha256:bcefb11013dfadf8902642337923bd0c786dc8a27cb4c21da6e154e52869ecb1"}, @@ -1915,12 +2043,25 @@ docs = ["sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx-rtd-theme rust-backend = ["rusty-rlp (>=0.2.1)"] test = ["hypothesis (==5.19.0)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"] +[[package]] +name = "six" +version = "1.17.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["main"] +files = [ + {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, + {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, +] + [[package]] name = "sniffio" version = "1.3.1" description = "Sniff out which async library your code is running under" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, @@ -1932,6 +2073,7 @@ version = "0.35.1" description = "Solana Python API" optional = false python-versions = "<4.0,>=3.8" +groups = ["main"] files = [ {file = "solana-0.35.1-py3-none-any.whl", hash = "sha256:f1388142f8e7edcf3fba52ddd021bab5ceaeab491b5100203732f40963f3742f"}, {file = "solana-0.35.1.tar.gz", hash = "sha256:8768246c66f9b8aebcb85cb89465240cc42aab3bf802c15ebae2408f2076eaa1"}, @@ -1950,6 +2092,7 @@ version = "0.21.0" description = "Python bindings for Solana Rust tools" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "solders-0.21.0-cp37-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:7df88e59aea016644c0b2eac84f2f931d5aa570c654132770263b26f2928fdb7"}, {file = "solders-0.21.0-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a11dfc5933707c466880ef2116f1bffc74659bf677b79479f4280247d60543c9"}, @@ -1972,6 +2115,7 @@ version = "0.1a6" description = "Algebraic types for Python (notably providing Sum Types, aka Tagged Unions)" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "sumtypes-0.1a6-py2.py3-none-any.whl", hash = "sha256:3e9d71322dd927d25d935072f8be7daec655ea292fd392359a5bb2c1e53dfdc3"}, {file = "sumtypes-0.1a6.tar.gz", hash = "sha256:1a6ff095e06a1885f340ddab803e0f38e3f9bed81f9090164ca9682e04e96b43"}, @@ -1986,6 +2130,7 @@ version = "0.10.2" description = "Python Library for Tom's Obvious, Minimal Language" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +groups = ["main"] files = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, @@ -1997,6 +2142,7 @@ version = "0.11.2" description = "List processing tools and functional utilities" optional = false python-versions = ">=3.5" +groups = ["main"] files = [ {file = "toolz-0.11.2-py3-none-any.whl", hash = "sha256:a5700ce83414c64514d82d60bcda8aabfde092d1c1a8663f9200c07fdcc6da8f"}, {file = "toolz-0.11.2.tar.gz", hash = "sha256:6b312d5e15138552f1bda8a4e66c30e236c831b612b2bf0005f8a1df10a4bc33"}, @@ -2008,6 +2154,7 @@ version = "4.67.1" description = "Fast, Extensible Progress Meter" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2"}, {file = "tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2"}, @@ -2029,6 +2176,7 @@ version = "4.14.0" description = "Twitter library for Python" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "tweepy-4.14.0-py3-none-any.whl", hash = "sha256:db6d3844ccc0c6d27f339f12ba8acc89912a961da513c1ae50fa2be502a56afb"}, {file = "tweepy-4.14.0.tar.gz", hash = "sha256:1f9f1707d6972de6cff6c5fd90dfe6a449cd2e0d70bd40043ffab01e07a06c8c"}, @@ -2052,6 +2200,7 @@ version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, @@ -2063,6 +2212,7 @@ version = "2.3.0" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df"}, {file = "urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d"}, @@ -2080,6 +2230,7 @@ version = "0.2.13" description = "Measures the displayed width of unicode strings in a terminal" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, @@ -2091,6 +2242,7 @@ version = "10.4" description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "websockets-10.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d58804e996d7d2307173d56c297cf7bc132c52df27a3efaac5e8d43e36c21c48"}, {file = "websockets-10.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bc0b82d728fe21a0d03e65f81980abbbcb13b5387f733a1a870672c5be26edab"}, @@ -2169,6 +2321,7 @@ version = "1.18.3" description = "Yet another URL library" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "yarl-1.18.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7df647e8edd71f000a5208fe6ff8c382a1de8edfbccdbbfe649d263de07d8c34"}, {file = "yarl-1.18.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c69697d3adff5aa4f874b19c0e4ed65180ceed6318ec856ebc423aa5850d84f7"}, @@ -2260,6 +2413,6 @@ multidict = ">=4.0" propcache = ">=0.2.0" [metadata] -lock-version = "2.0" +lock-version = "2.1" python-versions = "^3.10,<3.12.0" -content-hash = "59f9d836435ee61489b147838bf89d9d63f1a8cae4e999d96dc681b0e5bdc3b0" +content-hash = "c0399ad3b781012d4fb1fc0a09ac63d090414f3a661cdd833cc5ea0661f4d7e1" From 4fecd82f2a63f33fb3e4881a242c9bd58907947a Mon Sep 17 00:00:00 2001 From: reeyank Date: Sat, 11 Jan 2025 14:23:39 -0500 Subject: [PATCH 4/4] updated poetry lock file --- dockerfile | 45 ------------------------------ poetry.lock | 76 +++++++++++++++++++++++++++++++++++++++++++++++++- pyproject.toml | 3 ++ src/agent.py | 1 - 4 files changed, 78 insertions(+), 47 deletions(-) delete mode 100644 dockerfile diff --git a/dockerfile b/dockerfile deleted file mode 100644 index bcf2f07a..00000000 --- a/dockerfile +++ /dev/null @@ -1,45 +0,0 @@ -# Use an official Python runtime as a parent image -FROM python:3.11-slim - -# Set environment variables -ENV PYTHONUNBUFFERED=1 \ - PYTHONDONTWRITEBYTECODE=1 \ - PIP_NO_CACHE_DIR=off \ - PIP_DISABLE_PIP_VERSION_CHECK=on \ - POETRY_VERSION=1.7.1 \ - POETRY_HOME="/opt/poetry" \ - POETRY_VIRTUALENVS_IN_PROJECT=true \ - POETRY_NO_INTERACTION=1 \ - PYSETUP_PATH="/opt/pysetup" \ - VENV_PATH="/opt/pysetup/.venv" - -# prepend poetry and venv to path -ENV PATH="$POETRY_HOME/bin:$VENV_PATH/bin:$PATH" - -# Install system dependencies -RUN apt-get update \ - && apt-get install -y --no-install-recommends \ - curl \ - build-essential \ - && rm -rf /var/lib/apt/lists/* - -# Install Poetry -RUN curl -sSL https://install.python-poetry.org | python3 - - -# Set working directory -WORKDIR $PYSETUP_PATH - -# Copy poetry.lock* in case it doesn't exist in the repo -COPY ./pyproject.toml ./poetry.lock* ./ - -# Install runtime deps - uses $POETRY_VIRTUALENVS_IN_PROJECT internally -RUN poetry install --no-dev --no-root - -# Copy the project files -COPY . . - -# Install the project -RUN poetry install --no-dev - -# Run the application -CMD ["poetry", "run", "python", "your_app.py"] \ No newline at end of file diff --git a/poetry.lock b/poetry.lock index a2106257..dac4a1aa 100644 --- a/poetry.lock +++ b/poetry.lock @@ -602,6 +602,21 @@ files = [ {file = "charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3"}, ] +[[package]] +name = "click" +version = "8.1.8" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"}, + {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + [[package]] name = "colorama" version = "0.4.6" @@ -990,6 +1005,27 @@ pyhumps = ">=3.7.2,<4.0.0" python-dotenv = ">=0.21,<1.1" requests = ">=2.28.1,<3.0.0" +[[package]] +name = "fastapi" +version = "0.115.6" +description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "fastapi-0.115.6-py3-none-any.whl", hash = "sha256:e9240b29e36fa8f4bb7290316988e90c381e5092e0cbe84e7818cc3713bcf305"}, + {file = "fastapi-0.115.6.tar.gz", hash = "sha256:9ec46f7addc14ea472958a96aae5b5de65f39721a46aaf5705c480d9a8b76654"}, +] + +[package.dependencies] +pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<2.1.0 || >2.1.0,<3.0.0" +starlette = ">=0.40.0,<0.42.0" +typing-extensions = ">=4.8.0" + +[package.extras] +all = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.5)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.7)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] +standard = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.5)", "httpx (>=0.23.0)", "jinja2 (>=2.11.2)", "python-multipart (>=0.0.7)", "uvicorn[standard] (>=0.12.0)"] + [[package]] name = "frozenlist" version = "1.5.0" @@ -2109,6 +2145,24 @@ files = [ jsonalias = "0.1.1" typing-extensions = ">=4.2.0" +[[package]] +name = "starlette" +version = "0.41.3" +description = "The little ASGI library that shines." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "starlette-0.41.3-py3-none-any.whl", hash = "sha256:44cedb2b7c77a9de33a8b74b2b90e9f50d11fcf25d8270ea525ad71a25374ff7"}, + {file = "starlette-0.41.3.tar.gz", hash = "sha256:0e4ab3d16522a255be6b28260b938eae2482f98ce5cc934cb08dce8dc3ba5835"}, +] + +[package.dependencies] +anyio = ">=3.4.0,<5" + +[package.extras] +full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.7)", "pyyaml"] + [[package]] name = "sumtypes" version = "0.1a6" @@ -2224,6 +2278,26 @@ h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] +[[package]] +name = "uvicorn" +version = "0.34.0" +description = "The lightning-fast ASGI server." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "uvicorn-0.34.0-py3-none-any.whl", hash = "sha256:023dc038422502fa28a09c7a30bf2b6991512da7dcdb8fd35fe57cfc154126f4"}, + {file = "uvicorn-0.34.0.tar.gz", hash = "sha256:404051050cd7e905de2c9a7e61790943440b3416f49cb409f965d9dcd0fa73e9"}, +] + +[package.dependencies] +click = ">=7.0" +h11 = ">=0.8" +typing-extensions = {version = ">=4.0", markers = "python_version < \"3.11\""} + +[package.extras] +standard = ["colorama (>=0.4)", "httptools (>=0.6.3)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.4)"] + [[package]] name = "wcwidth" version = "0.2.13" @@ -2415,4 +2489,4 @@ propcache = ">=0.2.0" [metadata] lock-version = "2.1" python-versions = "^3.10,<3.12.0" -content-hash = "c0399ad3b781012d4fb1fc0a09ac63d090414f3a661cdd833cc5ea0661f4d7e1" +content-hash = "cde33a4f800af80f0a0e9caefb2f3397cb632f904abaf616540e797871a56e98" diff --git a/pyproject.toml b/pyproject.toml index 7c8afdf3..a031fec3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,14 +9,17 @@ readme = "README.md" [tool.poetry.dependencies] python = "^3.10,<3.12.0" python-dotenv = "^1.0.1" +pinecone = "^5.0.1" openai = "^1.57.2" tweepy = "^4.14.0" prompt-toolkit = "^3.0.48" anthropic = "^0.42.0" farcaster = "^0.7.11" +fastapi = "^0.115.6" solders = "^0.21.0,<0.24.0" solana = "^0.35.0" aiohttp = "^3.11.11" +uvicorn = "^ 0.34.0" requests = "2.32.3" jupiter-python-sdk = "^0.0.2.0" diff --git a/src/agent.py b/src/agent.py index 6a0f3687..efa747c5 100644 --- a/src/agent.py +++ b/src/agent.py @@ -3,7 +3,6 @@ import time import logging import os -import tiktoken from pathlib import Path from dotenv import load_dotenv from src.connection_manager import ConnectionManager