Skip to content

Commit

Permalink
Merge pull request #450 from l3vels/fix/langchain-update
Browse files Browse the repository at this point in the history
  • Loading branch information
Chkhikvadze authored Mar 14, 2024
2 parents b227aba + 716cccb commit aed1f15
Show file tree
Hide file tree
Showing 65 changed files with 2,108 additions and 485 deletions.
16 changes: 12 additions & 4 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,20 @@
"name": "Poetry: Uvicorn",
"type": "python",
"request": "launch",
"module": "uvicorn",
"args": ["main:app", "--host", "0.0.0.0", "--port", "4000", "--reload"],
"module": "poetry",
"args": [
"run",
"uvicorn",
"main:app",
"--host",
"0.0.0.0",
"--port",
"4000",
"--reload"
],
"console": "integratedTerminal",
"justMyCode": false,
"cwd": "${workspaceFolder}/apps/server",
// "python": "${workspaceFolder}/apps/server/.venv/bin/python"
"cwd": "${workspaceFolder}/apps/server"
},
{
"name": "Python: Test",
Expand Down
13 changes: 6 additions & 7 deletions apps/server/agents/agent_simulations/agent/dialogue_agent.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
from langchain.chat_models import ChatOpenAI
from langchain.schema import (
HumanMessage,
SystemMessage,
)
from typing import Callable, List
from uuid import UUID
from typing import List, Callable
from typings.agent import AgentWithConfigsOutput

from langchain.schema import HumanMessage, SystemMessage
from langchain_community.chat_models import ChatOpenAI

from agents.handle_agent_errors import handle_agent_error
from typings.agent import AgentWithConfigsOutput


class DialogueAgent:
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
from typing import List, Optional

from langchain.agents import AgentType, initialize_agent
from langchain.chat_models import ChatOpenAI
from langchain.schema import AIMessage, SystemMessage
from langchain_community.chat_models import ChatOpenAI

from agents.agent_simulations.agent.dialogue_agent import DialogueAgent
from agents.conversational.output_parser import ConvoOutputParser
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
from typing import List, Optional

from fastapi_sqlalchemy import db
from langchain.chat_models import ChatOpenAI
from langchain.schema import HumanMessage, SystemMessage
from langchain_community.chat_models import ChatOpenAI

from agents.agent_simulations.agent.dialogue_agent import DialogueSimulator
from agents.agent_simulations.agent.dialogue_agent_with_tools import \
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,12 @@
import random
import tenacity
from typing import List

from langchain.prompts import (
PromptTemplate,
)
from langchain.chat_models import ChatOpenAI
import tenacity
from langchain.output_parsers import RegexParser
from langchain.schema import (
HumanMessage,
SystemMessage,
)
from langchain.prompts import PromptTemplate
from langchain.schema import HumanMessage, SystemMessage
from langchain_community.chat_models import ChatOpenAI

from agents.agent_simulations.agent.dialogue_agent import DialogueAgent


Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,14 @@
import random
import tenacity
from typing import List

from langchain.prompts import (
PromptTemplate,
)
from langchain.chat_models import ChatOpenAI
import tenacity
from langchain.output_parsers import RegexParser
from langchain.schema import (
HumanMessage,
SystemMessage,
)
from agents.agent_simulations.agent.dialogue_agent_with_tools import (
DialogueAgentWithTools,
)
from langchain.prompts import PromptTemplate
from langchain.schema import HumanMessage, SystemMessage
from langchain_community.chat_models import ChatOpenAI

from agents.agent_simulations.agent.dialogue_agent_with_tools import \
DialogueAgentWithTools
from typings.agent import AgentWithConfigsOutput


Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
from typing import List, Optional

from fastapi_sqlalchemy import db
from langchain.chat_models import ChatOpenAI
from langchain.schema import HumanMessage, SystemMessage
from langchain_community.chat_models import ChatOpenAI

from agents.agent_simulations.agent.dialogue_agent import (DialogueAgent,
DialogueSimulator)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
from typing import List

from langchain.chat_models import ChatOpenAI
from langchain.prompts import PromptTemplate
from langchain.schema import (AIMessage, BaseMessage, HumanMessage,
SystemMessage)
from langchain_community.chat_models import ChatOpenAI

from agents.agent_simulations.agent.dialogue_agent_with_tools import \
DialogueAgentWithTools
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
import numpy as np
import tenacity
from fastapi_sqlalchemy import db
from langchain.chat_models import ChatOpenAI
from langchain.schema import HumanMessage, SystemMessage
from langchain_community.chat_models import ChatOpenAI

from agents.agent_simulations.agent.dialogue_agent import DialogueSimulator
from agents.agent_simulations.agent.dialogue_agent_with_tools import \
Expand Down
86 changes: 62 additions & 24 deletions apps/server/agents/conversational/conversational.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import asyncio

from langchain.agents import AgentType, initialize_agent
from langchain import hub
from langchain.agents import (AgentExecutor, AgentType, create_react_agent,
initialize_agent)

from agents.base_agent import BaseAgent
from agents.conversational.output_parser import ConvoOutputParser
Expand Down Expand Up @@ -63,30 +65,66 @@ async def run(
streaming_handler = AsyncCallbackHandler()

llm.streaming = True
llm.callbacks = [
run_logs_manager.get_agent_callback_handler(),
streaming_handler,
]

agent = initialize_agent(
tools,
llm,
agent=AgentType.CHAT_CONVERSATIONAL_REACT_DESCRIPTION,
verbose=True,
memory=memory,
handle_parsing_errors="Check your output and make sure it conforms!",
agent_kwargs={
"system_message": system_message,
"output_parser": ConvoOutputParser(),
},
callbacks=[run_logs_manager.get_agent_callback_handler()],
)

task = asyncio.create_task(agent.arun(prompt))
# llm.callbacks = [
# run_logs_manager.get_agent_callback_handler(),
# streaming_handler,
# ]

# agent = initialize_agent(
# tools,
# llm,
# agent=AgentType.CHAT_CONVERSATIONAL_REACT_DESCRIPTION,
# verbose=True,
# memory=memory,
# handle_parsing_errors="Check your output and make sure it conforms!",
# agent_kwargs={
# "system_message": system_message,
# "output_parser": ConvoOutputParser(),
# },
# callbacks=[run_logs_manager.get_agent_callback_handler()],
# )

agentPrompt = hub.pull("hwchase17/react")

agent = create_react_agent(llm, tools, prompt=agentPrompt)

agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

chunks = []
final_answer_detected = False

async for event in agent_executor.astream_events(
{"input": prompt}, version="v1"
):
kind = event["event"]

if kind == "on_chat_model_stream":
content = event["data"]["chunk"].content
if content:
chunks.append(content)
# Check if the last three elements in chunks, when stripped, are "Final", "Answer", and ":"
if (
len(chunks) >= 3
and chunks[-3].strip() == "Final"
and chunks[-2].strip() == "Answer"
and chunks[-1].strip() == ":"
):
final_answer_detected = True
continue

if final_answer_detected:
yield content

full_response = "".join(chunks)
final_answer_index = full_response.find("Final Answer:")
if final_answer_index != -1:
# Add the length of the phrase "Final Answer:" and any subsequent whitespace or characters you want to skip
start_index = final_answer_index + len("Final Answer:")
# Optionally strip leading whitespace
res = full_response[start_index:].lstrip()
else:
res = "Final Answer not found in response."

async for token in streaming_handler.aiter():
yield token
res = await task
except Exception as err:
res = handle_agent_error(err)

Expand Down
9 changes: 4 additions & 5 deletions apps/server/agents/handle_agent_errors.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import sentry_sdk
from openai.error import (AuthenticationError, RateLimitError,
ServiceUnavailableError)
from openai.error import Timeout as TimeoutError
from openai import APITimeoutError as TimeoutError
from openai import AuthenticationError, RateLimitError

from exceptions import (InvalidLLMApiKeyException, PlannerEmptyTasksException,
SynthesizerException, ToolEnvKeyException,
Expand All @@ -15,8 +14,8 @@ def handle_agent_error(err: Exception) -> str:
return "Your OpenAI API key is invalid. Please recheck it in [Settings](/integrations?setting=openai)"
elif isinstance(err, TimeoutError):
return "OpenAI timed out, please try again later"
elif isinstance(err, ServiceUnavailableError):
return "OpenAI service is unavailable at the moment, please try again later"
# elif isinstance(err, ServiceUnavailableError):
# return "OpenAI service is unavailable at the moment, please try again later"
elif isinstance(err, ToolEnvKeyException):
return str(err)
elif isinstance(err, PlannerEmptyTasksException):
Expand Down
30 changes: 17 additions & 13 deletions apps/server/datasources/file/file_retriever.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@
from uuid import UUID, uuid4

import s3fs
from langchain.embeddings import OpenAIEmbeddings
from llama_index import (ServiceContext, SimpleDirectoryReader, StorageContext,
SummaryIndex, TreeIndex, VectorStoreIndex,
load_index_from_storage)
from llama_index.embeddings import LangchainEmbedding
from llama_index.llms import LangChainLLM
from llama_index.core import (ServiceContext, Settings, SimpleDirectoryReader,
StorageContext, SummaryIndex, TreeIndex,
VectorStoreIndex, load_index_from_storage)
from llama_index.core.vector_stores.types import VectorStore
from llama_index.embeddings.langchain import LangchainEmbedding
from llama_index.embeddings.openai import OpenAIEmbedding as OpenAIEmbeddings
from llama_index.llms.langchain import LangChainLLM
from llama_index.vector_stores.pinecone import PineconeVectorStore
from llama_index.vector_stores.types import VectorStore
from llama_index.vector_stores.weaviate import WeaviateVectorStore
from llama_index.vector_stores.zep import ZepVectorStore

Expand Down Expand Up @@ -142,15 +142,19 @@ def index_documents(self, file_urls: List[str]):
# Remove tmp directory
shutil.rmtree(self.datasource_path)

embed_model = LangchainEmbedding(
OpenAIEmbeddings(
openai_api_key=self.settings.openai_api_key,
show_progress_bar=True,
),
Settings.embed_model = OpenAIEmbeddings(
api_key=self.settings.openai_api_key,
show_progress_bar=True,
)
# embed_model = LangchainEmbedding(
# OpenAIEmbeddings(
# openai_api_key=self.settings.openai_api_key,
# show_progress_bar=True,
# ),
# )

service_context = ServiceContext.from_defaults(
chunk_size=self.chunk_size, embed_model=embed_model
chunk_size=self.chunk_size, embed_model=Settings.embed_model
)

# try:
Expand Down
17 changes: 7 additions & 10 deletions apps/server/memory/zep/zep_chat_message_history.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,12 @@
from __future__ import annotations

import re
from typing import TYPE_CHECKING, List, Dict, Optional
from langchain.schema.messages import (
AIMessage,
BaseMessage,
HumanMessage,
SystemMessage,
)
from langchain.memory.chat_message_histories import (
ZepChatMessageHistory as ZepChatMessageHistoryBase,
)
from typing import TYPE_CHECKING, Dict, List, Optional

from langchain.schema.messages import (AIMessage, BaseMessage, HumanMessage,
SystemMessage)
from langchain_community.chat_message_histories import \
ZepChatMessageHistory as ZepChatMessageHistoryBase

if TYPE_CHECKING:
from zep_python import Memory, Message
Expand Down
Loading

0 comments on commit aed1f15

Please sign in to comment.