vv-agent 0.4.7

VectorVein agent runtime, SDK, CLI, tools, and workspace backends
Documentation
use std::collections::BTreeMap;
use std::sync::Arc;

use crate::config::build_vv_llm_from_local_settings;
use crate::types::{AgentTask, SubAgentConfig};

use super::super::types::{ResolvedSubAgentClient, SubTaskRunContext};

pub(super) fn resolve_sub_agent_client(
    context: &SubTaskRunContext,
    parent_task: &AgentTask,
    sub_agent: &SubAgentConfig,
) -> Result<ResolvedSubAgentClient, String> {
    let requested_model = if sub_agent.model.trim().is_empty() {
        parent_task.model.clone()
    } else {
        sub_agent.model.clone()
    };

    if let Some(settings_file) = &context.settings_file {
        let backend = sub_agent
            .backend
            .clone()
            .or_else(|| context.default_backend.clone())
            .unwrap_or_else(|| "inline".to_string());
        let (client, resolved) = build_vv_llm_from_local_settings(
            settings_file,
            &backend,
            &requested_model,
            context.sub_agent_timeout_seconds,
        )
        .map_err(|error| error.to_string())?;
        let endpoint = resolved
            .endpoint()
            .map(|endpoint| endpoint.endpoint_id.clone())
            .unwrap_or_default();
        let resolved_payload = BTreeMap::from([
            ("backend".to_string(), resolved.backend.clone()),
            (
                "selected_model".to_string(),
                resolved.selected_model.clone(),
            ),
            ("model_id".to_string(), resolved.model_id.clone()),
            ("endpoint".to_string(), endpoint),
        ]);
        return Ok(ResolvedSubAgentClient {
            llm_client: Arc::new(client),
            model_id: resolved.model_id,
            payload: resolved_payload,
        });
    }

    if requested_model != parent_task.model {
        return Err(
            "Sub-agent model resolution requires runtime settings_file when sub-agent model differs from parent model."
                .to_string(),
        );
    }

    Ok(ResolvedSubAgentClient {
        llm_client: context.llm_client.clone(),
        model_id: parent_task.model.clone(),
        payload: BTreeMap::new(),
    })
}