Skip to content

Commit

Permalink
Merge branch 'develop'
Browse files Browse the repository at this point in the history
  • Loading branch information
Sunwood-ai-labs committed Oct 14, 2024
2 parents 3b9a396 + f45422d commit 9fefeac
Show file tree
Hide file tree
Showing 11 changed files with 445 additions and 66 deletions.
1 change: 1 addition & 0 deletions .github/scripts/update_readme.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ def main():
9. リポジトリ中身を深く観察し存在しないファイルへのパスは記載しないで
10. READMEの上にリリースノートを付けるような形式ではなく、READMEの中身の各章を更新する形式で更新してください。
11. > [!IMPORTANT] などの注釈部分には手を加えないでそのままにして
12. バッジやリンクなどは勝手に省略しないでちゃんと維持して
更新されたREADMEの全文をそのまま出力してください。
</Update guidelines>
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -160,3 +160,4 @@ cython_debug/
# and can be added to the global gitignore or merged into this file. For a more nuclear
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
#.idea/
examples/customer_service_streaming/data_mini
59 changes: 57 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,64 @@
<a href="https://github.com/Sunwood-ai-labs/swarm-sample-box/graphs/commit-activity">
<img alt="GitHub commit activity" src="https://img.shields.io/github/commit-activity/m/Sunwood-ai-labs/swarm-sample-box">
</a>
<!-- 多くのバッジは省略 -->
<a href="https://github.com/Sunwood-ai-labs/swarm-sample-box/pulls">
<img alt="PRs Welcome" src="https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square">
</a>
<img alt="GitHub repo size" src="https://img.shields.io/github/repo-size/Sunwood-ai-labs/swarm-sample-box">
<img alt="Development Status" src="https://img.shields.io/badge/status-active-success.svg">
<a href="https://github.com/Sunwood-ai-labs/swarm-sample-box/issues">
<img alt="GitHub issues" src="https://img.shields.io/github/issues/Sunwood-ai-labs/swarm-sample-box">
</a>
<a href="https://github.com/Sunwood-ai-labs/swarm-sample-box/network/members">
<img alt="GitHub forks" src="https://img.shields.io/github/forks/Sunwood-ai-labs/swarm-sample-box?style=social">
</a>
<a href="https://github.com/Sunwood-ai-labs/swarm-sample-box/watchers">
<img alt="GitHub watchers" src="https://img.shields.io/github/watchers/Sunwood-ai-labs/swarm-sample-box?style=social">
</a>
<img alt="GitHub last commit" src="https://img.shields.io/github/last-commit/Sunwood-ai-labs/swarm-sample-box">
<img alt="GitHub top language" src="https://img.shields.io/github/languages/top/Sunwood-ai-labs/swarm-sample-box">
<a href="https://github.com/Sunwood-ai-labs/swarm-sample-box/graphs/contributors">
<img alt="GitHub contributors" src="https://img.shields.io/github/contributors/Sunwood-ai-labs/swarm-sample-box">
</a>
<a href="https://github.com/Sunwood-ai-labs/swarm-sample-box/issues?q=is%3Aissue+is%3Aclosed">
<img alt="GitHub closed issues" src="https://img.shields.io/github/issues-closed/Sunwood-ai-labs/swarm-sample-box">
</a>
<a href="https://github.com/Sunwood-ai-labs/swarm-sample-box/pulls?q=is%3Apr+is%3Aclosed">
<img alt="GitHub closed PRs" src="https://img.shields.io/github/issues-pr-closed/Sunwood-ai-labs/swarm-sample-box">
</a>
<img alt="GitHub language count" src="https://img.shields.io/github/languages/count/Sunwood-ai-labs/swarm-sample-box">
<img alt="GitHub search hit counter" src="https://img.shields.io/github/search/Sunwood-ai-labs/swarm-sample-box/goto">
<img alt="GitHub code size" src="https://img.shields.io/github/languages/code-size/Sunwood-ai-labs/swarm-sample-box">
<a href="https://github.com/Sunwood-ai-labs/swarm-sample-box/blob/main/CONTRIBUTING.md">
<img src="https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg" alt="Contributor Covenant">
</a>
<a href="https://twitter.com/intent/tweet?text=Check%20out%20this%20awesome%20project%3A&url=https%3A%2F%2Fgithub.com%2FSunwood-ai-labs%2Fswarm-sample-box">
<img alt="Twitter" src="https://img.shields.io/twitter/url?style=social&url=https%3A%2F%2Fgithub.com%2FSunwood-ai-labs%2Fswarm-sample-box">
</a>
<img alt="GitHub Created At" src="https://img.shields.io/github/created-at/Sunwood-ai-labs/swarm-sample-box">
<a href="https://github.com/Sunwood-ai-labs/swarm-sample-box/deployments">
<img alt="GitHub deployments" src="https://img.shields.io/github/deployments/Sunwood-ai-labs/swarm-sample-box/Production">
</a>
<a href="https://github.com/Sunwood-ai-labs/swarm-sample-box/discussions">
<img alt="GitHub Discussions" src="https://img.shields.io/github/discussions/Sunwood-ai-labs/swarm-sample-box">
</a>
<img alt="GitHub followers" src="https://img.shields.io/github/followers/Sunwood-ai-labs?style=social">
<img alt="GitHub Release Date" src="https://img.shields.io/github/release-date/Sunwood-ai-labs/swarm-sample-box">
<img alt="GitHub commit activity (branch)" src="https://img.shields.io/github/commit-activity/y/Sunwood-ai-labs/swarm-sample-box/main">
<img alt="GitHub commits since latest release (by date)" src="https://img.shields.io/github/commits-since/Sunwood-ai-labs/swarm-sample-box/latest">


</a>
</p>

<p align="center">
<a href="https://github.com/Sunwood-ai-labs/swarm-sample-box/actions/workflows/generate-release-notes.yml">
<img alt="GitHub Workflow Status" src="https://img.shields.io/github/actions/workflow/status/Sunwood-ai-labs/swarm-sample-box/generate-release-notes.yml?label=generate-auto-release-notes">
<a href="https://github.com/Sunwood-ai-labs/swarm-sample-box/actions/workflows/translate-readme.yml">
<img alt="GitHub Workflow Status" src="https://img.shields.io/github/actions/workflow/status/Sunwood-ai-labs/swarm-sample-box/generate-release-notes.yml?label=auto-translate-readme">
<a href="https://github.com/Sunwood-ai-labs/swarm-sample-box/actions/workflows/issue-review.yml">
<img alt="GitHub Workflow Status" src="https://img.shields.io/github/actions/workflow/status/Sunwood-ai-labs/swarm-sample-box/generate-release-notes.yml?label=auto-issue-review">
</p>

<h2 align="center">
~ Experimental Playground for AI Agent Orchestration ~
Expand Down Expand Up @@ -101,7 +156,7 @@ swarm-sample-boxを使用するためのインストール手順は「使用方
- [Support Bot](https://github.com/Sunwood-ai-labs/swarm-sample-box/tree/main/examples/support_bot): カスタマーサポート向けボットの実装例で、Qdrantを使用した文書検索機能を含みます。
- [Triage Agent](https://github.com/Sunwood-ai-labs/swarm-sample-box/tree/main/examples/triage_agent): ユーザーリクエストを適切なエージェントに振り分けるトリアージエージェントの実装例です。
- [Weather Agent](https://github.com/Sunwood-ai-labs/swarm-sample-box/tree/main/examples/weather_agent): 天気情報の取得と関連タスクを行うシンプルなエージェントの実装例です。
- [Customer Service Streaming](https://github.com/Sunwood-ai-labs/swarm-sample-box/tree/main/examples/customer_service_streaming): ストリーミング形式でのカスタマーサービスを模したサンプルです。(🔥未整備)
- [Customer Service Streaming](https://github.com/Sunwood-ai-labs/swarm-sample-box/tree/main/examples/customer_service_streaming): ストリーミング形式でのカスタマーサービスを模したサンプルです。

### オリジナルサンプル

Expand Down
129 changes: 129 additions & 0 deletions examples/customer_service_streaming/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
# 🎧 Swarm カスタマーサービスストリーミングエージェント

![](https://raw.githubusercontent.com/Sunwood-ai-labs/swarm-sample-box/refs/heads/main/docs/Sample01.png)

このプロジェクトは、Swarmフレームワークを使用したカスタマーサービスストリーミングエージェントを示しています。顧客の問い合わせに対応し、OpenAI製品に関する情報を提供し、サポートチケットを管理するように設計されています。

>[!NOTE]
> 本家のプロジェクトでこのサンプルは完成してないか、まだ実験中ぽいのでこのサンプルの実装や使用はお勧めできません。
## 🌟 特徴

- ドキュメント検索:OpenAI製品に関する情報を取得
- チケット送信:問題やリクエストのヘルプチケットを作成
- メール送信:ユーザーとメールでコミュニケーション
- 複数のアシスタント:専門化されたアシスタントで異なるタイプの問い合わせを処理
- ストリーミングレスポンス:ユーザーの問い合わせにリアルタイムで応答

## 🔄 エージェントのワークフロー

以下の図は、カスタマーサービスストリーミングエージェントのワークフローを示しています:

```mermaid
graph TD
A[ユーザー入力] --> B{ユーザーインターフェースアシスタント}
B -->|ドキュメント検索| C[ドキュメント検索]
B -->|チケット作成| D[チケット送信]
B -->|メールリクエスト| E[メール送信]
B -->|その他のリクエスト| F[AIで対応]
C --> G{追加アクション?}
D --> G
E --> G
F --> G
G -->|はい| B
G -->|いいえ| H[会話終了]
```

### 主要コンポーネント

1. **ユーザーインターフェースアシスタント**
- ユーザー入力を分析し、適切な機能またはサブアシスタントにルーティング
- 一般的な問い合わせを処理し、応答を調整

2. **ドキュメント検索**
- OpenAIのドキュメンテーションから関連情報を取得

3. **チケット送信**
- ユーザーの問題やリクエストに対するヘルプチケットを作成

4. **メール送信**
- ユーザーへのメールを作成して送信

5. **AI駆動の応答**
- 複雑な問い合わせに対して文脈を考慮した応答を生成

このワークフローにより、様々なカスタマーサービスシナリオを効率的に処理できます。

## 🛠️ セットアップ

1. `uv`をインストールしていない場合は、まずインストールします:

```bash
pip install uv
```

2. 仮想環境を作成してアクティベートします:

```bash
uv venv
source .venv/bin/activate # Linux/macOSの場合
.venv\Scripts\activate # Windowsの場合
```

3. 必要なパッケージをインストールします:

```bash
uv pip install -r requirements.txt
```

4. Docker-composeを使用してQdrantデータベースを起動します:

```bash
docker-compose up -d
```

この操作により、`docker-compose.yaml`ファイルに定義されたQdrantコンテナが起動します。

## 🚀 エージェントの実行

カスタマーサービスストリーミングエージェントを実行するには:

```bash
python main.py
```

コマンドライン引数を使用して実行をカスタマイズできます:

- `--engine`:使用するエンジンを選択(localまたはassistants)
- `--test`:テストを実行
- `--create-task`:指定した説明で新しいタスクを作成
- `--input`:CLIの入力モードを使用

例:
```bash
python main.py --engine local --input
python main.py --create-task "Answers Transition Guideについて教えて" --assistant user_interface --evaluate
```


## 📁 プロジェクト構造

- `configs/`:アシスタントとツールの設定ファイル
- `logs/`:ログファイル
- `src/`:Swarmフレームワークとタスク処理のソースコード
- `tests/`:テストファイルと評価スクリプト
- `main.py`:カスタマーサービスエージェントを実行するメインスクリプト
- `prep_data.py`:Qdrantベクトルデータベースのデータ準備スクリプト
- `docker-compose.yaml`:Qdrant実行用のDocker設定
- `requirements.txt`:必要なパッケージのリスト

## 🧠 エージェントの拡張

新しい機能を追加するには:

1. `configs/tools/`に新しいツール定義を作成
2. それぞれのツールディレクトリにツールハンドラを実装
3. `configs/assistants/`のアシスタント設定を更新して新しいツールを使用
4. `swarm_tasks.json`ファイルを修正して新しいタスクタイプを含める
2 changes: 1 addition & 1 deletion examples/customer_service_streaming/configs/general.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ class Colors:

test_root = 'tests'
test_file = 'test_prompts.jsonl'
tasks_path = 'configs/swarm_tasks.json'
tasks_path = 'configs/swarm_tasks_JP.json'

#Options are 'assistants' or 'local'
engine_name = 'local'
Expand Down
14 changes: 14 additions & 0 deletions examples/customer_service_streaming/configs/swarm_tasks_JP.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
[
{
"description": "16の平方根は何ですか?"
},
{
"description": "OpenAIアカウントの新規作成やChatGPTの利用に電話番号認証は必要ですか?",
"evaluate": true
},
{
"description": "OpenAIアカウントに登録すると、何個の無料トークンがもらえますか?その回答を[email protected]にメールで送信してください。",
"iterate": true,
"evaluate": true
}
]
86 changes: 70 additions & 16 deletions examples/customer_service_streaming/main.py
Original file line number Diff line number Diff line change
@@ -1,24 +1,73 @@
"""
このスクリプトは、Swarmフレームワークを使用してカスタマーサービスタスクを実行します。
主な機能:
1. コマンドライン引数の解析
2. ツールとアシスタントの検証
3. テストモードまたは対話モードでのタスク実行
4. 事前定義されたタスクの実行
進捗状況はloguruを使用して表示されます。
"""

import shlex
import argparse
from loguru import logger
from art import text2art

from src.swarm.swarm import Swarm
from src.tasks.task import Task
from configs.general import test_root, test_file, engine_name, persist
from src.validator import validate_all_tools, validate_all_assistants
from src.arg_parser import parse_args


from pyfiglet import Figlet
from colorama import init, Fore, Style

# coloramaの初期化
init(autoreset=True)

def generate_ascii_art(text, font="standard", color=Fore.WHITE):
"""
指定されたテキスト、フォント、色でASCIIアートを生成します。
:param text: 変換するテキスト
:param font: 使用するフォント (デフォルト: "standard")
:param color: テキストの色 (デフォルト: 白)
:return: 色付きのASCIIアート文字列
"""
f = Figlet(font=font)
ascii_art = f.renderText(text)

# 各行に色を適用
colored_ascii_art = "\n".join([f"{color}{line}{Style.RESET_ALL}" for line in ascii_art.split("\n")])

return colored_ascii_art

# 使用例
print(generate_ascii_art("Swarm Sample", font="slant", color=Fore.CYAN))
print(generate_ascii_art(">> Customer service streaming", font="slant", color=Fore.YELLOW))

def main():
logger.info("Swarmの実行を開始します")

args = parse_args()
logger.info(f"解析されたコマンドライン引数: {args}")

try:
logger.info("ツールとアシスタントの検証を開始します")
validate_all_tools(engine_name)
validate_all_assistants()
except:
raise Exception("Validation failed")
logger.success("ツールとアシスタントの検証が成功しました")
except Exception as e:
logger.error(f"検証に失敗しました: {e}")
raise Exception("検証に失敗しました")

swarm = Swarm(
engine_name=engine_name, persist=persist)
swarm = Swarm(engine_name=engine_name, persist=persist)
logger.info(f"Swarmを初期化しました (engine: {engine_name}, persist: {persist})")

if args.test is not None:
logger.info("テストモードで実行します")
test_files = args.test
if len(test_files) == 0:
test_file_paths = [f"{test_root}/{test_file}"]
Expand All @@ -28,43 +77,48 @@ def main():
swarm.deploy(test_mode=True, test_file_paths=test_file_paths)

elif args.input:
# Interactive mode for adding tasks
logger.info("対話モードで実行します")
# 対話モードでタスクを追加
while True:
print("Enter a task (or 'exit' to quit):")
print("タスクを入力してください(終了する場合は 'exit' と入力):")
task_input = input()

# Check for exit command
# 終了コマンドのチェック
if task_input.lower() == 'exit':
logger.info("対話モードを終了します")
break

# Use shlex to parse the task description and arguments
# shlexを使用してタスクの説明と引数を解析
task_args = shlex.split(task_input)
task_parser = argparse.ArgumentParser()
task_parser.add_argument("description", type=str, nargs='?', default="")
task_parser.add_argument("--iterate", action="store_true", help="Set the iterate flag for the new task.")
task_parser.add_argument("--evaluate", action="store_true", help="Set the evaluate flag for the new task.")
task_parser.add_argument("--assistant", type=str, default="user_interface", help="Specify the assistant for the new task.")
task_parser.add_argument("--iterate", action="store_true", help="新しいタスクの反復フラグを設定します。")
task_parser.add_argument("--evaluate", action="store_true", help="新しいタスクの評価フラグを設定します。")
task_parser.add_argument("--assistant", type=str, default="user_interface", help="タスクのアシスタントを指定します。")

# Parse task arguments
# タスク引数の解析
task_parsed_args = task_parser.parse_args(task_args)

# Create and add the new task
# 新しいタスクの作成と追加
new_task = Task(description=task_parsed_args.description,
iterate=task_parsed_args.iterate,
evaluate=task_parsed_args.evaluate,
assistant=task_parsed_args.assistant)
swarm.add_task(new_task)
logger.info(f"新しいタスクを追加しました: {new_task.description}")

# Deploy Swarm with the new task
# 新しいタスクでSwarmをデプロイ
swarm.deploy()
swarm.tasks.clear()

else:
# Load predefined tasks if any
# Deploy the Swarm for predefined tasks
logger.info("事前定義されたタスクを読み込みます")
# 事前定義されたタスクがあれば読み込む
# 事前定義されたタスクでSwarmをデプロイ
swarm.load_tasks()
swarm.deploy()

logger.success("Swarmの操作が完了しました")
print("\n\n🍯🐝🍯 Swarm operations complete 🍯🐝🍯\n\n")


Expand Down
Loading

0 comments on commit 9fefeac

Please sign in to comment.