Spaces:
Sleeping
Sleeping
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. 🐱") | |