Fix
CI / check (push) Successful in 3m13s
CI / test (push) Successful in 3m53s
CI / clippy (push) Failing after 3m15s
CI / deploy (push) Has been skipped

This commit is contained in:
2026-04-25 18:59:24 +02:00
parent fe148fda4e
commit b6a5618f78
7 changed files with 70 additions and 103 deletions
+3 -23
View File
@@ -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<String>,
shared_core_path: impl Into<String>,
soul_core_path: impl Into<String>,
config: AgentConfig,
llm: Box<dyn LlmProvider>,
registry: Arc<SkillRegistry>,
memory: Arc<dyn Memory>,
summarizer: Arc<dyn Summarizer>,
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),
}
}
+32 -29
View File
@@ -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<String>,
shared_core_path: impl Into<String>,
soul_core_path: impl Into<String>,
config: AgentConfig,
llm: Box<dyn LlmProvider>,
registry: Arc<SkillRegistry>,
memory: Arc<dyn Memory>,
summarizer: Arc<dyn Summarizer>,
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(
@@ -120,11 +120,7 @@ impl SkillExecutor {
let mut calls = Vec::new();
let mut clean = response.to_string();
loop {
let start = match clean.find("<skill name=\"") {
Some(s) => s,
None => break,
};
while let Some(start) = clean.find("<skill name=\"") {
let end = match clean[start..].find("</skill>") {
Some(e) => start + e,
None => {
+8 -6
View File
@@ -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<Self, Self::Err> {
match s {
"tool_use" => Self::ToolUse,
"none" => Self::None,
_ => Self::Xml, // default
"tool_use" => Ok(Self::ToolUse),
"none" => Ok(Self::None),
_ => Ok(Self::Xml),
}
}
}
+22 -17
View File
@@ -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<dyn LlmProvider> {
let skill_format = model_cfg.skill_format
.as_deref()
.map(SkillFormat::from_str)
.map(|s| s.parse::<SkillFormat>().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?;
+3 -23
View File
@@ -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<String>,
shared_core_path: impl Into<String>,
soul_core_path: impl Into<String>,
config: AgentConfig,
llm: Box<dyn LlmProvider>,
registry: Arc<SkillRegistry>,
memory: Arc<dyn Memory>,
summarizer: Arc<dyn Summarizer>,
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),
}
}