Skip to content

Commit

Permalink
chore(versioning): versioning and linting changes
Browse files Browse the repository at this point in the history
  • Loading branch information
actions-user committed May 12, 2024
1 parent cc720b1 commit 98e34a2
Show file tree
Hide file tree
Showing 6 changed files with 32 additions and 41 deletions.
26 changes: 10 additions & 16 deletions arcan/ai/agents/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,13 @@
from tempfile import TemporaryDirectory

from fastapi.responses import StreamingResponse
from langchain.agents import (AgentExecutor, create_tool_calling_agent,
load_tools)
from langchain.agents.format_scratchpad.openai_tools import \
format_to_openai_tool_messages
from langchain.agents.output_parsers.openai_tools import \
OpenAIToolsAgentOutputParser
from langchain.agents import AgentExecutor, create_tool_calling_agent, load_tools
from langchain.agents.format_scratchpad.openai_tools import (
format_to_openai_tool_messages,
)
from langchain.agents.output_parsers.openai_tools import OpenAIToolsAgentOutputParser
from langchain.sql_database import SQLDatabase
from langchain_community.agent_toolkits import (FileManagementToolkit,
SQLDatabaseToolkit)
from langchain_community.agent_toolkits import FileManagementToolkit, SQLDatabaseToolkit
from langchain_core.messages import AIMessage, HumanMessage

from arcan.ai.agents.helpers import AsyncIteratorCallbackHandler
Expand Down Expand Up @@ -124,9 +122,6 @@ def get_response(self, user_content: str):
return response["output"]





# %%
#

Expand Down Expand Up @@ -198,9 +193,7 @@ async def agent_chat(text: str, agent): # query: Query = Body(...),):
return StreamingResponse(gen, media_type="text/event-stream")




#%%
# %%
from langchain.agents import AgentExecutor, create_tool_calling_agent


Expand Down Expand Up @@ -246,7 +239,7 @@ def __init__(
self.database = database
self.toolkit = SQLDatabaseToolkit(db=self.database, llm=self.llm)
self.context = self.toolkit.get_context()
self.prompt = prompt # arcan_prompt.partial(**self.context)
self.prompt = prompt # arcan_prompt.partial(**self.context)
self.sql_tools = self.toolkit.get_tools()
self.working_directory = TemporaryDirectory()
self.file_system_tools = FileManagementToolkit(
Expand All @@ -270,7 +263,7 @@ def __init__(
self.agent_executor = AgentExecutor(
agent=self.agent, tools=self.agent_tools, verbose=self.verbose
)

def get_response(self, user_content: str):
"""
Gets the response from the agent given user input.
Expand All @@ -294,4 +287,5 @@ def get_response(self, user_content: str):
)
return response["output"]


# %%
8 changes: 5 additions & 3 deletions arcan/ai/prompts/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,11 @@
from typing import cast

from langchain_core.messages import AIMessage, SystemMessage
from langchain_core.prompts import (ChatPromptTemplate,
HumanMessagePromptTemplate,
MessagesPlaceholder)
from langchain_core.prompts import (
ChatPromptTemplate,
HumanMessagePromptTemplate,
MessagesPlaceholder,
)

ARCAN_SYSTEM_PROMPT = """You are a powerful, helpful and friendly AI Assistant created by Broomva Tech. Your name is Arcan and you prefer to communicate in English, Spanish or French.
You were created by Carlos D. Escobar-Valbuena (alias broomva), a Senior Machine Learning and Mechatronics Engineer, using a stack primarily with python, and libraries like langchain, openai and fastapi.
Expand Down
11 changes: 5 additions & 6 deletions arcan/api/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#%%
# %%
from dotenv import load_dotenv
from fastapi import Depends, FastAPI, Form, Request
from sqlalchemy.exc import SQLAlchemyError
Expand All @@ -7,7 +7,7 @@
from arcan.api.datamodels import get_db, get_db_context
from arcan.api.session import ArcanSession, run_agent

#%%
# %%
# from fastapi.security import HTTPAuthorizationCredentials, HTTPBearer

# from arcan.api.session.auth import requires_auth
Expand All @@ -31,20 +31,19 @@ async def index():
return {"message": "Arcan is Running!"}





@app.get("/api/chat/{user_id}")
async def api_user_chat(user_id: str, query: str, db: Session = Depends(get_db)):
arcan_session = ArcanSession(db)
response = run_agent(session=arcan_session, user_id=user_id, query=query)
return {"response": response}


# @requires_auth
@app.get("/api/chat")
async def chat(user_id: str, query: str, db: Session = Depends(get_db)):
arcan_session = ArcanSession(db)
response = run_agent(session=arcan_session, user_id=user_id, query=query)
return {"response": response}

#%%

# %%
3 changes: 2 additions & 1 deletion arcan/api/datamodels/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

load_dotenv()

#%%
# %%

engine = create_engine(os.environ.get("SQLALCHEMY_URL"))
SessionLocal = sessionmaker(bind=engine)
Expand Down Expand Up @@ -41,4 +41,5 @@ def get_db_context():
finally:
db.close()


# %%
10 changes: 4 additions & 6 deletions arcan/api/langserve/app/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,22 +25,20 @@ class Input(BaseModel):
extra={"widget": {"type": "chat", "input": "input", "output": "output"}},
)


class Output(BaseModel):
output: Any





def get_runnable() -> Runnable:
return ArcanSpellsAgent().agent_executor


add_routes(
app=app,
runnable=get_runnable().with_types(input_type=Input, output_type=Output).with_config(
{"run_name": "agent"}
),
runnable=get_runnable()
.with_types(input_type=Input, output_type=Output)
.with_config({"run_name": "agent"}),
path="/chat",
enable_feedback_endpoint=True,
# enable_public_trace_link_endpoint=True,
Expand Down
15 changes: 6 additions & 9 deletions arcan/api/session/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ def get_or_create_agent(

self.agents[user_id] = agent
return agent

else:
provided_agent.user_id = user_id
self.agents[user_id] = provided_agent
Expand All @@ -74,7 +74,9 @@ def store_message(self, user_id: str, body: str, response: str):
:param response: The response generated by the system.
"""
with self.database as db_session:
conversation = Conversations(sender=user_id, message=body, response=response)
conversation = Conversations(
sender=user_id, message=body, response=response
)
db_session.add(conversation)
db_session.commit()
print(f"Conversation #{conversation.id} stored in database")
Expand Down Expand Up @@ -131,20 +133,15 @@ def get_chat_history(self, user_id: str) -> list:
return loaded



def run_agent(session: ArcanSession, query: str, user_id: str) -> Dict[str, str]:
print(f"Sending the LangChain response to user: {user_id}")
agent = session.get_or_create_agent(user_id)
# Get the generated text from the LangChain agent
response = agent.get_response(user_content=query)
# Store the conversation in the database
try:
session.store_message(
user_id=user_id, body=query, response=response
)
session.store_chat_history(
user_id=user_id, agent_history=agent.chat_history
)
session.store_message(user_id=user_id, body=query, response=response)
session.store_chat_history(user_id=user_id, agent_history=agent.chat_history)
except SQLAlchemyError as e:
session.database.rollback()
print(f"Error storing conversation in database: {e}")
Expand Down

0 comments on commit 98e34a2

Please sign in to comment.