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(()) } }