use spawningpool::ai::Client;
use crate::cli::ListKind;
pub(crate) async fn list(kind: ListKind) -> Result<(), String> {
if let ListKind::Models { remote: true } = kind {
return list_remote_models().await;
}
if let ListKind::Tools = kind {
let dir = spawningpool::store::tools_dir();
let names = spawningpool::tools::list(&dir)?;
if names.is_empty() {
eprintln!(
"no tools yet — drop an executable script in {} or run \
`spawningpool define tool <name> --script <path>` (see `spawningpool show tool`).",
dir.display()
);
}
for name in names {
println!("{name}");
}
return Ok(());
}
let registry = spawningpool::store::load()?;
let mut names: Vec<&String> = match kind {
ListKind::Specialists => registry.specialists.keys().collect(),
ListKind::Providers => registry.providers.keys().collect(),
ListKind::Models { .. } => registry.models.keys().collect(),
ListKind::Tools => unreachable!("tools listed from the folder above"),
};
names.sort();
for name in names {
println!("{name}");
}
Ok(())
}
async fn list_remote_models() -> Result<(), String> {
let models = Client::new()
.list_models("lmstudio")
.await
.map_err(|e| e.to_string())?;
let mut ids: Vec<String> = models.into_iter().map(|m| m.id).collect();
ids.sort();
for id in ids {
println!("{id}");
}
Ok(())
}