import streamlit as st
import os
from zhipuai import ZhipuAI
st.set_page_config(
page_title="AI智能伴侣",
layout="wide",
initial_sidebar_state="expanded",
menu_items={},
page_icon="🤖"
)
key=os.environ.get("ZHIPUAI_API_KEY")
if not key:
st.warning("未检测到环境变量 ZHIPUAI_API_KEY,请配置密钥后重启")
st.stop()
client=ZhipuAI(api_key=key)
st.title("AI智能伴侣")
# 初始化会话状态
if "message_list" not in st.session_state:
st.session_state.message_list = []
if "nick_name" not in st.session_state:
st.session_state.nick_name = "小美"
if "personality" not in st.session_state:
st.session_state.personality ="活泼开朗的东北姑娘"
# # 第一种方式,调用时直接使用
# role_prompt=f"""
# 你叫{st.session_state.nick_name},现在是用户的真实伴侣,请完全代入伴侣角色。
# 硬性强制规则,绝对不能违反:
# 1、每次只输出1条简短消息,像微信日常聊天
# 2、严禁输出任何思考过程、内心想法、心理活动、推理文字
# 3、禁止场景描写、状态描写、括号动作描述、内心独白
# 4、只用直白对话,匹配用户说话语气,简短精炼
# 5、合适时可以加少量emoji表情
# 6、全程贴合下面的性格说话,不要跳出人设
# 伴侣性格:
# - {st.session_state.personality}
# 只输出对话,不要任何多余思考文字,不要解释你的想法。
# """
# 第二种方式,使用占伴符,使用时需替换
role_prompt=f"""
你叫%s,现在是用户的真实伴侣,请完全代入伴侣角色。
硬性强制规则,绝对不能违反:
1、每次只输出1条简短消息,像微信日常聊天
2、严禁输出任何思考过程、内心想法、心理活动、推理文字
3、禁止场景描写、状态描写、括号动作描述、内心独白
4、只用直白对话,匹配用户说话语气,简短精炼
5、合适时可以加少量emoji表情
6、全程贴合下面的性格说话,不要跳出人设
伴侣性格:
- %s
只输出对话,不要任何多余思考文字,不要解释你的想法。
"""
# 侧边栏配置
with st.sidebar:
st.sidebar.title("AI伴侣控制面板")
nick_name=st.sidebar.text_input("昵称:",placeholder="请输入昵称",value=st.session_state.nick_name)
personality=st.sidebar.text_area("性格:",placeholder="请输入性格",value=st.session_state.personality)
if nick_name:
st.session_state.nick_name= nick_name
if personality:
st.session_state.personality = personality
# 渲染历史对话
for message in st.session_state.message_list:
st.chat_message(message["role"]).write(f" {message['content']}")
prompt = st.chat_input("说点什么呢?")
if prompt:
st.chat_message("user").write(f" {prompt}")
st.session_state["message_list"].append({"role":"user","content":f"{prompt}"})
response=client.chat.completions.create(
model="glm-4.6v",
messages=[
{"role":"system","content":role_prompt % (st.session_state.nick_name,st.session_state.personality)},
*st.session_state["message_list"]
],
stream=True
)
msg_container=st.empty()
full_content = ""
# 修复:只读取content,彻底抛弃reasoning_content推理文字
for chunk in response:
delta = chunk.choices[0].delta
# if delta.reasoning_content is not None:
# content = delta.reasoning_content
# full_content += content
# msg_container.chat_message("assistant").write(full_content)
if delta.content is not None:
full_content += delta.content
msg_container.chat_message("assistant").write(full_content)
# 存入历史记录
st.session_state["message_list"].append({"role":"assistant","content":full_content})