Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions Co-creation-projects/megg-ops-roleplay_agent/.env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# .env file
LLM_API_KEY=
LLM_MODEL_ID=
LLM_BASE_URL=
107 changes: 107 additions & 0 deletions Co-creation-projects/megg-ops-roleplay_agent/README.md
Original file line number Diff line number Diff line change
@@ -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 (环境变量管理)

## 许可证

本项目仅供学习和研究使用。
2 changes: 2 additions & 0 deletions Co-creation-projects/megg-ops-roleplay_agent/requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
openai>=1.0.0
python-dotenv>=1.0.0
173 changes: 173 additions & 0 deletions Co-creation-projects/megg-ops-roleplay_agent/roleplay_agent.py
Original file line number Diff line number Diff line change
@@ -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()