Skip to main content

opendev_models/config/
agent.rs

1//! Agent and model variant configuration models.
2
3use serde::{Deserialize, Serialize};
4use std::collections::HashMap;
5
6/// A named model configuration variant.
7#[derive(Debug, Clone, Serialize, Deserialize)]
8pub struct ModelVariant {
9    pub name: String,
10    pub model: String,
11    pub provider: String,
12    #[serde(default = "super::default_temperature")]
13    pub temperature: f64,
14    #[serde(default = "super::default_max_tokens")]
15    pub max_tokens: u32,
16    #[serde(default)]
17    pub description: String,
18}
19
20/// Inline agent configuration from opendev.json.
21///
22/// Allows defining new agents or overriding builtin agents directly
23/// in the config file. All fields are optional — only specified fields
24/// are applied as overrides.
25///
26/// Also used for model role entries (e.g. `agents.compact`) where only
27/// `model` and `provider` are relevant.
28#[derive(Debug, Clone, Default, Serialize, Deserialize)]
29pub struct AgentConfigInline {
30    /// Model override (e.g. "gpt-4o", "claude-opus-4-5").
31    #[serde(skip_serializing_if = "Option::is_none")]
32    pub model: Option<String>,
33    /// Provider override (e.g. "openai", "google").
34    #[serde(skip_serializing_if = "Option::is_none")]
35    pub provider: Option<String>,
36    /// System prompt override or addition.
37    #[serde(skip_serializing_if = "Option::is_none")]
38    pub prompt: Option<String>,
39    /// Description of when to use this agent.
40    #[serde(skip_serializing_if = "Option::is_none")]
41    pub description: Option<String>,
42    /// Temperature override.
43    #[serde(skip_serializing_if = "Option::is_none")]
44    pub temperature: Option<f64>,
45    /// Top-p override.
46    #[serde(skip_serializing_if = "Option::is_none")]
47    pub top_p: Option<f64>,
48    /// Max iterations (steps) for the react loop.
49    #[serde(skip_serializing_if = "Option::is_none")]
50    pub max_steps: Option<usize>,
51    /// Agent mode: "primary", "subagent", or "all".
52    #[serde(skip_serializing_if = "Option::is_none")]
53    pub mode: Option<String>,
54    /// Display color (hex string like "#FF6600").
55    #[serde(skip_serializing_if = "Option::is_none")]
56    pub color: Option<String>,
57    /// Hide from autocomplete listings.
58    #[serde(skip_serializing_if = "Option::is_none")]
59    pub hidden: Option<bool>,
60    /// Disable/remove this agent entirely.
61    #[serde(skip_serializing_if = "Option::is_none")]
62    pub disable: Option<bool>,
63    /// Per-tool permission rules (tool pattern -> "allow"/"deny"/"ask").
64    #[serde(default, skip_serializing_if = "HashMap::is_empty")]
65    pub permission: HashMap<String, String>,
66}