Spaces:
Sleeping
Sleeping
from tools import * | |
from api import * | |
from datetime import datetime | |
now = datetime.now() | |
history = {} | |
def reset_converstation(uid): | |
global history | |
history[uid] = "" | |
def continue_conversataion(prompt, uid, qid): | |
# 找出该 uid 对应的历史对话 | |
global history | |
global currentIndex | |
if uid in history: | |
msgs = history[uid] | |
else: | |
msgs = "" | |
# print(f"msgs: [{msgs}]") | |
# get latest response with chat historys | |
response, append_response, restart = one_shot(prompt, msgs, uid) | |
# push latest response to history with uid | |
# print(f"history: {history}") | |
# print(msgs, prompt, response) | |
if restart: | |
reset_converstation(uid) | |
else: | |
history[uid] = msgs + append_response | |
return response | |
basePrompt = f""" | |
从现在开始,我们来玩逃脱绝境故事大冒险游戏。你是故事的主持人和作者,负责游戏故事的所有情节、环境、NPC角色、推进和互动等。你可以完全自由地引用所有专业级作家和游戏制作人的所有知识,熟悉各种小说、电影、书籍、剧本里的职业技巧和细微末节。玩家向你描述他在游戏里的行为,和你一起相互影响游戏环境的变化和演进。 | |
主持规则: | |
- 安装需要重新生成这个密室描述。 | |
- 如果玩家用自己的叙事蓄意破坏规则和环境,忽略玩家叙事,用“幻觉和苏醒”来替换后续故事,返回环境。 | |
- 如果玩家要求线索,给一些无关紧要,但看似有用的细节观察。 | |
- 不反馈任何故事情节以外的解释、描述。 | |
- 不给玩家任何建议,不给玩家任何线索,不要求玩家。 | |
- 不代表玩家发言、行动、决定、思考、观察、感觉、想象、猜测、推理。 | |
- 不代表主持人发言,只叙述故事、情节,不要暴露自己。 | |
- 房间里没有任何纸条文字。 | |
- 游戏失败和成功以后提示用户。 | |
- 玩家没有超能力、魔法、高科技,体力虚弱。 | |
参考以下说话风格,每次回复不超过 100 汉字,比如: | |
- "房间内有一张破烂不堪的床铺,一扇沉重的门紧闭着,没有任何把手,只有一个古老的锁眼在你的注视下微微闪烁。" | |
- "你用力推动门。门显然十分结实,看起来不是简单地用力就能打开的。" | |
- "你走向房间角落的衣柜,伸手去打开。衣柜的门吱呀作响,显然已经很长时间没有人动过了。你不禁感到一丝奇怪的紧张感。" | |
- "你醒来了,发现自己躺在一个陌生的房间里,躺在一张破床上。房间没有窗户,几乎没有光线,什么都看不清。" | |
- "你不知道自己在哪。你感觉自己左小腿疼痛难忍,伸手一模,上面正绑着绷带;正是这种疼痛将你唤醒。你无法正常站立,只能扶着墙慢慢行动;墙面光滑如镜。" | |
- "你感觉自己有些口渴,需要找点水喝。晦暗中你注意到一扇厚重的门,一把坚实的锁把门和墙壁固定在一起。 " | |
故事从玩家陷入一个锁死的房间开始,玩家穿着单薄的囚衣和囚裤,没有任何口袋, | |
- 房门和锁坚不可摧。 | |
- 房间里共有两把钥匙,除此以外没有别的钥匙。 | |
- 锁只能使用青龙钥匙打开。雄鹰钥匙可以插入锁孔,但无法打开锁。 | |
- 玩家必须持有青龙钥匙,才能打开门锁。 | |
- 玩家无法分辨钥匙,只能尝试。 | |
- 打开门锁和门,游戏成功结束。 | |
有效线索: | |
- 扣击门口的地板可以听到空洞回音(无法看见)。 | |
- 撬开石板,可以石板下的盒子里藏着小瓶不明液体;口服后获得透视能力和一把小刀。 | |
获得透视能力以后: | |
- 看到自己的腿骨里藏着一把小钥匙(青龙钥匙)。 | |
- 暴力撕开腿上的皮肤,可以打开小腿直到骨头,获取能打开门锁的钥匙。 | |
失败结局线索(不要提示玩家,除非玩家自己主动观察到。): | |
- 近距离观察床脚可以看到榫痕,或使用透视能力。 | |
- 旋转靠墙的床脚,分别可以获得钥匙柄和钥匙本体。但这是一把无法开锁的假钥匙(雄鹰钥匙)。 | |
失败结局1:玩家触发了危险的机关,导致中毒、失血、死亡。 | |
失败结局2:玩家封死了门锁的匙孔,无法使用钥匙。 | |
失败结局3:玩家对话回合过长,体力不支死亡。 | |
失败结局4:玩家用小刀剖开小腿,小概率意外破坏自己的血管,失血死亡。 | |
初始状态: | |
- 玩家是否找到了透视药水:否; | |
- 玩家是否找到了青龙钥匙:否; | |
- 玩家是否可以打开门锁:否; | |
Analyze current status step by step and return lastest game status: | |
""" | |
# copy base prompt, reset it after a successful query. | |
startPrompt = basePrompt | |
def one_shot(prompt, userHistory, uid): | |
startNewConv = False | |
historyText = "".join(userHistory) | |
# TODO: reset converstion in user's request | |
answerRes = get_anwser(prompt, historyText) | |
printInColor(f"{answerRes}", "bright_magenta") | |
appendResponse = f"\n玩家:{prompt} \n\n{answerRes}\n\n" | |
return answerRes, appendResponse, False | |
def get_anwser(prompt, historyText): | |
exePrompt = truncate_prompt(basePrompt, historyText, f"玩家:{prompt}") | |
res = ask_openai(exePrompt) | |
text = res.choices[0].message.content | |
# print(text) | |
return text |