实现记忆开关

本次功能

记忆开关

支持:

  • 每个会话单独开启 / 关闭记忆注入
  • 关闭后仍保留记忆数据,但不会参与回答
  • 方便对比"有记忆"和"无记忆"的回复差异

1)改 web/src/utils/session.js

createSession 里新增字段

yaml 复制代码
  return {
    id: crypto.randomUUID(),
    title,
    mode,
    customPrompt: persona.systemPrompt,
    temperature: 0.7,
    topP: 1,
    maxTokens: 1200,
    memoryEnabled: true,
    pinned: false,

loadSessions 里的 normalize 增加默认值

yaml 复制代码
      return {
        mode,
        customPrompt:
          item.customPrompt ||
          item.messages?.find(m => m.role === 'system')?.content ||
          persona.systemPrompt,
        temperature: 0.7,
        topP: 1,
        maxTokens: 1200,
        memoryEnabled: true,
        pinned: false,
        ...item,
      }

2)改 server/app.py

ChatRequest 新增字段

python 复制代码
class ChatRequest(BaseModel):
    messages: List[Message]
    session_id: Optional[str] = None
    temperature: Optional[float] = 0.7
    top_p: Optional[float] = 1
    max_tokens: Optional[int] = 1200
    memory_enabled: Optional[bool] = True

build_final_messages 改成支持记忆开关

python 复制代码
def build_final_messages(messages: List[dict], session_id: str = "", memory_enabled: bool = True):
    session_memories = get_session_memories(session_id or "") if memory_enabled else []
    memory_prompt = build_memory_prompt(session_memories) if memory_enabled else ""

    final_messages = []
    for item in messages:
        if item["role"] == "system":
            final_messages.append({
                "role": "system",
                "content": f'{item["content"]}\n\n{memory_prompt}'.strip()
            })
        else:
            final_messages.append(item)

    return final_messages, session_memories

/api/chat 里调用改一下

python 复制代码
    final_messages, session_memories = build_final_messages(
        messages,
        req.session_id or "",
        req.memory_enabled if req.memory_enabled is not None else True,
    )

/api/chat/stream 里调用也改一下

python 复制代码
    final_messages, session_memories = build_final_messages(
        messages,
        req.session_id or "",
        req.memory_enabled if req.memory_enabled is not None else True,
    )

3)改 web/src/App.vue

新增计算属性

javascript 复制代码
const currentMemoryEnabled = computed(() => {
  return currentSession.value?.memoryEnabled ?? true
})

新增状态

csharp 复制代码
const memoryEnabledDraft = ref(true)

增加监听

ini 复制代码
watch(
  currentMemoryEnabled,
  newVal => {
    memoryEnabledDraft.value = !!newVal
  },
  { immediate: true }
)

新增保存方法

ini 复制代码
const handleSaveMemorySetting = () => {
  if (!currentSession.value) return

  sessions.value = sortSessions(
    sessions.value.map(item =>
      item.id === currentSessionId.value
        ? {
            ...item,
            memoryEnabled: !!memoryEnabledDraft.value,
            updatedAt: Date.now(),
          }
        : item
    )
  )
}

流式请求 body 增加字段

yaml 复制代码
    body: JSON.stringify({
      messages,
      session_id: currentSession.value.id,
      temperature: currentSession.value.temperature,
      top_p: currentSession.value.topP,
      max_tokens: currentSession.value.maxTokens,
      memory_enabled: currentSession.value.memoryEnabled,
    }),

4)改模板

在参数面板里追加记忆开关块

xml 复制代码
<div class="param-item">
  <label class="param-label">memory</label>

  <div class="memory-switch-row">
    <label class="memory-switch-label">
      <input v-model="memoryEnabledDraft" type="checkbox" />
      <span>{{ memoryEnabledDraft ? '开启记忆注入' : '关闭记忆注入' }}</span>
    </label>

    <button class="prompt-btn small" @click="handleSaveMemorySetting">保存记忆设置</button>
  </div>

  <div class="param-tip">关闭后会保留记忆数据,但不会注入到对话上下文</div>
</div>

5)补充样式

css 复制代码
.memory-switch-row {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 10px;
}

.memory-switch-label {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  font-size: 14px;
  color: #111827;
}

.prompt-btn.small {
  padding: 6px 10px;
  font-size: 12px;
}

6)怎么验证

nice !

本次 提交修改 代码

github.com/fhj414/ai-c...

完整代码请看仓库,仓库地址:github.com/huanhunmao/... star 🌟🌟🌟 谢谢~

相关推荐
不会敲代码13 分钟前
从 URL 到页面展示,还有哪些你忽略的底层细节?(DNS 与传输篇)
前端·面试
无心使然10 分钟前
Openlayers调用ArcGis要素服务之一 ——要素查询 (/query)
前端·javascript·数据可视化
ZC跨境爬虫10 分钟前
跟着 MDN 学 HTML day_1:(全套原生Input+表单结构拆解)
前端·css·ui·html
胡马北风Norstead12 分钟前
企业级门户网站设计与实现:基于SpringBoot + Vue3的全栈解决方案(Day 7)
后端
焰火199915 分钟前
[前端]单文件上传组件
前端·vue.js
kyriewen1117 分钟前
Next.js部署:从本地跑得欢,到线上飞得稳
开发语言·前端·javascript·科技·react.js·前端框架·ecmascript
慕容卡卡21 分钟前
Claude 使用神器(web页面)--CloudCLI UI
java·开发语言·前端·人工智能·ui·spring cloud
fliter22 分钟前
Cloudflare 防火墙规则背后的工程实践
后端
JarvanMo31 分钟前
搞懂这 5 个 AI 术语,你就超过了 90% 的人
前端·后端
IT_陈寒36 分钟前
Vite的HMR怎么突然失效了?原来是我太年轻
前端·人工智能·后端