Skip to content

Commit

Permalink
1. update the limit of recommendations, 2. chroma HttpClient using do…
Browse files Browse the repository at this point in the history
…cker
  • Loading branch information
Hk669 committed Jul 15, 2024
1 parent d1576a0 commit 762b890
Show file tree
Hide file tree
Showing 6 changed files with 88 additions and 39 deletions.
7 changes: 5 additions & 2 deletions src/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,14 @@
User,
GithubUser,
RepositoryRecommendation,
get_user_collection
get_user_collection,
# check_daily_limit
)
from .db import (
recommend,
get_topic_based_recommendations,
get_chromadb_collection,
upsert_to_chroma_db
)
)

from .settings import *
17 changes: 13 additions & 4 deletions src/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -161,9 +161,16 @@ async def preflight_verify_token():
async def get_recommendations(request: Request, current_user: dict = Depends(get_current_user)) -> dict:
try:
body = await request.json()
username = body.get("username")
extra_topics = body.get("extra_topics", [])
languages = body.get("languages", [])

# TODO: v2
# try:
# check_daily_limit(username)
# except ValueError as e:
# raise HTTPException(status_code=403, detail=str(e))

urls = []
user = User(username=current_user["username"], access_token=current_user["access_token"],extra_topics=extra_topics, languages=languages)

Expand All @@ -181,16 +188,17 @@ async def get_recommendations(request: Request, current_user: dict = Depends(get
# raise ValueError("Error fetching repositories")

try:
print('Recommending\n\n')
urls = await recommend(user_details=user_details, languages_topics=language_topics)
except Exception as e:
logger.error(f"Error generating recommendations: {str(e)}")
logger.info("Generating topic-based recommendations")
return get_topic_based_recommendations(user)
print("Error: Generating topic-based recommendations")
return await get_topic_based_recommendations(user)

if urls and len(urls) < 10:
if urls and len(urls) < 5:
logger.info("Fewer than 10 recommendations found, fetching more repositories based on topics")
fetched_repos = await main(language_topics, access_token=user.access_token, extra_topics=extra_topics, extra_languages=languages)
urls = recommend(user_details, language_topics)
urls = await recommend(user_details=user_details, languages_topics=language_topics)

seen_full_names = set()
unique_recommendations = []
Expand All @@ -204,6 +212,7 @@ async def get_recommendations(request: Request, current_user: dict = Depends(get
if not unique_recommendations:
return {'recommendations': [], 'message': 'No recommendations found'}

# update_daily_limit(username) # updates the daily limit of the user.
return {'recommendations': unique_recommendations[::-1]}
except Exception as e:
logger.error(f"Error: {str(e)}")
Expand Down
49 changes: 29 additions & 20 deletions src/db.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@
import random
import os
import logging
from typing import List
import asyncio
import settings
from typing import List, Optional
from datetime import datetime, timezone
from src.models import RepositoryRecommendation
from src.oai import generate_embeddings
Expand Down Expand Up @@ -39,7 +41,7 @@ async def recommend(user_details=None,
if results['metadatas'][0]:
metadatas = results["metadatas"][0]

for metadata in metadatas:
for metadata in metadatas[:4]: # considering only the top 4 recommendations
repo_name = metadata.get("full_name")
print('----------------\n Repo Name:', repo_name)
print('\n------------------')
Expand All @@ -59,13 +61,12 @@ async def recommend(user_details=None,
"topics": metadata.get("topics", [])
})
recommended_repos.add(repo_url)
print('\n--------------\nRecommendations:', recommendations)
if len(recommendations) >= max_recommendations:
break
# if len(recommendations) >= max_recommendations:
# break
else:
logger.info(f"No recommendations found for project {user_proj['project_name']}")

if topics:
if topics and not user_details:
logger.info(f"Querying ChromaDB for topics: {topics}")
embeddings = [generate_embeddings(topic) for topic in topics]

Expand Down Expand Up @@ -97,8 +98,8 @@ async def recommend(user_details=None,
"topics": metadata.get("topics", [])
})
recommended_repos.add(repo_url)
if len(recommendations) >= max_recommendations:
break
if len(recommendations) >= max_recommendations:
break
else:
logger.info(f"No recommendations found for project {user_proj['project_name']}")

Expand All @@ -109,7 +110,7 @@ async def recommend(user_details=None,
async def get_topic_based_recommendations(user):
all_topics = user.languages + user.extra_topics
if not all_topics:
raise ValueError("Please provide at least one language or topic")
raise ValueError("Please provide at least one language or topic, no projects found on your profile")

# Get recommendations based on topics
try:
Expand All @@ -126,15 +127,19 @@ async def get_topic_based_recommendations(user):

def get_chromadb_collection():
try:
# client = chromadb.PersistentClient(path=r"C:\Users\hrush\OneDrive - Student Ambassadors\Desktop\Open-Source-Recommender\chroma")
project_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
db_path = os.path.join(project_dir, "chroma")

client = chromadb.PersistentClient(path=db_path)
collection = client.get_or_create_collection("projects")
if settings.DEBUG:
print('Using local chromadb')
project_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
db_path = os.path.join(project_dir, "chroma")
client = chromadb.PersistentClient(path=db_path)
else:
client = chromadb.HttpClient(host=os.getenv('CHROMA_HOST'), port=8000)

collection = client.get_or_create_collection(name="projects",
metadata={"hnsw:space": "cosine"})
return collection
except DatabaseError as e:
raise Exception(f"Error in getting collection: {e}")
raise DatabaseError(f"Error in getting collection: {e}")



Expand Down Expand Up @@ -206,7 +211,7 @@ def upsert_to_chroma_db(collection, unique_repos):

except Exception as e:
# Catch any unexpected errors during upsert
raise Exception(f"Unexpected error upserting data to ChromaDB: {e}")
raise ValueError(f"Unexpected error upserting data to ChromaDB: {e}")


def convert_to_readable_format(time_str):
Expand All @@ -219,7 +224,7 @@ def convert_to_readable_format(time_str):
return readable_time_str


if __name__ == "__main__":
async def main():
collection = get_chromadb_collection()
print(collection)

Expand All @@ -233,10 +238,14 @@ def convert_to_readable_format(time_str):
'languages': ['Python', 'typescript'],
'topics': ['agentic-ai', 'openai', "GPT", "llm"]
}
topics = ["docker", "kubernetes", "devops"]
try:
recommendations = recommend(user_details, languages_topics)
recommendations = await recommend(user_details=user_details, languages_topics=languages_topics, topics=topics)
# logger.info(recommendations)
print('--------')
print(recommendations)
except Exception as e:
print(f"Error Recommending data: {e}")
print(f"Error Recommending data: {e}")

if __name__ == "__main__":
asyncio.run(main())
24 changes: 24 additions & 0 deletions src/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,3 +75,27 @@ class RepositoryRecommendation(BaseModel):
language: str
updated_at: str
topics: str

# TODO: v2
# def update_daily_limit_to_all_users():
# try:
# user_collection = db['users']
# user_collection.update_many({}, {"$set": {"daily_limit": 2}})
# except Exception as e:
# logger.error(f"Failed to update daily limit: {str(e)}")
# raise ValueError("Failed to update daily limit")


# def check_and_update_daily_limit(username: str):
# user_collection = db['users']
# result = user_collection.find_one_and_update(
# {"username": username, "daily_limit": {"$gt": 0}},
# {"$inc": {"daily_limit": -1}},
# return_document=True
# )

# if not result:
# logger.warning(f"Daily limit exceeded for user: {username}")
# raise ValueError("Daily limit exceeded")

# return result
5 changes: 5 additions & 0 deletions src/settings.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import os
from datetime import timedelta


DEBUG = False
25 changes: 12 additions & 13 deletions src/user_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@

logger = logging.getLogger(__name__)

GPAT = os.getenv('GPAT')

async def get_repos(user):
"""
Expand Down Expand Up @@ -71,15 +70,15 @@ async def get_repos(user):

return user_details, language_topics

if __name__ == '__main__':
from .models import User
username = 'Hk669'
user = User(username=username, access_token=GPAT)

loop = asyncio.get_event_loop()
user_details, language_topics = loop.run_until_complete(get_repos(user))
loop.close()
print('-----')
print(user_details)
print('-----')
print(language_topics)
# if __name__ == '__main__':
# from .models import User
# username = 'Hk669'
# user = User(username=username, access_token=GPAT)

# loop = asyncio.get_event_loop()
# user_details, language_topics = loop.run_until_complete(get_repos(user))
# loop.close()
# print('-----')
# print(user_details)
# print('-----')
# print(language_topics)

0 comments on commit 762b890

Please sign in to comment.