192 lines
6.9 KiB
Python
192 lines
6.9 KiB
Python
# chat_client.py
|
|
"""
|
|
Simple Chat Interface for AigptMCP Server
|
|
"""
|
|
import requests
|
|
import json
|
|
import os
|
|
from datetime import datetime
|
|
|
|
class AigptChatClient:
|
|
def __init__(self, server_url="http://localhost:5000"):
|
|
self.server_url = server_url
|
|
self.session_id = f"session_{datetime.now().strftime('%Y%m%d_%H%M%S')}"
|
|
self.conversation_history = []
|
|
|
|
def send_message(self, message: str) -> str:
|
|
"""メッセージを送信してレスポンスを取得"""
|
|
try:
|
|
# MCPサーバーにメッセージを送信
|
|
response = requests.post(
|
|
f"{self.server_url}/chat",
|
|
json={"message": message},
|
|
headers={"Content-Type": "application/json"}
|
|
)
|
|
|
|
if response.status_code == 200:
|
|
data = response.json()
|
|
ai_response = data.get("response", "Sorry, no response received.")
|
|
|
|
# 会話履歴を保存
|
|
self.conversation_history.append({
|
|
"role": "user",
|
|
"content": message,
|
|
"timestamp": datetime.now().isoformat()
|
|
})
|
|
self.conversation_history.append({
|
|
"role": "assistant",
|
|
"content": ai_response,
|
|
"timestamp": datetime.now().isoformat()
|
|
})
|
|
|
|
# 関係性を更新(簡単な例)
|
|
self.update_relationship(message, ai_response)
|
|
|
|
return ai_response
|
|
else:
|
|
return f"Error: {response.status_code} - {response.text}"
|
|
|
|
except requests.RequestException as e:
|
|
return f"Connection error: {e}"
|
|
|
|
def update_relationship(self, user_message: str, ai_response: str):
|
|
"""関係性を自動更新"""
|
|
try:
|
|
# 簡単な感情分析(実際はもっと高度に)
|
|
positive_words = ["thank", "good", "great", "awesome", "love", "like", "helpful"]
|
|
negative_words = ["bad", "terrible", "hate", "wrong", "stupid", "useless"]
|
|
|
|
user_lower = user_message.lower()
|
|
interaction_type = "neutral"
|
|
weight = 1.0
|
|
|
|
if any(word in user_lower for word in positive_words):
|
|
interaction_type = "positive"
|
|
weight = 2.0
|
|
elif any(word in user_lower for word in negative_words):
|
|
interaction_type = "negative"
|
|
weight = 2.0
|
|
|
|
# 関係性を更新
|
|
requests.post(
|
|
f"{self.server_url}/relationship/update",
|
|
json={
|
|
"target": "user_general",
|
|
"interaction_type": interaction_type,
|
|
"weight": weight,
|
|
"context": f"Chat: {user_message[:50]}..."
|
|
}
|
|
)
|
|
except:
|
|
pass # 関係性更新に失敗しても継続
|
|
|
|
def search_memories(self, query: str) -> list:
|
|
"""記憶を検索"""
|
|
try:
|
|
response = requests.post(
|
|
f"{self.server_url}/memory/search",
|
|
json={"query": query, "limit": 5}
|
|
)
|
|
if response.status_code == 200:
|
|
return response.json().get("results", [])
|
|
except:
|
|
pass
|
|
return []
|
|
|
|
def get_relationship_status(self) -> dict:
|
|
"""関係性ステータスを取得"""
|
|
try:
|
|
response = requests.get(f"{self.server_url}/relationship/check?target=user_general")
|
|
if response.status_code == 200:
|
|
return response.json()
|
|
except:
|
|
pass
|
|
return {}
|
|
|
|
def save_conversation(self):
|
|
"""会話を保存"""
|
|
if not self.conversation_history:
|
|
return
|
|
|
|
conversation_data = {
|
|
"session_id": self.session_id,
|
|
"start_time": self.conversation_history[0]["timestamp"],
|
|
"end_time": self.conversation_history[-1]["timestamp"],
|
|
"messages": self.conversation_history,
|
|
"message_count": len(self.conversation_history)
|
|
}
|
|
|
|
filename = f"conversation_{self.session_id}.json"
|
|
with open(filename, 'w', encoding='utf-8') as f:
|
|
json.dump(conversation_data, f, ensure_ascii=False, indent=2)
|
|
|
|
print(f"💾 Conversation saved to {filename}")
|
|
|
|
def main():
|
|
"""メインのチャットループ"""
|
|
print("🤖 AigptMCP Chat Interface")
|
|
print("Type 'quit' to exit, 'save' to save conversation, 'status' for relationship status")
|
|
print("=" * 50)
|
|
|
|
client = AigptChatClient()
|
|
|
|
# サーバーの状態をチェック
|
|
try:
|
|
response = requests.get(client.server_url)
|
|
if response.status_code == 200:
|
|
print("✅ Connected to AigptMCP Server")
|
|
else:
|
|
print("❌ Failed to connect to server")
|
|
return
|
|
except:
|
|
print("❌ Server not running. Please start with: python mcp/server.py")
|
|
return
|
|
|
|
while True:
|
|
try:
|
|
user_input = input("\n👤 You: ").strip()
|
|
|
|
if not user_input:
|
|
continue
|
|
|
|
if user_input.lower() == 'quit':
|
|
client.save_conversation()
|
|
print("👋 Goodbye!")
|
|
break
|
|
elif user_input.lower() == 'save':
|
|
client.save_conversation()
|
|
continue
|
|
elif user_input.lower() == 'status':
|
|
status = client.get_relationship_status()
|
|
if status:
|
|
print(f"📊 Relationship Score: {status.get('score', 0):.1f}")
|
|
print(f"📤 Can Send Messages: {'Yes' if status.get('can_send_message') else 'No'}")
|
|
else:
|
|
print("❌ Failed to get relationship status")
|
|
continue
|
|
elif user_input.lower().startswith('search '):
|
|
query = user_input[7:] # Remove 'search '
|
|
memories = client.search_memories(query)
|
|
if memories:
|
|
print(f"🔍 Found {len(memories)} related memories:")
|
|
for memory in memories:
|
|
print(f" - {memory['title']}: {memory.get('ai_summary', memory.get('basic_summary', ''))[:100]}...")
|
|
else:
|
|
print("🔍 No related memories found")
|
|
continue
|
|
|
|
# 通常のチャット
|
|
print("🤖 AI: ", end="", flush=True)
|
|
response = client.send_message(user_input)
|
|
print(response)
|
|
|
|
except KeyboardInterrupt:
|
|
client.save_conversation()
|
|
print("\n👋 Goodbye!")
|
|
break
|
|
except Exception as e:
|
|
print(f"❌ Error: {e}")
|
|
|
|
if __name__ == "__main__":
|
|
main()
|