Skip to content

Commit 2f3bae6

Browse files
committed
refactor codes
1 parent 91298cb commit 2f3bae6

File tree

15 files changed

+159
-160
lines changed

15 files changed

+159
-160
lines changed

.env.template

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,40 @@
1+
# ---------
12
# Project environment variables
3+
# ---------
4+
5+
## Project Settings
26
PROJECT_NAME=template-langgraph
37

4-
# Azure OpenAI Service
5-
AZURE_OPENAI_ENDPOINT="https://YOUR_AZURE_OPENAI_ENDPOINT/"
6-
AZURE_OPENAI_API_KEY="YOUR_AZURE_OPENAI_API_KEY"
8+
## LangSmith Settings
9+
LANGSMITH_API_KEY="lsv2_xxx"
10+
11+
# ---------
12+
# LLMs
13+
# ---------
14+
15+
## Azure OpenAI Service
16+
AZURE_OPENAI_ENDPOINT="https://xxx.openai.azure.com/"
17+
AZURE_OPENAI_API_KEY="xxx"
718
AZURE_OPENAI_API_VERSION="2024-10-21"
819
AZURE_OPENAI_MODEL_CHAT="gpt-4o"
920
AZURE_OPENAI_MODEL_EMBEDDING="text-embedding-3-small"
1021

11-
# LangSmith Settings
12-
LANGSMITH_API_KEY="YOUR_LANGSMITH_API_KEY"
13-
14-
# CSV Loader Settings
15-
CSV_LOADER_DATA_DIR_PATH="./data"
22+
# ---------
23+
# Tools
24+
# ---------
1625

17-
# Qdrant Settings
26+
## Qdrant Settings
1827
QDRANT_URL="http://localhost:6333"
1928

20-
# Elasticsearch Settings
29+
## Elasticsearch Settings
2130
ELASTICSEARCH_URL="http://localhost:9200"
31+
32+
# ---------
33+
# Utilities
34+
# ---------
35+
36+
## CSV Loader Settings
37+
CSV_LOADER_DATA_DIR_PATH="./data"
38+
39+
## PDF Loader Settings
40+
PDF_LOADER_DATA_DIR_PATH="./data"

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,3 +164,4 @@ cython_debug/
164164
requirements.txt
165165
assets/
166166
.langgraph_api
167+
generated/

docs/index.md

Lines changed: 5 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2,38 +2,14 @@
22

33
## Operations
44

5-
```bash
5+
see [test_all.sh](../scripts/test_all.sh) for all operations
6+
7+
```shell
68
# Start Docker containers
79
docker compose up -d
810

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のマニュアルから禅モードに関する情報を教えて下さい"
30-
# KABUTOの起動時に、画面全体が紫色に点滅し、システムがフリーズします。KABUTO のマニュアルから、関連する情報を取得したり過去のシステムのトラブルシュート事例が蓄積されたデータベースから、関連する情報を取得して質問に答えてください
31-
# 天狗のいたずら という現象について KABUTO のマニュアルから、関連する情報を取得したり過去のシステムのトラブルシュート事例が蓄積されたデータベースから、関連する情報を取得して質問に答えてください
32-
# KABUTOの起動時に、画面全体が紫色に点滅し、システムがフリーズします。
33-
# KABUTOのマニュアルから禅モードに関する情報を教えて下さい
34-
35-
AGENT_NAME=issue_formatter_agent
36-
uv run python scripts/graph_runner.py run --name $AGENT_NAME --verbose --question "KABUTOにログインできない!パスワードは合ってるはずなのに…若手社員である山田太郎は、Windows 11 を立ち上げ、日課のように自社の業務システムKABUTOのログイン画面を開きます。しかし、そこには、意味をなさない「虚無」という文字だけがただひっそりと表示されていたのです。これは質問でもあり不具合の報告でもあります。岡本太郎さんに本件調査依頼します。"
11+
# Test all scripts
12+
bash scripts/test_all.sh
3713
```
3814

3915
## References

langgraph.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33
"."
44
],
55
"graphs": {
6-
"supervisor_agent": "template_langgraph.agents.supervisor_agent:graph",
6+
"supervisor_agent": "template_langgraph.agents.supervisor_agent.agent:graph",
77
"chat_with_tools_agent": "template_langgraph.agents.chat_with_tools_agent.agent:graph",
8-
"kabuto_helpdesk_agent": "template_langgraph.agents.kabuto_helpdesk_agent:graph",
8+
"kabuto_helpdesk_agent": "template_langgraph.agents.kabuto_helpdesk_agent.agent:graph",
99
"issue_formatter_agent": "template_langgraph.agents.issue_formatter_agent.agent:graph",
1010
"task_decomposer_agent": "template_langgraph.agents.task_decomposer_agent.agent:graph"
1111
},

scripts/graph_runner.py renamed to scripts/agent_runner.py

Lines changed: 15 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,14 @@
55

66
from template_langgraph.agents.chat_with_tools_agent.agent import graph as chat_with_tools_agent_graph
77
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
8+
from template_langgraph.agents.kabuto_helpdesk_agent.agent import graph as kabuto_helpdesk_agent_graph
99
from template_langgraph.agents.task_decomposer_agent.agent import graph as task_decomposer_agent_graph
1010
from template_langgraph.loggers import get_logger
1111

1212
# Initialize the Typer application
1313
app = typer.Typer(
1414
add_completion=False,
15-
help="template-langgraph CLI",
15+
help="agent runner CLI",
1616
)
1717

1818
# Set up logging
@@ -90,55 +90,19 @@ def run(
9090
if verbose:
9191
logger.setLevel(logging.DEBUG)
9292

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}")
93+
graph = get_agent_graph(name)
94+
for event in graph.stream(
95+
input={
96+
"messages": [
97+
{
98+
"role": "user",
99+
"content": question,
100+
}
101+
],
102+
}
103+
):
104+
logger.info("-" * 20)
105+
logger.info(f"Event: {event}")
142106

143107

144108
if __name__ == "__main__":

scripts/elasticsearch_operator.py

Lines changed: 57 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
from template_langgraph.loggers import get_logger
77
from template_langgraph.tools.elasticsearch_tool import ElasticsearchClientWrapper
8-
from template_langgraph.tools.pdf_loaders import PdfLoaderWrapper
8+
from template_langgraph.utilities.pdf_loaders import PdfLoaderWrapper
99

1010
# Initialize the Typer application
1111
app = typer.Typer(
@@ -57,12 +57,12 @@ def search_documents(
5757

5858

5959
@app.command()
60-
def add_documents(
60+
def create_index(
6161
index_name: str = typer.Option(
6262
"docs_kabuto",
6363
"--index-name",
6464
"-i",
65-
help="Name of the Elasticsearch index to add documents to",
65+
help="Name of the Elasticsearch index to create",
6666
),
6767
verbose: bool = typer.Option(
6868
False,
@@ -75,7 +75,6 @@ def add_documents(
7575
if verbose:
7676
logger.setLevel(logging.DEBUG)
7777

78-
# Create Elasticsearch index
7978
es = ElasticsearchClientWrapper()
8079
logger.info(f"Creating Elasticsearch index: {index_name}")
8180
result = es.create_index(
@@ -86,6 +85,60 @@ def add_documents(
8685
else:
8786
logger.warning(f"Index {index_name} already exists.")
8887

88+
89+
@app.command()
90+
def delete_index(
91+
index_name: str = typer.Option(
92+
"docs_kabuto",
93+
"--index-name",
94+
"-i",
95+
help="Name of the Elasticsearch index to delete",
96+
),
97+
verbose: bool = typer.Option(
98+
False,
99+
"--verbose",
100+
"-v",
101+
help="Enable verbose output",
102+
),
103+
):
104+
# Set up logging
105+
if verbose:
106+
logger.setLevel(logging.DEBUG)
107+
108+
es = ElasticsearchClientWrapper()
109+
logger.info(f"Deleting Elasticsearch index: {index_name}")
110+
result = es.delete_index(
111+
index_name=index_name,
112+
)
113+
if result:
114+
logger.info(f"Deleted Elasticsearch index: {index_name}")
115+
else:
116+
logger.warning(f"Index {index_name} does not exist or could not be deleted.")
117+
return False
118+
119+
120+
@app.command()
121+
def add_documents(
122+
index_name: str = typer.Option(
123+
"docs_kabuto",
124+
"--index-name",
125+
"-i",
126+
help="Name of the Elasticsearch index to add documents to",
127+
),
128+
verbose: bool = typer.Option(
129+
False,
130+
"--verbose",
131+
"-v",
132+
help="Enable verbose output",
133+
),
134+
):
135+
# Set up logging
136+
if verbose:
137+
logger.setLevel(logging.DEBUG)
138+
139+
# Create Elasticsearch index
140+
es = ElasticsearchClientWrapper()
141+
89142
# Load documents from PDF files
90143
documents = PdfLoaderWrapper().load_pdf_docs()
91144
logger.info(f"Loaded {len(documents)} documents from PDF.")

scripts/qdrant_operator.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66

77
from template_langgraph.llms.azure_openais import AzureOpenAiWrapper
88
from template_langgraph.loggers import get_logger
9-
from template_langgraph.tools.csv_loaders import CsvLoaderWrapper
109
from template_langgraph.tools.qdrants import QdrantClientWrapper
10+
from template_langgraph.utilities.csv_loaders import CsvLoaderWrapper
1111

1212
# Initialize the Typer application
1313
app = typer.Typer(

scripts/template.py

Lines changed: 0 additions & 50 deletions
This file was deleted.

scripts/test_all.sh

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
#!/bin/bash
2+
3+
# Qdrant
4+
uv run python scripts/qdrant_operator.py --help
5+
uv run python scripts/qdrant_operator.py delete-collection --collection-name qa_kabuto --verbose
6+
uv run python scripts/qdrant_operator.py add-documents --collection-name qa_kabuto --verbose
7+
uv run python scripts/qdrant_operator.py search-documents --collection-name qa_kabuto --question "「鬼灯」を実行すると、KABUTOが急に停止します。原因と対策を教えてください。" --verbose
8+
9+
# Elasticsearch
10+
uv run python scripts/elasticsearch_operator.py --help
11+
uv run python scripts/elasticsearch_operator.py delete-index --index-name docs_kabuto --verbose
12+
uv run python scripts/elasticsearch_operator.py create-index --index-name docs_kabuto --verbose
13+
uv run python scripts/elasticsearch_operator.py add-documents --index-name docs_kabuto --verbose
14+
uv run python scripts/elasticsearch_operator.py search-documents --index-name docs_kabuto --query "禅モード" --verbose
15+
16+
# Agents
17+
18+
## Draw agent graph
19+
mkdir -p generated
20+
AGENT_NAMES=(
21+
"chat_with_tools_agent"
22+
"issue_formatter_agent"
23+
"kabuto_helpdesk_agent"
24+
"task_decomposer_agent"
25+
)
26+
for AGENT_NAME in "${AGENT_NAMES[@]}"; do
27+
uv run python scripts/agent_runner.py png --name "$AGENT_NAME" --verbose --output "generated/${AGENT_NAME}.png"
28+
done
29+
30+
## Run agents
31+
# An array of pairs of agent names and questions
32+
NAME_QUESTION_ARRAY=(
33+
"chat_with_tools_agent:KABUTOの起動時に、画面全体が紫色に点滅し、システムがフリーズします。KABUTO のマニュアルから、関連する情報を取得したり過去のシステムのトラブルシュート事例が蓄積されたデータベースから、関連する情報を取得して質問に答えてください"
34+
"issue_formatter_agent:KABUTOにログインできない!パスワードは合ってるはずなのに…若手社員である山田太郎は、Windows 11 を立ち上げ、日課のように自社の業務システムKABUTOのログイン画面を開きます。しかし、そこには、意味をなさない「虚無」という文字だけがただひっそりと表示されていたのです。これは質問でもあり不具合の報告でもあります。岡本太郎さんに本件調査依頼します。"
35+
"kabuto_helpdesk_agent:天狗のいたずら という現象について KABUTO のマニュアルから、関連する情報を取得したり過去のシステムのトラブルシュート事例が蓄積されたデータベースから、関連する情報を取得して質問に答えてください"
36+
"task_decomposer_agent:KABUTOにログインできない!パスワードは合ってるはずなのに…若手社員である山田太郎は、Windows 11 を立ち上げ、日課のように自社の業務システムKABUTOのログイン画面を開きます。しかし、そこには、意味をなさない「虚無」という文字だけがただひっそりと表示されていたのです。これは質問でもあり不具合の報告でもあります。岡本太郎さんに本件調査依頼します。"
37+
)
38+
for NAME_QUESTION in "${NAME_QUESTION_ARRAY[@]}"; do
39+
IFS=':' read -r AGENT_NAME QUESTION <<< "$NAME_QUESTION"
40+
echo "Running agent: $AGENT_NAME with question: $QUESTION"
41+
uv run python scripts/agent_runner.py run --name "$AGENT_NAME" --verbose --question "$QUESTION"
42+
done

0 commit comments

Comments
 (0)