新增浏览器调用能力。

This commit is contained in:
xiaoski 2026-05-21 17:11:53 +08:00
parent 2f11aed44a
commit b85578a7d2
6 changed files with 1087 additions and 1 deletions

View File

@ -48,6 +48,7 @@ http = "1"
encoding_rs = "0.8" encoding_rs = "0.8"
zstd = "0.13" zstd = "0.13"
tar = "0.4" tar = "0.4"
fantoccini = { version = "0.22", default-features = false, features = ["rustls-tls"] }
[build-dependencies] [build-dependencies]
zstd = "0.13" zstd = "0.13"

View File

@ -55,6 +55,8 @@ pub struct Config {
pub workspace_dir: String, pub workspace_dir: String,
#[serde(default)] #[serde(default)]
pub mcp: McpConfig, pub mcp: McpConfig,
#[serde(default)]
pub browser: BrowserConfig,
} }
fn default_workspace_dir() -> String { fn default_workspace_dir() -> String {
@ -324,6 +326,37 @@ fn default_mcp_tool_timeout_secs() -> u64 {
180 180
} }
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct BrowserConfig {
#[serde(default)]
pub enabled: bool,
#[serde(default = "default_webdriver_url")]
pub webdriver_url: String,
#[serde(default = "default_true")]
pub headless: bool,
#[serde(default)]
pub chrome_path: Option<String>,
}
fn default_webdriver_url() -> String {
"http://127.0.0.1:9515".to_string()
}
fn default_true() -> bool {
true
}
impl Default for BrowserConfig {
fn default() -> Self {
Self {
enabled: false,
webdriver_url: default_webdriver_url(),
headless: true,
chrome_path: None,
}
}
}
fn default_recall_limit() -> usize { 5 } fn default_recall_limit() -> usize { 5 }
fn default_idle_consolidation_minutes() -> u64 { 10 } fn default_idle_consolidation_minutes() -> u64 { 10 }
fn default_timeline_retention_days() -> u64 { 90 } fn default_timeline_retention_days() -> u64 { 90 }

View File

@ -78,12 +78,19 @@ impl GatewayState {
// Create MessageBus first (shared by SessionManager and ChannelManager) // Create MessageBus first (shared by SessionManager and ChannelManager)
let bus = MessageBus::new(100); let bus = MessageBus::new(100);
let browser_config = if config.browser.enabled {
Some(config.browser.clone())
} else {
None
};
// Create SessionManager with bus injection // Create SessionManager with bus injection
let session_manager = SessionManager::new( let session_manager = SessionManager::new(
provider_config.clone(), provider_config.clone(),
storage.clone(), storage.clone(),
bus.clone(), bus.clone(),
memory_manager, memory_manager,
browser_config,
)?; )?;
let session_manager = Arc::new(session_manager); let session_manager = Arc::new(session_manager);

View File

@ -21,6 +21,7 @@ pub enum HandleResult {
} }
use crate::channels::slash_command::parse_slash_command; use crate::channels::slash_command::parse_slash_command;
use crate::config::LLMProviderConfig; use crate::config::LLMProviderConfig;
use crate::config::BrowserConfig;
use crate::agent::{AgentLoop, AgentError, ContextCompressor}; use crate::agent::{AgentLoop, AgentError, ContextCompressor};
use crate::agent::system_prompt::build_system_prompt; use crate::agent::system_prompt::build_system_prompt;
use crate::agent::context_compressor::ContextCompressionConfig; use crate::agent::context_compressor::ContextCompressionConfig;
@ -813,13 +814,18 @@ impl SessionManager {
storage: Arc<Storage>, storage: Arc<Storage>,
bus: Arc<MessageBus>, bus: Arc<MessageBus>,
memory_manager: Arc<crate::memory::MemoryManager>, memory_manager: Arc<crate::memory::MemoryManager>,
browser_config: Option<BrowserConfig>,
) -> Result<Self, AgentError> { ) -> Result<Self, AgentError> {
let mut skills_loader = SkillsLoader::new(); let mut skills_loader = SkillsLoader::new();
skills_loader.load_skills(); skills_loader.load_skills();
skills_loader.set_workspace_skills_dir(provider_config.workspace_dir.clone()); skills_loader.set_workspace_skills_dir(provider_config.workspace_dir.clone());
let skills_loader = Arc::new(skills_loader); let skills_loader = Arc::new(skills_loader);
let tools = Arc::new(create_default_tools(skills_loader.clone(), memory_manager.clone())); let tools = Arc::new(create_default_tools(
skills_loader.clone(),
memory_manager.clone(),
browser_config.as_ref(),
));
Ok(Self { Ok(Self {
inner: Arc::new(Mutex::new(SessionManagerInner { inner: Arc::new(Mutex::new(SessionManagerInner {

1029
src/tools/browser.rs Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,4 +1,5 @@
pub mod bash; pub mod bash;
pub mod browser;
pub mod calculator; pub mod calculator;
pub mod chat_manager; pub mod chat_manager;
pub mod content_search; pub mod content_search;
@ -18,6 +19,7 @@ pub mod traits;
pub mod web_fetch; pub mod web_fetch;
pub use bash::BashTool; pub use bash::BashTool;
pub use browser::BrowserTool;
pub use calculator::CalculatorTool; pub use calculator::CalculatorTool;
pub use chat_manager::ChatManagerTool; pub use chat_manager::ChatManagerTool;
pub use content_search::ContentSearchTool; pub use content_search::ContentSearchTool;
@ -34,6 +36,7 @@ pub use traits::{OutboundMessenger, Tool, ToolResult};
pub use web_fetch::WebFetchTool; pub use web_fetch::WebFetchTool;
use std::sync::Arc; use std::sync::Arc;
use crate::config::BrowserConfig;
use crate::memory::MemoryManager; use crate::memory::MemoryManager;
use crate::skills::SkillsLoader; use crate::skills::SkillsLoader;
@ -43,6 +46,7 @@ use crate::skills::SkillsLoader;
pub fn create_default_tools( pub fn create_default_tools(
skills_loader: Arc<SkillsLoader>, skills_loader: Arc<SkillsLoader>,
memory: Arc<MemoryManager>, memory: Arc<MemoryManager>,
browser_config: Option<&BrowserConfig>,
) -> ToolRegistry { ) -> ToolRegistry {
let registry = ToolRegistry::new(); let registry = ToolRegistry::new();
registry.register(CalculatorTool::new()); registry.register(CalculatorTool::new());
@ -66,5 +70,11 @@ pub fn create_default_tools(
registry.register(TimelineRecallTool::new(memory.clone())); registry.register(TimelineRecallTool::new(memory.clone()));
registry.register(MemoryForgetTool::new(memory.clone())); registry.register(MemoryForgetTool::new(memory.clone()));
if let Some(cfg) = browser_config {
if cfg.enabled {
registry.register(BrowserTool::new(cfg));
}
}
registry registry
} }