Skip to content

Commit 91298cb

Browse files
authored
Merge pull request #23 from ks6088ts-labs/cosmetic-changes
renew interfaces for running agent with breaking changes
2 parents 6d438e5 + 610f1f6 commit 91298cb

18 files changed

+446
-328
lines changed

docs/index.md

Lines changed: 25 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -6,35 +6,34 @@
66
# Start Docker containers
77
docker compose up -d
88

9-
# Delete collection from Qdrant
10-
uv run python -m template_langgraph.tasks.delete_qdrant_collection
11-
12-
# Add documents to Qdrant
13-
uv run python -m template_langgraph.tasks.add_documents_to_qdrant
14-
15-
# Search Qdrant
16-
uv run python -m template_langgraph.tasks.search_documents_on_qdrant
17-
18-
# Add documents to Elasticsearch
19-
uv run python -m template_langgraph.tasks.add_documents_to_elasticsearch
20-
21-
# Search Elasticsearch
22-
uv run python -m template_langgraph.tasks.search_documents_on_elasticsearch
23-
24-
# Run Kabuto Helpdesk Agent
25-
uv run python -m template_langgraph.tasks.run_kabuto_helpdesk_agent "KABUTOの起動時に、画面全体が紫色に点滅し、システムがフリーズします。"
26-
uv run python -m template_langgraph.tasks.run_kabuto_helpdesk_agent "KABUTOのマニュアルから禅モードに関する情報を教えて下さい"
27-
28-
# ChatWithToolsAgent
29-
uv run python -m template_langgraph.tasks.draw_chat_with_tools_agent_mermaid_png "data/chat_with_tools_agent.png"
30-
uv run python -m template_langgraph.tasks.run_chat_with_tools_agent
9+
# Qdrant
10+
uv run python scripts/qdrant_operator.py --help
11+
uv run python scripts/qdrant_operator.py delete-collection --collection-name qa_kabuto --verbose
12+
uv run python scripts/qdrant_operator.py add-documents --collection-name qa_kabuto --verbose
13+
uv run python scripts/qdrant_operator.py search-documents --collection-name qa_kabuto --question "「鬼灯」を実行すると、KABUTOが急に停止します。原因と対策を教えてください。" --verbose
14+
15+
# Elasticsearch
16+
uv run python scripts/elasticsearch_operator.py --help
17+
uv run python scripts/elasticsearch_operator.py add-documents --index-name docs_kabuto --verbose
18+
uv run python scripts/elasticsearch_operator.py search-documents --index-name docs_kabuto --query "禅モード" --verbose
19+
20+
# Agents
21+
22+
## Draw agent graph
23+
AGENT_NAME=chat_with_tools_agent
24+
uv run python scripts/graph_runner.py png --name $AGENT_NAME --verbose --output data/$AGENT_NAME.png
25+
26+
## Run agents
27+
AGENT_NAME=chat_with_tools_agent
28+
AGENT_NAME=kabuto_helpdesk_agent
29+
uv run python scripts/graph_runner.py run --name $AGENT_NAME --verbose --question "KABUTOのマニュアルから禅モードに関する情報を教えて下さい"
3130
# KABUTOの起動時に、画面全体が紫色に点滅し、システムがフリーズします。KABUTO のマニュアルから、関連する情報を取得したり過去のシステムのトラブルシュート事例が蓄積されたデータベースから、関連する情報を取得して質問に答えてください
3231
# 天狗のいたずら という現象について KABUTO のマニュアルから、関連する情報を取得したり過去のシステムのトラブルシュート事例が蓄積されたデータベースから、関連する情報を取得して質問に答えてください
32+
# KABUTOの起動時に、画面全体が紫色に点滅し、システムがフリーズします。
33+
# KABUTOのマニュアルから禅モードに関する情報を教えて下さい
3334

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

4039
## References

scripts/elasticsearch_operator.py

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
import logging
2+
3+
import typer
4+
from dotenv import load_dotenv
5+
6+
from template_langgraph.loggers import get_logger
7+
from template_langgraph.tools.elasticsearch_tool import ElasticsearchClientWrapper
8+
from template_langgraph.tools.pdf_loaders import PdfLoaderWrapper
9+
10+
# Initialize the Typer application
11+
app = typer.Typer(
12+
add_completion=False,
13+
help="Elasticsearch operator CLI",
14+
)
15+
16+
# Set up logging
17+
logger = get_logger(__name__)
18+
19+
20+
@app.command()
21+
def search_documents(
22+
index_name: str = typer.Option(
23+
"docs_kabuto",
24+
"--index-name",
25+
"-i",
26+
help="Name of the Elasticsearch index to search documents in",
27+
),
28+
query: str = typer.Option(
29+
"禅モード",
30+
"--query",
31+
"-q",
32+
help="Query to search in the Elasticsearch index",
33+
),
34+
verbose: bool = typer.Option(
35+
False,
36+
"--verbose",
37+
"-v",
38+
help="Enable verbose output",
39+
),
40+
):
41+
# Set up logging
42+
if verbose:
43+
logger.setLevel(logging.DEBUG)
44+
45+
es = ElasticsearchClientWrapper()
46+
47+
results = es.search(
48+
index_name=index_name,
49+
query=query,
50+
)
51+
logger.info(f"Found {len(results)} results for the question: {query}")
52+
for i, result in enumerate(results, start=1):
53+
logger.info(f"Result {i}:")
54+
logger.info(f"File Name: {result.metadata['source']}")
55+
logger.info(f"Content: {result.page_content}")
56+
logger.info("-" * 40)
57+
58+
59+
@app.command()
60+
def add_documents(
61+
index_name: str = typer.Option(
62+
"docs_kabuto",
63+
"--index-name",
64+
"-i",
65+
help="Name of the Elasticsearch index to add documents to",
66+
),
67+
verbose: bool = typer.Option(
68+
False,
69+
"--verbose",
70+
"-v",
71+
help="Enable verbose output",
72+
),
73+
):
74+
# Set up logging
75+
if verbose:
76+
logger.setLevel(logging.DEBUG)
77+
78+
# Create Elasticsearch index
79+
es = ElasticsearchClientWrapper()
80+
logger.info(f"Creating Elasticsearch index: {index_name}")
81+
result = es.create_index(
82+
index_name=index_name,
83+
)
84+
if result:
85+
logger.info(f"Created Elasticsearch index: {index_name}")
86+
else:
87+
logger.warning(f"Index {index_name} already exists.")
88+
89+
# Load documents from PDF files
90+
documents = PdfLoaderWrapper().load_pdf_docs()
91+
logger.info(f"Loaded {len(documents)} documents from PDF.")
92+
93+
# Add documents to Elasticsearch index
94+
result = es.add_documents(
95+
index_name=index_name,
96+
documents=documents,
97+
)
98+
if result:
99+
logger.info(f"Added {len(documents)} documents to Elasticsearch index: {index_name}")
100+
else:
101+
logger.error(f"Failed to add documents to Elasticsearch index: {index_name}")
102+
103+
104+
if __name__ == "__main__":
105+
load_dotenv(
106+
override=True,
107+
verbose=True,
108+
)
109+
app()

scripts/graph_runner.py

Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
import logging
2+
3+
import typer
4+
from dotenv import load_dotenv
5+
6+
from template_langgraph.agents.chat_with_tools_agent.agent import graph as chat_with_tools_agent_graph
7+
from template_langgraph.agents.issue_formatter_agent.agent import graph as issue_formatter_agent_graph
8+
from template_langgraph.agents.kabuto_helpdesk_agent import graph as kabuto_helpdesk_agent_graph
9+
from template_langgraph.agents.task_decomposer_agent.agent import graph as task_decomposer_agent_graph
10+
from template_langgraph.loggers import get_logger
11+
12+
# Initialize the Typer application
13+
app = typer.Typer(
14+
add_completion=False,
15+
help="template-langgraph CLI",
16+
)
17+
18+
# Set up logging
19+
logger = get_logger(__name__)
20+
21+
22+
def get_agent_graph(name: str):
23+
if name == "chat_with_tools_agent":
24+
return chat_with_tools_agent_graph
25+
elif name == "issue_formatter_agent":
26+
return issue_formatter_agent_graph
27+
elif name == "task_decomposer_agent":
28+
return task_decomposer_agent_graph
29+
elif name == "kabuto_helpdesk_agent":
30+
return kabuto_helpdesk_agent_graph
31+
else:
32+
raise ValueError(f"Unknown agent name: {name}")
33+
34+
35+
@app.command()
36+
def png(
37+
name: str = typer.Option(
38+
"chat_with_tools_agent",
39+
"--name",
40+
"-n",
41+
help="Name of the agent to draw",
42+
),
43+
output_file_path: str = typer.Option(
44+
"output.png",
45+
"--output",
46+
"-o",
47+
help="Path to the output PNG file",
48+
),
49+
verbose: bool = typer.Option(
50+
False,
51+
"--verbose",
52+
"-v",
53+
help="Enable verbose output",
54+
),
55+
):
56+
# Set up logging
57+
if verbose:
58+
logger.setLevel(logging.DEBUG)
59+
60+
logger.debug(f"This is a debug message with name: {name}")
61+
typer.echo(f"Drawing agent: {name}")
62+
get_agent_graph(name).get_graph().draw_mermaid_png(
63+
output_file_path=output_file_path,
64+
)
65+
typer.echo(f"Graph saved to {output_file_path}")
66+
67+
68+
@app.command()
69+
def run(
70+
name: str = typer.Option(
71+
"chat_with_tools_agent",
72+
"--name",
73+
"-n",
74+
help="Name of the agent to draw",
75+
),
76+
question: str = typer.Option(
77+
"「鬼灯」を実行すると、KABUTOが急に停止します。原因と対策を教えてください。",
78+
"--question",
79+
"-q",
80+
help="Question to ask the agent",
81+
),
82+
verbose: bool = typer.Option(
83+
False,
84+
"--verbose",
85+
"-v",
86+
help="Enable verbose output",
87+
),
88+
):
89+
# Set up logging
90+
if verbose:
91+
logger.setLevel(logging.DEBUG)
92+
93+
if name == "chat_with_tools_agent":
94+
from template_langgraph.agents.chat_with_tools_agent.agent import (
95+
AgentState,
96+
)
97+
98+
for event in chat_with_tools_agent_graph.stream(
99+
input=AgentState(
100+
messages=[
101+
{
102+
"role": "user",
103+
"content": question,
104+
}
105+
],
106+
)
107+
):
108+
logger.info("-" * 20)
109+
logger.info(f"Event: {event}")
110+
111+
if name == "issue_formatter_agent":
112+
from template_langgraph.agents.issue_formatter_agent.agent import (
113+
AgentState,
114+
)
115+
116+
for event in issue_formatter_agent_graph.stream(
117+
input=AgentState(
118+
messages=[
119+
{
120+
"role": "user",
121+
"content": question,
122+
}
123+
],
124+
)
125+
):
126+
logger.info("-" * 20)
127+
logger.info(f"Event: {event}")
128+
129+
if name == "kabuto_helpdesk_agent":
130+
from template_langgraph.agents.kabuto_helpdesk_agent import KabutoHelpdeskAgent
131+
132+
agent = KabutoHelpdeskAgent(
133+
tools=None, # ツールはカスタムせず、デフォルトのツールを使用
134+
)
135+
response = agent.run(
136+
question=question,
137+
)
138+
logger.info(f"Agent result: {response}")
139+
140+
# エージェントの応答を表示
141+
logger.info(f"Answer: {response['messages'][-1].content}")
142+
143+
144+
if __name__ == "__main__":
145+
load_dotenv(
146+
override=True,
147+
verbose=True,
148+
)
149+
app()

0 commit comments

Comments
 (0)