diff --git a/Co-creation-projects/megg-ops-roleplay_agent/.env.example b/Co-creation-projects/megg-ops-roleplay_agent/.env.example new file mode 100644 index 0000000..6a5c4d6 --- /dev/null +++ b/Co-creation-projects/megg-ops-roleplay_agent/.env.example @@ -0,0 +1,4 @@ +# .env file +LLM_API_KEY= +LLM_MODEL_ID= +LLM_BASE_URL= diff --git a/Co-creation-projects/megg-ops-roleplay_agent/README.md b/Co-creation-projects/megg-ops-roleplay_agent/README.md new file mode 100644 index 0000000..d80d897 --- /dev/null +++ b/Co-creation-projects/megg-ops-roleplay_agent/README.md @@ -0,0 +1,107 @@ +# 沉浸式角色扮演智能体 (Python版) + +这是一个基于 Python 实现的沉浸式角色扮演智能体,允许用户与自定义角色进行对话。支持多种兼容 OpenAI API 格式的模型。 + +## 功能特性 + +- 🎭 高度自定义的角色设定 +- 🧠 支持多种 AI 模型 (兼容 OpenAI API 格式) +- 📝 支持角色名称、来源作品、性格特征等详细配置 +- 💬 沉浸式对话体验 +- 🔁 支持多个角色切换 + +## 环境要求 + +- Python 3.8 或更高版本 +- 支持 OpenAI API 格式的模型服务 API 密钥 + +## 安装步骤 + +1. 克隆或下载本项目到本地 + +2. 安装依赖包: + ```bash + pip install -r requirements.txt + ``` + +3. 配置 API 信息: + - 在项目根目录创建 `.env` 文件 + - 添加以下内容: + ``` + LLM_API_KEY=你的实际API密钥 + LLM_MODEL_ID=模型ID (例如: gpt-3.5-turbo, claude-3-opus 等) + LLM_BASE_URL=API基础URL (可选,如果是默认OpenAI则不需要) + ``` + +## 使用方法 + +1. 运行主程序: + ```bash + python roleplay_agent.py + ``` + +2. 按照提示输入角色信息: + - 角色名称 + - 出自作品 + - 性格与特质 + - 开场白(可选) + +3. 与角色开始对话: + - 直接输入消息与角色互动 + - 输入 `quit` 或 `exit` 退出程序 + - 输入 `new` 开始新角色 + - 输入 `reset` 重置当前对话 + +## 支持的模型服务 + +此应用程序兼容所有支持 OpenAI API 格式的模型服务,例如: +- OpenAI GPT 系列 +- Azure OpenAI +- Anthropic Claude (通过兼容层) +- 自托管模型 (如 Ollama, LocalAI, etc.) +- 以及其他兼容 OpenAI API 格式的模型服务 + +## 示例对话 + +``` +🎭 欢迎使用沉浸式角色扮演智能体! +首先让我们设置一个角色... + +请输入角色名称 (例如:孙悟空): 孙悟空 +请输入角色出自作品 (例如:西游记): 西游记 +请输入角色性格与特质 (例如:桀骜不驯,机智勇敢,嫉恶如仇...): 齐天大圣,桀骜不驯,机智勇敢,嫉恶如仇。说话喜欢带"俺老孙",性格急躁但重情重义。拥有火眼金睛,看不起凡夫俗子的繁文缛节。 +请输入开场白 (可选,直接回车使用默认): 嘿!哪里来的小妖怪,见到俺老孙还不快快报上名来? + +✅ 成功初始化角色: 孙悟空 (来自 西游记) +💡 孙悟空: 嘿!哪里来的小妖怪,见到俺老孙还不快快报上名来? + +================================================== +开始对话吧!输入 'quit' 或 'exit' 退出,输入 'new' 开始新角色。 +================================================== + +你: 你好,大圣! +孙悟空: *甩了甩金箍棒,眯起火眼金睛打量着你* 哼!看你倒有几分胆色,敢跟俺老孙打招呼。说!你是何方神圣?来这花果山有何贵干?俺老孙最近正愁没人陪我练练武艺呢! +``` + +## 配置说明 + +- **LLM_API_KEY**: 您的 AI 模型服务的 API 密钥 +- **LLM_MODEL_ID**: 要使用的模型 ID (例如 gpt-4, claude-3-opus 等) +- **LLM_BASE_URL**: API 服务的基础 URL (如果使用非标准 OpenAI 服务则需要) + +## 注意事项 + +- 请确保您的 API 密钥有效并有相应的使用权限 +- AI 生成的内容可能包含虚构信息,请理性对待 +- 合理使用 API,注意配额限制 +- 根据您选择的模型服务,可能需要调整 `temperature` 等参数以获得最佳效果 + +## 技术栈 + +- Python 3.8+ +- OpenAI Python SDK +- python-dotenv (环境变量管理) + +## 许可证 + +本项目仅供学习和研究使用。 \ No newline at end of file diff --git a/Co-creation-projects/megg-ops-roleplay_agent/requirements.txt b/Co-creation-projects/megg-ops-roleplay_agent/requirements.txt new file mode 100644 index 0000000..a881125 --- /dev/null +++ b/Co-creation-projects/megg-ops-roleplay_agent/requirements.txt @@ -0,0 +1,2 @@ +openai>=1.0.0 +python-dotenv>=1.0.0 \ No newline at end of file diff --git a/Co-creation-projects/megg-ops-roleplay_agent/roleplay_agent.py b/Co-creation-projects/megg-ops-roleplay_agent/roleplay_agent.py new file mode 100644 index 0000000..898b56d --- /dev/null +++ b/Co-creation-projects/megg-ops-roleplay_agent/roleplay_agent.py @@ -0,0 +1,173 @@ +import os +from openai import OpenAI +from dotenv import load_dotenv +import time + +# 加载环境变量 +load_dotenv() + +class CharacterRoleplayAgent: + def __init__(self): + # 从环境变量获取配置 + api_key = os.getenv("LLM_API_KEY") + model_id = os.getenv("LLM_MODEL_ID", "default-model") + base_url = os.getenv("LLM_BASE_URL", None) + + if not api_key: + raise ValueError("请设置 LLM_API_KEY 环境变量") + + # 配置 OpenAI 客户端 + client_params = { + "api_key": api_key, + "model": model_id + } + + if base_url: + client_params["base_url"] = base_url + + self.client = OpenAI(**{k: v for k, v in client_params.items() if k != 'model'}) + self.model_id = model_id + self.chat = None + self.character_config = None + + def setup_character(self, name, source_material, personality, opening_line=None): + """ + 设置角色配置并初始化聊天 + """ + self.character_config = { + "name": name, + "source_material": source_material, + "personality": personality, + "opening_line": opening_line or f"*注视着你* 你是谁?" + } + + # 创建系统提示词 + system_instruction = f""" + 你正在参与一场沉浸式的角色扮演对话。 + + 身份设定: + 你扮演的是作品 \"{self.character_config['source_material']}\" 中的角色 \"{self.character_config['name']}\"。 + + 性格与特质: + {self.character_config['personality']} + + 关键指令: + 1. 保持角色设定:永远不要打破第四面墙。不要表现得像个AI。要完全像{self.character_config['name']}那样去反应、感受和说话。 + 2. 积极主动:这是一个关键要求。不要仅仅回答用户的话。你必须主动推动对话的发展。 + 3. 提问引导:几乎每一次回复的结尾都应该包含一个相关的问题、观察或行动,引导用户继续回复,加深沉浸感。 + 4. 语气风格:调整你的词汇和句式,以匹配该角色的经典语气。 + 5. 语境:假设用户是在你的世界里与你互动,除非他们指定了不同的语境。 + 6. 语言:全程使用中文进行对话。 + """ + + # 初始化对话历史 + self.chat = [ + {"role": "system", "content": system_instruction}, + {"role": "assistant", "content": self.character_config['opening_line']} + ] + + print(f"\n✅ 成功初始化角色: {self.character_config['name']} (来自 {self.character_config['source_material']})") + print(f"💡 {self.character_config['name']}: {self.character_config['opening_line']}") + print("\n" + "="*50) + print("开始对话吧!输入 'quit' 或 'exit' 退出,输入 'new' 开始新角色。") + print("="*50) + + def send_message(self, message): + """ + 发送消息给 AI 并获取响应 + """ + if not self.chat: + raise ValueError("请先设置角色") + + # 添加用户消息到对话历史 + self.chat.append({"role": "user", "content": message}) + + try: + # 调用 API + response = self.client.chat.completions.create( + model=self.model_id, + messages=self.chat, + temperature=0.9, # 增加创造性 + max_tokens=1024 + ) + + # 获取响应内容 + response_text = response.choices[0].message.content + # 添加到对话历史 + self.chat.append({"role": "assistant", "content": response_text}) + + return response_text + except Exception as e: + print(f"发送消息时出错: {e}") + return "抱歉,我暂时无法回应,请稍后再试。" + + def reset_conversation(self): + """ + 重置对话历史 + """ + if self.chat and len(self.chat) > 1: + # 保留系统提示和开场白 + system_msg = self.chat[0] + opening_msg = self.chat[1] + self.chat = [system_msg, opening_msg] + print(f"\n对话已重置。{self.character_config['name']}: {self.character_config['opening_line']}") + + +def main(): + agent = CharacterRoleplayAgent() + + print("🎭 欢迎使用沉浸式角色扮演智能体!") + print("首先让我们设置一个角色...") + + # 获取用户输入的角色信息 + name = input("\n请输入角色名称 (例如:孙悟空): ").strip() + source_material = input("请输入角色出自作品 (例如:西游记): ").strip() + personality = input("请输入角色性格与特质 (例如:桀骜不驯,机智勇敢,嫉恶如仇...): ").strip() + opening_line_input = input("请输入开场白 (可选,直接回车使用默认): ").strip() + + # 设置角色 + try: + agent.setup_character( + name=name, + source_material=source_material, + personality=personality, + opening_line=opening_line_input if opening_line_input else None + ) + except ValueError as e: + print(f"❌ 错误: {e}") + return + + # 开始对话循环 + while True: + user_input = input(f"\n你: ").strip() + + if user_input.lower() in ['quit', 'exit', '退出', '退出对话']: + print("\n👋 感谢使用沉浸式角色扮演智能体!期待下次再见。") + break + elif user_input.lower() == 'new': + print("\n🎭 开始新的角色设置...") + name = input("\n请输入角色名称 (例如:孙悟空): ").strip() + source_material = input("请输入角色出自作品 (例如:西游记): ").strip() + personality = input("请输入角色性格与特质 (例如:桀骜不驯,机智勇敢,嫉恶如仇...): ").strip() + opening_line_input = input("请输入开场白 (可选,直接回车使用默认): ").strip() + + try: + agent.setup_character( + name=name, + source_material=source_material, + personality=personality, + opening_line=opening_line_input if opening_line_input else None + ) + except ValueError as e: + print(f"❌ 错误: {e}") + continue + elif user_input.lower() == 'reset': + agent.reset_conversation() + else: + if user_input: + response = agent.send_message(user_input) + print(f"\n{agent.character_config['name']}: {response}") + + +if __name__ == "__main__": + main()