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
51 changes: 25 additions & 26 deletions docs/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,35 +6,34 @@
# Start Docker containers
docker compose up -d

# Delete collection from Qdrant
uv run python -m template_langgraph.tasks.delete_qdrant_collection

# Add documents to Qdrant
uv run python -m template_langgraph.tasks.add_documents_to_qdrant

# Search Qdrant
uv run python -m template_langgraph.tasks.search_documents_on_qdrant

# Add documents to Elasticsearch
uv run python -m template_langgraph.tasks.add_documents_to_elasticsearch

# Search Elasticsearch
uv run python -m template_langgraph.tasks.search_documents_on_elasticsearch

# Run Kabuto Helpdesk Agent
uv run python -m template_langgraph.tasks.run_kabuto_helpdesk_agent "KABUTOの起動時に、画面全体が紫色に点滅し、システムがフリーズします。"
uv run python -m template_langgraph.tasks.run_kabuto_helpdesk_agent "KABUTOのマニュアルから禅モードに関する情報を教えて下さい"

# ChatWithToolsAgent
uv run python -m template_langgraph.tasks.draw_chat_with_tools_agent_mermaid_png "data/chat_with_tools_agent.png"
uv run python -m template_langgraph.tasks.run_chat_with_tools_agent
# Qdrant
uv run python scripts/qdrant_operator.py --help
uv run python scripts/qdrant_operator.py delete-collection --collection-name qa_kabuto --verbose
uv run python scripts/qdrant_operator.py add-documents --collection-name qa_kabuto --verbose
uv run python scripts/qdrant_operator.py search-documents --collection-name qa_kabuto --question "「鬼灯」を実行すると、KABUTOが急に停止します。原因と対策を教えてください。" --verbose

# Elasticsearch
uv run python scripts/elasticsearch_operator.py --help
uv run python scripts/elasticsearch_operator.py add-documents --index-name docs_kabuto --verbose
uv run python scripts/elasticsearch_operator.py search-documents --index-name docs_kabuto --query "禅モード" --verbose

# Agents

## Draw agent graph
AGENT_NAME=chat_with_tools_agent
uv run python scripts/graph_runner.py png --name $AGENT_NAME --verbose --output data/$AGENT_NAME.png

## Run agents
AGENT_NAME=chat_with_tools_agent
AGENT_NAME=kabuto_helpdesk_agent
uv run python scripts/graph_runner.py run --name $AGENT_NAME --verbose --question "KABUTOのマニュアルから禅モードに関する情報を教えて下さい"
# KABUTOの起動時に、画面全体が紫色に点滅し、システムがフリーズします。KABUTO のマニュアルから、関連する情報を取得したり過去のシステムのトラブルシュート事例が蓄積されたデータベースから、関連する情報を取得して質問に答えてください
# 天狗のいたずら という現象について KABUTO のマニュアルから、関連する情報を取得したり過去のシステムのトラブルシュート事例が蓄積されたデータベースから、関連する情報を取得して質問に答えてください
# KABUTOの起動時に、画面全体が紫色に点滅し、システムがフリーズします。
# KABUTOのマニュアルから禅モードに関する情報を教えて下さい

# IssueFormatterAgent
uv run python -m template_langgraph.tasks.run_issue_formatter_agent
# KABUTOにログインできない!パスワードは合ってるはずなのに…若手社員である山田太郎は、Windows 11 を立ち上げ、日課のように自社の業務システムKABUTOのログイン画面を開きます。しかし、そこには、意味をなさない「虚無」という文字だけがただひっそりと表示されていたのです。これは質問でもあり不具合の報告でもあります。岡本太郎さんに本件調査依頼します。

AGENT_NAME=issue_formatter_agent
uv run python scripts/graph_runner.py run --name $AGENT_NAME --verbose --question "KABUTOにログインできない!パスワードは合ってるはずなのに…若手社員である山田太郎は、Windows 11 を立ち上げ、日課のように自社の業務システムKABUTOのログイン画面を開きます。しかし、そこには、意味をなさない「虚無」という文字だけがただひっそりと表示されていたのです。これは質問でもあり不具合の報告でもあります。岡本太郎さんに本件調査依頼します。"
```

## References
Expand Down
109 changes: 109 additions & 0 deletions scripts/elasticsearch_operator.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
import logging

import typer
from dotenv import load_dotenv

from template_langgraph.loggers import get_logger
from template_langgraph.tools.elasticsearch_tool import ElasticsearchClientWrapper
from template_langgraph.tools.pdf_loaders import PdfLoaderWrapper

# Initialize the Typer application
app = typer.Typer(
add_completion=False,
help="Elasticsearch operator CLI",
)

# Set up logging
logger = get_logger(__name__)


@app.command()
def search_documents(
index_name: str = typer.Option(
"docs_kabuto",
"--index-name",
"-i",
help="Name of the Elasticsearch index to search documents in",
),
query: str = typer.Option(
"禅モード",
"--query",
"-q",
help="Query to search in the Elasticsearch index",
),
verbose: bool = typer.Option(
False,
"--verbose",
"-v",
help="Enable verbose output",
),
):
# Set up logging
if verbose:
logger.setLevel(logging.DEBUG)

es = ElasticsearchClientWrapper()

results = es.search(
index_name=index_name,
query=query,
)
logger.info(f"Found {len(results)} results for the question: {query}")
for i, result in enumerate(results, start=1):
logger.info(f"Result {i}:")
logger.info(f"File Name: {result.metadata['source']}")
logger.info(f"Content: {result.page_content}")
logger.info("-" * 40)


@app.command()
def add_documents(
index_name: str = typer.Option(
"docs_kabuto",
"--index-name",
"-i",
help="Name of the Elasticsearch index to add documents to",
),
verbose: bool = typer.Option(
False,
"--verbose",
"-v",
help="Enable verbose output",
),
):
# Set up logging
if verbose:
logger.setLevel(logging.DEBUG)

# Create Elasticsearch index
es = ElasticsearchClientWrapper()
logger.info(f"Creating Elasticsearch index: {index_name}")
result = es.create_index(
index_name=index_name,
)
if result:
logger.info(f"Created Elasticsearch index: {index_name}")
else:
logger.warning(f"Index {index_name} already exists.")

# Load documents from PDF files
documents = PdfLoaderWrapper().load_pdf_docs()
logger.info(f"Loaded {len(documents)} documents from PDF.")

# Add documents to Elasticsearch index
result = es.add_documents(
index_name=index_name,
documents=documents,
)
if result:
logger.info(f"Added {len(documents)} documents to Elasticsearch index: {index_name}")
else:
logger.error(f"Failed to add documents to Elasticsearch index: {index_name}")


if __name__ == "__main__":
load_dotenv(
override=True,
verbose=True,
)
app()
149 changes: 149 additions & 0 deletions scripts/graph_runner.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
import logging

import typer
from dotenv import load_dotenv

from template_langgraph.agents.chat_with_tools_agent.agent import graph as chat_with_tools_agent_graph
from template_langgraph.agents.issue_formatter_agent.agent import graph as issue_formatter_agent_graph
from template_langgraph.agents.kabuto_helpdesk_agent import graph as kabuto_helpdesk_agent_graph
from template_langgraph.agents.task_decomposer_agent.agent import graph as task_decomposer_agent_graph
from template_langgraph.loggers import get_logger

# Initialize the Typer application
app = typer.Typer(
add_completion=False,
help="template-langgraph CLI",
)

# Set up logging
logger = get_logger(__name__)


def get_agent_graph(name: str):
if name == "chat_with_tools_agent":
return chat_with_tools_agent_graph
elif name == "issue_formatter_agent":
return issue_formatter_agent_graph
elif name == "task_decomposer_agent":
return task_decomposer_agent_graph
elif name == "kabuto_helpdesk_agent":
return kabuto_helpdesk_agent_graph
else:
raise ValueError(f"Unknown agent name: {name}")


@app.command()
def png(
name: str = typer.Option(
"chat_with_tools_agent",
"--name",
"-n",
help="Name of the agent to draw",
),
output_file_path: str = typer.Option(
"output.png",
"--output",
"-o",
help="Path to the output PNG file",
),
verbose: bool = typer.Option(
False,
"--verbose",
"-v",
help="Enable verbose output",
),
):
# Set up logging
if verbose:
logger.setLevel(logging.DEBUG)

logger.debug(f"This is a debug message with name: {name}")
typer.echo(f"Drawing agent: {name}")
get_agent_graph(name).get_graph().draw_mermaid_png(
output_file_path=output_file_path,
)
typer.echo(f"Graph saved to {output_file_path}")


@app.command()
def run(
name: str = typer.Option(
"chat_with_tools_agent",
"--name",
"-n",
help="Name of the agent to draw",
),
question: str = typer.Option(
"「鬼灯」を実行すると、KABUTOが急に停止します。原因と対策を教えてください。",
"--question",
"-q",
help="Question to ask the agent",
),
verbose: bool = typer.Option(
False,
"--verbose",
"-v",
help="Enable verbose output",
),
):
# Set up logging
if verbose:
logger.setLevel(logging.DEBUG)

if name == "chat_with_tools_agent":
from template_langgraph.agents.chat_with_tools_agent.agent import (
AgentState,
)

for event in chat_with_tools_agent_graph.stream(
input=AgentState(
messages=[
{
"role": "user",
"content": question,
}
],
)
):
logger.info("-" * 20)
logger.info(f"Event: {event}")

if name == "issue_formatter_agent":
from template_langgraph.agents.issue_formatter_agent.agent import (
AgentState,
)

for event in issue_formatter_agent_graph.stream(
input=AgentState(
messages=[
{
"role": "user",
"content": question,
}
],
)
):
logger.info("-" * 20)
logger.info(f"Event: {event}")

if name == "kabuto_helpdesk_agent":
from template_langgraph.agents.kabuto_helpdesk_agent import KabutoHelpdeskAgent

agent = KabutoHelpdeskAgent(
tools=None, # ツールはカスタムせず、デフォルトのツールを使用
)
response = agent.run(
question=question,
)
logger.info(f"Agent result: {response}")

# エージェントの応答を表示
logger.info(f"Answer: {response['messages'][-1].content}")


if __name__ == "__main__":
load_dotenv(
override=True,
verbose=True,
)
app()
Loading