Skip to main content

vv_agent/cli/
task.rs

1use chrono::Utc;
2use serde_json::Value;
3
4use crate::config::{apply_resolved_model_limits, ResolvedModelConfig};
5use crate::prompt::{build_system_prompt_bundle_with_options, BuildSystemPromptOptions};
6use crate::types::AgentTask;
7
8use super::args::CliArgs;
9
10pub fn build_cli_task(
11    args: &CliArgs,
12    model_id: impl Into<String>,
13    task_id: impl Into<String>,
14) -> Result<AgentTask, String> {
15    let prompt_bundle = build_system_prompt_bundle_with_options(
16        "You are Vector Vein agent runtime demo. Execute tasks with reliable tool usage and clear final outputs.",
17        BuildSystemPromptOptions {
18            language: args.language.clone(),
19            allow_interruption: true,
20            use_workspace: true,
21            enable_todo_management: true,
22            agent_type: args.agent_type.clone(),
23            workspace: Some(args.workspace.clone()),
24            ..BuildSystemPromptOptions::default()
25        },
26    );
27    let mut task = AgentTask::new(task_id, model_id, prompt_bundle.prompt, args.prompt.clone());
28    task.max_cycles = args.max_cycles.max(1);
29    task.agent_type = args.agent_type.clone();
30    task.model_settings = args.model_settings.clone();
31    task.metadata
32        .insert("language".to_string(), Value::String(args.language.clone()));
33    task.metadata.insert(
34        "system_prompt_sections".to_string(),
35        Value::Array(prompt_bundle.sections),
36    );
37    Ok(task)
38}
39
40pub fn build_cli_task_from_resolved(
41    args: &CliArgs,
42    resolved: &ResolvedModelConfig,
43    task_id: impl Into<String>,
44) -> Result<AgentTask, String> {
45    let mut task = build_cli_task(args, resolved.model_id.clone(), task_id)?;
46    apply_resolved_model_limits(&mut task, resolved);
47    Ok(task)
48}
49
50pub(super) fn generate_task_id() -> String {
51    format!("task_{}", Utc::now().format("%Y%m%d%H%M%S%3f"))
52}