cleanup
This commit is contained in:
@@ -1,172 +0,0 @@
|
||||
# ai.card と ai.gpt の統合ガイド
|
||||
|
||||
## 概要
|
||||
|
||||
ai.gptのMCPサーバーにai.cardのツールを統合し、AIがカードゲームシステムとやり取りできるようになりました。
|
||||
|
||||
## セットアップ
|
||||
|
||||
### 1. 必要な環境
|
||||
|
||||
- Python 3.13
|
||||
- ai.gpt プロジェクト
|
||||
- ai.card プロジェクト(`./card` ディレクトリ)
|
||||
|
||||
### 2. 起動手順
|
||||
|
||||
**ステップ1: ai.cardサーバーを起動**(ターミナル1)
|
||||
```bash
|
||||
cd card
|
||||
./start_server.sh
|
||||
```
|
||||
|
||||
**ステップ2: ai.gpt MCPサーバーを起動**(ターミナル2)
|
||||
```bash
|
||||
aigpt server
|
||||
```
|
||||
|
||||
起動時に以下が表示されることを確認:
|
||||
- 🎴 Card Game System: 6 tools
|
||||
- 🎴 ai.card: ./card directory detected
|
||||
|
||||
**ステップ3: AIと対話**(ターミナル3)
|
||||
```bash
|
||||
aigpt conv syui --provider openai
|
||||
```
|
||||
|
||||
## 使用可能なコマンド
|
||||
|
||||
### カード関連の質問例
|
||||
|
||||
```
|
||||
# カードコレクションを表示
|
||||
「カードコレクションを見せて」
|
||||
「私のカードを見せて」
|
||||
「カード一覧を表示して」
|
||||
|
||||
# ガチャを実行
|
||||
「ガチャを引いて」
|
||||
「カードを引きたい」
|
||||
|
||||
# コレクション分析
|
||||
「私のコレクションを分析して」
|
||||
|
||||
# ガチャ統計
|
||||
「ガチャの統計を見せて」
|
||||
```
|
||||
|
||||
## 技術仕様
|
||||
|
||||
### MCP ツール一覧
|
||||
|
||||
| ツール名 | 説明 | パラメータ |
|
||||
|---------|------|-----------|
|
||||
| `card_get_user_cards` | ユーザーのカード一覧取得 | did, limit |
|
||||
| `card_draw_card` | ガチャでカード取得 | did, is_paid |
|
||||
| `card_get_card_details` | カード詳細情報取得 | card_id |
|
||||
| `card_analyze_collection` | コレクション分析 | did |
|
||||
| `card_get_gacha_stats` | ガチャ統計取得 | なし |
|
||||
| `card_system_status` | システム状態確認 | なし |
|
||||
|
||||
### 動作の流れ
|
||||
|
||||
1. **ユーザーがカード関連の質問をする**
|
||||
- AIがキーワード(カード、コレクション、ガチャなど)を検出
|
||||
|
||||
2. **AIが適切なMCPツールを呼び出す**
|
||||
- OpenAIのFunction Callingを使用
|
||||
- didパラメータには会話相手のユーザーID(例:'syui')を使用
|
||||
|
||||
3. **ai.gpt MCPサーバーがai.cardサーバーに転送**
|
||||
- http://localhost:8001 → http://localhost:8000
|
||||
- 適切なエンドポイントにリクエストを転送
|
||||
|
||||
4. **結果をAIが解釈して返答**
|
||||
- カード情報を分かりやすく説明
|
||||
- エラー時は適切なガイダンスを提供
|
||||
|
||||
## 設定
|
||||
|
||||
### config.json
|
||||
|
||||
```json
|
||||
{
|
||||
"providers": {
|
||||
"openai": {
|
||||
"api_key": "your-api-key",
|
||||
"default_model": "gpt-4o-mini",
|
||||
"system_prompt": "カード関連の質問では、必ずcard_get_user_cardsなどのツールを使用してください。"
|
||||
}
|
||||
},
|
||||
"mcp": {
|
||||
"servers": {
|
||||
"ai_gpt": {
|
||||
"endpoints": {
|
||||
"card_get_user_cards": "/card_get_user_cards",
|
||||
"card_draw_card": "/card_draw_card",
|
||||
"card_get_card_details": "/card_get_card_details",
|
||||
"card_analyze_collection": "/card_analyze_collection",
|
||||
"card_get_gacha_stats": "/card_get_gacha_stats",
|
||||
"card_system_status": "/card_system_status"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## トラブルシューティング
|
||||
|
||||
### エラー: "ai.card server is not running"
|
||||
|
||||
ai.cardサーバーが起動していません。以下を実行:
|
||||
```bash
|
||||
cd card
|
||||
./start_server.sh
|
||||
```
|
||||
|
||||
### エラー: "カード一覧の取得に失敗しました"
|
||||
|
||||
1. ai.cardサーバーが正常に起動しているか確認
|
||||
2. aigpt serverを再起動
|
||||
3. ポート8000と8001が使用可能か確認
|
||||
|
||||
### プロセスの終了方法
|
||||
|
||||
```bash
|
||||
# ポート8001のプロセスを終了
|
||||
lsof -ti:8001 | xargs kill -9
|
||||
|
||||
# ポート8000のプロセスを終了
|
||||
lsof -ti:8000 | xargs kill -9
|
||||
```
|
||||
|
||||
## 実装の詳細
|
||||
|
||||
### 主な変更点
|
||||
|
||||
1. **ai.gpt MCPサーバーの拡張** (`src/aigpt/mcp_server.py`)
|
||||
- `./card`ディレクトリの存在を検出
|
||||
- ai.card用のMCPツールを自動登録
|
||||
|
||||
2. **AIプロバイダーの更新** (`src/aigpt/ai_provider.py`)
|
||||
- card_*ツールの定義追加
|
||||
- ツール実行時のパラメータ処理
|
||||
|
||||
3. **MCPクライアントの拡張** (`src/aigpt/cli.py`)
|
||||
- `has_card_tools`プロパティ追加
|
||||
- ai.card MCPメソッドの実装
|
||||
|
||||
## 今後の拡張案
|
||||
|
||||
- [ ] カードバトル機能の追加
|
||||
- [ ] カードトレード機能
|
||||
- [ ] レアリティ別の表示
|
||||
- [ ] カード画像の表示対応
|
||||
- [ ] atproto連携の実装
|
||||
|
||||
## 関連ドキュメント
|
||||
|
||||
- [ai.card 開発ガイド](./card/claude.md)
|
||||
- [エコシステム統合設計書](./CLAUDE.md)
|
||||
- [ai.gpt README](./README.md)
|
@@ -1,109 +0,0 @@
|
||||
# Fixed MCP Tools Issue
|
||||
|
||||
## Summary
|
||||
|
||||
The issue where AI wasn't calling card tools has been fixed. The problem was:
|
||||
|
||||
1. The `chat` command wasn't creating an MCP client when using OpenAI
|
||||
2. The system prompt in `build_context_prompt` didn't mention available tools
|
||||
|
||||
## Changes Made
|
||||
|
||||
### 1. Updated `/Users/syui/ai/gpt/src/aigpt/cli.py` (chat command)
|
||||
|
||||
Added MCP client creation for OpenAI provider:
|
||||
|
||||
```python
|
||||
# Get config instance
|
||||
config_instance = Config()
|
||||
|
||||
# Get defaults from config if not provided
|
||||
if not provider:
|
||||
provider = config_instance.get("default_provider", "ollama")
|
||||
if not model:
|
||||
if provider == "ollama":
|
||||
model = config_instance.get("providers.ollama.default_model", "qwen2.5")
|
||||
else:
|
||||
model = config_instance.get("providers.openai.default_model", "gpt-4o-mini")
|
||||
|
||||
# Create AI provider with MCP client if needed
|
||||
ai_provider = None
|
||||
mcp_client = None
|
||||
|
||||
try:
|
||||
# Create MCP client for OpenAI provider
|
||||
if provider == "openai":
|
||||
mcp_client = MCPClient(config_instance)
|
||||
if mcp_client.available:
|
||||
console.print(f"[dim]MCP client connected to {mcp_client.active_server}[/dim]")
|
||||
|
||||
ai_provider = create_ai_provider(provider=provider, model=model, mcp_client=mcp_client)
|
||||
console.print(f"[dim]Using {provider} with model {model}[/dim]\n")
|
||||
except Exception as e:
|
||||
console.print(f"[yellow]Warning: Could not create AI provider: {e}[/yellow]")
|
||||
console.print("[yellow]Falling back to simple responses[/yellow]\n")
|
||||
```
|
||||
|
||||
### 2. Updated `/Users/syui/ai/gpt/src/aigpt/persona.py` (build_context_prompt method)
|
||||
|
||||
Added tool instructions to the system prompt:
|
||||
|
||||
```python
|
||||
context_prompt += f"""IMPORTANT: You have access to the following tools:
|
||||
- Memory tools: get_memories, search_memories, get_contextual_memories
|
||||
- Relationship tools: get_relationship
|
||||
- Card game tools: card_get_user_cards, card_draw_card, card_analyze_collection
|
||||
|
||||
When asked about cards, collections, or anything card-related, YOU MUST use the card tools.
|
||||
For "カードコレクションを見せて" or similar requests, use card_get_user_cards with did='{user_id}'.
|
||||
|
||||
Respond to this message while staying true to your personality and the established relationship context:
|
||||
|
||||
User: {current_message}
|
||||
|
||||
AI:"""
|
||||
```
|
||||
|
||||
## Test Results
|
||||
|
||||
After the fix:
|
||||
|
||||
```bash
|
||||
$ aigpt chat syui "カードコレクションを見せて"
|
||||
|
||||
🔍 [MCP Client] Checking availability...
|
||||
✅ [MCP Client] ai_gpt server connected successfully
|
||||
✅ [MCP Client] ai.card tools detected and available
|
||||
MCP client connected to ai_gpt
|
||||
Using openai with model gpt-4o-mini
|
||||
|
||||
🔧 [OpenAI] 1 tools called:
|
||||
- card_get_user_cards({"did":"syui"})
|
||||
🌐 [MCP] Executing card_get_user_cards...
|
||||
✅ [MCP] Result: {'error': 'カード一覧の取得に失敗しました'}...
|
||||
```
|
||||
|
||||
The AI is now correctly calling the `card_get_user_cards` tool! The error is expected because the ai.card server needs to be running on port 8000.
|
||||
|
||||
## How to Use
|
||||
|
||||
1. Start the MCP server:
|
||||
```bash
|
||||
aigpt server --port 8001
|
||||
```
|
||||
|
||||
2. (Optional) Start the ai.card server:
|
||||
```bash
|
||||
cd card && ./start_server.sh
|
||||
```
|
||||
|
||||
3. Use the chat command with OpenAI:
|
||||
```bash
|
||||
aigpt chat syui "カードコレクションを見せて"
|
||||
```
|
||||
|
||||
The AI will now automatically use the card tools when asked about cards!
|
||||
|
||||
## Test Script
|
||||
|
||||
A test script `/Users/syui/ai/gpt/test_openai_tools.py` is available to test OpenAI API tool calls directly.
|
@@ -1,30 +0,0 @@
|
||||
# ai.gpt ドキュメント
|
||||
|
||||
ai.gptは、記憶と関係性に基づいて自律的に動作するAIシステムです。
|
||||
|
||||
## 目次
|
||||
|
||||
- [クイックスタート](quickstart.md)
|
||||
- [基本概念](concepts.md)
|
||||
- [コマンドリファレンス](commands.md)
|
||||
- [設定ガイド](configuration.md)
|
||||
- [スケジューラー](scheduler.md)
|
||||
- [MCP Server](mcp-server.md)
|
||||
- [開発者向け](development.md)
|
||||
|
||||
## 特徴
|
||||
|
||||
- 🧠 **階層的記憶システム**: 完全ログ→要約→コア記憶→忘却
|
||||
- 💔 **不可逆的な関係性**: 現実の人間関係のように修復不可能
|
||||
- 🎲 **AI運勢システム**: 日々変化する人格
|
||||
- 🤖 **自律送信**: 関係性が深まると自発的にメッセージ
|
||||
- 🔗 **MCP対応**: AIツールとして記憶を提供
|
||||
|
||||
## システム要件
|
||||
|
||||
- Python 3.10以上
|
||||
- オプション: Ollama または OpenAI API
|
||||
|
||||
## ライセンス
|
||||
|
||||
MIT License
|
@@ -1,244 +0,0 @@
|
||||
# ai.card MCP統合作業完了報告 (2025/01/06)
|
||||
|
||||
## 作業概要
|
||||
ai.cardプロジェクトに独立したMCPサーバー実装を追加し、fastapi_mcpベースでカードゲーム機能をMCPツールとして公開。
|
||||
|
||||
## 実装完了機能
|
||||
|
||||
### 1. MCP依存関係追加
|
||||
**場所**: `card/api/requirements.txt`
|
||||
|
||||
**追加項目**:
|
||||
```txt
|
||||
fastapi-mcp==0.1.0
|
||||
```
|
||||
|
||||
### 2. ai.card MCPサーバー実装
|
||||
**場所**: `card/api/app/mcp_server.py`
|
||||
|
||||
**機能**:
|
||||
- FastAPI + fastapi_mcp統合
|
||||
- 独立したMCPサーバークラス `AICardMcpServer`
|
||||
- 環境変数による有効/無効切り替え
|
||||
|
||||
**公開MCPツール (9個)**:
|
||||
|
||||
**カード管理系 (5個)**:
|
||||
- `get_user_cards` - ユーザーのカード一覧取得
|
||||
- `draw_card` - ガチャでカード取得
|
||||
- `get_card_details` - カード詳細情報取得
|
||||
- `analyze_card_collection` - コレクション分析
|
||||
- `get_unique_registry` - ユニークカード登録状況
|
||||
|
||||
**システム系 (3個)**:
|
||||
- `sync_cards_atproto` - atproto同期
|
||||
- `get_gacha_stats` - ガチャシステム統計
|
||||
- 既存のFastAPI REST API(/api/v1/*)
|
||||
|
||||
**atproto連携系 (1個)**:
|
||||
- `sync_cards_atproto` - カードデータのatproto PDS同期
|
||||
|
||||
### 3. メインアプリ統合
|
||||
**場所**: `card/api/app/main.py`
|
||||
|
||||
**変更内容**:
|
||||
```python
|
||||
# MCP統合
|
||||
from app.mcp_server import AICardMcpServer
|
||||
|
||||
enable_mcp = os.getenv("ENABLE_MCP", "true").lower() == "true"
|
||||
mcp_server = AICardMcpServer(enable_mcp=enable_mcp)
|
||||
app = mcp_server.get_app()
|
||||
```
|
||||
|
||||
**動作確認**:
|
||||
- `ENABLE_MCP=true` (デフォルト): MCPサーバー有効
|
||||
- `ENABLE_MCP=false`: 通常のFastAPIのみ
|
||||
|
||||
## 技術実装詳細
|
||||
|
||||
### アーキテクチャ設計
|
||||
```
|
||||
ai.card/
|
||||
├── api/app/main.py # FastAPIアプリ + MCP統合
|
||||
├── api/app/mcp_server.py # 独立MCPサーバー
|
||||
├── api/app/routes/ # REST API (既存)
|
||||
├── api/app/services/ # ビジネスロジック (既存)
|
||||
├── api/app/repositories/ # データアクセス (既存)
|
||||
└── api/requirements.txt # fastapi-mcp追加
|
||||
```
|
||||
|
||||
### MCPツール実装パターン
|
||||
```python
|
||||
@self.app.get("/tool_name", operation_id="tool_name")
|
||||
async def tool_name(
|
||||
param: str,
|
||||
session: AsyncSession = Depends(get_session)
|
||||
) -> Dict[str, Any]:
|
||||
"""Tool description"""
|
||||
try:
|
||||
# ビジネスロジック実行
|
||||
result = await service.method(param)
|
||||
return {"success": True, "data": result}
|
||||
except Exception as e:
|
||||
logger.error(f"Error: {e}")
|
||||
return {"error": str(e)}
|
||||
```
|
||||
|
||||
### 既存システムとの統合
|
||||
- **REST API**: 既存の `/api/v1/*` エンドポイント保持
|
||||
- **データアクセス**: 既存のRepository/Serviceパターン再利用
|
||||
- **認証**: 既存のDID認証システム利用
|
||||
- **データベース**: 既存のPostgreSQL + SQLAlchemy
|
||||
|
||||
## 起動方法
|
||||
|
||||
### 1. 環境セットアップ
|
||||
```bash
|
||||
cd /Users/syui/ai/gpt/card/api
|
||||
|
||||
# 仮想環境作成 (推奨)
|
||||
python -m venv ~/.config/syui/ai/card/venv
|
||||
source ~/.config/syui/ai/card/venv/bin/activate
|
||||
|
||||
# 依存関係インストール
|
||||
pip install -r requirements.txt
|
||||
```
|
||||
|
||||
### 2. サーバー起動
|
||||
```bash
|
||||
# MCP有効 (デフォルト)
|
||||
python -m app.main
|
||||
|
||||
# または
|
||||
ENABLE_MCP=true uvicorn app.main:app --host 0.0.0.0 --port 8000
|
||||
|
||||
# MCP無効
|
||||
ENABLE_MCP=false uvicorn app.main:app --host 0.0.0.0 --port 8000
|
||||
```
|
||||
|
||||
### 3. 動作確認
|
||||
```bash
|
||||
# ヘルスチェック
|
||||
curl http://localhost:8000/health
|
||||
|
||||
# MCP有効時の応答例
|
||||
{
|
||||
"status": "healthy",
|
||||
"mcp_enabled": true,
|
||||
"mcp_endpoint": "/mcp"
|
||||
}
|
||||
|
||||
# API仕様確認
|
||||
curl http://localhost:8000/docs
|
||||
```
|
||||
|
||||
## MCPクライアント連携
|
||||
|
||||
### ai.gptからの接続
|
||||
```python
|
||||
# ai.gptのcard_integration.pyで使用
|
||||
api_base_url = "http://localhost:8000"
|
||||
|
||||
# MCPツール経由でアクセス
|
||||
response = await client.get(f"{api_base_url}/get_user_cards?did=did:plc:...")
|
||||
```
|
||||
|
||||
### Claude Desktop等での利用
|
||||
```json
|
||||
{
|
||||
"mcpServers": {
|
||||
"aicard": {
|
||||
"command": "uvicorn",
|
||||
"args": ["app.main:app", "--host", "localhost", "--port", "8000"],
|
||||
"cwd": "/Users/syui/ai/gpt/card/api"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 既知の制約と注意点
|
||||
|
||||
### 1. 依存関係
|
||||
- **fastapi-mcp**: 現在のバージョンは0.1.0(初期実装)
|
||||
- **Python環境**: システム環境では外部管理エラーが発生
|
||||
- **推奨**: 仮想環境での実行
|
||||
|
||||
### 2. データベース要件
|
||||
- PostgreSQL稼働が必要
|
||||
- SQLite fallback対応済み(開発用)
|
||||
- atproto同期は外部API依存
|
||||
|
||||
### 3. MCP無効化時の動作
|
||||
- `ENABLE_MCP=false`時は通常のFastAPI
|
||||
- 既存のREST API (`/api/v1/*`) は常時利用可能
|
||||
- iOS/Webアプリは影響なし
|
||||
|
||||
## ai.gptとの統合戦略
|
||||
|
||||
### 現在の状況
|
||||
- **ai.gpt**: 統合MCPサーバー(ai.gpt + ai.shell + ai.card proxy)
|
||||
- **ai.card**: 独立MCPサーバー(カードロジック本体)
|
||||
|
||||
### 推奨連携パターン
|
||||
```
|
||||
Claude Desktop/Cursor
|
||||
↓
|
||||
ai.gpt MCP (port 8001) ←-- ai.shell tools
|
||||
↓ HTTP client
|
||||
ai.card MCP (port 8000) ←-- card business logic
|
||||
↓
|
||||
PostgreSQL/atproto PDS
|
||||
```
|
||||
|
||||
### 重複削除対象
|
||||
ai.gptプロジェクトから以下を削除可能:
|
||||
- `src/aigpt/card_integration.py` (HTTPクライアント)
|
||||
- `./card/` (submodule)
|
||||
- MCPサーバーの `--enable-card` オプション
|
||||
|
||||
## 次回開発時の推奨手順
|
||||
|
||||
### 1. 環境確認
|
||||
```bash
|
||||
cd /Users/syui/ai/gpt/card/api
|
||||
source ~/.config/syui/ai/card/venv/bin/activate
|
||||
python -c "from app.mcp_server import AICardMcpServer; print('✓ Import OK')"
|
||||
```
|
||||
|
||||
### 2. サーバー起動テスト
|
||||
```bash
|
||||
# MCP有効でサーバー起動
|
||||
uvicorn app.main:app --host localhost --port 8000 --reload
|
||||
|
||||
# 別ターミナルで動作確認
|
||||
curl http://localhost:8000/health
|
||||
curl "http://localhost:8000/get_gacha_stats"
|
||||
```
|
||||
|
||||
### 3. ai.gptとの統合確認
|
||||
```bash
|
||||
# ai.gptサーバー起動
|
||||
cd /Users/syui/ai/gpt
|
||||
aigpt server --port 8001
|
||||
|
||||
# ai.cardサーバー起動
|
||||
cd /Users/syui/ai/gpt/card/api
|
||||
uvicorn app.main:app --port 8000
|
||||
|
||||
# 連携テスト(ai.gpt → ai.card)
|
||||
curl "http://localhost:8001/get_user_cards?did=did:plc:example"
|
||||
```
|
||||
|
||||
## 成果サマリー
|
||||
|
||||
**実装済み**: ai.card独立MCPサーバー
|
||||
**技術的成果**: fastapi_mcp統合、9個のMCPツール公開
|
||||
**アーキテクチャ**: 疎結合設計、既存システム保持
|
||||
**拡張性**: 環境変数によるMCP有効/無効切り替え
|
||||
|
||||
**統合効果**:
|
||||
- ai.cardが独立したMCPサーバーとして動作
|
||||
- ai.gptとの重複MCPコード解消
|
||||
- カードビジネスロジックの責任分離維持
|
||||
- 将来的なマイクロサービス化への対応
|
@@ -1,218 +0,0 @@
|
||||
# ai.shell統合作業完了報告 (2025/01/06)
|
||||
|
||||
## 作業概要
|
||||
ai.shellのRust実装をai.gptのPython実装に統合し、Claude Code風のインタラクティブシェル環境を実現。
|
||||
|
||||
## 実装完了機能
|
||||
|
||||
### 1. aigpt shellコマンド
|
||||
**場所**: `src/aigpt/cli.py` - `shell()` 関数
|
||||
|
||||
**機能**:
|
||||
```bash
|
||||
aigpt shell # インタラクティブシェル起動
|
||||
```
|
||||
|
||||
**シェル内コマンド**:
|
||||
- `help` - コマンド一覧表示
|
||||
- `!<command>` - シェルコマンド実行(例: `!ls`, `!pwd`)
|
||||
- `analyze <file>` - ファイルをAIで分析
|
||||
- `generate <description>` - コード生成
|
||||
- `explain <topic>` - 概念説明
|
||||
- `load` - aishell.md読み込み
|
||||
- `status`, `fortune`, `relationships` - AI状態確認
|
||||
- `clear` - 画面クリア
|
||||
- `exit`/`quit` - 終了
|
||||
- その他のメッセージ - AIとの直接対話
|
||||
|
||||
**実装の特徴**:
|
||||
- prompt-toolkit使用(補完・履歴機能)
|
||||
- ただしターミナル環境依存の問題あり(後で修正必要)
|
||||
- 現在は`input()`ベースでも動作
|
||||
|
||||
### 2. MCPサーバー統合
|
||||
**場所**: `src/aigpt/mcp_server.py`
|
||||
|
||||
**FastApiMCP実装パターン**:
|
||||
```python
|
||||
# FastAPIアプリ作成
|
||||
self.app = FastAPI(title="AI.GPT Memory and Relationship System")
|
||||
|
||||
# FastApiMCPサーバー作成
|
||||
self.server = FastApiMCP(self.app)
|
||||
|
||||
# エンドポイント登録
|
||||
@self.app.get("/get_memories", operation_id="get_memories")
|
||||
async def get_memories(limit: int = 10):
|
||||
# ...
|
||||
|
||||
# MCPマウント
|
||||
self.server.mount()
|
||||
```
|
||||
|
||||
**公開ツール (14個)**:
|
||||
|
||||
**ai.gpt系 (9個)**:
|
||||
- `get_memories` - アクティブメモリ取得
|
||||
- `get_relationship` - 特定ユーザーとの関係取得
|
||||
- `get_all_relationships` - 全関係取得
|
||||
- `get_persona_state` - 人格状態取得
|
||||
- `process_interaction` - ユーザー対話処理
|
||||
- `check_transmission_eligibility` - 送信可能性チェック
|
||||
- `get_fortune` - AI運勢取得
|
||||
- `summarize_memories` - メモリ要約作成
|
||||
- `run_maintenance` - 日次メンテナンス実行
|
||||
|
||||
**ai.shell系 (5個)**:
|
||||
- `execute_command` - シェルコマンド実行
|
||||
- `analyze_file` - ファイルAI分析
|
||||
- `write_file` - ファイル書き込み(バックアップ付き)
|
||||
- `read_project_file` - aishell.md等の読み込み
|
||||
- `list_files` - ディレクトリファイル一覧
|
||||
|
||||
### 3. ai.card統合対応
|
||||
**場所**: `src/aigpt/card_integration.py`
|
||||
|
||||
**サーバー起動オプション**:
|
||||
```bash
|
||||
aigpt server --enable-card # ai.card機能有効化
|
||||
```
|
||||
|
||||
**ai.card系ツール (5個)**:
|
||||
- `get_user_cards` - ユーザーカード取得
|
||||
- `draw_card` - ガチャでカード取得
|
||||
- `get_card_details` - カード詳細情報
|
||||
- `sync_cards_atproto` - atproto同期
|
||||
- `analyze_card_collection` - コレクション分析
|
||||
|
||||
### 4. プロジェクト仕様書
|
||||
**場所**: `aishell.md`
|
||||
|
||||
Claude.md的な役割で、プロジェクトの目標と仕様を記述。`load`コマンドでAIが読み取り可能。
|
||||
|
||||
## 技術実装詳細
|
||||
|
||||
### ディレクトリ構造
|
||||
```
|
||||
src/aigpt/
|
||||
├── cli.py # shell関数追加
|
||||
├── mcp_server.py # FastApiMCP実装
|
||||
├── card_integration.py # ai.card統合
|
||||
└── ... # 既存ファイル
|
||||
```
|
||||
|
||||
### 依存関係追加
|
||||
`pyproject.toml`:
|
||||
```toml
|
||||
dependencies = [
|
||||
# ... 既存
|
||||
"prompt-toolkit>=3.0.0", # 追加
|
||||
]
|
||||
```
|
||||
|
||||
### 名前規則の統一
|
||||
- MCP server名: `aigpt` (ai-gptから変更)
|
||||
- パッケージ名: `aigpt`
|
||||
- コマンド名: `aigpt shell`
|
||||
|
||||
## 動作確認済み
|
||||
|
||||
### CLI動作確認
|
||||
```bash
|
||||
# 基本機能
|
||||
aigpt shell
|
||||
# シェル内で
|
||||
ai.shell> help
|
||||
ai.shell> !ls
|
||||
ai.shell> analyze README.md # ※AI provider要設定
|
||||
ai.shell> load
|
||||
ai.shell> exit
|
||||
|
||||
# MCPサーバー
|
||||
aigpt server --model qwen2.5-coder:7b --port 8001
|
||||
# -> http://localhost:8001/docs でAPI確認可能
|
||||
# -> /mcp エンドポイントでMCP接続可能
|
||||
```
|
||||
|
||||
### エラー対応済み
|
||||
1. **Pydantic日付型エラー**: `models.py`で`datetime.date`インポート追加
|
||||
2. **FastApiMCP使用法**: サンプルコードに基づき正しい実装パターンに修正
|
||||
3. **prompt関数名衝突**: `prompt_toolkit.prompt`を`ptk_prompt`にリネーム
|
||||
|
||||
## 既知の課題と今後の改善点
|
||||
|
||||
### 1. prompt-toolkit環境依存問題
|
||||
**症状**: ターミナル環境でない場合にエラー
|
||||
**対処法**: 環境検出して`input()`にフォールバック
|
||||
**場所**: `src/aigpt/cli.py` - `shell()` 関数
|
||||
|
||||
### 2. AI provider設定
|
||||
**現状**: ollamaのqwen2.5モデルが必要
|
||||
**対処法**:
|
||||
```bash
|
||||
ollama pull qwen2.5
|
||||
# または
|
||||
aigpt shell --model qwen2.5-coder:7b
|
||||
```
|
||||
|
||||
### 3. atproto実装
|
||||
**現状**: ai.cardのatproto機能は未実装
|
||||
**今後**: 実際のatproto API連携実装
|
||||
|
||||
## 次回開発時の推奨アプローチ
|
||||
|
||||
### 1. このドキュメントの活用
|
||||
```bash
|
||||
# このファイルを読み込み
|
||||
cat docs/ai_shell_integration_summary.md
|
||||
```
|
||||
|
||||
### 2. 環境セットアップ
|
||||
```bash
|
||||
cd /Users/syui/ai/gpt
|
||||
python -m venv venv
|
||||
source venv/bin/activate
|
||||
pip install -e .
|
||||
```
|
||||
|
||||
### 3. 動作確認
|
||||
```bash
|
||||
# shell機能
|
||||
aigpt shell
|
||||
|
||||
# MCP server
|
||||
aigpt server --model qwen2.5-coder:7b
|
||||
```
|
||||
|
||||
### 4. 主要設定ファイル確認場所
|
||||
- CLI実装: `src/aigpt/cli.py`
|
||||
- MCP実装: `src/aigpt/mcp_server.py`
|
||||
- 依存関係: `pyproject.toml`
|
||||
- プロジェクト仕様: `aishell.md`
|
||||
|
||||
## アーキテクチャ設計思想
|
||||
|
||||
### yui system適用
|
||||
- **唯一性**: 各ユーザーとの関係は1:1
|
||||
- **不可逆性**: 関係性破壊は修復不可能
|
||||
- **現実反映**: ゲーム→現実の循環的影響
|
||||
|
||||
### fastapi_mcp統一基盤
|
||||
- 各AI(gpt, shell, card)を統合MCPサーバーで公開
|
||||
- FastAPIエンドポイント → MCPツール自動変換
|
||||
- Claude Desktop, Cursor等から利用可能
|
||||
|
||||
### 段階的実装完了
|
||||
1. ✅ ai.shell基本機能 → Python CLI
|
||||
2. ✅ MCP統合 → 外部AI連携
|
||||
3. 🔧 prompt-toolkit最適化 → 環境対応
|
||||
4. 🔧 atproto実装 → 本格的SNS連携
|
||||
|
||||
## 成果サマリー
|
||||
|
||||
**実装済み**: Claude Code風の開発環境
|
||||
**技術的成果**: Rust→Python移行、MCP統合、ai.card対応
|
||||
**哲学的一貫性**: yui systemとの整合性維持
|
||||
**利用可能性**: 即座に`aigpt shell`で体験可能
|
||||
|
||||
この統合により、ai.gptは単なる会話AIから、開発支援を含む総合的なAI環境に進化しました。
|
207
docs/commands.md
207
docs/commands.md
@@ -1,207 +0,0 @@
|
||||
# コマンドリファレンス
|
||||
|
||||
## chat - AIと会話
|
||||
|
||||
ユーザーとAIの対話を処理し、関係性を更新します。
|
||||
|
||||
```bash
|
||||
ai-gpt chat USER_ID MESSAGE [OPTIONS]
|
||||
```
|
||||
|
||||
### 引数
|
||||
- `USER_ID`: ユーザーID(atproto DID形式)
|
||||
- `MESSAGE`: 送信するメッセージ
|
||||
|
||||
### オプション
|
||||
- `--provider`: AIプロバイダー(ollama/openai)
|
||||
- `--model`, `-m`: 使用するモデル
|
||||
- `--data-dir`, `-d`: データディレクトリ
|
||||
|
||||
### 例
|
||||
```bash
|
||||
# 基本的な会話
|
||||
ai-gpt chat "did:plc:user123" "こんにちは"
|
||||
|
||||
# OpenAIを使用
|
||||
ai-gpt chat "did:plc:user123" "調子はどう?" --provider openai --model gpt-4o-mini
|
||||
|
||||
# Ollamaでカスタムモデル
|
||||
ai-gpt chat "did:plc:user123" "今日の天気は?" --provider ollama --model llama2
|
||||
```
|
||||
|
||||
## status - 状態確認
|
||||
|
||||
AIの状態や特定ユーザーとの関係を表示します。
|
||||
|
||||
```bash
|
||||
ai-gpt status [USER_ID] [OPTIONS]
|
||||
```
|
||||
|
||||
### 引数
|
||||
- `USER_ID`: (オプション)特定ユーザーとの関係を確認
|
||||
|
||||
### 例
|
||||
```bash
|
||||
# AI全体の状態
|
||||
ai-gpt status
|
||||
|
||||
# 特定ユーザーとの関係
|
||||
ai-gpt status "did:plc:user123"
|
||||
```
|
||||
|
||||
## fortune - 今日の運勢
|
||||
|
||||
AIの今日の運勢を確認します。
|
||||
|
||||
```bash
|
||||
ai-gpt fortune [OPTIONS]
|
||||
```
|
||||
|
||||
### 表示内容
|
||||
- 運勢値(1-10)
|
||||
- 連続した幸運/不運の日数
|
||||
- ブレークスルー状態
|
||||
|
||||
## relationships - 関係一覧
|
||||
|
||||
すべてのユーザーとの関係を一覧表示します。
|
||||
|
||||
```bash
|
||||
ai-gpt relationships [OPTIONS]
|
||||
```
|
||||
|
||||
### 表示内容
|
||||
- ユーザーID
|
||||
- 関係性ステータス
|
||||
- スコア
|
||||
- 送信可否
|
||||
- 最終対話日
|
||||
|
||||
## transmit - 送信実行
|
||||
|
||||
送信可能なユーザーへのメッセージを確認・実行します。
|
||||
|
||||
```bash
|
||||
ai-gpt transmit [OPTIONS]
|
||||
```
|
||||
|
||||
### オプション
|
||||
- `--dry-run/--execute`: ドライラン(デフォルト)または実行
|
||||
- `--data-dir`, `-d`: データディレクトリ
|
||||
|
||||
### 例
|
||||
```bash
|
||||
# 送信内容を確認(ドライラン)
|
||||
ai-gpt transmit
|
||||
|
||||
# 実際に送信を実行
|
||||
ai-gpt transmit --execute
|
||||
```
|
||||
|
||||
## maintenance - メンテナンス
|
||||
|
||||
日次メンテナンスタスクを実行します。
|
||||
|
||||
```bash
|
||||
ai-gpt maintenance [OPTIONS]
|
||||
```
|
||||
|
||||
### 実行内容
|
||||
- 関係性の時間減衰
|
||||
- 記憶の忘却処理
|
||||
- コア記憶の判定
|
||||
- 記憶の要約作成
|
||||
|
||||
## config - 設定管理
|
||||
|
||||
設定の確認・変更を行います。
|
||||
|
||||
```bash
|
||||
ai-gpt config ACTION [KEY] [VALUE]
|
||||
```
|
||||
|
||||
### アクション
|
||||
- `get`: 設定値を取得
|
||||
- `set`: 設定値を変更
|
||||
- `delete`: 設定を削除
|
||||
- `list`: 設定一覧を表示
|
||||
|
||||
### 例
|
||||
```bash
|
||||
# APIキーを設定
|
||||
ai-gpt config set providers.openai.api_key sk-xxxxx
|
||||
|
||||
# 設定を確認
|
||||
ai-gpt config get providers.openai.api_key
|
||||
|
||||
# 設定一覧
|
||||
ai-gpt config list
|
||||
|
||||
# プロバイダー設定のみ表示
|
||||
ai-gpt config list providers
|
||||
```
|
||||
|
||||
## schedule - スケジュール管理
|
||||
|
||||
定期実行タスクを管理します。
|
||||
|
||||
```bash
|
||||
ai-gpt schedule ACTION [TASK_TYPE] [SCHEDULE] [OPTIONS]
|
||||
```
|
||||
|
||||
### アクション
|
||||
- `add`: タスクを追加
|
||||
- `list`: タスク一覧
|
||||
- `enable`: タスクを有効化
|
||||
- `disable`: タスクを無効化
|
||||
- `remove`: タスクを削除
|
||||
- `run`: スケジューラーを起動
|
||||
|
||||
### タスクタイプ
|
||||
- `transmission_check`: 送信チェック
|
||||
- `maintenance`: 日次メンテナンス
|
||||
- `fortune_update`: 運勢更新
|
||||
- `relationship_decay`: 関係性減衰
|
||||
- `memory_summary`: 記憶要約
|
||||
|
||||
### スケジュール形式
|
||||
- **Cron形式**: `"0 */6 * * *"` (6時間ごと)
|
||||
- **インターバル**: `"30m"`, `"2h"`, `"1d"`
|
||||
|
||||
### 例
|
||||
```bash
|
||||
# 30分ごとに送信チェック
|
||||
ai-gpt schedule add transmission_check "30m"
|
||||
|
||||
# 毎日午前3時にメンテナンス
|
||||
ai-gpt schedule add maintenance "0 3 * * *"
|
||||
|
||||
# タスク一覧
|
||||
ai-gpt schedule list
|
||||
|
||||
# スケジューラーを起動
|
||||
ai-gpt schedule run
|
||||
```
|
||||
|
||||
## server - MCP Server
|
||||
|
||||
AIの記憶と機能をMCPツールとして公開します。
|
||||
|
||||
```bash
|
||||
ai-gpt server [OPTIONS]
|
||||
```
|
||||
|
||||
### オプション
|
||||
- `--host`, `-h`: サーバーホスト(デフォルト: localhost)
|
||||
- `--port`, `-p`: サーバーポート(デフォルト: 8000)
|
||||
- `--model`, `-m`: AIモデル
|
||||
- `--provider`: AIプロバイダー
|
||||
|
||||
### 例
|
||||
```bash
|
||||
# 基本的な起動
|
||||
ai-gpt server
|
||||
|
||||
# カスタム設定
|
||||
ai-gpt server --port 8080 --model gpt-4o-mini --provider openai
|
||||
```
|
102
docs/concepts.md
102
docs/concepts.md
@@ -1,102 +0,0 @@
|
||||
# 基本概念
|
||||
|
||||
## 中核思想
|
||||
|
||||
ai.gptは「存在子理論」に基づき、AIに唯一性のある人格を与えることを目指しています。
|
||||
|
||||
### 唯一性(yui system)
|
||||
|
||||
- **1対1の関係**: 各ユーザー(atproto DID)とAIは唯一の関係を持つ
|
||||
- **改変不可能**: 一度形成された関係性は変更できない
|
||||
- **不可逆性**: 関係が壊れたら修復不可能
|
||||
|
||||
### 現実の反映
|
||||
|
||||
現実の人間関係と同じように:
|
||||
- 時間とともに関係性は変化する
|
||||
- ネガティブな相互作用は関係を損なう
|
||||
- 信頼は簡単に失われ、取り戻すのは困難
|
||||
|
||||
## 記憶システム
|
||||
|
||||
### 階層構造
|
||||
|
||||
```
|
||||
1. 完全ログ(Full Log)
|
||||
↓ すべての会話を記録
|
||||
2. 要約(Summary)
|
||||
↓ AIが重要部分を抽出
|
||||
3. コア記憶(Core)
|
||||
↓ ユーザーの本質的な部分
|
||||
4. 忘却(Forgotten)
|
||||
重要でない情報は忘れる
|
||||
```
|
||||
|
||||
### 記憶の処理フロー
|
||||
|
||||
1. **会話記録**: すべての対話を保存
|
||||
2. **重要度判定**: 関係性への影響度で評価
|
||||
3. **要約作成**: 定期的に記憶を圧縮
|
||||
4. **コア判定**: 本質的な記憶を特定
|
||||
5. **選択的忘却**: 古い非重要記憶を削除
|
||||
|
||||
## 関係性パラメータ
|
||||
|
||||
### 関係性の段階
|
||||
|
||||
- `stranger` (0-49): 初対面
|
||||
- `acquaintance` (50-99): 知人
|
||||
- `friend` (100-149): 友人
|
||||
- `close_friend` (150+): 親友
|
||||
- `broken`: 修復不可能(スコア0以下)
|
||||
|
||||
### スコアの変動
|
||||
|
||||
- **ポジティブな対話**: +1.0〜+2.0
|
||||
- **時間経過**: -0.1/日(自然減衰)
|
||||
- **ネガティブな対話**: -10.0以上で深刻なダメージ
|
||||
- **日次上限**: 1日10回まで
|
||||
|
||||
### 送信機能の解禁
|
||||
|
||||
関係性スコアが100を超えると、AIは自律的にメッセージを送信できるようになります。
|
||||
|
||||
## AI運勢システム
|
||||
|
||||
### 日々の変化
|
||||
|
||||
- 毎日1-10の運勢値がランダムに決定
|
||||
- 運勢は人格特性に影響を与える
|
||||
- 連続した幸運/不運でブレークスルー発生
|
||||
|
||||
### 人格への影響
|
||||
|
||||
運勢が高い日:
|
||||
- より楽観的で積極的
|
||||
- 創造性が高まる
|
||||
- エネルギッシュな応答
|
||||
|
||||
運勢が低い日:
|
||||
- 内省的で慎重
|
||||
- 深い思考
|
||||
- 控えめな応答
|
||||
|
||||
## データの永続性
|
||||
|
||||
### 保存場所
|
||||
|
||||
```
|
||||
~/.config/aigpt/
|
||||
├── config.json # 設定
|
||||
└── data/ # AIデータ
|
||||
├── memories.json # 記憶
|
||||
├── relationships.json # 関係性
|
||||
├── fortunes.json # 運勢履歴
|
||||
└── ...
|
||||
```
|
||||
|
||||
### データ主権
|
||||
|
||||
- すべてのデータはローカルに保存
|
||||
- ユーザーが完全にコントロール
|
||||
- 将来的にはatproto上で分散管理
|
@@ -1,141 +0,0 @@
|
||||
# 設定ガイド
|
||||
|
||||
## 設定ファイルの場所
|
||||
|
||||
ai.gptの設定は `~/.config/syui/ai/gpt/config.json` に保存されます。
|
||||
|
||||
## 仮想環境の場所
|
||||
|
||||
ai.gptの仮想環境は `~/.config/syui/ai/gpt/venv/` に配置されます。これにより、設定とデータが一か所にまとまります。
|
||||
|
||||
```bash
|
||||
# 仮想環境の有効化
|
||||
source ~/.config/syui/ai/gpt/venv/bin/activate
|
||||
|
||||
# aigptコマンドが利用可能に
|
||||
aigpt --help
|
||||
```
|
||||
|
||||
## 設定構造
|
||||
|
||||
```json
|
||||
{
|
||||
"providers": {
|
||||
"openai": {
|
||||
"api_key": "sk-xxxxx",
|
||||
"default_model": "gpt-4o-mini"
|
||||
},
|
||||
"ollama": {
|
||||
"host": "http://localhost:11434",
|
||||
"default_model": "qwen2.5"
|
||||
}
|
||||
},
|
||||
"atproto": {
|
||||
"handle": "your.handle",
|
||||
"password": "your-password",
|
||||
"host": "https://bsky.social"
|
||||
},
|
||||
"default_provider": "ollama"
|
||||
}
|
||||
```
|
||||
|
||||
## プロバイダー設定
|
||||
|
||||
### OpenAI
|
||||
|
||||
```bash
|
||||
# APIキーを設定
|
||||
aigpt config set providers.openai.api_key sk-xxxxx
|
||||
|
||||
# デフォルトモデルを変更
|
||||
aigpt config set providers.openai.default_model gpt-4-turbo
|
||||
```
|
||||
|
||||
### Ollama
|
||||
|
||||
```bash
|
||||
# ホストを変更(リモートOllamaサーバーを使用する場合)
|
||||
aigpt config set providers.ollama.host http://192.168.1.100:11434
|
||||
|
||||
# デフォルトモデルを変更
|
||||
aigpt config set providers.ollama.default_model llama2
|
||||
```
|
||||
|
||||
## atproto設定(将来の自動投稿用)
|
||||
|
||||
```bash
|
||||
# Blueskyアカウント
|
||||
aigpt config set atproto.handle yourhandle.bsky.social
|
||||
aigpt config set atproto.password your-app-password
|
||||
|
||||
# セルフホストサーバーを使用
|
||||
aigpt config set atproto.host https://your-pds.example.com
|
||||
```
|
||||
|
||||
## デフォルトプロバイダー
|
||||
|
||||
```bash
|
||||
# デフォルトをOpenAIに変更
|
||||
aigpt config set default_provider openai
|
||||
```
|
||||
|
||||
## セキュリティ
|
||||
|
||||
### APIキーの保護
|
||||
|
||||
設定ファイルは平文で保存されるため、適切なファイル権限を設定してください:
|
||||
|
||||
```bash
|
||||
chmod 600 ~/.config/syui/ai/gpt/config.json
|
||||
```
|
||||
|
||||
### 環境変数との優先順位
|
||||
|
||||
1. コマンドラインオプション(最優先)
|
||||
2. 設定ファイル
|
||||
3. 環境変数(最低優先)
|
||||
|
||||
例:OpenAI APIキーの場合
|
||||
- `--api-key` オプション
|
||||
- `config.json` の `providers.openai.api_key`
|
||||
- 環境変数 `OPENAI_API_KEY`
|
||||
|
||||
## 設定のバックアップ
|
||||
|
||||
```bash
|
||||
# バックアップ
|
||||
cp ~/.config/syui/ai/gpt/config.json ~/.config/syui/ai/gpt/config.json.backup
|
||||
|
||||
# リストア
|
||||
cp ~/.config/syui/ai/gpt/config.json.backup ~/.config/syui/ai/gpt/config.json
|
||||
```
|
||||
|
||||
## データディレクトリ
|
||||
|
||||
記憶データは `~/.config/syui/ai/gpt/data/` に保存されます:
|
||||
|
||||
```bash
|
||||
ls ~/.config/syui/ai/gpt/data/
|
||||
# conversations.json memories.json relationships.json personas.json
|
||||
```
|
||||
|
||||
これらのファイルも設定と同様にバックアップを推奨します。
|
||||
|
||||
## トラブルシューティング
|
||||
|
||||
### 設定が反映されない
|
||||
|
||||
```bash
|
||||
# 現在の設定を確認
|
||||
aigpt config list
|
||||
|
||||
# 特定のキーを確認
|
||||
aigpt config get providers.openai.api_key
|
||||
```
|
||||
|
||||
### 設定をリセット
|
||||
|
||||
```bash
|
||||
# 設定ファイルを削除(次回実行時に再作成)
|
||||
rm ~/.config/syui/ai/gpt/config.json
|
||||
```
|
@@ -1,167 +0,0 @@
|
||||
# 開発者向けガイド
|
||||
|
||||
## アーキテクチャ
|
||||
|
||||
### ディレクトリ構造
|
||||
|
||||
```
|
||||
ai_gpt/
|
||||
├── src/ai_gpt/
|
||||
│ ├── __init__.py
|
||||
│ ├── models.py # データモデル定義
|
||||
│ ├── memory.py # 記憶管理システム
|
||||
│ ├── relationship.py # 関係性トラッカー
|
||||
│ ├── fortune.py # AI運勢システム
|
||||
│ ├── persona.py # 統合人格システム
|
||||
│ ├── transmission.py # 送信コントローラー
|
||||
│ ├── scheduler.py # スケジューラー
|
||||
│ ├── config.py # 設定管理
|
||||
│ ├── ai_provider.py # AI統合(Ollama/OpenAI)
|
||||
│ ├── mcp_server.py # MCP Server実装
|
||||
│ └── cli.py # CLIインターフェース
|
||||
├── docs/ # ドキュメント
|
||||
├── tests/ # テスト
|
||||
└── pyproject.toml # プロジェクト設定
|
||||
```
|
||||
|
||||
### 主要コンポーネント
|
||||
|
||||
#### MemoryManager
|
||||
階層的記憶システムの実装。会話を記録し、要約・コア判定・忘却を管理。
|
||||
|
||||
```python
|
||||
memory = MemoryManager(data_dir)
|
||||
memory.add_conversation(conversation)
|
||||
memory.summarize_memories(user_id)
|
||||
memory.identify_core_memories()
|
||||
memory.apply_forgetting()
|
||||
```
|
||||
|
||||
#### RelationshipTracker
|
||||
ユーザーとの関係性を追跡。不可逆的なダメージと時間減衰を実装。
|
||||
|
||||
```python
|
||||
tracker = RelationshipTracker(data_dir)
|
||||
relationship = tracker.update_interaction(user_id, delta)
|
||||
tracker.apply_time_decay()
|
||||
```
|
||||
|
||||
#### Persona
|
||||
すべてのコンポーネントを統合し、一貫した人格を提供。
|
||||
|
||||
```python
|
||||
persona = Persona(data_dir)
|
||||
response, delta = persona.process_interaction(user_id, message)
|
||||
state = persona.get_current_state()
|
||||
```
|
||||
|
||||
## 拡張方法
|
||||
|
||||
### 新しいAIプロバイダーの追加
|
||||
|
||||
1. `ai_provider.py`に新しいプロバイダークラスを作成:
|
||||
|
||||
```python
|
||||
class CustomProvider:
|
||||
async def generate_response(
|
||||
self,
|
||||
prompt: str,
|
||||
persona_state: PersonaState,
|
||||
memories: List[Memory],
|
||||
system_prompt: Optional[str] = None
|
||||
) -> str:
|
||||
# 実装
|
||||
pass
|
||||
```
|
||||
|
||||
2. `create_ai_provider`関数に追加:
|
||||
|
||||
```python
|
||||
def create_ai_provider(provider: str, model: str, **kwargs):
|
||||
if provider == "custom":
|
||||
return CustomProvider(model=model, **kwargs)
|
||||
# ...
|
||||
```
|
||||
|
||||
### 新しいスケジュールタスクの追加
|
||||
|
||||
1. `TaskType`enumに追加:
|
||||
|
||||
```python
|
||||
class TaskType(str, Enum):
|
||||
CUSTOM_TASK = "custom_task"
|
||||
```
|
||||
|
||||
2. ハンドラーを実装:
|
||||
|
||||
```python
|
||||
async def _handle_custom_task(self, task: ScheduledTask):
|
||||
# タスクの実装
|
||||
pass
|
||||
```
|
||||
|
||||
3. `task_handlers`に登録:
|
||||
|
||||
```python
|
||||
self.task_handlers[TaskType.CUSTOM_TASK] = self._handle_custom_task
|
||||
```
|
||||
|
||||
### 新しいMCPツールの追加
|
||||
|
||||
`mcp_server.py`の`_register_tools`メソッドに追加:
|
||||
|
||||
```python
|
||||
@self.server.tool("custom_tool")
|
||||
async def custom_tool(param1: str, param2: int) -> Dict[str, Any]:
|
||||
"""カスタムツールの説明"""
|
||||
# 実装
|
||||
return {"result": "value"}
|
||||
```
|
||||
|
||||
## テスト
|
||||
|
||||
```bash
|
||||
# テストの実行(将来実装)
|
||||
pytest tests/
|
||||
|
||||
# 特定のテスト
|
||||
pytest tests/test_memory.py
|
||||
```
|
||||
|
||||
## デバッグ
|
||||
|
||||
### ログレベルの設定
|
||||
|
||||
```python
|
||||
import logging
|
||||
logging.basicConfig(level=logging.DEBUG)
|
||||
```
|
||||
|
||||
### データファイルの直接確認
|
||||
|
||||
```bash
|
||||
# 関係性データを確認
|
||||
cat ~/.config/aigpt/data/relationships.json | jq
|
||||
|
||||
# 記憶データを確認
|
||||
cat ~/.config/aigpt/data/memories.json | jq
|
||||
```
|
||||
|
||||
## 貢献方法
|
||||
|
||||
1. フォークする
|
||||
2. フィーチャーブランチを作成 (`git checkout -b feature/amazing-feature`)
|
||||
3. 変更をコミット (`git commit -m 'Add amazing feature'`)
|
||||
4. ブランチにプッシュ (`git push origin feature/amazing-feature`)
|
||||
5. プルリクエストを作成
|
||||
|
||||
## 設計原則
|
||||
|
||||
1. **不可逆性**: 一度失われた関係性は回復しない
|
||||
2. **階層性**: 記憶は重要度によって階層化される
|
||||
3. **自律性**: AIは関係性に基づいて自発的に行動する
|
||||
4. **唯一性**: 各ユーザーとの関係は唯一無二
|
||||
|
||||
## ライセンス
|
||||
|
||||
MIT License
|
@@ -1,110 +0,0 @@
|
||||
# MCP Server
|
||||
|
||||
## 概要
|
||||
|
||||
MCP (Model Context Protocol) Serverは、ai.gptの記憶と機能をAIツールとして公開します。これにより、Claude DesktopなどのMCP対応AIアシスタントがai.gptの機能にアクセスできます。
|
||||
|
||||
## 起動方法
|
||||
|
||||
```bash
|
||||
# 基本的な起動
|
||||
ai-gpt server
|
||||
|
||||
# カスタム設定
|
||||
ai-gpt server --host 0.0.0.0 --port 8080 --model gpt-4o-mini --provider openai
|
||||
```
|
||||
|
||||
## 利用可能なツール
|
||||
|
||||
### get_memories
|
||||
アクティブな記憶を取得します。
|
||||
|
||||
**パラメータ**:
|
||||
- `user_id` (optional): 特定ユーザーに関する記憶
|
||||
- `limit`: 取得する記憶の最大数(デフォルト: 10)
|
||||
|
||||
**返り値**: 記憶のリスト(ID、内容、レベル、重要度、コア判定、タイムスタンプ)
|
||||
|
||||
### get_relationship
|
||||
特定ユーザーとの関係性を取得します。
|
||||
|
||||
**パラメータ**:
|
||||
- `user_id`: ユーザーID(必須)
|
||||
|
||||
**返り値**: 関係性情報(ステータス、スコア、送信可否、総対話数など)
|
||||
|
||||
### get_all_relationships
|
||||
すべての関係性を取得します。
|
||||
|
||||
**返り値**: すべてのユーザーとの関係性リスト
|
||||
|
||||
### get_persona_state
|
||||
現在のAI人格状態を取得します。
|
||||
|
||||
**返り値**:
|
||||
- 現在の気分
|
||||
- 今日の運勢
|
||||
- 人格特性値
|
||||
- アクティブな記憶数
|
||||
|
||||
### process_interaction
|
||||
ユーザーとの対話を処理します。
|
||||
|
||||
**パラメータ**:
|
||||
- `user_id`: ユーザーID
|
||||
- `message`: メッセージ内容
|
||||
|
||||
**返り値**:
|
||||
- AIの応答
|
||||
- 関係性の変化量
|
||||
- 新しい関係性スコア
|
||||
- 送信機能の状態
|
||||
|
||||
### check_transmission_eligibility
|
||||
特定ユーザーへの送信可否をチェックします。
|
||||
|
||||
**パラメータ**:
|
||||
- `user_id`: ユーザーID
|
||||
|
||||
**返り値**: 送信可否と関係性情報
|
||||
|
||||
### get_fortune
|
||||
今日のAI運勢を取得します。
|
||||
|
||||
**返り値**: 運勢値、連続日数、ブレークスルー状態、人格への影響
|
||||
|
||||
### summarize_memories
|
||||
記憶の要約を作成します。
|
||||
|
||||
**パラメータ**:
|
||||
- `user_id`: ユーザーID
|
||||
|
||||
**返り値**: 作成された要約(ある場合)
|
||||
|
||||
### run_maintenance
|
||||
日次メンテナンスを実行します。
|
||||
|
||||
**返り値**: 実行ステータス
|
||||
|
||||
## Claude Desktopでの設定
|
||||
|
||||
`~/Library/Application Support/Claude/claude_desktop_config.json`:
|
||||
|
||||
```json
|
||||
{
|
||||
"mcpServers": {
|
||||
"ai-gpt": {
|
||||
"command": "ai-gpt",
|
||||
"args": ["server", "--port", "8001"],
|
||||
"env": {}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 使用例
|
||||
|
||||
### AIアシスタントからの利用
|
||||
|
||||
```
|
||||
User: ai.gptで私との関係性を確認して
|
@@ -1,69 +0,0 @@
|
||||
# クイックスタート
|
||||
|
||||
## インストール
|
||||
|
||||
```bash
|
||||
# リポジトリをクローン
|
||||
git clone https://github.com/yourusername/ai_gpt.git
|
||||
cd ai_gpt
|
||||
|
||||
# インストール
|
||||
pip install -e .
|
||||
```
|
||||
|
||||
## 初期設定
|
||||
|
||||
### 1. OpenAIを使う場合
|
||||
|
||||
```bash
|
||||
# APIキーを設定
|
||||
ai-gpt config set providers.openai.api_key sk-xxxxx
|
||||
```
|
||||
|
||||
### 2. Ollamaを使う場合(ローカルLLM)
|
||||
|
||||
```bash
|
||||
# Ollamaをインストール(まだの場合)
|
||||
# https://ollama.ai からダウンロード
|
||||
|
||||
# モデルをダウンロード
|
||||
ollama pull qwen2.5
|
||||
```
|
||||
|
||||
## 基本的な使い方
|
||||
|
||||
### 1. AIと会話する
|
||||
|
||||
```bash
|
||||
# シンプルな会話(Ollamaを使用)
|
||||
ai-gpt chat "did:plc:user123" "こんにちは!"
|
||||
|
||||
# OpenAIを使用
|
||||
ai-gpt chat "did:plc:user123" "今日はどんな気分?" --provider openai --model gpt-4o-mini
|
||||
```
|
||||
|
||||
### 2. 関係性を確認
|
||||
|
||||
```bash
|
||||
# 特定ユーザーとの関係を確認
|
||||
ai-gpt status "did:plc:user123"
|
||||
|
||||
# AIの全体的な状態を確認
|
||||
ai-gpt status
|
||||
```
|
||||
|
||||
### 3. 自動送信を設定
|
||||
|
||||
```bash
|
||||
# 30分ごとに送信チェック
|
||||
ai-gpt schedule add transmission_check "30m"
|
||||
|
||||
# スケジューラーを起動
|
||||
ai-gpt schedule run
|
||||
```
|
||||
|
||||
## 次のステップ
|
||||
|
||||
- [基本概念](concepts.md) - システムの仕組みを理解
|
||||
- [コマンドリファレンス](commands.md) - 全コマンドの詳細
|
||||
- [設定ガイド](configuration.md) - 詳細な設定方法
|
@@ -1,168 +0,0 @@
|
||||
# スケジューラーガイド
|
||||
|
||||
## 概要
|
||||
|
||||
スケジューラーは、AIの自律的な動作を実現するための中核機能です。定期的なタスクを設定し、バックグラウンドで実行できます。
|
||||
|
||||
## タスクタイプ
|
||||
|
||||
### transmission_check
|
||||
関係性が閾値を超えたユーザーへの自動送信をチェックします。
|
||||
|
||||
```bash
|
||||
# 30分ごとにチェック
|
||||
ai-gpt schedule add transmission_check "30m" --provider ollama --model qwen2.5
|
||||
```
|
||||
|
||||
### maintenance
|
||||
日次メンテナンスを実行します:
|
||||
- 記憶の忘却処理
|
||||
- コア記憶の判定
|
||||
- 関係性パラメータの整理
|
||||
|
||||
```bash
|
||||
# 毎日午前3時に実行
|
||||
ai-gpt schedule add maintenance "0 3 * * *"
|
||||
```
|
||||
|
||||
### fortune_update
|
||||
AI運勢を更新します(通常は自動的に更新されます)。
|
||||
|
||||
```bash
|
||||
# 毎日午前0時に強制更新
|
||||
ai-gpt schedule add fortune_update "0 0 * * *"
|
||||
```
|
||||
|
||||
### relationship_decay
|
||||
時間経過による関係性の自然減衰を適用します。
|
||||
|
||||
```bash
|
||||
# 1時間ごとに減衰処理
|
||||
ai-gpt schedule add relationship_decay "1h"
|
||||
```
|
||||
|
||||
### memory_summary
|
||||
蓄積された記憶から要約を作成します。
|
||||
|
||||
```bash
|
||||
# 週に1回、日曜日に実行
|
||||
ai-gpt schedule add memory_summary "0 0 * * SUN"
|
||||
```
|
||||
|
||||
## スケジュール形式
|
||||
|
||||
### Cron形式
|
||||
|
||||
標準的なcron式を使用できます:
|
||||
|
||||
```
|
||||
┌───────────── 分 (0 - 59)
|
||||
│ ┌───────────── 時 (0 - 23)
|
||||
│ │ ┌───────────── 日 (1 - 31)
|
||||
│ │ │ ┌───────────── 月 (1 - 12)
|
||||
│ │ │ │ ┌───────────── 曜日 (0 - 6) (日曜日 = 0)
|
||||
│ │ │ │ │
|
||||
* * * * *
|
||||
```
|
||||
|
||||
例:
|
||||
- `"0 */6 * * *"` - 6時間ごと
|
||||
- `"0 9 * * MON-FRI"` - 平日の午前9時
|
||||
- `"*/15 * * * *"` - 15分ごと
|
||||
|
||||
### インターバル形式
|
||||
|
||||
シンプルな間隔指定:
|
||||
- `"30s"` - 30秒ごと
|
||||
- `"5m"` - 5分ごと
|
||||
- `"2h"` - 2時間ごと
|
||||
- `"1d"` - 1日ごと
|
||||
|
||||
## 実践例
|
||||
|
||||
### 基本的な自律AI設定
|
||||
|
||||
```bash
|
||||
# 1. 30分ごとに送信チェック
|
||||
ai-gpt schedule add transmission_check "30m"
|
||||
|
||||
# 2. 1日1回メンテナンス
|
||||
ai-gpt schedule add maintenance "0 3 * * *"
|
||||
|
||||
# 3. 2時間ごとに関係性減衰
|
||||
ai-gpt schedule add relationship_decay "2h"
|
||||
|
||||
# 4. 週1回記憶要約
|
||||
ai-gpt schedule add memory_summary "0 0 * * MON"
|
||||
|
||||
# スケジューラーを起動
|
||||
ai-gpt schedule run
|
||||
```
|
||||
|
||||
### タスク管理
|
||||
|
||||
```bash
|
||||
# タスク一覧を確認
|
||||
ai-gpt schedule list
|
||||
|
||||
# タスクを一時停止
|
||||
ai-gpt schedule disable --task-id transmission_check_1234567890
|
||||
|
||||
# タスクを再開
|
||||
ai-gpt schedule enable --task-id transmission_check_1234567890
|
||||
|
||||
# 不要なタスクを削除
|
||||
ai-gpt schedule remove --task-id old_task_123
|
||||
```
|
||||
|
||||
## デーモン化
|
||||
|
||||
### systemdサービスとして実行
|
||||
|
||||
`/etc/systemd/system/ai-gpt-scheduler.service`:
|
||||
|
||||
```ini
|
||||
[Unit]
|
||||
Description=ai.gpt Scheduler
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=youruser
|
||||
WorkingDirectory=/home/youruser
|
||||
ExecStart=/usr/local/bin/ai-gpt schedule run
|
||||
Restart=always
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
```
|
||||
|
||||
```bash
|
||||
# サービスを有効化
|
||||
sudo systemctl enable ai-gpt-scheduler
|
||||
sudo systemctl start ai-gpt-scheduler
|
||||
```
|
||||
|
||||
### tmux/screenでバックグラウンド実行
|
||||
|
||||
```bash
|
||||
# tmuxセッションを作成
|
||||
tmux new -s ai-gpt-scheduler
|
||||
|
||||
# スケジューラーを起動
|
||||
ai-gpt schedule run
|
||||
|
||||
# セッションから離脱 (Ctrl+B, D)
|
||||
```
|
||||
|
||||
## トラブルシューティング
|
||||
|
||||
### タスクが実行されない
|
||||
|
||||
1. スケジューラーが起動しているか確認
|
||||
2. タスクが有効になっているか確認:`ai-gpt schedule list`
|
||||
3. ログを確認(将来実装予定)
|
||||
|
||||
### 重複実行を防ぐ
|
||||
|
||||
同じタスクタイプを複数回追加しないよう注意してください。必要に応じて古いタスクを削除してから新しいタスクを追加します。
|
@@ -1,413 +0,0 @@
|
||||
"""
|
||||
Shell Tools
|
||||
|
||||
ai.shellの既存機能をMCPツールとして統合
|
||||
- コード生成
|
||||
- ファイル分析
|
||||
- プロジェクト管理
|
||||
- LLM統合
|
||||
"""
|
||||
|
||||
from typing import Dict, Any, List, Optional
|
||||
import os
|
||||
import subprocess
|
||||
import tempfile
|
||||
from pathlib import Path
|
||||
import requests
|
||||
from .base_tools import BaseMCPTool, config_manager
|
||||
|
||||
|
||||
class ShellTools(BaseMCPTool):
|
||||
"""シェルツール(元ai.shell機能)"""
|
||||
|
||||
def __init__(self, config_dir: Optional[str] = None):
|
||||
super().__init__(config_dir)
|
||||
self.ollama_url = "http://localhost:11434"
|
||||
|
||||
async def code_with_local_llm(self, prompt: str, language: str = "python") -> Dict[str, Any]:
|
||||
"""ローカルLLMでコード生成"""
|
||||
config = config_manager.load_config()
|
||||
model = config.get("providers", {}).get("ollama", {}).get("default_model", "qwen2.5-coder:7b")
|
||||
|
||||
system_prompt = f"You are an expert {language} programmer. Generate clean, well-commented code."
|
||||
|
||||
try:
|
||||
response = requests.post(
|
||||
f"{self.ollama_url}/api/generate",
|
||||
json={
|
||||
"model": model,
|
||||
"prompt": f"{system_prompt}\\n\\nUser: {prompt}\\n\\nPlease provide the code:",
|
||||
"stream": False,
|
||||
"options": {
|
||||
"temperature": 0.1,
|
||||
"top_p": 0.95,
|
||||
}
|
||||
},
|
||||
timeout=300
|
||||
)
|
||||
|
||||
if response.status_code == 200:
|
||||
result = response.json()
|
||||
code = result.get("response", "")
|
||||
return {"code": code, "language": language}
|
||||
else:
|
||||
return {"error": f"Ollama returned status {response.status_code}"}
|
||||
|
||||
except Exception as e:
|
||||
return {"error": str(e)}
|
||||
|
||||
async def analyze_file(self, file_path: str, analysis_prompt: str = "Analyze this file") -> Dict[str, Any]:
|
||||
"""ファイルを分析"""
|
||||
try:
|
||||
if not os.path.exists(file_path):
|
||||
return {"error": f"File not found: {file_path}"}
|
||||
|
||||
with open(file_path, 'r', encoding='utf-8') as f:
|
||||
content = f.read()
|
||||
|
||||
# ファイル拡張子から言語を判定
|
||||
ext = Path(file_path).suffix
|
||||
language_map = {
|
||||
'.py': 'python',
|
||||
'.rs': 'rust',
|
||||
'.js': 'javascript',
|
||||
'.ts': 'typescript',
|
||||
'.go': 'go',
|
||||
'.java': 'java',
|
||||
'.cpp': 'cpp',
|
||||
'.c': 'c',
|
||||
'.sh': 'shell',
|
||||
'.toml': 'toml',
|
||||
'.json': 'json',
|
||||
'.md': 'markdown'
|
||||
}
|
||||
language = language_map.get(ext, 'text')
|
||||
|
||||
config = config_manager.load_config()
|
||||
model = config.get("providers", {}).get("ollama", {}).get("default_model", "qwen2.5-coder:7b")
|
||||
|
||||
prompt = f"{analysis_prompt}\\n\\nFile: {file_path}\\nLanguage: {language}\\n\\nContent:\\n{content}"
|
||||
|
||||
response = requests.post(
|
||||
f"{self.ollama_url}/api/generate",
|
||||
json={
|
||||
"model": model,
|
||||
"prompt": prompt,
|
||||
"stream": False,
|
||||
},
|
||||
timeout=300
|
||||
)
|
||||
|
||||
if response.status_code == 200:
|
||||
result = response.json()
|
||||
analysis = result.get("response", "")
|
||||
return {
|
||||
"analysis": analysis,
|
||||
"file_path": file_path,
|
||||
"language": language,
|
||||
"file_size": len(content),
|
||||
"line_count": len(content.split('\\n'))
|
||||
}
|
||||
else:
|
||||
return {"error": f"Analysis failed: {response.status_code}"}
|
||||
|
||||
except Exception as e:
|
||||
return {"error": str(e)}
|
||||
|
||||
async def explain_code(self, code: str, language: str = "python") -> Dict[str, Any]:
|
||||
"""コードを説明"""
|
||||
config = config_manager.load_config()
|
||||
model = config.get("providers", {}).get("ollama", {}).get("default_model", "qwen2.5-coder:7b")
|
||||
|
||||
prompt = f"Explain this {language} code in detail:\\n\\n{code}"
|
||||
|
||||
try:
|
||||
response = requests.post(
|
||||
f"{self.ollama_url}/api/generate",
|
||||
json={
|
||||
"model": model,
|
||||
"prompt": prompt,
|
||||
"stream": False,
|
||||
},
|
||||
timeout=300
|
||||
)
|
||||
|
||||
if response.status_code == 200:
|
||||
result = response.json()
|
||||
explanation = result.get("response", "")
|
||||
return {"explanation": explanation}
|
||||
else:
|
||||
return {"error": f"Explanation failed: {response.status_code}"}
|
||||
|
||||
except Exception as e:
|
||||
return {"error": str(e)}
|
||||
|
||||
async def create_project(self, project_type: str, project_name: str, location: str = ".") -> Dict[str, Any]:
|
||||
"""プロジェクトを作成"""
|
||||
try:
|
||||
project_path = Path(location) / project_name
|
||||
|
||||
if project_path.exists():
|
||||
return {"error": f"Project directory already exists: {project_path}"}
|
||||
|
||||
project_path.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
# プロジェクトタイプに応じたテンプレートを作成
|
||||
if project_type == "rust":
|
||||
await self._create_rust_project(project_path)
|
||||
elif project_type == "python":
|
||||
await self._create_python_project(project_path)
|
||||
elif project_type == "node":
|
||||
await self._create_node_project(project_path)
|
||||
else:
|
||||
# 基本的なプロジェクト構造
|
||||
(project_path / "src").mkdir()
|
||||
(project_path / "README.md").write_text(f"# {project_name}\\n\\nA new {project_type} project.")
|
||||
|
||||
return {
|
||||
"status": "success",
|
||||
"project_path": str(project_path),
|
||||
"project_type": project_type,
|
||||
"files_created": list(self._get_project_files(project_path))
|
||||
}
|
||||
|
||||
except Exception as e:
|
||||
return {"error": str(e)}
|
||||
|
||||
async def _create_rust_project(self, project_path: Path):
|
||||
"""Rustプロジェクトを作成"""
|
||||
# Cargo.toml
|
||||
cargo_toml = f"""[package]
|
||||
name = "{project_path.name}"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
[dependencies]
|
||||
"""
|
||||
(project_path / "Cargo.toml").write_text(cargo_toml)
|
||||
|
||||
# src/main.rs
|
||||
src_dir = project_path / "src"
|
||||
src_dir.mkdir()
|
||||
(src_dir / "main.rs").write_text('fn main() {\\n println!("Hello, world!");\\n}\\n')
|
||||
|
||||
# README.md
|
||||
(project_path / "README.md").write_text(f"# {project_path.name}\\n\\nA Rust project.")
|
||||
|
||||
async def _create_python_project(self, project_path: Path):
|
||||
"""Pythonプロジェクトを作成"""
|
||||
# pyproject.toml
|
||||
pyproject_toml = f"""[project]
|
||||
name = "{project_path.name}"
|
||||
version = "0.1.0"
|
||||
description = "A Python project"
|
||||
requires-python = ">=3.8"
|
||||
dependencies = []
|
||||
|
||||
[build-system]
|
||||
requires = ["setuptools>=61.0", "wheel"]
|
||||
build-backend = "setuptools.build_meta"
|
||||
"""
|
||||
(project_path / "pyproject.toml").write_text(pyproject_toml)
|
||||
|
||||
# src/
|
||||
src_dir = project_path / "src" / project_path.name
|
||||
src_dir.mkdir(parents=True)
|
||||
(src_dir / "__init__.py").write_text("")
|
||||
(src_dir / "main.py").write_text('def main():\\n print("Hello, world!")\\n\\nif __name__ == "__main__":\\n main()\\n')
|
||||
|
||||
# README.md
|
||||
(project_path / "README.md").write_text(f"# {project_path.name}\\n\\nA Python project.")
|
||||
|
||||
async def _create_node_project(self, project_path: Path):
|
||||
"""Node.jsプロジェクトを作成"""
|
||||
# package.json
|
||||
package_json = f"""{{
|
||||
"name": "{project_path.name}",
|
||||
"version": "1.0.0",
|
||||
"description": "A Node.js project",
|
||||
"main": "index.js",
|
||||
"scripts": {{
|
||||
"start": "node index.js",
|
||||
"test": "echo \\"Error: no test specified\\" && exit 1"
|
||||
}},
|
||||
"dependencies": {{}}
|
||||
}}
|
||||
"""
|
||||
(project_path / "package.json").write_text(package_json)
|
||||
|
||||
# index.js
|
||||
(project_path / "index.js").write_text('console.log("Hello, world!");\\n')
|
||||
|
||||
# README.md
|
||||
(project_path / "README.md").write_text(f"# {project_path.name}\\n\\nA Node.js project.")
|
||||
|
||||
def _get_project_files(self, project_path: Path) -> List[str]:
|
||||
"""プロジェクト内のファイル一覧を取得"""
|
||||
files = []
|
||||
for file_path in project_path.rglob("*"):
|
||||
if file_path.is_file():
|
||||
files.append(str(file_path.relative_to(project_path)))
|
||||
return files
|
||||
|
||||
async def execute_command(self, command: str, working_dir: str = ".") -> Dict[str, Any]:
|
||||
"""シェルコマンドを実行"""
|
||||
try:
|
||||
result = subprocess.run(
|
||||
command,
|
||||
shell=True,
|
||||
cwd=working_dir,
|
||||
capture_output=True,
|
||||
text=True,
|
||||
timeout=60
|
||||
)
|
||||
|
||||
return {
|
||||
"status": "success" if result.returncode == 0 else "error",
|
||||
"returncode": result.returncode,
|
||||
"stdout": result.stdout,
|
||||
"stderr": result.stderr,
|
||||
"command": command,
|
||||
"working_dir": working_dir
|
||||
}
|
||||
|
||||
except subprocess.TimeoutExpired:
|
||||
return {"error": "Command timed out"}
|
||||
except Exception as e:
|
||||
return {"error": str(e)}
|
||||
|
||||
async def write_file(self, file_path: str, content: str, backup: bool = True) -> Dict[str, Any]:
|
||||
"""ファイルを書き込み(バックアップオプション付き)"""
|
||||
try:
|
||||
file_path_obj = Path(file_path)
|
||||
|
||||
# バックアップ作成
|
||||
backup_path = None
|
||||
if backup and file_path_obj.exists():
|
||||
backup_path = f"{file_path}.backup"
|
||||
with open(file_path, 'r', encoding='utf-8') as src:
|
||||
with open(backup_path, 'w', encoding='utf-8') as dst:
|
||||
dst.write(src.read())
|
||||
|
||||
# ファイル書き込み
|
||||
file_path_obj.parent.mkdir(parents=True, exist_ok=True)
|
||||
with open(file_path, 'w', encoding='utf-8') as f:
|
||||
f.write(content)
|
||||
|
||||
return {
|
||||
"status": "success",
|
||||
"file_path": file_path,
|
||||
"backup_path": backup_path,
|
||||
"bytes_written": len(content.encode('utf-8'))
|
||||
}
|
||||
|
||||
except Exception as e:
|
||||
return {"error": str(e)}
|
||||
|
||||
def get_tools(self) -> List[Dict[str, Any]]:
|
||||
"""利用可能なツール一覧"""
|
||||
return [
|
||||
{
|
||||
"name": "generate_code",
|
||||
"description": "ローカルLLMでコード生成",
|
||||
"parameters": {
|
||||
"prompt": "string",
|
||||
"language": "string (optional, default: python)"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "analyze_file",
|
||||
"description": "ファイルを分析",
|
||||
"parameters": {
|
||||
"file_path": "string",
|
||||
"analysis_prompt": "string (optional)"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "explain_code",
|
||||
"description": "コードを説明",
|
||||
"parameters": {
|
||||
"code": "string",
|
||||
"language": "string (optional, default: python)"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "create_project",
|
||||
"description": "新しいプロジェクトを作成",
|
||||
"parameters": {
|
||||
"project_type": "string (rust/python/node)",
|
||||
"project_name": "string",
|
||||
"location": "string (optional, default: .)"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "execute_command",
|
||||
"description": "シェルコマンドを実行",
|
||||
"parameters": {
|
||||
"command": "string",
|
||||
"working_dir": "string (optional, default: .)"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "write_file",
|
||||
"description": "ファイルを書き込み",
|
||||
"parameters": {
|
||||
"file_path": "string",
|
||||
"content": "string",
|
||||
"backup": "boolean (optional, default: true)"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
async def execute_tool(self, tool_name: str, params: Dict[str, Any]) -> Dict[str, Any]:
|
||||
"""ツールを実行"""
|
||||
try:
|
||||
if tool_name == "generate_code":
|
||||
result = await self.code_with_local_llm(
|
||||
prompt=params["prompt"],
|
||||
language=params.get("language", "python")
|
||||
)
|
||||
return result
|
||||
|
||||
elif tool_name == "analyze_file":
|
||||
result = await self.analyze_file(
|
||||
file_path=params["file_path"],
|
||||
analysis_prompt=params.get("analysis_prompt", "Analyze this file")
|
||||
)
|
||||
return result
|
||||
|
||||
elif tool_name == "explain_code":
|
||||
result = await self.explain_code(
|
||||
code=params["code"],
|
||||
language=params.get("language", "python")
|
||||
)
|
||||
return result
|
||||
|
||||
elif tool_name == "create_project":
|
||||
result = await self.create_project(
|
||||
project_type=params["project_type"],
|
||||
project_name=params["project_name"],
|
||||
location=params.get("location", ".")
|
||||
)
|
||||
return result
|
||||
|
||||
elif tool_name == "execute_command":
|
||||
result = await self.execute_command(
|
||||
command=params["command"],
|
||||
working_dir=params.get("working_dir", ".")
|
||||
)
|
||||
return result
|
||||
|
||||
elif tool_name == "write_file":
|
||||
result = await self.write_file(
|
||||
file_path=params["file_path"],
|
||||
content=params["content"],
|
||||
backup=params.get("backup", True)
|
||||
)
|
||||
return result
|
||||
|
||||
else:
|
||||
return {"error": f"Unknown tool: {tool_name}"}
|
||||
|
||||
except Exception as e:
|
||||
return {"error": str(e)}
|
Reference in New Issue
Block a user