From b6a5618f78c605ec1b46d4a5ad3f844a1df0832c Mon Sep 17 00:00:00 2001 From: Sithies Date: Sat, 25 Apr 2026 18:59:24 +0200 Subject: [PATCH] Fix --- .gitignore | 1 + crates/lyra/src/lib.rs | 26 +------- crates/nazarick-core/src/agent/base.rs | 61 ++++++++++--------- .../nazarick-core/src/agent/skill_executor.rs | 6 +- crates/nazarick-core/src/llm/traits.rs | 14 +++-- crates/nazarick/src/main.rs | 39 ++++++------ crates/sebas-tian/src/lib.rs | 26 +------- 7 files changed, 70 insertions(+), 103 deletions(-) diff --git a/.gitignore b/.gitignore index 89a6f2b..38b24d0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ /target +/.claude .env *.key config/private/ diff --git a/crates/lyra/src/lib.rs b/crates/lyra/src/lib.rs index 5073242..e139210 100644 --- a/crates/lyra/src/lib.rs +++ b/crates/lyra/src/lib.rs @@ -1,5 +1,5 @@ use std::sync::Arc; -use nazarick_core::agent::base::BaseAgent; +use nazarick_core::agent::base::{AgentConfig, BaseAgent}; use nazarick_core::agent::skill_registry::SkillRegistry; use nazarick_core::memory::Memory; use nazarick_core::summarizer::Summarizer; @@ -13,34 +13,14 @@ pub struct Lyra { impl Lyra { pub fn new( - agent_id: impl Into, - shared_core_path: impl Into, - soul_core_path: impl Into, + config: AgentConfig, llm: Box, registry: Arc, memory: Arc, summarizer: Arc, - max_tokens: u32, - max_loops: u32, - history_window: usize, - summary_every: usize, - conversation_timeout_mins: u64, ) -> Self { Self { - base: BaseAgent::new( - agent_id, - shared_core_path, - soul_core_path, - llm, - registry, - memory, - summarizer, - max_tokens, - max_loops, - history_window, - summary_every, - conversation_timeout_mins, - ), + base: BaseAgent::new(config, llm, registry, memory, summarizer), } } diff --git a/crates/nazarick-core/src/agent/base.rs b/crates/nazarick-core/src/agent/base.rs index 78f5059..615409e 100644 --- a/crates/nazarick-core/src/agent/base.rs +++ b/crates/nazarick-core/src/agent/base.rs @@ -13,6 +13,17 @@ use crate::agent::skill_registry::SkillRegistry; use crate::memory::Memory; use crate::summarizer::Summarizer; +pub struct AgentConfig { + pub agent_id: String, + pub shared_core_path: String, + pub soul_core_path: String, + pub max_tokens: u32, + pub max_loops: u32, + pub history_window: usize, + pub summary_every: usize, + pub conversation_timeout_mins: u64, +} + pub struct BaseAgent { pub id: AgentId, agent_id: String, @@ -36,36 +47,28 @@ pub struct BaseAgent { impl BaseAgent { pub fn new( - agent_id: impl Into, - shared_core_path: impl Into, - soul_core_path: impl Into, + config: AgentConfig, llm: Box, registry: Arc, memory: Arc, summarizer: Arc, - max_tokens: u32, - max_loops: u32, - history_window: usize, - summary_every: usize, - conversation_timeout_mins: u64, ) -> Self { let skill_format = llm.skill_format(); - let agent_id = agent_id.into(); Self { id: AgentId::new_v4(), - agent_id: agent_id.clone(), - max_tokens, - max_loops, - history_window, - summary_every, - conversation_timeout_mins, + agent_id: config.agent_id.clone(), + max_tokens: config.max_tokens, + max_loops: config.max_loops, + history_window: config.history_window, + summary_every: config.summary_every, + conversation_timeout_mins: config.conversation_timeout_mins, conversation_id: 0, messages_since_summary: 0, prompt_builder: PromptBuilder::new( - &agent_id, - shared_core_path, - soul_core_path, + &config.agent_id, + config.shared_core_path, + config.soul_core_path, ), skill_executor: SkillExecutor::new(registry.clone(), skill_format.clone()), skill_format, @@ -243,17 +246,17 @@ impl BaseAgent { continue; } - if let Some(skill_name) = Self::parse_skill_info(&clean_raw) { - if let Some(skill) = self.registry.get(&skill_name) { - let details = format!( - "[Skill-Details für '{}']\n{}", - skill_name, - skill.details() - ); - loop_context.push(Message::assistant(&clean_raw)); - loop_context.push(Message::user(&details)); - continue; - } + if let Some(skill_name) = Self::parse_skill_info(&clean_raw) + && let Some(skill) = self.registry.get(&skill_name) + { + let details = format!( + "[Skill-Details für '{}']\n{}", + skill_name, + skill.details() + ); + loop_context.push(Message::assistant(&clean_raw)); + loop_context.push(Message::user(&details)); + continue; } let (clean, feedback) = self.skill_executor.process( diff --git a/crates/nazarick-core/src/agent/skill_executor.rs b/crates/nazarick-core/src/agent/skill_executor.rs index f9ff76c..143fd43 100644 --- a/crates/nazarick-core/src/agent/skill_executor.rs +++ b/crates/nazarick-core/src/agent/skill_executor.rs @@ -120,11 +120,7 @@ impl SkillExecutor { let mut calls = Vec::new(); let mut clean = response.to_string(); - loop { - let start = match clean.find(" s, - None => break, - }; + while let Some(start) = clean.find("") { Some(e) => start + e, None => { diff --git a/crates/nazarick-core/src/llm/traits.rs b/crates/nazarick-core/src/llm/traits.rs index 8f25d6d..f27fc62 100644 --- a/crates/nazarick-core/src/llm/traits.rs +++ b/crates/nazarick-core/src/llm/traits.rs @@ -1,5 +1,6 @@ // nazarick-core/src/llm/traits.rs +use std::str::FromStr; use crate::types::Result; use crate::llm::types::{LlmRequest, LlmResponse}; @@ -13,13 +14,14 @@ pub enum SkillFormat { None, } -impl SkillFormat { - /// Parsed aus config.toml String - pub fn from_str(s: &str) -> Self { +impl FromStr for SkillFormat { + type Err = (); + + fn from_str(s: &str) -> std::result::Result { match s { - "tool_use" => Self::ToolUse, - "none" => Self::None, - _ => Self::Xml, // default + "tool_use" => Ok(Self::ToolUse), + "none" => Ok(Self::None), + _ => Ok(Self::Xml), } } } diff --git a/crates/nazarick/src/main.rs b/crates/nazarick/src/main.rs index a96600e..b171c6c 100644 --- a/crates/nazarick/src/main.rs +++ b/crates/nazarick/src/main.rs @@ -10,6 +10,7 @@ use tokio::sync::Mutex; use tower_http::trace::TraceLayer; use tracing::info; +use nazarick_core::agent::base::AgentConfig; use nazarick_core::agent::skill_registry::SkillRegistry; use nazarick_core::llm::{LlmProvider, SkillFormat}; use api::llm::openai_compat::OpenAiCompatProvider; @@ -26,7 +27,7 @@ use skills as _; fn build_provider(model_cfg: &ModelConfig) -> Box { let skill_format = model_cfg.skill_format .as_deref() - .map(SkillFormat::from_str) + .map(|s| s.parse::().unwrap_or(SkillFormat::Xml)) .unwrap_or(SkillFormat::Xml); match model_cfg.provider.as_str() { @@ -107,34 +108,38 @@ async fn main() -> anyhow::Result<()> { info!("Memory geladen"); let mut sebas = Sebas::new( - "sebas_tian", - "config/shared_core.md", - "crates/sebas-tian/config/soul_core.md", + AgentConfig { + agent_id: "sebas_tian".to_string(), + shared_core_path: "config/shared_core.md".to_string(), + soul_core_path: "crates/sebas-tian/config/soul_core.md".to_string(), + max_tokens: sebas_cfg.max_tokens, + max_loops: sebas_cfg.max_loops, + history_window: sebas_cfg.history_window, + summary_every: sebas_cfg.summary_every, + conversation_timeout_mins: sebas_cfg.conversation_timeout_mins, + }, build_provider(sebas_model), registry.clone(), sebas_memory, summarizer.clone(), - sebas_cfg.max_tokens, - sebas_cfg.max_loops, - sebas_cfg.history_window, - sebas_cfg.summary_every, - sebas_cfg.conversation_timeout_mins, ); sebas.init().await?; let mut lyra = Lyra::new( - "lyra", - "config/shared_core.md", - "crates/lyra/config/soul_core.md", + AgentConfig { + agent_id: "lyra".to_string(), + shared_core_path: "config/shared_core.md".to_string(), + soul_core_path: "crates/lyra/config/soul_core.md".to_string(), + max_tokens: lyra_cfg.max_tokens, + max_loops: lyra_cfg.max_loops, + history_window: lyra_cfg.history_window, + summary_every: lyra_cfg.summary_every, + conversation_timeout_mins: lyra_cfg.conversation_timeout_mins, + }, build_provider(lyra_model), registry.clone(), lyra_memory, summarizer.clone(), - lyra_cfg.max_tokens, - lyra_cfg.max_loops, - lyra_cfg.history_window, - lyra_cfg.summary_every, - lyra_cfg.conversation_timeout_mins, ); lyra.init().await?; diff --git a/crates/sebas-tian/src/lib.rs b/crates/sebas-tian/src/lib.rs index 9f0dad5..639409a 100644 --- a/crates/sebas-tian/src/lib.rs +++ b/crates/sebas-tian/src/lib.rs @@ -1,5 +1,5 @@ use std::sync::Arc; -use nazarick_core::agent::base::BaseAgent; +use nazarick_core::agent::base::{AgentConfig, BaseAgent}; use nazarick_core::agent::skill_registry::SkillRegistry; use nazarick_core::memory::Memory; use nazarick_core::summarizer::Summarizer; @@ -13,34 +13,14 @@ pub struct Sebas { impl Sebas { pub fn new( - agent_id: impl Into, - shared_core_path: impl Into, - soul_core_path: impl Into, + config: AgentConfig, llm: Box, registry: Arc, memory: Arc, summarizer: Arc, - max_tokens: u32, - max_loops: u32, - history_window: usize, - summary_every: usize, - conversation_timeout_mins: u64, ) -> Self { Self { - base: BaseAgent::new( - agent_id, - shared_core_path, - soul_core_path, - llm, - registry, - memory, - summarizer, - max_tokens, - max_loops, - history_window, - summary_every, - conversation_timeout_mins, - ), + base: BaseAgent::new(config, llm, registry, memory, summarizer), } }