Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

MERGE development INTO master #80

Merged
merged 36 commits into from
Jan 2, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
8b92e5c
MERGE feature/50-adds-settings-and-updates-history-endpoints INTO dev…
ryaneggz Dec 10, 2023
42fb268
resolve conflicts
ryaneggz Dec 10, 2023
4ab5d4c
Merge branch 'master' into development
ryaneggz Dec 10, 2023
f4f3131
Merge branch 'master' into development
ryaneggz Dec 10, 2023
0eeef77
MERGE Feature/rag chat fixed to not be agent INTO development (#53)
ryaneggz Dec 14, 2023
332fd63
MERGE feature/55-update-ollama-rag-chat INTO development (#56)
ryaneggz Dec 17, 2023
510d7b6
MERGE feature/55-update-ollama-rag-chat INTO development (#57)
ryaneggz Dec 17, 2023
47b3660
resolve conflict
ryaneggz Dec 17, 2023
6f3c85c
Update changelog
ryaneggz Dec 17, 2023
cff7d2a
Update changlog
ryaneggz Dec 17, 2023
cb436c9
fixing the retrieval routes
ryaneggz Dec 23, 2023
fe58875
resolve confclits
ryaneggz Dec 23, 2023
db42f6f
Update changelog
ryaneggz Dec 23, 2023
97ca3c5
Update retrieval controller with file upload
ryaneggz Dec 24, 2023
e932202
Adds better error handling for tools in agent
ryaneggz Dec 25, 2023
e1b3bb5
resolve conflict
ryaneggz Dec 25, 2023
9f79651
Merge branch 'master' into development
ryaneggz Dec 25, 2023
9830f08
Changes made (#62)
ryaneggz Dec 26, 2023
08705b0
MERGE feature/64-retricts-what-can-be-passed-to-settings-and-history …
ryaneggz Dec 27, 2023
f454e06
Resolves conflicts
ryaneggz Dec 27, 2023
e69dd11
Small fix in history controller
ryaneggz Dec 27, 2023
8889ec5
Need to account for tags and title on history and settings
ryaneggz Dec 27, 2023
dd8d341
Switch to a set to be more efficient (#71)
ryaneggz Dec 29, 2023
604ec70
A couple adjustments
ryaneggz Dec 29, 2023
1729ff8
reslve conflicts
ryaneggz Dec 29, 2023
dc1aeaf
Had to update the PINECONE_KEY to PINECONE_API_KEY
ryaneggz Dec 29, 2023
2439769
Had to do some updates
ryaneggz Dec 29, 2023
e032315
Resolve conflicts
ryaneggz Dec 29, 2023
b8b0046
update HistoryController with user_id for webhook
ryaneggz Dec 31, 2023
6cad5c3
Update changelog
ryaneggz Dec 31, 2023
ac4dc5d
resolve conflict in changelog
ryaneggz Dec 31, 2023
0ac173d
MERGE feature/76-updates-params-for-ability-to-fetch-from-other-prope…
ryaneggz Dec 31, 2023
2b6f769
resolve conflicts
ryaneggz Dec 31, 2023
d7e62b2
Updates so UserRepo can be passed
ryaneggz Jan 1, 2024
81a192f
MERGE feature/15-can-pass-tools-and-user-repo-to-include-router INTO …
ryaneggz Jan 2, 2024
06c4c90
resolve changelog conflcit
ryaneggz Jan 2, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions Changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## 1.1.12
### Added
- feature/15-can-pass-tools-and-user-repo-to-include-router (2024-01-01)

## 1.1.11
### Added
- feature/76-updates-params-for-ability-to-fetch-from-other-properties (2023-12-31)
Expand Down
2 changes: 2 additions & 0 deletions promptengineers/core/exceptions/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,5 @@
class ValidationException(Exception):
pass

class NotFoundException(Exception):
pass
34 changes: 29 additions & 5 deletions promptengineers/fastapi/chat.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,19 +15,34 @@
from promptengineers.core.utils import logger
from promptengineers.llms.utils import gather_tools
from promptengineers.tools.utils import format_agent_actions
from promptengineers.core.exceptions import NotFoundException

router = APIRouter()
TAG = "Chat"

def get_controller(request: Request) -> ChatController:
return ChatController(request=request)
try:
return ChatController(
request=request,
user_repo=request.state.user_repo,
available_tools=request.state.available_tools
)
except NotFoundException as e:
# Handle specific NotFoundException with a custom message or logging
logger.warn(f"Failed to initialize HistoryController: {str(e)}")
raise HTTPException(status_code=404, detail=f"Initialization failed: {str(e)}") from e
except Exception as e:
# Catch all other exceptions
logger.error(f"Unexpected error initializing HistoryController: {str(e)}")
raise HTTPException(status_code=500, detail="Internal server error") from e

#################################################
# ChatGPT
#################################################
@router.post(
"/chat",
tags=[TAG],
name='chat',
response_model=ResponseChat,
responses={
200: {
Expand Down Expand Up @@ -96,6 +111,7 @@ async def chat(
@router.post(
"/chat/agent",
tags=[TAG],
name='chat_agent',
response_model=ResponseAgentChat,
responses={
200: {
Expand Down Expand Up @@ -196,6 +212,7 @@ async def agent(
@router.post(
"/chat/vectorstore",
tags=[TAG],
name='chat_vectorstore',
response_model=ResponseVectorstoreChat,
responses={
200: {
Expand All @@ -221,7 +238,7 @@ async def vector_search(
user_id = getattr(request.state, "user_id", None)

# Retrieve User Tokens
token = chat_controller.user_repo.find_token(user_id, ['OPENAI_API_KEY']).get('OPENAI_API_KEY')
token = chat_controller.user_repo.find_token(user_id, 'OPENAI_API_KEY')

# Generate Embeddings
embeddings = EmbeddingFactory(body.model, token)
Expand All @@ -231,9 +248,10 @@ async def vector_search(
provider=body.provider,
index_name=body.vectorstore,
embeddings=embeddings(),
user_id=user_id,
user_id=chat_controller.user_id,
user_repo=chat_controller.user_repo,
)
vectostore_service = VectorstoreContext(vectorstore_strategy)
vectostore_service = VectorstoreContext(vectorstore_strategy())
vectorstore = vectostore_service.load()

# Check if the retrieved file is empty
Expand All @@ -252,9 +270,15 @@ async def vector_search(
temperature=body.temperature,
vectorstore=vectorstore,
)
formatted_docs = []
for doc in result['source_documents']:
formatted_docs.append({
'page_content': doc.page_content,
'metadata': doc.metadata,
})
data = ujson.dumps({
'message': result['answer'],
'documents': result['source_documents'],
'documents': formatted_docs,
'usage': {
'total_tokens': cb.total_tokens,
'prompt_tokens': cb.prompt_tokens,
Expand Down
19 changes: 17 additions & 2 deletions promptengineers/fastapi/history.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,25 +3,36 @@
import traceback

from fastapi import APIRouter, HTTPException, Response, Depends, Request, status
from promptengineers.core.exceptions import NotFoundException
from promptengineers.core.utils import logger
from promptengineers.fastapi.controllers import HistoryController
from promptengineers.models.request import ReqBodyHistory
from promptengineers.models.response import (ResponseHistoryShow, ResponseHistoryIndex,
ResponseCreate, ResponseUpdate)
from promptengineers.mongo.utils import JSONEncoder
from promptengineers.core.utils import logger

router = APIRouter()
TAG = "Chat"

def get_controller(request: Request) -> HistoryController:
return HistoryController(request=request)
try:
return HistoryController(request=request, user_repo=request.state.user_repo)
except NotFoundException as e:
# Handle specific NotFoundException with a custom message or logging
logger.warn(f"Failed to initialize HistoryController: {str(e)}")
raise HTTPException(status_code=404, detail=f"Initialization failed: {str(e)}") from e
except Exception as e:
# Catch all other exceptions
logger.error(f"Unexpected error initializing HistoryController: {str(e)}")
raise HTTPException(status_code=500, detail="Internal server error") from e

#################################################
# List Chat Histories
#################################################
@router.get(
"/chat/history",
tags=[TAG],
name='history_list',
response_model=ResponseHistoryIndex
)
async def list_chat_histories(
Expand Down Expand Up @@ -60,6 +71,7 @@ async def list_chat_histories(
@router.post(
"/chat/history",
tags=[TAG],
name='history_create',
response_model=ResponseCreate
)
async def create_chat_history(
Expand Down Expand Up @@ -95,6 +107,7 @@ async def create_chat_history(
@router.get(
"/chat/history/{history_id}",
tags=[TAG],
name='history_show',
response_model=ResponseHistoryShow,
)
async def show_chat_history(
Expand Down Expand Up @@ -131,6 +144,7 @@ async def show_chat_history(
@router.put(
"/chat/history/{history_id}",
tags=[TAG],
name='history_update',
response_model=ResponseUpdate,
)
async def update_chat_history(
Expand Down Expand Up @@ -163,6 +177,7 @@ async def update_chat_history(
@router.delete(
"/chat/history/{history_id}",
tags=[TAG],
name='history_delete',
status_code=status.HTTP_204_NO_CONTENT,
)
async def delete_chat_history(
Expand Down
21 changes: 18 additions & 3 deletions promptengineers/fastapi/prompt.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,19 +8,30 @@
from promptengineers.models.response import ResponsePromptSystemList, ResponsePromptSystem
from promptengineers.mongo.utils import JSONEncoder
from promptengineers.core.utils import logger
from promptengineers.core.exceptions import NotFoundException

router = APIRouter()
TAG = "Prompt"

def get_controller(request: Request) -> PromptController:
return PromptController(request=request)
try:
return PromptController(request=request, user_repo=request.state.user_repo)
except NotFoundException as e:
# Handle specific NotFoundException with a custom message or logging
logger.warn(f"Failed to initialize HistoryController: {str(e)}")
raise HTTPException(status_code=404, detail=f"Initialization failed: {str(e)}") from e
except Exception as e:
# Catch all other exceptions
logger.error(f"Unexpected error initializing HistoryController: {str(e)}")
raise HTTPException(status_code=500, detail="Internal server error") from e

#################################################
# List Chat Histories
#################################################
@router.get(
"/prompt/system",
tags=[TAG],
name='prompt_system_list',
response_model=ResponsePromptSystemList
)
async def index(
Expand Down Expand Up @@ -57,6 +68,7 @@ async def index(
@router.post(
"/prompt/system",
tags=[TAG],
name='prompt_system_create',
response_model=ResponsePromptSystem
)
async def create(
Expand Down Expand Up @@ -92,11 +104,12 @@ async def create(
@router.get(
"/prompt/system/{prompt_id}",
tags=[TAG],
name='prompt_system_show',
response_model=ResponsePromptSystem,
)
async def show(
prompt_id: str,
controller: PromptController = Depends(get_controller),
prompt_id: str,
controller: PromptController = Depends(get_controller),
):
"""Retrieve resource"""
try:
Expand Down Expand Up @@ -128,6 +141,7 @@ async def show(
@router.put(
"/prompt/system/{prompt_id}",
tags=[TAG],
name='prompt_system_update',
response_model=ResponsePromptSystem,
)
async def update(
Expand Down Expand Up @@ -160,6 +174,7 @@ async def update(
@router.delete(
"/prompt/system/{prompt_id}",
tags=[TAG],
name='prompt_system_delete',
status_code=status.HTTP_204_NO_CONTENT,
)
async def delete(
Expand Down
22 changes: 20 additions & 2 deletions promptengineers/fastapi/retrieval.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,24 +6,36 @@
Response, UploadFile, File, HTTPException)

from promptengineers.core.exceptions import ValidationException
from promptengineers.core.interfaces.controllers import IController
from promptengineers.models.request import RequestDataLoader, RequestMultiLoader
from promptengineers.models.response import (ResponseFileLoader, ResponseCreateVectorStore,
ResponseListPineconeVectorStores)
from promptengineers.fastapi.controllers import VectorSearchController, AuthController
from promptengineers.core.utils import logger
from promptengineers.core.exceptions import NotFoundException

TAG = "Retrieval"
router = APIRouter()
auth_controller = AuthController()

def get_controller(request: Request) -> VectorSearchController:
return VectorSearchController(request=request)
def get_controller(request: Request) -> IController:
try:
return VectorSearchController(request=request, user_repo=request.state.user_repo)
except NotFoundException as e:
# Handle specific NotFoundException with a custom message or logging
logger.warn(f"Failed to initialize HistoryController: {str(e)}")
raise HTTPException(status_code=404, detail=f"Initialization failed: {str(e)}") from e
except Exception as e:
# Catch all other exceptions
logger.error(f"Unexpected error initializing HistoryController: {str(e)}")
raise HTTPException(status_code=500, detail="Internal server error") from e

#################################################
# Create vectorstore from files
#################################################
@router.post(
"/vectorstores",
name='retrieval_vectorstore_create',
response_model=ResponseCreateVectorStore,
tags=[TAG]
)
Expand Down Expand Up @@ -68,6 +80,7 @@ async def create_vectorstore(
#################################################
@router.post(
"/vectorstores/file",
name='retrieval_vectorstore_file_create',
response_model=ResponseFileLoader,
tags=[TAG]
)
Expand Down Expand Up @@ -117,6 +130,7 @@ async def create_vectorstore_from_file(
#################################################
@router.post(
"/vectorstores/multi",
name='retrieval_vectorstore_multi_create',
response_model=ResponseCreateVectorStore,
tags=[TAG],
# include_in_schema=False # TODO: Needs some work
Expand Down Expand Up @@ -164,6 +178,7 @@ async def create_vectorstore_from_multiple_sources(
######################################
@router.get(
"/vectorstores/pinecone",
name='retrieval_vectorstore_pinecone_list',
response_model=ResponseListPineconeVectorStores,
tags=[TAG]
)
Expand Down Expand Up @@ -202,6 +217,7 @@ async def list_pinecone_vectorstores(controller: VectorSearchController = Depend
######################################
@router.delete(
"/vectorstores/pinecone",
name='retrieval_vectorstore_pinecone_delete',
status_code=status.HTTP_204_NO_CONTENT,
tags=[TAG]
)
Expand All @@ -226,6 +242,7 @@ async def delete_pinecone_vectorstore(
######################################
@router.get(
"/vectorstores/redis",
name='retrieval_vectorstore_redis_list',
response_model=ResponseListPineconeVectorStores,
tags=[TAG]
)
Expand Down Expand Up @@ -264,6 +281,7 @@ async def list_redis_vectorstores(controller: VectorSearchController = Depends(g
######################################
@router.delete(
"/vectorstores/redis",
name='retrieval_vectorstore_redis_delete',
status_code=status.HTTP_204_NO_CONTENT,
tags=[TAG]
)
Expand Down
Loading