Skip to content

Commit 8d8cdbe

Browse files
authored
Added sublists for providers using %ai (#1458)
1 parent 65c0d12 commit 8d8cdbe

File tree

2 files changed

+65
-16
lines changed

2 files changed

+65
-16
lines changed

packages/jupyter-ai-magics/jupyter_ai_magics/magics.py

Lines changed: 61 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,7 @@ def ai(self, line: str, cell: Optional[str] = None) -> Any:
201201
default_map = {"model_id": self.initial_language_model}
202202

203203
# parse arguments
204+
args = None
204205
try:
205206
if cell:
206207
args = cell_magic_parser(
@@ -221,6 +222,9 @@ def ai(self, line: str, cell: Optional[str] = None) -> Any:
221222
error_msg = "No Model ID entered, please enter it in the following format: `%%ai <model_id>`"
222223
print(error_msg, file=sys.stderr)
223224
return
225+
if not args:
226+
print("No valid %ai magics arguments given, run `%ai help` for all options.", file=sys.stderr)
227+
return
224228
raise e
225229

226230
if args == 0 and self.initial_language_model is None:
@@ -468,25 +472,67 @@ def handle_version(self, args: VersionArgs) -> str:
468472

469473
def handle_list(self, args: ListArgs):
470474
"""
471-
Handles `%ai list`. Lists all LiteLLM models.
475+
Handles `%ai list`.
476+
- `%ai list` shows all providers by default, and ask the user to run %ai list <provider-name>.
477+
- `%ai list <provider-name>` shows all models available from one provider. It should also note that the list is not comprehensive, and include a reference to the upstream LiteLLM docs.
478+
- `%ai list all` should list all models.
472479
"""
473480
# Get list of available models from litellm
474481
models = CHAT_MODELS
475482

476-
# Format output for both text and markdown
477-
text_output = "Available models:\n\n"
478-
markdown_output = "## Available models\n\n"
483+
# If provider_id is None, only return provider IDs
484+
if getattr(args, 'provider_id', None) is None:
485+
# Extract unique provider IDs from model IDs
486+
provider_ids = set()
487+
for model in models:
488+
if '/' in model:
489+
provider_ids.add(model.split('/')[0])
490+
491+
# Format output for both text and markdown
492+
text_output = "Available providers\n\n (Run `%ai list <provider_name>` to see models for a specific provider)\n\n"
493+
markdown_output = "## Available providers\n\n (Run `%ai list <provider_name>` to see models for a specific provider)\n\n"
494+
495+
for provider_id in sorted(provider_ids):
496+
text_output += f"* {provider_id}\n"
497+
markdown_output += f"* `{provider_id}`\n"
498+
499+
return TextOrMarkdown(text_output, markdown_output)
500+
501+
elif getattr(args, 'provider_id', None) == 'all':
502+
# Otherwise show all models and aliases
503+
text_output = "All available models\n\n (The list is not comprehensive, a list of models is available at https://docs.litellm.ai/docs/providers)\n\n"
504+
markdown_output = "## All available models \n\n (The list is not comprehensive, a list of models is available at https://docs.litellm.ai/docs/providers)\n\n"
505+
506+
for model in models:
507+
text_output += f"* {model}\n"
508+
markdown_output += f"* `{model}`\n"
509+
510+
# Also list any custom aliases
511+
if len(self.aliases) > 0:
512+
text_output += "\nAliases:\n"
513+
markdown_output += "\n### Aliases\n\n"
514+
for alias, target in self.aliases.items():
515+
text_output += f"* {alias} -> {target}\n"
516+
markdown_output += f"* `{alias}` -> `{target}`\n"
517+
518+
return TextOrMarkdown(text_output, markdown_output)
519+
520+
else:
521+
# If a specific provider_id is given, filter models by that provider
522+
provider_id = args.provider_id
523+
filtered_models = [m for m in models if m.startswith(provider_id + "/")]
524+
525+
if not filtered_models:
526+
return TextOrMarkdown(
527+
f"No models found for provider '{provider_id}'.",
528+
f"No models found for provider `{provider_id}`.",
529+
)
479530

480-
for model in models:
481-
text_output += f"* {model}\n"
482-
markdown_output += f"* `{model}`\n"
531+
text_output = f"Available models for provider '{provider_id}'\n\n (The list is not comprehensive, a list of models is available at https://docs.litellm.ai/docs/providers/{provider_id})\n\n"
532+
markdown_output = f"## Available models for provider `{provider_id}`\n\n (The list is not comprehensive, a list of models is available at https://docs.litellm.ai/docs/providers/{provider_id})\n\n"
483533

484-
# Also list any custom aliases
485-
if len(self.aliases) > 0:
486-
text_output += "\nAliases:\n"
487-
markdown_output += "\n### Aliases\n\n"
488-
for alias, target in self.aliases.items():
489-
text_output += f"* {alias} -> {target}\n"
490-
markdown_output += f"* `{alias}` -> `{target}`\n"
534+
for model in filtered_models:
535+
text_output += f"* {model}\n"
536+
markdown_output += f"* `{model}`\n"
491537

492-
return TextOrMarkdown(text_output, markdown_output)
538+
return TextOrMarkdown(text_output, markdown_output)

packages/jupyter-ai-magics/jupyter_ai_magics/parsers.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,10 @@ def help_subparser():
248248
)
249249
@click.argument("provider_id", required=False)
250250
def list_subparser(**kwargs):
251-
"""List language models, optionally scoped to PROVIDER_ID."""
251+
"""List language models, optionally scoped to PROVIDER_ID.\n\n
252+
If no PROVIDER_ID is given, all providers are listed.
253+
If PROVIDER_ID is given, only models from that provider are listed.
254+
If PROVIDER_ID is 'all', models from all providers are listed."""
252255
return ListArgs(**kwargs)
253256

254257

0 commit comments

Comments
 (0)