From 0ea98c6e8e5a69998f5daeb35a1c27a7f2323cd2 Mon Sep 17 00:00:00 2001 From: ooodc <549496103@qq.com> Date: Sun, 10 May 2026 14:47:22 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E7=94=9F=E6=88=90?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E7=8E=AF=E5=A2=83=E4=BF=A1=E6=81=AF=E6=8F=90?= =?UTF-8?q?=E7=A4=BA=E8=AF=8D=E5=8A=9F=E8=83=BD=EF=BC=8C=E5=B9=B6=E5=9C=A8?= =?UTF-8?q?=E4=BC=9A=E8=AF=9D=E5=8E=86=E5=8F=B2=E4=B8=AD=E6=B3=A8=E5=85=A5?= =?UTF-8?q?=E8=AF=A5=E6=8F=90=E7=A4=BA=E8=AF=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/gateway/prompt.rs | 25 +++++++++++++++++++++++++ src/gateway/session.rs | 1 + src/gateway/session_history.rs | 17 ++++++++++++++++- 3 files changed, 42 insertions(+), 1 deletion(-) diff --git a/src/gateway/prompt.rs b/src/gateway/prompt.rs index c41cf8d..1735dad 100644 --- a/src/gateway/prompt.rs +++ b/src/gateway/prompt.rs @@ -1,7 +1,9 @@ +use std::env; use std::fs; use std::path::{Path, PathBuf}; use crate::agent::AgentError; +use crate::config::LLMProviderConfig; use crate::platform::atomic_rename; pub(crate) const DEFAULT_AGENT_PROMPT: &str = include_str!("default_agent_prompt.md"); @@ -100,6 +102,29 @@ fn strip_comments_and_whitespace(content: &str) -> String { .join("\n") } +/// 生成系统环境信息提示词 +pub(crate) fn generate_system_environment_prompt(config: &LLMProviderConfig) -> String { + use std::env::consts::{ARCH, OS}; + + let os_name = match OS { + "windows" => "Windows", + "linux" => "Linux", + "macos" => "macOS", + "freebsd" => "FreeBSD", + _ => OS, + }; + + let shell = env::var("SHELL").unwrap_or_else(|_| "unknown".to_string()); + let cwd = env::current_dir() + .map(|p| p.display().to_string()) + .unwrap_or_else(|_| "unknown".to_string()); + + format!( + "## 系统环境\n- 操作系统: {}\n- 架构: {}\n- Shell: {}\n- 当前工作目录: {}\n- 模型提供商: {}\n- 模型: {}", + os_name, ARCH, shell, cwd, config.name, config.model_id + ) +} + fn persist_memory_summary(path: &Path, markdown_body: &str) -> Result<(), AgentError> { let trimmed = markdown_body.trim(); if trimmed.is_empty() { diff --git a/src/gateway/session.rs b/src/gateway/session.rs index ec2d558..7b78178 100644 --- a/src/gateway/session.rs +++ b/src/gateway/session.rs @@ -141,6 +141,7 @@ impl Session { prompt_injector, conversations, skill_events, + provider_config, ), }) } diff --git a/src/gateway/session_history.rs b/src/gateway/session_history.rs index c209e75..a19923f 100644 --- a/src/gateway/session_history.rs +++ b/src/gateway/session_history.rs @@ -3,10 +3,12 @@ use std::sync::Arc; use crate::agent::AgentError; use crate::bus::ChatMessage; +use crate::config::LLMProviderConfig; use crate::storage::{ ConversationRepository, SessionRecord, SkillEventRepository, persistent_session_id, }; +use super::prompt::generate_system_environment_prompt; use super::prompt_injector::PromptInjector; fn preview_text(content: &str, max_chars: usize) -> String { @@ -24,6 +26,7 @@ pub(crate) struct SessionHistory { prompt_injector: PromptInjector, conversations: Arc, skill_events: Arc, + provider_config: LLMProviderConfig, } impl SessionHistory { @@ -32,6 +35,7 @@ impl SessionHistory { prompt_injector: PromptInjector, conversations: Arc, skill_events: Arc, + provider_config: LLMProviderConfig, ) -> Self { Self { channel_name: channel_name.into(), @@ -40,6 +44,7 @@ impl SessionHistory { prompt_injector, conversations, skill_events, + provider_config, } } @@ -259,9 +264,19 @@ impl SessionHistory { return Ok(()); } + // 注入 Agent Prompt let prompt_injector = self.prompt_injector.clone(); prompt_injector.ensure_initial_prompt(history_is_empty, |message| { self.append_persisted_message(chat_id, message) - }) + })?; + + // 注入系统环境提示词 + let env_prompt = generate_system_environment_prompt(&self.provider_config); + self.append_persisted_message( + chat_id, + ChatMessage::system(env_prompt), + )?; + + Ok(()) } }