Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
8 changes: 7 additions & 1 deletion bootstraprag/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,13 @@ def create(project_name, framework, template, observability):
choices=framework_choices
).execute()
if framework == 'llamaindex' or framework == 'langchain' or framework == 'haystack':
template_choices = ['simple-rag', 'rag-with-react', 'rag-with-hyde', 'rag-with-flare']
template_choices = [
'simple-rag',
'rag-with-react',
'rag-with-hyde',
'rag-with-flare',
'llama-agents-with-simpleq'
]
elif framework == 'None':
framework = 'qdrant'
template_choices = ['simple-search']
Expand Down
19 changes: 0 additions & 19 deletions bootstraprag/templates/llamaindex/llama_agents_simpleq/main.py

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -10,25 +10,29 @@
from llama_index.core.tools import FunctionTool
from llama_index.llms.ollama import Ollama
from llama_index.embeddings.ollama import OllamaEmbedding
from rag_operations import RAGOperations
from dotenv import load_dotenv, find_dotenv
import os


_ = load_dotenv(find_dotenv())
llm = Ollama(model=os.environ['OLLAMA_LLM_MODEL'], base_url=os.environ['OLLAMA_BASE_URL'], request_timeout=300)
embed_model = OllamaEmbedding(model_name=os.environ['OLLAMA_EMBED_MODEL'], base_url=os.environ['OLLAMA_BASE_URL'])

Settings.llm = llm
Settings.embed_model = embed_model

rag_ops = RAGOperations()

# create an agent
def get_the_secret_fact() -> str:
"""Returns the secret fact."""
return "The secret fact is: A baby llama is called a 'Cria'."
def retrieve_information(query: str) -> str:
"""used to retrieve the information for user asked questions"""
return rag_ops.query_engine.query(query)

class SimpleQAgent:
tool = FunctionTool.from_defaults(fn=get_the_secret_fact)
tool = FunctionTool.from_defaults(fn=retrieve_information)

agent1 = ReActAgent.from_tools([tool], llm=Settings.llm)
agent2 = ReActAgent.from_tools([], llm=Settings.llm)

# create our multi-agent framework components
message_queue = SimpleMessageQueue(port=8000)
Expand All @@ -40,14 +44,7 @@ class SimpleQAgent:
agent_server_1 = AgentService(
agent=agent1,
message_queue=message_queue,
description="Useful for getting the secret fact.",
service_name="secret_fact_agent",
description="Useful for getting the answer from user query.",
service_name="question_answer_agent",
port=8002,
)
agent_server_2 = AgentService(
agent=agent2,
message_queue=message_queue,
description="Useful for getting random dumb facts.",
service_name="dumb_fact_agent",
port=8003,
)
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
from llama_agents import LocalLauncher
import nest_asyncio
from agents_core import SimpleQAgent


simple_agent = SimpleQAgent()

# needed for running in a notebook
nest_asyncio.apply()

# launch it
launcher = LocalLauncher(
[simple_agent.agent_server_1],
simple_agent.control_plane,
simple_agent.message_queue,
)

# Start a loop to continually get input from the user
while True:
# Get a query from the user
user_query = input("Enter your query [type 'bye' to 'exit']: ")

# Check if the user wants to terminate the loop
if user_query.lower() == "bye" or user_query.lower() == "exit":
break

result = launcher.launch_single(user_query)
print(result)
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
from llama_index.core import SimpleDirectoryReader, Settings, StorageContext, VectorStoreIndex
from llama_index.core.base.base_query_engine import BaseQueryEngine
from llama_index.core.node_parser import SentenceSplitter
from llama_index.vector_stores.qdrant import QdrantVectorStore
from llama_index.embeddings.ollama import OllamaEmbedding
# enable if you are using openai
# from llama_index.embeddings.openai import OpenAIEmbedding
from llama_index.llms.ollama import Ollama
# enable if you are using openai
# from llama_index.llms.openai import OpenAI
from dotenv import load_dotenv, find_dotenv
from typing import Union
import qdrant_client
import logging
import os

_ = load_dotenv(find_dotenv())
logging.basicConfig(level=int(os.environ['INFO']))
logger = logging.getLogger(__name__)


class RAGOperations:

def __init__(self, data_path: str = './data', show_progress: bool = True, chunk_size: int = 512,
chunk_overlap: int = 200):
self.documents = SimpleDirectoryReader(input_dir=data_path).load_data(show_progress=show_progress)
self.text_parser = SentenceSplitter(chunk_size=chunk_size, chunk_overlap=chunk_overlap)
self.client = qdrant_client.QdrantClient(url=os.environ['DB_URL'], api_key=os.environ['DB_API_KEY'])
self.vector_store = QdrantVectorStore(client=self.client, collection_name=os.environ['COLLECTION_NAME'])

# use your prefered vector embeddings model
logger.info("initializing the OllamaEmbedding")
embed_model = OllamaEmbedding(model_name=os.environ['OLLAMA_EMBED_MODEL'],
base_url=os.environ['OLLAMA_BASE_URL'])
# openai embeddings, embedding_model_name="text-embedding-3-large"
# embed_model = OpenAIEmbedding(embed_batch_size=10, model=embedding_model_name)

# use your prefered llm
llm = Ollama(model=os.environ['OLLAMA_LLM_MODEL'], base_url=os.environ['OLLAMA_BASE_URL'], request_timeout=600)
# llm = OpenAI(model="gpt-4o")

logger.info("initializing the global settings")
Settings.embed_model = embed_model
Settings.llm = llm

Settings.transformations = [self.text_parser]
self.query_engine: BaseQueryEngine = None

self._index_and_create_query_engine()

def _index_and_create_query_engine(self):
logger.info("initializing the storage context")
storage_context = StorageContext.from_defaults(vector_store=self.vector_store)
logger.info("indexing the nodes in VectorStoreIndex")
if not self.client.collection_exists(collection_name=os.environ['COLLECTION_NAME']):
vector_index = VectorStoreIndex.from_documents(
documents=self.documents,
storage_context=storage_context,
transformations=Settings.transformations,
)
else:
vector_index = VectorStoreIndex.from_vector_store(vector_store=self.vector_store)

self.query_engine = vector_index.as_query_engine()
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
## llama-agents

### install qdrant
- `docker pull qdrant/qdrant`
- `docker run -p 6333:6333 -p 6334:6334 \
-v $(pwd)/qdrant_storage:/qdrant/storage:z \
qdrant/qdrant`

### install ollama
- navigate to [https://ollama.com/download](https://ollama.com/download)

### how to run llama-agents
- open `.env`
- change the `DB_URL`, `DB_API_KEY` and `COLLECTION_NAME` according to you
- point the right right LLMs (if not local)
- `pip install -r requirements.txt`
- `python main.py`
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,5 @@ llama-index-embeddings-openai==0.1.11
llama-index-embeddings-ollama==0.2.0
llama-index-vector-stores-qdrant==0.2.16
qdrant-client==1.11.0
fastapi==0.112.1
fastapi==0.109.2
uvicorn==0.30.6
3 changes: 3 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[build-system]
requires = ["setuptools>=64", "wheel"]
build-backend = "setuptools.build_meta"