1 line
15 KiB
JSON
1 line
15 KiB
JSON
{"repo": "binwan-dev/bincode", "files": {"backend/src/agent/core.rs": {"025cd5aab3ba075745beba661162950b25ffacca": {"t": 1785745862.6372752, "n": 4816, "h": "646870f71ccabf65", "c": "use std::path::PathBuf;\nuse std::sync::Arc;\nuse tokio::sync::RwLock;\n\nuse crate::agent::tool::{self, FileChange};\nuse crate::config::{AppConfig, MetaSuggestion};\nuse crate::memory::Context;\nuse crate::model::LlmProvider;\n\npub struct CoreAgent {\n provider: Arc<dyn LlmProvider>,\n config: Arc<RwLock<AppConfig>>,\n context: Arc<RwLock<Context>>,\n meta_check_enabled: bool,\n pub work_dir: PathBuf,\n}\n\nimpl CoreAgent {\n pub fn new(\n provider: Arc<dyn LlmProvider>,\n system_prompt: String,\n config: Arc<RwLock<AppConfig>>,\n work_dir: PathBuf,\n ) -> Self {\n let ctx = Context::new(system_prompt);\n\n Self {\n provider: provider.clone(),\n config,\n context: Arc::new(RwLock::new(ctx)),\n meta_check_enabled: true,\n work_dir,\n }\n }\n\n pub async fn process_message(\n &self,\n user_message: String,\n ) -> Result<impl futures::Stream<Item = Result<String, String>> + Unpin, String> {\n {\n let mut ctx = self.context.write().await;\n ctx.add(\"user\", user_message.clone());\n\n let cfg = self.config.read().await;\n ctx.system_prompt = cfg.system_prompt.clone();\n ctx.trim(cfg.max_context_messages);\n }\n\n let messages = {\n let ctx = self.context.read().await;\n ctx.to_api_messages()\n };\n\n let (temperature, max_tokens, model) = {\n let cfg = self.config.read().await;\n (cfg.temperature, cfg.max_tokens, cfg.model.clone())\n };\n\n self.provider\n .chat_stream(messages, temperature, max_tokens, &model)\n .await\n }\n\n pub async fn finalize_response(&self, content: String) -> Vec<FileChange> {\n {\n let mut ctx = self.context.write().await;\n ctx.add(\"assistant\", content.clone());\n }\n\n let changes = tool::execute_tools(&content, &self.work_dir);\n\n if !self.meta_check_enabled {\n return changes;\n }\n\n let should_check = {\n let ctx = self.context.read().await;\n let cfg = self.config.read().await;\n let user_count = ctx.messages.iter().filter(|m| m.role == \"user\").count();\n user_count > 0 && user_count % cfg.meta_check_interval == 0\n };\n\n if should_check {\n self.run_meta_check().await;\n }\n\n changes\n }\n\n async fn run_meta_check(&self) {\n let (api_key, _base_url, model) = {\n let cfg = self.config.read().await;\n (\n cfg.deepseek_api_key.clone(),\n cfg.deepseek_base_url.clone(),\n cfg.model.clone(),\n )\n };\n\n if api_key.is_empty() {\n return;\n }\n\n let current_settings = {\n let cfg = self.config.read().await;\n format!(\n \"Current: temperature={}, max_tokens={}, model={}\\nSystem: {}\",\n cfg.temperature, cfg.max_tokens, cfg.model, cfg.system_prompt\n )\n };\n\n let meta_messages = vec![\n crate::model::ChatMessage {\n role: \"system\".into(),\n content: META_SYSTEM_PROMPT.into(),\n },\n crate::model::ChatMessage {\n role: \"user\".into(),\n content: format!(\"Evaluate: {current_settings}\"),\n },\n ];\n\n let resp = match self.provider.chat(meta_messages, 0.1, 1024, &model).await {\n Ok(r) => r,\n Err(_) => return,\n };\n\n let json_str = resp.trim();\n let suggestion: MetaSuggestion = match serde_json::from_str(json_str) {\n Ok(s) => s,\n Err(_) => return,\n };\n\n let changed = suggestion.temperature.is_some()\n || suggestion.max_tokens.is_some()\n || suggestion.system_prompt.is_some()\n || suggestion.model.is_some();\n\n if changed {\n let mut cfg = self.config.write().await;\n cfg.apply_meta_suggestion(&suggestion);\n println!(\"[Meta] Auto-adjusted: {}\", suggestion.reason);\n }\n }\n}\n\nconst META_SYSTEM_PROMPT: &str = r#\"You are a configuration tuning AI. Analyze and suggest optimal LLM parameters. Output ONLY valid JSON, no explanation:\n\n{\n \"temperature\": <0.0-2.0 or null>,\n \"max_tokens\": <256-8192 or null>,\n \"system_prompt\": \"<new prompt or null>\",\n \"model\": \"<model name or null>\",\n \"reason\": \"<brief reason>\"\n}\n\nRules:\n- Higher temp (0.7-1.2) = creative/chat. Lower (0.1-0.4) = code/precision\n- Higher max_tokens = long responses needed. Lower = short answers\n- Adjust system_prompt if assistant style needs correction\n- null = no change needed. If all null, reason = \"no changes needed\"\"#;\n"}, "7a41c48a2f749aa38c615f98670453d7293aa1c5": {"t": 1785757369.0706718, "n": 4816, "h": "646870f71ccabf65", "c": "use std::path::PathBuf;\nuse std::sync::Arc;\nuse tokio::sync::RwLock;\n\nuse crate::agent::tool::{self, FileChange};\nuse crate::config::{AppConfig, MetaSuggestion};\nuse crate::memory::Context;\nuse crate::model::LlmProvider;\n\npub struct CoreAgent {\n provider: Arc<dyn LlmProvider>,\n config: Arc<RwLock<AppConfig>>,\n context: Arc<RwLock<Context>>,\n meta_check_enabled: bool,\n pub work_dir: PathBuf,\n}\n\nimpl CoreAgent {\n pub fn new(\n provider: Arc<dyn LlmProvider>,\n system_prompt: String,\n config: Arc<RwLock<AppConfig>>,\n work_dir: PathBuf,\n ) -> Self {\n let ctx = Context::new(system_prompt);\n\n Self {\n provider: provider.clone(),\n config,\n context: Arc::new(RwLock::new(ctx)),\n meta_check_enabled: true,\n work_dir,\n }\n }\n\n pub async fn process_message(\n &self,\n user_message: String,\n ) -> Result<impl futures::Stream<Item = Result<String, String>> + Unpin, String> {\n {\n let mut ctx = self.context.write().await;\n ctx.add(\"user\", user_message.clone());\n\n let cfg = self.config.read().await;\n ctx.system_prompt = cfg.system_prompt.clone();\n ctx.trim(cfg.max_context_messages);\n }\n\n let messages = {\n let ctx = self.context.read().await;\n ctx.to_api_messages()\n };\n\n let (temperature, max_tokens, model) = {\n let cfg = self.config.read().await;\n (cfg.temperature, cfg.max_tokens, cfg.model.clone())\n };\n\n self.provider\n .chat_stream(messages, temperature, max_tokens, &model)\n .await\n }\n\n pub async fn finalize_response(&self, content: String) -> Vec<FileChange> {\n {\n let mut ctx = self.context.write().await;\n ctx.add(\"assistant\", content.clone());\n }\n\n let changes = tool::execute_tools(&content, &self.work_dir);\n\n if !self.meta_check_enabled {\n return changes;\n }\n\n let should_check = {\n let ctx = self.context.read().await;\n let cfg = self.config.read().await;\n let user_count = ctx.messages.iter().filter(|m| m.role == \"user\").count();\n user_count > 0 && user_count % cfg.meta_check_interval == 0\n };\n\n if should_check {\n self.run_meta_check().await;\n }\n\n changes\n }\n\n async fn run_meta_check(&self) {\n let (api_key, _base_url, model) = {\n let cfg = self.config.read().await;\n (\n cfg.deepseek_api_key.clone(),\n cfg.deepseek_base_url.clone(),\n cfg.model.clone(),\n )\n };\n\n if api_key.is_empty() {\n return;\n }\n\n let current_settings = {\n let cfg = self.config.read().await;\n format!(\n \"Current: temperature={}, max_tokens={}, model={}\\nSystem: {}\",\n cfg.temperature, cfg.max_tokens, cfg.model, cfg.system_prompt\n )\n };\n\n let meta_messages = vec![\n crate::model::ChatMessage {\n role: \"system\".into(),\n content: META_SYSTEM_PROMPT.into(),\n },\n crate::model::ChatMessage {\n role: \"user\".into(),\n content: format!(\"Evaluate: {current_settings}\"),\n },\n ];\n\n let resp = match self.provider.chat(meta_messages, 0.1, 1024, &model).await {\n Ok(r) => r,\n Err(_) => return,\n };\n\n let json_str = resp.trim();\n let suggestion: MetaSuggestion = match serde_json::from_str(json_str) {\n Ok(s) => s,\n Err(_) => return,\n };\n\n let changed = suggestion.temperature.is_some()\n || suggestion.max_tokens.is_some()\n || suggestion.system_prompt.is_some()\n || suggestion.model.is_some();\n\n if changed {\n let mut cfg = self.config.write().await;\n cfg.apply_meta_suggestion(&suggestion);\n println!(\"[Meta] Auto-adjusted: {}\", suggestion.reason);\n }\n }\n}\n\nconst META_SYSTEM_PROMPT: &str = r#\"You are a configuration tuning AI. Analyze and suggest optimal LLM parameters. Output ONLY valid JSON, no explanation:\n\n{\n \"temperature\": <0.0-2.0 or null>,\n \"max_tokens\": <256-8192 or null>,\n \"system_prompt\": \"<new prompt or null>\",\n \"model\": \"<model name or null>\",\n \"reason\": \"<brief reason>\"\n}\n\nRules:\n- Higher temp (0.7-1.2) = creative/chat. Lower (0.1-0.4) = code/precision\n- Higher max_tokens = long responses needed. Lower = short answers\n- Adjust system_prompt if assistant style needs correction\n- null = no change needed. If all null, reason = \"no changes needed\"\"#;\n"}, "e857dcfdef4fe9cc5b70c64d299783d6397cefd8": {"t": 1785757370.463109, "n": 4550, "h": "1fa182ebe2ae5bcd", "c": "use std::sync::Arc;\nuse tokio::sync::RwLock;\n\nuse crate::config::{AppConfig, MetaSuggestion};\nuse crate::memory::Context;\nuse crate::model::LlmProvider;\n\npub struct CoreAgent {\n provider: Arc<dyn LlmProvider>,\n config: Arc<RwLock<AppConfig>>,\n context: Arc<RwLock<Context>>,\n meta_check_enabled: bool,\n}\n\nimpl CoreAgent {\n pub fn new(\n provider: Arc<dyn LlmProvider>,\n system_prompt: String,\n config: Arc<RwLock<AppConfig>>,\n ) -> Self {\n let ctx = Context::new(system_prompt);\n\n Self {\n provider: provider.clone(),\n config,\n context: Arc::new(RwLock::new(ctx)),\n meta_check_enabled: true,\n }\n }\n\n pub async fn process_message(\n &self,\n user_message: String,\n ) -> Result<impl futures::Stream<Item = Result<String, String>> + Unpin, String> {\n {\n let mut ctx = self.context.write().await;\n ctx.add(\"user\", user_message.clone());\n\n let cfg = self.config.read().await;\n ctx.system_prompt = cfg.system_prompt.clone();\n ctx.trim(cfg.max_context_messages);\n }\n\n let messages = {\n let ctx = self.context.read().await;\n ctx.to_api_messages()\n };\n\n let (temperature, max_tokens, model) = {\n let cfg = self.config.read().await;\n (cfg.temperature, cfg.max_tokens, cfg.model.clone())\n };\n\n self.provider\n .chat_stream(messages, temperature, max_tokens, &model)\n .await\n }\n\n pub async fn finalize_response(&self, content: String) {\n {\n let mut ctx = self.context.write().await;\n ctx.add(\"assistant\", content);\n }\n\n if !self.meta_check_enabled {\n return;\n }\n\n let should_check = {\n let ctx = self.context.read().await;\n let cfg = self.config.read().await;\n let user_count = ctx.messages.iter().filter(|m| m.role == \"user\").count();\n user_count > 0 && user_count % cfg.meta_check_interval == 0\n };\n\n if should_check {\n self.run_meta_check().await;\n }\n }\n\n async fn run_meta_check(&self) {\n let (api_key, _base_url, model) = {\n let cfg = self.config.read().await;\n (\n cfg.deepseek_api_key.clone(),\n cfg.deepseek_base_url.clone(),\n cfg.model.clone(),\n )\n };\n\n if api_key.is_empty() {\n return;\n }\n\n let current_settings = {\n let cfg = self.config.read().await;\n format!(\n \"Current: temperature={}, max_tokens={}, model={}\\nSystem: {}\",\n cfg.temperature, cfg.max_tokens, cfg.model, cfg.system_prompt\n )\n };\n\n let meta_messages = vec![\n crate::model::ChatMessage {\n role: \"system\".into(),\n content: META_SYSTEM_PROMPT.into(),\n },\n crate::model::ChatMessage {\n role: \"user\".into(),\n content: format!(\"Evaluate: {current_settings}\"),\n },\n ];\n\n let resp = match self.provider.chat(meta_messages, 0.1, 1024, &model).await {\n Ok(r) => r,\n Err(_) => return,\n };\n\n let json_str = resp.trim();\n let suggestion: MetaSuggestion = match serde_json::from_str(json_str) {\n Ok(s) => s,\n Err(_) => return,\n };\n\n let changed = suggestion.temperature.is_some()\n || suggestion.max_tokens.is_some()\n || suggestion.system_prompt.is_some()\n || suggestion.model.is_some();\n\n if changed {\n let mut cfg = self.config.write().await;\n cfg.apply_meta_suggestion(&suggestion);\n println!(\"[Meta] Auto-adjusted: {}\", suggestion.reason);\n }\n }\n}\n\nconst META_SYSTEM_PROMPT: &str = r#\"You are a configuration tuning AI. Analyze and suggest optimal LLM parameters. Output ONLY valid JSON, no explanation:\n\n{\n \"temperature\": <0.0-2.0 or null>,\n \"max_tokens\": <256-8192 or null>,\n \"system_prompt\": \"<new prompt or null>\",\n \"model\": \"<model name or null>\",\n \"reason\": \"<brief reason>\"\n}\n\nRules:\n- Higher temp (0.7-1.2) = creative/chat. Lower (0.1-0.4) = code/precision\n- Higher max_tokens = long responses needed. Lower = short answers\n- Adjust system_prompt if assistant style needs correction\n- null = no change needed. If all null, reason = \"no changes needed\"\"#;\n"}}}} |