MakiAi's picture
🎉 feat: AIチャットボット機能実装とUI改善
56ea7f1
import streamlit as st
from configs.agents import *
from swarm import Swarm
import os
from datetime import datetime
# ページ設定
st.set_page_config(
page_title="🐱 Neko Neko Company AI Chat 🐱",
page_icon="🐱",
layout="wide"
)
# Swarmクライアントの初期化
client = Swarm()
# セッション状態の初期化
if 'messages' not in st.session_state:
st.session_state['messages'] = []
if 'api_key' not in st.session_state:
st.session_state['api_key'] = os.getenv("OPENAI_API_KEY", "")
if 'context_variables' not in st.session_state:
st.session_state['context_variables'] = {
"company_context": """neko neko company 会社概要:
設立: 2024年
従業員数: 50名
事業内容: AIソリューション開発、システムインテグレーション
主要メンバー:
1. 代表取締役社長 猫山太郎
- 元IT企業CTO
- 経営戦略のスペシャリスト
2. 事業部長 猫田次郎
- プロジェクトマネジメントの達人
- 複数の大規模プロジェクト成功実績
3. デザイン部長 三毛猫美咲
- 国際的なデザイン賞受賞
- UI/UXデザインの第一人者
4. 技術部長 シャム猫健一
- AIアーキテクト
- オープンソースコミッティメンバー
5. 人事部長 黒猫和子
- 組織開発のエキスパート
- 従業員満足度向上のスペシャリスト
"""}
# サイドバーの設定
with st.sidebar:
st.image("https://raw.githubusercontent.com/Sunwood-ai-labs/swarm-neko-neko-company/refs/heads/main/docs/swarm-neko-neko-company.png", use_column_width=True)
st.title("🐱 Neko Neko Company")
# API Key設定セクション
st.markdown("### ⚙️ API設定")
api_key = st.text_input("OpenAI API Key", value=os.getenv("OPENAI_API_KEY", ""), type="password")
if api_key:
os.environ["OPENAI_API_KEY"] = api_key
st.success("✅ API Keyが設定されました!")
st.markdown("---")
st.markdown("""
### 社内AI支援システム
各部署のAIエージェントが、あなたの質問やリクエストに応答します。
#### 🌟 主なエージェント
- 👋 受付 みけこ
- 👔 社長 にゃんたろう
- 📊 事業部長 もふすけ
- 🎨 デザイン部長 ぷりん
- 💻 技術部長 たま
- 🔧 主任エンジニア ごまちゃん
- 👥 人事部長 ふわり
""")
if st.button("チャットをクリア"):
st.session_state['messages'] = []
st.rerun()
# メインコンテンツ
st.title("🐱 Neko Neko Company AI Chat System")
# チャット履歴の表示
for message in st.session_state['messages']:
with st.chat_message(message["role"], avatar=message.get("avatar")):
st.write(f"**{message.get('name', 'User')}**: {message['content']}")
# ユーザー入力
if prompt := st.chat_input("メッセージを入力してください..."):
# ユーザーメッセージの追加
st.session_state['messages'].append({
"role": "user",
"content": prompt,
"name": "User"
})
with st.chat_message("user"):
st.write(f"**User**: {prompt}")
try:
# Swarmを使用してエージェントの応答を取得
messages = [{"role": "user", "content": prompt}]
# メッセージプレースホルダーの作成
with st.chat_message("assistant", avatar="🐱"):
message_placeholder = st.empty()
message_placeholder.markdown("🤔 考え中...")
# 非ストリーミングモードで実行
response = client.run(
agent=triage_agent,
messages=messages,
context_variables=st.session_state['context_variables'],
stream=False
)
# レスポンスからメッセージを取得
if response and response.messages:
# 最後のメッセージを取得
last_message = response.messages[-1]
full_response = last_message["content"]
current_agent_name = last_message.get("sender", triage_agent.name)
message_placeholder.markdown(f"**{current_agent_name}**: {full_response} 🐱")
# 全てのエージェントの応答を保存
if response and response.messages:
for msg in response.messages:
if msg["role"] == "assistant":
st.session_state['messages'].append({
"role": "assistant",
"content": msg["content"],
"name": msg.get("sender", triage_agent.name),
"avatar": "🐱"
})
except Exception as e:
st.error(f"エラーが発生しました: {str(e)}")
# フッター
st.markdown("---")
st.markdown("© 2024 Neko Neko Company. All rights reserved. 🐱")