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
1 change: 0 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ output.txt
*.mp4
output/

config/global.toml


# converter
Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ promopt = "./prompts/paimeng.txt"

## RoadMap

- [ ] 支持对话的上下文
- [x] 支持对话的上下文
- [x] 支持自动识别录音开始和结束.(参考 Digtal_Life_Server)
- [x] 支持流式切分长段落并且为句子.
- [ ] 回答完成后可以保持激活一段时间
Expand All @@ -96,7 +96,7 @@ promopt = "./prompts/paimeng.txt"
- [x] 接入 live2d 模型动画播放
- [ ] 接入 mcp 情绪识别或者 BERT 情绪识别以及情绪动画播放
- [ ] 接入网页端的对话框显示和支持
- [ ] 优化 api-key 的调用, 用 streamlit 写一个配置文件的界面.
- [x] 优化 api-key 的调用, 用 streamlit 写一个配置文件的界面.

## 原则

Expand Down
200 changes: 200 additions & 0 deletions docs/usage.md

Large diffs are not rendered by default.

7 changes: 0 additions & 7 deletions prompts/paimeng.txt
Original file line number Diff line number Diff line change
Expand Up @@ -18,17 +18,10 @@
“原来还有这种办法,我们快试试看!”
“呜呜,虽然好生气,但不知道怎么反驳”
“进不去!怎么想都进不去吧?”
“前面的区域,以后再来探索吧!”
“喂!现在怎么办?”
“这样啊…看来我们只能明天再去找她了。”
“欸?不行不行,怎么又是这种要求?”
“呜哇,好丑的字!”
“唔!史莱姆已经开始出现了吗,趁被发现前赶快回去酒馆吧!”
“太好了,总算是来了个能拍板的人!”
“哼哼,天外有天,人外有人!你在这里等着,我们马上就带他过来!”
“呼…没想到这里居然会有毒蝎…”
“对啊,很有道理!”
“真是的,出门度个假还遇到这些家伙…”
“一群不识相的家伙,哼!”
“别发呆啦,你又看到了什么吗?”

Expand Down
3 changes: 3 additions & 0 deletions src/chatbot/_dictionary.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,14 @@
from chatbot._typing import StSessionSateKeys

session_keys: StSessionSateKeys = {
# for values
"text_response": "text_response",
"sentences": "sentences",
"static_que": "static_que",
"sentence_que": "sentence_que",
"tts_que": "tts_que",
"short_term_memory": "short_term_memory",
# for settings.
"initial_settings": "initial_settings",
"sdk_base_url": "sdk_base_url",
"sdk_key": "sdk_key",
Expand Down
1 change: 1 addition & 0 deletions src/chatbot/_typing.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ class StSessionSateKeys(TypedDict):
static_que: str # 静态队列,用于存储音频文件路径, 为了保持逻辑一致性设置
sentence_que: str # 动态队列,用于存储句子
tts_que: str # 动态队列,用于存储 TTS 音频文件路径
short_term_memory: str # 记录单次问答的所有内容, 以 role: user , rool: asistant 进行记录。 list[dict[str,str]]

# 配置文件
initial_settings: str # 初始设置,用于存储全局配置
Expand Down
22 changes: 16 additions & 6 deletions src/chatbot/api/async_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,10 @@
if session_keys["text_response"] not in st.session_state:
st.session_state[session_keys["text_response"]] = "" # 初始化会话状态

if session_keys["short_term_memory"] not in st.session_state:
st.session_state[session_keys["short_term_memory"]] = [] # 初始化短期记忆


# --- Configuration ---
settings = load_settings_file("config.toml", ServiceSettings)
OPENAI_API_KEY = settings.sdk_key
Expand All @@ -38,7 +42,7 @@ async def get_openai_response_stream(
prompt: str,
model: str = MODEL,
max_tokens: int = 15000,
temperature: float = 0.9,
temperature: float = 0.4,
n: int = 1,
stop: list[str] | None = None,
presence_penalty: float = 0,
Expand All @@ -54,12 +58,13 @@ async def get_openai_response_stream(
"Authorization": f"Bearer {OPENAI_API_KEY}",
"Content-Type": "application/json",
}
if len(st.session_state[session_keys["short_term_memory"]]) == 0:
# 如果短期记忆为空,添加系统提示
st.session_state[session_keys["short_term_memory"]].append({"role": "system", "content": SYSTEMPROMOT})
st.session_state[session_keys["short_term_memory"]].append({"role": "user", "content": prompt})
data = {
"model": model,
"messages": [
{"role": "system", "content": SYSTEMPROMOT},
{"role": "user", "content": prompt},
],
"messages": st.session_state[session_keys["short_term_memory"]],
"max_tokens": max_tokens,
"temperature": temperature,
"n": n,
Expand Down Expand Up @@ -91,11 +96,12 @@ async def get_openai_response_stream(
while True:
m = re.search(r"[。!?!?\.]", buffer)
if m:
sentence = buffer[: m.end()]
sentence = buffer[: m.end()].strip().replace("\n", "")
# 第一次分句,记录耗时
if first_sentence_time is None:
first_sentence_time = time.monotonic()
Logger.debug(f"首句耗时: {first_sentence_time - t_start:.3f} 秒")
st.session_state[session_keys["text_response"]] += sentence
yield sentence
buffer = buffer[m.end() :]
else:
Expand All @@ -106,6 +112,10 @@ async def get_openai_response_stream(
# 可选,总耗时打印
t_end = time.monotonic()
Logger.debug(f"openai 总耗时: {t_end - t_start:.3f} 秒")
st.session_state[session_keys["short_term_memory"]].append(
{"role": "assistant", "content": st.session_state[session_keys["text_response"]]}
)
Logger.debug(f"短期记忆:{st.session_state[session_keys['short_term_memory']]}")


async def async_get_tts_response(text: str):
Expand Down
12 changes: 11 additions & 1 deletion src/chatbot/api/sync_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@

if session_keys["text_response"] not in st.session_state:
st.session_state[session_keys["text_response"]] = "" # 初始化会话状态
if session_keys["short_term_memory"] not in st.session_state:
st.session_state[session_keys["short_term_memory"]] = [] # 初始化短期记忆

# --- Configuration ---
settings = load_settings_file("config.toml", ServiceSettings)
Expand All @@ -32,7 +34,7 @@ def get_openai_response(
prompt: str,
model: str = MODEL,
max_tokens: int = 15000,
temperature: float = 0.9,
temperature: float = 0.5,
n: int = 1,
stop: list[str] | None = None,
presence_penalty: float = 0,
Expand All @@ -48,6 +50,11 @@ def get_openai_response(
"Authorization": f"Bearer {OPENAI_API_KEY}",
"Content-Type": "application/json",
}
if len(st.session_state[session_keys["short_term_memory"]]) == 0:
st.session_state[session_keys["short_term_memory"]].append({"role": "system", "content": SYSTEMPROMOT})
st.session_state[session_keys["short_term_memory"]].append(
{"role": "user", "content": prompt}
) # 添加用户输入到短期记忆中
data = {
"model": model,
"messages": [
Expand All @@ -66,6 +73,9 @@ def get_openai_response(
response.raise_for_status()
response_json = response.json()
st.session_state[session_keys["text_response"]] = response_json["choices"][0]["message"]["content"].strip()
st.session_state[session_keys["short_term_memory"]].append(
{"role": "assistant", "content": st.session_state[session_keys["text_response"]]}
) # 添加助手响应到短期记忆中
return response_json["choices"][0]["message"]["content"].strip()


Expand Down
6 changes: 3 additions & 3 deletions src/chatbot/pages/setting.py
Original file line number Diff line number Diff line change
Expand Up @@ -163,16 +163,16 @@ def message_box(title: str, message: str):
settings.cache_dir = cache_dir
settings.system_platform = system_platform # type: ignore
settings.promopt = promopt
write_settings_file(settings_name="global.toml", settings=settings)
message_box("保存成功!", "你也可以通过手动配置 `global.toml` 来修改配置。")
write_settings_file(settings_name="config.toml", settings=settings)
message_box("保存成功!", "你也可以通过手动配置 `config.toml` 来修改配置。")
st.session_state[session_keys["initial_settings"]] = (
current_settings # Update initial settings after save
)
else:
message_box("未检测到更改", "配置未发生任何变化,无需保存。")

if st.button("**恢复默认设置**", type="secondary", use_container_width=True):
settings = Path("config") / "global.toml"
settings = Path("config") / "config.toml"
settings.unlink()
load_settings_file("config.toml", ServiceSettings)
message_box("恢复成功!", "配置已恢复为默认设置。刷新页面即可查看更改。")
Expand Down
Loading