From 3364c9eae1dadefccad8fa904296f19e0bf045da Mon Sep 17 00:00:00 2001 From: Logan Date: Mon, 29 May 2023 18:07:45 -0600 Subject: [PATCH] Logan/update llama index (#29) * bump llama agi to use llamaindex v0.6.13 * linting * bump llama-agi to v0.2.0 --- convo_agents/convo_agents.py | 17 ++--- convo_agents/requirements.txt | 2 +- .../execution_agent/SimpleExecutionAgent.py | 15 ++--- .../execution_agent/ToolExecutionAgent.py | 26 ++++---- .../llama_agi/execution_agent/__init__.py | 5 +- llama_agi/llama_agi/execution_agent/base.py | 11 ++-- llama_agi/llama_agi/runners/AutoAGIRunner.py | 6 +- .../runners/AutoStreamlitAGIRunner.py | 63 +++++++++++-------- llama_agi/llama_agi/runners/__init__.py | 5 +- .../task_manager/LlamaTaskManager.py | 33 +++++----- llama_agi/llama_agi/task_manager/__init__.py | 2 +- llama_agi/llama_agi/task_manager/base.py | 7 ++- llama_agi/llama_agi/tools/NoteTakingTools.py | 4 +- .../llama_agi/tools/WebpageSearchTool.py | 4 +- llama_agi/llama_agi/tools/__init__.py | 6 +- llama_agi/llama_agi/utils.py | 10 ++- llama_agi/pyproject.toml | 12 ++-- llama_agi/requirements.txt | 7 ++- 18 files changed, 123 insertions(+), 112 deletions(-) diff --git a/convo_agents/convo_agents.py b/convo_agents/convo_agents.py index c074084..8749d7f 100644 --- a/convo_agents/convo_agents.py +++ b/convo_agents/convo_agents.py @@ -5,7 +5,7 @@ The goal of this is to simulate conversation between two agents. """ from llama_index import ( - GPTSimpleVectorIndex, GPTListIndex, Document, ServiceContext + GPTVectorStoreIndex, GPTListIndex, Document, ServiceContext ) from llama_index.indices.base import BaseGPTIndex from llama_index.data_structs import Node @@ -68,7 +68,7 @@ class ConvoAgent(BaseModel): ) -> "ConvoAgent": name = name or "Agent" st_memory = st_memory or deque() - lt_memory = lt_memory or GPTSimpleVectorIndex([]) + lt_memory = lt_memory or GPTVectorStoreIndex([]) service_context = service_context or ServiceContext.from_defaults() return cls( name=name, @@ -94,12 +94,9 @@ class ConvoAgent(BaseModel): prev_message = self.st_memory[-1] st_memory_text = "\n".join([l for l in self.st_memory]) - summary_response = self.lt_memory.query( + summary_response = self.lt_memory.as_query_engine(**self.lt_memory_query_kwargs).query( f"Tell me a bit more about any context that's relevant " - f"to the current messages: \n{st_memory_text}", - # similarity_top_k=10, - response_mode="compact", - **self.lt_memory_query_kwargs + f"to the current messages: \n{st_memory_text}" ) # add both the long-term memory summary and the short-term conversation @@ -114,9 +111,7 @@ class ConvoAgent(BaseModel): ) qa_prompt = QuestionAnswerPrompt(full_qa_prompt_tmpl) - response = list_builder.query( - "Generate the next message in the conversation.", - text_qa_template=qa_prompt, - response_mode="compact" + response = list_builder.as_query_engine(text_qa_template=qa_prompt).query( + "Generate the next message in the conversation." ) return str(response) diff --git a/convo_agents/requirements.txt b/convo_agents/requirements.txt index bcd58ca..d4807af 100644 --- a/convo_agents/requirements.txt +++ b/convo_agents/requirements.txt @@ -1 +1 @@ -llama-index==0.5.22 +llama-index==0.6.13 diff --git a/llama_agi/llama_agi/execution_agent/SimpleExecutionAgent.py b/llama_agi/llama_agi/execution_agent/SimpleExecutionAgent.py index 6d2fa3e..48d9abb 100644 --- a/llama_agi/llama_agi/execution_agent/SimpleExecutionAgent.py +++ b/llama_agi/llama_agi/execution_agent/SimpleExecutionAgent.py @@ -15,22 +15,23 @@ class SimpleExecutionAgent(BaseExecutionAgent): This agent uses an LLM to execute a basic action without tools. The LlamaAgentPrompts.execution_prompt defines how this execution agent - behaves. + behaves. Usually, this is used for simple tasks, like generating the initial list of tasks. - - The execution template kwargs are automatically extracted and expected to be + + The execution template kwargs are automatically extracted and expected to be specified in execute_task(). - + Args: llm (Union[BaseLLM, BaseChatModel]): The langchain LLM class to use. - model_name: (str): The name of the OpenAI model to use, if the LLM is + model_name: (str): The name of the OpenAI model to use, if the LLM is not provided. max_tokens: (int): The maximum number of tokens the LLM can generate. - prompts: (LlamaAgentPrompts): The prompt templates used during execution. - The only prompt used byt the SimpleExecutionAgent is + prompts: (LlamaAgentPrompts): The prompt templates used during execution. + The only prompt used byt the SimpleExecutionAgent is LlamaAgentPrompts.execution_prompt. """ + def __init__( self, llm: Optional[Union[BaseLLM, BaseChatModel]] = None, diff --git a/llama_agi/llama_agi/execution_agent/ToolExecutionAgent.py b/llama_agi/llama_agi/execution_agent/ToolExecutionAgent.py index 7e06a35..461aef4 100644 --- a/llama_agi/llama_agi/execution_agent/ToolExecutionAgent.py +++ b/llama_agi/llama_agi/execution_agent/ToolExecutionAgent.py @@ -12,30 +12,31 @@ from llama_agi.execution_agent.base import BaseExecutionAgent, LlamaAgentPrompts class ToolExecutionAgent(BaseExecutionAgent): """Tool Execution Agent - + This agent is a wrapper around the zero-shot agent from Langchain. Using - a set of tools, the agent is expected to carry out and complete some task + a set of tools, the agent is expected to carry out and complete some task that will help achieve an overall objective. - - The agents overall behavior is controlled by the LlamaAgentPrompts.agent_prefix + + The agents overall behavior is controlled by the LlamaAgentPrompts.agent_prefix and LlamaAgentPrompts.agent_suffix prompt templates. - The execution template kwargs are automatically extracted and expected to be - specified in execute_task(). + The execution template kwargs are automatically extracted and expected to be + specified in execute_task(). execute_task() also returns the intermediate steps, for additional debugging and is - used for the streamlit example. + used for the streamlit example. Args: llm (Union[BaseLLM, BaseChatModel]): The langchain LLM class to use. - model_name: (str): The name of the OpenAI model to use, if the LLM is + model_name: (str): The name of the OpenAI model to use, if the LLM is not provided. max_tokens: (int): The maximum number of tokens the LLM can generate. - prompts: (LlamaAgentPrompts): The prompt templates used during execution. - The Tool Execution Agent uses LlamaAgentPrompts.agent_prefix and + prompts: (LlamaAgentPrompts): The prompt templates used during execution. + The Tool Execution Agent uses LlamaAgentPrompts.agent_prefix and LlamaAgentPrompts.agent_suffix. tools: (List[Tool]): The list of langchain tools for the execution agent to use. """ + def __init__( self, llm: Optional[Union[BaseLLM, BaseChatModel]] = None, @@ -71,7 +72,10 @@ class ToolExecutionAgent(BaseExecutionAgent): llm_chain=self._llm_chain, tools=self.tools, verbose=True ) self._execution_chain = AgentExecutor.from_agent_and_tools( - agent=self._agent, tools=self.tools, verbose=True, return_intermediate_steps=True + agent=self._agent, + tools=self.tools, + verbose=True, + return_intermediate_steps=True, ) def execute_task(self, **prompt_kwargs: Any) -> Dict[str, str]: diff --git a/llama_agi/llama_agi/execution_agent/__init__.py b/llama_agi/llama_agi/execution_agent/__init__.py index b71edfa..550e0ee 100644 --- a/llama_agi/llama_agi/execution_agent/__init__.py +++ b/llama_agi/llama_agi/execution_agent/__init__.py @@ -1,7 +1,4 @@ from .SimpleExecutionAgent import SimpleExecutionAgent from .ToolExecutionAgent import ToolExecutionAgent -__all__ = [ - SimpleExecutionAgent, - ToolExecutionAgent -] +__all__ = [SimpleExecutionAgent, ToolExecutionAgent] diff --git a/llama_agi/llama_agi/execution_agent/base.py b/llama_agi/llama_agi/execution_agent/base.py index 385c25f..b2177a9 100644 --- a/llama_agi/llama_agi/execution_agent/base.py +++ b/llama_agi/llama_agi/execution_agent/base.py @@ -7,9 +7,7 @@ from langchain.llms import OpenAI, BaseLLM from langchain.chat_models.base import BaseChatModel from langchain.chat_models import ChatOpenAI -from llama_agi.default_task_prompts import ( - LC_PREFIX, LC_SUFFIX, LC_EXECUTION_PROMPT -) +from llama_agi.default_task_prompts import LC_PREFIX, LC_SUFFIX, LC_EXECUTION_PROMPT @dataclass @@ -21,16 +19,17 @@ class LlamaAgentPrompts: class BaseExecutionAgent: """Base Execution Agent - + Args: llm (Union[BaseLLM, BaseChatModel]): The langchain LLM class to use. - model_name: (str): The name of the OpenAI model to use, if the LLM is + model_name: (str): The name of the OpenAI model to use, if the LLM is not provided. max_tokens: (int): The maximum number of tokens the LLM can generate. prompts: (LlamaAgentPrompts): The prompt templates used during execution. - tools: (List[Tool]): The list of langchain tools for the execution + tools: (List[Tool]): The list of langchain tools for the execution agent to use. """ + def __init__( self, llm: Optional[Union[BaseLLM, BaseChatModel]] = None, diff --git a/llama_agi/llama_agi/runners/AutoAGIRunner.py b/llama_agi/llama_agi/runners/AutoAGIRunner.py index 892c305..9d948e2 100644 --- a/llama_agi/llama_agi/runners/AutoAGIRunner.py +++ b/llama_agi/llama_agi/runners/AutoAGIRunner.py @@ -35,7 +35,9 @@ class AutoAGIRunner(BaseAGIRunner): completed_tasks_summary=initial_completed_tasks_summary, ) - initial_task_list = self.task_manager.parse_task_list(initial_task_list_result['output']) + initial_task_list = self.task_manager.parse_task_list( + initial_task_list_result["output"] + ) # add tasks to the task manager self.task_manager.add_new_tasks(initial_task_list) @@ -53,7 +55,7 @@ class AutoAGIRunner(BaseAGIRunner): objective=objective, cur_task=cur_task, completed_tasks_summary=completed_tasks_summary, - )['output'] + )["output"] # store the task and result as completed self.task_manager.add_completed_task(cur_task, result) diff --git a/llama_agi/llama_agi/runners/AutoStreamlitAGIRunner.py b/llama_agi/llama_agi/runners/AutoStreamlitAGIRunner.py index af3f79e..90e0941 100644 --- a/llama_agi/llama_agi/runners/AutoStreamlitAGIRunner.py +++ b/llama_agi/llama_agi/runners/AutoStreamlitAGIRunner.py @@ -27,14 +27,14 @@ class AutoStreamlitAGIRunner(BaseAGIRunner): initial_task: str, sleep_time: int, initial_task_list: Optional[List[str]] = None, - max_iterations: Optional[int] = None + max_iterations: Optional[int] = None, ) -> None: - + run_initial_task = False - if 'logs' not in st.session_state: - st.session_state['logs'] = [] - st.session_state['state_str'] = "No state yet!" - st.session_state['tasks_summary'] = "" + if "logs" not in st.session_state: + st.session_state["logs"] = [] + st.session_state["state_str"] = "No state yet!" + st.session_state["tasks_summary"] = "" run_initial_task = True logs_col, state_col = st.columns(2) @@ -42,12 +42,12 @@ class AutoStreamlitAGIRunner(BaseAGIRunner): with logs_col: st.subheader("Execution Log") st_logs = st.empty() - st_logs.write(st.session_state['logs']) - + st_logs.write(st.session_state["logs"]) + with state_col: st.subheader("AGI State") st_state = st.empty() - st_state.write(st.session_state['state_str']) + st_state.write(st.session_state["state_str"]) if run_initial_task: # get initial list of tasks @@ -71,7 +71,9 @@ class AutoStreamlitAGIRunner(BaseAGIRunner): completed_tasks_summary=initial_completed_tasks_summary, ) - initial_task_list = self.task_manager.parse_task_list(initial_task_list_result['output']) + initial_task_list = self.task_manager.parse_task_list( + initial_task_list_result["output"] + ) # add tasks to the task manager self.task_manager.add_new_tasks(initial_task_list) @@ -80,12 +82,18 @@ class AutoStreamlitAGIRunner(BaseAGIRunner): self.task_manager.prioritize_tasks(objective) tasks_summary = initial_completed_tasks_summary - st.session_state['tasks_summary'] = tasks_summary + st.session_state["tasks_summary"] = tasks_summary # update streamlit state - st.session_state['state_str'] = log_current_status(initial_task, initial_task_list_result['output'], tasks_summary, self.task_manager.current_tasks, return_str=True) - if st.session_state['state_str']: - st_state.markdown(st.session_state['state_str'].replace("\n", "\n\n")) + st.session_state["state_str"] = log_current_status( + initial_task, + initial_task_list_result["output"], + tasks_summary, + self.task_manager.current_tasks, + return_str=True, + ) + if st.session_state["state_str"]: + st_state.markdown(st.session_state["state_str"].replace("\n", "\n\n")) for _ in range(0, max_iterations): # Get the next task @@ -95,14 +103,16 @@ class AutoStreamlitAGIRunner(BaseAGIRunner): result_dict = self.execution_agent.execute_task( objective=objective, cur_task=cur_task, - completed_tasks_summary=st.session_state['tasks_summary'], + completed_tasks_summary=st.session_state["tasks_summary"], ) - result = result_dict['output'] - - # update logs - log = make_intermediate_steps_pretty(json.dumps(result_dict['intermediate_steps'])) + [result] - st.session_state['logs'].append(log) - st_logs.write(st.session_state['logs']) + result = result_dict["output"] + + # update logs + log = make_intermediate_steps_pretty( + json.dumps(result_dict["intermediate_steps"]) + ) + [result] + st.session_state["logs"].append(log) + st_logs.write(st.session_state["logs"]) # store the task and result as completed self.task_manager.add_completed_task(cur_task, result) @@ -112,18 +122,18 @@ class AutoStreamlitAGIRunner(BaseAGIRunner): # Summarize completed tasks completed_tasks_summary = self.task_manager.get_completed_tasks_summary() - st.session_state['tasks_summary'] = completed_tasks_summary + st.session_state["tasks_summary"] = completed_tasks_summary # log state of AGI to streamlit - st.session_state['state_str'] = log_current_status( + st.session_state["state_str"] = log_current_status( cur_task, result, completed_tasks_summary, self.task_manager.current_tasks, - return_str=True + return_str=True, ) - if st.session_state['state_str'] is not None: - st_state.markdown(st.session_state['state_str'].replace("\n", "\n\n")) + if st.session_state["state_str"] is not None: + st_state.markdown(st.session_state["state_str"].replace("\n", "\n\n")) # Quit the loop? if len(self.task_manager.current_tasks) == 0: @@ -132,4 +142,3 @@ class AutoStreamlitAGIRunner(BaseAGIRunner): # wait a bit to let you read what's happening time.sleep(sleep_time) - diff --git a/llama_agi/llama_agi/runners/__init__.py b/llama_agi/llama_agi/runners/__init__.py index 828a15c..f7be6b6 100644 --- a/llama_agi/llama_agi/runners/__init__.py +++ b/llama_agi/llama_agi/runners/__init__.py @@ -1,7 +1,4 @@ from .AutoAGIRunner import AutoAGIRunner from .AutoStreamlitAGIRunner import AutoStreamlitAGIRunner -__all__ = [ - AutoAGIRunner, - AutoStreamlitAGIRunner -] \ No newline at end of file +__all__ = [AutoAGIRunner, AutoStreamlitAGIRunner] diff --git a/llama_agi/llama_agi/task_manager/LlamaTaskManager.py b/llama_agi/llama_agi/task_manager/LlamaTaskManager.py index 33008b5..043010a 100644 --- a/llama_agi/llama_agi/task_manager/LlamaTaskManager.py +++ b/llama_agi/llama_agi/task_manager/LlamaTaskManager.py @@ -12,7 +12,7 @@ from llama_agi.default_task_prompts import NO_COMPLETED_TASKS_SUMMARY class LlamaTaskManager(BaseTaskManager): """Llama Task Manager - + This task manager uses LlamaIndex to create and prioritize tasks. Using the LlamaTaskPrompts, the task manager will create tasks that work towards achieving an overall objective. @@ -24,12 +24,13 @@ class LlamaTaskManager(BaseTaskManager): Args: tasks (List[str]): The initial list of tasks to complete. - prompts: (LlamaTaskPrompts): The prompts to control the task creation + prompts: (LlamaTaskPrompts): The prompts to control the task creation and prioritization. - tasK_service_context (ServiceContext): The LlamaIndex service context to use + tasK_service_context (ServiceContext): The LlamaIndex service context to use for task creation and prioritization. """ + def __init__( self, tasks: List[str], @@ -51,7 +52,9 @@ class LlamaTaskManager(BaseTaskManager): self.task_create_refine_template = self.prompts.task_create_refine_template self.task_prioritize_qa_template = self.prompts.task_prioritize_qa_template - self.task_prioritize_refine_template = self.prompts.task_prioritize_refine_template + self.task_prioritize_refine_template = ( + self.prompts.task_prioritize_refine_template + ) def _get_task_create_templates( self, prev_task: str, prev_result: str @@ -104,19 +107,19 @@ class LlamaTaskManager(BaseTaskManager): """Generate a summary of completed tasks.""" if len(self.completed_tasks) == 0: return NO_COMPLETED_TASKS_SUMMARY - summary = self.completed_tasks_index.query( - "Summarize the current completed tasks", response_mode="tree_summarize" + summary = self.completed_tasks_index.as_query_engine( + response_mode="tree_summarize" + ).query( + "Summarize the current completed tasks", ) return str(summary) def prioritize_tasks(self, objective: str) -> None: """Prioritize the current list of incomplete tasks.""" (text_qa_template, refine_template) = self._get_task_prioritize_templates() - prioritized_tasks = self.current_tasks_index.query( - objective, - text_qa_template=text_qa_template, - refine_template=refine_template, - ) + prioritized_tasks = self.current_tasks_index.as_query_engine( + text_qa_template=text_qa_template, refine_template=refine_template + ).query(objective) new_tasks = [] for task in str(prioritized_tasks).split("\n"): @@ -135,11 +138,9 @@ class LlamaTaskManager(BaseTaskManager): (text_qa_template, refine_template) = self._get_task_create_templates( prev_task, prev_result ) - task_list_response = self.completed_tasks_index.query( - objective, - text_qa_template=text_qa_template, - refine_template=refine_template, - ) + task_list_response = self.completed_tasks_index.as_query_engine( + text_qa_template=text_qa_template, refine_template=refine_template + ).query(objective) new_tasks = self.parse_task_list(str(task_list_response)) self.add_new_tasks(new_tasks) diff --git a/llama_agi/llama_agi/task_manager/__init__.py b/llama_agi/llama_agi/task_manager/__init__.py index 2fd0d79..461d793 100644 --- a/llama_agi/llama_agi/task_manager/__init__.py +++ b/llama_agi/llama_agi/task_manager/__init__.py @@ -2,4 +2,4 @@ from .LlamaTaskManager import LlamaTaskManager __all__ = [ LlamaTaskManager, -] \ No newline at end of file +] diff --git a/llama_agi/llama_agi/task_manager/base.py b/llama_agi/llama_agi/task_manager/base.py index 3f79726..874c9db 100644 --- a/llama_agi/llama_agi/task_manager/base.py +++ b/llama_agi/llama_agi/task_manager/base.py @@ -22,15 +22,16 @@ class LlamaTaskPrompts: class BaseTaskManager: """Base Task Manager - + Args: tasks (List[str]): The initial list of tasks to complete. - prompts: (LlamaTaskPrompts): The prompts to control the task creation + prompts: (LlamaTaskPrompts): The prompts to control the task creation and prioritization. - tasK_service_context (ServiceContext): The LlamaIndex service context to use + tasK_service_context (ServiceContext): The LlamaIndex service context to use for task creation and prioritization. """ + def __init__( self, tasks: List[str], diff --git a/llama_agi/llama_agi/tools/NoteTakingTools.py b/llama_agi/llama_agi/tools/NoteTakingTools.py index 9d6ce2c..988a78d 100644 --- a/llama_agi/llama_agi/tools/NoteTakingTools.py +++ b/llama_agi/llama_agi/tools/NoteTakingTools.py @@ -17,5 +17,7 @@ def record_note(note: str) -> str: def search_notes(query_str: str) -> str: """Useful for searching through notes that you previously recorded.""" global note_index - response = note_index.query(query_str, similarity_top_k=3, response_mode="compact") + response = note_index.as_query_engine( + similarity_top_k=3, + ).query(query_str) return str(response) diff --git a/llama_agi/llama_agi/tools/WebpageSearchTool.py b/llama_agi/llama_agi/tools/WebpageSearchTool.py index f3df4c9..3d4b88b 100644 --- a/llama_agi/llama_agi/tools/WebpageSearchTool.py +++ b/llama_agi/llama_agi/tools/WebpageSearchTool.py @@ -20,9 +20,7 @@ def search_webpage(prompt: str) -> str: documents = loader.load_data(urls=[url]) service_context = ServiceContext.from_defaults(chunk_size_limit=512) index = initialize_search_index(documents, service_context=service_context) - query_result = index.query( - query_str, similarity_top_k=3, response_mode="compact" - ) + query_result = index.as_query_engine(similarity_top_k=3).query(query_str) return str(query_result) except ValueError as e: return str(e) diff --git a/llama_agi/llama_agi/tools/__init__.py b/llama_agi/llama_agi/tools/__init__.py index a4f424f..f244ff3 100644 --- a/llama_agi/llama_agi/tools/__init__.py +++ b/llama_agi/llama_agi/tools/__init__.py @@ -1,8 +1,4 @@ from .NoteTakingTools import record_note, search_notes from .WebpageSearchTool import search_webpage -__all__ = [ - record_note, - search_notes, - search_webpage -] +__all__ = [record_note, search_notes, search_webpage] diff --git a/llama_agi/llama_agi/utils.py b/llama_agi/llama_agi/utils.py index 4d093d8..71f42c5 100644 --- a/llama_agi/llama_agi/utils.py +++ b/llama_agi/llama_agi/utils.py @@ -1,6 +1,6 @@ from typing import Any, List, Optional -from llama_index import GPTSimpleVectorIndex, GPTListIndex, ServiceContext, Document +from llama_index import GPTVectorStoreIndex, GPTListIndex, ServiceContext, Document from llama_index.indices.base import BaseGPTIndex @@ -13,13 +13,17 @@ def initialize_task_list_index( def initialize_search_index( documents: List[Document], service_context: Optional[ServiceContext] = None ) -> BaseGPTIndex[Any]: - return GPTSimpleVectorIndex.from_documents( + return GPTVectorStoreIndex.from_documents( documents, service_context=service_context ) def log_current_status( - cur_task: str, result: str, completed_tasks_summary: str, task_list: List[Document], return_str: bool = False + cur_task: str, + result: str, + completed_tasks_summary: str, + task_list: List[Document], + return_str: bool = False, ) -> Optional[str]: status_string = f""" __________________________________ diff --git a/llama_agi/pyproject.toml b/llama_agi/pyproject.toml index 3d3d4f6..f323a72 100644 --- a/llama_agi/pyproject.toml +++ b/llama_agi/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "llama_agi" -version = "0.1.2" +version = "0.2.0" description = "Building AGI loops using LlamaIndex and Langchain" authors = [] license = "MIT" @@ -13,10 +13,12 @@ keywords = ["LLM", "LlamaIndex", "Langchain", "AGI"] [tool.poetry.dependencies] python = ">=3.8.1,<4.0" -langchain = "==0.0.141" -llama-index = "==0.5.16" -streamlit = ">=1.21.0" - +altair = "==4.2.2" +langchain = "==0.0.154" +llama-index = "==0.6.13" +streamlit = "==1.21.0" +transformers = ">=0.4.29" +google-api-python-client = ">=2.87.0" [tool.poetry.group.lint.dependencies] ruff = "^0.0.249" diff --git a/llama_agi/requirements.txt b/llama_agi/requirements.txt index 374d1e5..a406ceb 100644 --- a/llama_agi/requirements.txt +++ b/llama_agi/requirements.txt @@ -1,3 +1,6 @@ -langchain==0.0.141 -llama-index==0.5.16 +altair==4.2.2 +google-api-python-client>=2.87.0 +langchain==0.0.154 +llama-index==0.6.13 streamlit==1.21.0 +transformers>=4.29.2