use std::path::PathBuf;
use clap::Args;
use crate::disagg::DisaggregationMode;
#[derive(Args, Clone, Debug)]
pub struct CommonArgs {
#[arg(
long,
default_value = "dynamo",
env = "DYN_NAMESPACE",
value_parser = parse_worker_namespace
)]
pub namespace: String,
#[arg(long, default_value = "backend", env = "DYN_COMPONENT")]
pub component: String,
#[arg(long, default_value = "generate", env = "DYN_ENDPOINT")]
pub endpoint: String,
#[arg(long, default_value = "chat,completions", env = "DYN_ENDPOINT_TYPES")]
pub endpoint_types: String,
#[arg(long, env = "DYN_CUSTOM_JINJA_TEMPLATE")]
pub custom_jinja_template: Option<PathBuf>,
#[arg(long = "dyn-tool-call-parser", env = "DYN_TOOL_CALL_PARSER")]
pub dyn_tool_call_parser: Option<String>,
#[arg(long = "dyn-reasoning-parser", env = "DYN_REASONING_PARSER")]
pub dyn_reasoning_parser: Option<String>,
#[arg(
long = "exclude-tools-when-tool-choice-none",
env = "DYN_EXCLUDE_TOOLS_WHEN_TOOL_CHOICE_NONE",
default_value_t = true,
action = clap::ArgAction::Set
)]
pub exclude_tools_when_tool_choice_none: bool,
#[arg(
long,
value_enum,
default_value_t = DisaggregationMode::Aggregated,
env = "DYN_DISAGGREGATION_MODE",
)]
pub disaggregation_mode: DisaggregationMode,
#[arg(long, default_value_t = false, env = "DYN_ROUTE_TO_ENCODER")]
pub route_to_encoder: bool,
#[arg(long, default_value_t = false, env = "DYN_ENABLE_RL")]
pub enable_rl: bool,
}
fn parse_worker_namespace(namespace: &str) -> Result<String, std::convert::Infallible> {
let Ok(suffix) = std::env::var("DYN_NAMESPACE_WORKER_SUFFIX") else {
return Ok(namespace.to_owned());
};
if suffix.is_empty() {
return Ok(namespace.to_owned());
}
let suffix = format!("-{suffix}");
if namespace.ends_with(&suffix) {
return Ok(namespace.to_owned());
}
Ok(format!("{namespace}{suffix}"))
}
#[cfg(test)]
mod tests {
use clap::Parser;
use super::CommonArgs;
#[derive(Parser)]
struct TestArgs {
#[command(flatten)]
common: CommonArgs,
}
#[test]
#[serial_test::serial]
fn worker_suffix_is_applied_once_to_namespace() {
for (namespace, suffix, argv, expected) in [
(Some("dynamo"), Some("qa1"), &["test"][..], "dynamo-qa1"),
(Some("dynamo-qa1"), Some("qa1"), &["test"][..], "dynamo-qa1"),
(Some("dynamo"), Some(""), &["test"][..], "dynamo"),
(Some("dynamo"), None, &["test"][..], "dynamo"),
(None, Some("qa1"), &["test"][..], "dynamo-qa1"),
(
Some("ignored"),
Some("qa1"),
&["test", "--namespace", "cli"][..],
"cli-qa1",
),
] {
temp_env::with_vars(
[
("DYN_NAMESPACE", namespace),
("DYN_NAMESPACE_WORKER_SUFFIX", suffix),
],
|| {
let args = TestArgs::try_parse_from(argv).unwrap();
assert_eq!(args.common.namespace, expected);
},
);
}
}
}