honcho/api/src/agent.py

77 lines
1.8 KiB
Python

import os
import uuid
from typing import Optional
from dotenv import load_dotenv
from langchain_core.prompts import (
ChatPromptTemplate,
SystemMessagePromptTemplate,
load_prompt,
)
from langchain_openai import ChatOpenAI
from sqlalchemy.ext.asyncio import AsyncSession
from . import crud, schemas
load_dotenv()
# from supabase import Client
SYSTEM_DIALECTIC = load_prompt(
os.path.join(os.path.dirname(__file__), "prompts/dialectic.yaml")
)
system_dialectic: SystemMessagePromptTemplate = SystemMessagePromptTemplate(
prompt=SYSTEM_DIALECTIC
)
llm: ChatOpenAI = ChatOpenAI(model_name="gpt-4")
async def chat(
app_id: uuid.UUID,
user_id: uuid.UUID,
session_id: uuid.UUID,
query: str,
db: AsyncSession,
):
collection = await crud.get_collection_by_name(db, app_id, user_id, "honcho")
retrieved_facts = None
if collection is None:
collection_create = schemas.CollectionCreate(name="honcho", metadata={})
collection = await crud.create_collection(
db,
collection=collection_create,
app_id=app_id,
user_id=user_id,
)
else:
retrieved_documents = await crud.query_documents(
db=db,
app_id=app_id,
user_id=user_id,
collection_id=collection.id,
query=query,
top_k=1,
)
if len(retrieved_documents) > 0:
retrieved_facts = retrieved_documents[0].content
dialectic_prompt = ChatPromptTemplate.from_messages([system_dialectic])
chain = dialectic_prompt | llm
response = await chain.ainvoke(
{
"agent_input": query,
"retrieved_facts": retrieved_facts if retrieved_facts else "None",
}
)
return schemas.AgentChat(content=response.content)
async def hydrate():
pass
async def insight():
pass