alloy-runtime-cli 0.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- alloy_runtime_cli-0.1.0.dist-info/METADATA +61 -0
- alloy_runtime_cli-0.1.0.dist-info/RECORD +451 -0
- alloy_runtime_cli-0.1.0.dist-info/WHEEL +5 -0
- alloy_runtime_cli-0.1.0.dist-info/entry_points.txt +2 -0
- alloy_runtime_cli-0.1.0.dist-info/top_level.txt +1 -0
- cli/__init__.py +0 -0
- cli/commands/__init__.py +0 -0
- cli/commands/admin/__init__.py +0 -0
- cli/commands/admin/bootstrap_command.py +118 -0
- cli/commands/admin/credentials/__init__.py +0 -0
- cli/commands/admin/credentials/create/__init__.py +0 -0
- cli/commands/admin/credentials/create/command.py +148 -0
- cli/commands/admin/credentials/create/presenter.py +16 -0
- cli/commands/admin/credentials/grant/__init__.py +0 -0
- cli/commands/admin/credentials/grant/command.py +119 -0
- cli/commands/admin/credentials/grant/fields.py +33 -0
- cli/commands/admin/credentials/grant/presenter.py +23 -0
- cli/commands/agents/__init__.py +0 -0
- cli/commands/agents/create/__init__.py +0 -0
- cli/commands/agents/create/command.py +475 -0
- cli/commands/agents/create/fields.py +64 -0
- cli/commands/agents/create/presenter.py +68 -0
- cli/commands/agents/delete/__init__.py +0 -0
- cli/commands/agents/delete/command.py +47 -0
- cli/commands/agents/delete/presenter.py +16 -0
- cli/commands/agents/get/command.py +37 -0
- cli/commands/agents/get/presenter.py +32 -0
- cli/commands/agents/list/__init__.py +1 -0
- cli/commands/agents/list/command.py +54 -0
- cli/commands/agents/list/presenter.py +82 -0
- cli/commands/agents/update/__init__.py +0 -0
- cli/commands/agents/update/command.py +435 -0
- cli/commands/agents/update/fields.py +40 -0
- cli/commands/agents/update/presenter.py +68 -0
- cli/commands/audio/__init__.py +0 -0
- cli/commands/audio/transcribe/__init__.py +0 -0
- cli/commands/audio/transcribe/command.py +144 -0
- cli/commands/audio/transcribe/presenter.py +15 -0
- cli/commands/auth/__init__.py +0 -0
- cli/commands/auth/login/__init__.py +0 -0
- cli/commands/auth/login/command.py +80 -0
- cli/commands/auth/signup/__init__.py +0 -0
- cli/commands/auth/signup/command.py +115 -0
- cli/commands/billing/__init__.py +1 -0
- cli/commands/billing/costs/__init__.py +1 -0
- cli/commands/billing/costs/by_agent/__init__.py +1 -0
- cli/commands/billing/costs/by_agent/command.py +57 -0
- cli/commands/billing/costs/by_agent/presenter.py +81 -0
- cli/commands/billing/costs/by_model/__init__.py +1 -0
- cli/commands/billing/costs/by_model/command.py +57 -0
- cli/commands/billing/costs/by_model/presenter.py +80 -0
- cli/commands/billing/costs/daily/__init__.py +1 -0
- cli/commands/billing/costs/daily/command.py +55 -0
- cli/commands/billing/costs/daily/presenter.py +75 -0
- cli/commands/billing/costs/summary/__init__.py +1 -0
- cli/commands/billing/costs/summary/command.py +57 -0
- cli/commands/billing/costs/summary/presenter.py +42 -0
- cli/commands/billing/projects/__init__.py +1 -0
- cli/commands/billing/projects/create/__init__.py +1 -0
- cli/commands/billing/projects/create/command.py +60 -0
- cli/commands/billing/projects/create/presenter.py +26 -0
- cli/commands/billing/projects/get/__init__.py +1 -0
- cli/commands/billing/projects/get/command.py +33 -0
- cli/commands/billing/projects/get/presenter.py +32 -0
- cli/commands/billing/projects/list/__init__.py +1 -0
- cli/commands/billing/projects/list/command.py +40 -0
- cli/commands/billing/projects/list/presenter.py +57 -0
- cli/commands/content/__init__.py +1 -0
- cli/commands/content/delete/__init__.py +0 -0
- cli/commands/content/delete/command.py +49 -0
- cli/commands/content/delete/presenter.py +18 -0
- cli/commands/content/edit/__init__.py +1 -0
- cli/commands/content/edit/command.py +155 -0
- cli/commands/content/edit/editor.py +150 -0
- cli/commands/content/edit/presenter.py +146 -0
- cli/commands/content/get/__init__.py +1 -0
- cli/commands/content/get/command.py +39 -0
- cli/commands/content/get/presenter.py +176 -0
- cli/commands/content/list/__init__.py +1 -0
- cli/commands/content/list/command.py +347 -0
- cli/commands/content/list/export_formatters.py +409 -0
- cli/commands/content/list/export_handler.py +165 -0
- cli/commands/content/list/presenter.py +190 -0
- cli/commands/credentials/__init__.py +0 -0
- cli/commands/credentials/create/__init__.py +0 -0
- cli/commands/credentials/create/command.py +165 -0
- cli/commands/credentials/create/fields.py +38 -0
- cli/commands/credentials/create/presenter.py +20 -0
- cli/commands/credentials/update/__init__.py +0 -0
- cli/commands/credentials/update/command.py +53 -0
- cli/commands/credentials/update/fields.py +71 -0
- cli/commands/credentials/update/presenter.py +16 -0
- cli/commands/flag_utils.py +366 -0
- cli/commands/generate/__init__.py +0 -0
- cli/commands/generate/cancel/__init__.py +1 -0
- cli/commands/generate/cancel/command.py +44 -0
- cli/commands/generate/cancel/presenter.py +26 -0
- cli/commands/generate/status/__init__.py +1 -0
- cli/commands/generate/status/command.py +58 -0
- cli/commands/generate/status/presenter.py +78 -0
- cli/commands/generate/text/__init__.py +0 -0
- cli/commands/generate/text/command.py +1325 -0
- cli/commands/generate/text/concurrent_renderer.py +355 -0
- cli/commands/generate/text/presenter.py +287 -0
- cli/commands/generate/text/stream_renderer.py +129 -0
- cli/commands/knowledge/__init__.py +0 -0
- cli/commands/knowledge/collections/__init__.py +0 -0
- cli/commands/knowledge/collections/cluster/__init__.py +0 -0
- cli/commands/knowledge/collections/cluster/command.py +64 -0
- cli/commands/knowledge/collections/cluster/presenter.py +74 -0
- cli/commands/knowledge/collections/cluster_status/__init__.py +0 -0
- cli/commands/knowledge/collections/cluster_status/command.py +46 -0
- cli/commands/knowledge/collections/cluster_status/presenter.py +10 -0
- cli/commands/knowledge/collections/create/__init__.py +0 -0
- cli/commands/knowledge/collections/create/command.py +137 -0
- cli/commands/knowledge/collections/create/presenter.py +38 -0
- cli/commands/knowledge/collections/delete/__init__.py +1 -0
- cli/commands/knowledge/collections/delete/command.py +47 -0
- cli/commands/knowledge/collections/delete/presenter.py +20 -0
- cli/commands/knowledge/collections/get/__init__.py +1 -0
- cli/commands/knowledge/collections/get/command.py +30 -0
- cli/commands/knowledge/collections/get/presenter.py +44 -0
- cli/commands/knowledge/collections/list/__init__.py +1 -0
- cli/commands/knowledge/collections/list/command.py +41 -0
- cli/commands/knowledge/collections/list/presenter.py +68 -0
- cli/commands/knowledge/collections/update/__init__.py +0 -0
- cli/commands/knowledge/collections/update/command.py +97 -0
- cli/commands/knowledge/collections/update/presenter.py +42 -0
- cli/commands/knowledge/documents/__init__.py +0 -0
- cli/commands/knowledge/documents/bulk_metadata/__init__.py +0 -0
- cli/commands/knowledge/documents/bulk_metadata/command.py +119 -0
- cli/commands/knowledge/documents/bulk_metadata/presenter.py +36 -0
- cli/commands/knowledge/documents/delete/__init__.py +0 -0
- cli/commands/knowledge/documents/delete/command.py +47 -0
- cli/commands/knowledge/documents/delete/presenter.py +20 -0
- cli/commands/knowledge/documents/get/__init__.py +0 -0
- cli/commands/knowledge/documents/get/command.py +39 -0
- cli/commands/knowledge/documents/get/presenter.py +78 -0
- cli/commands/knowledge/documents/ingest/__init__.py +0 -0
- cli/commands/knowledge/documents/ingest/command.py +222 -0
- cli/commands/knowledge/documents/ingest/presenter.py +41 -0
- cli/commands/knowledge/documents/list/__init__.py +0 -0
- cli/commands/knowledge/documents/list/command.py +69 -0
- cli/commands/knowledge/documents/list/presenter.py +86 -0
- cli/commands/knowledge/documents/reingest/__init__.py +0 -0
- cli/commands/knowledge/documents/reingest/command.py +102 -0
- cli/commands/knowledge/documents/reingest/presenter.py +70 -0
- cli/commands/knowledge/documents/update/__init__.py +0 -0
- cli/commands/knowledge/documents/update/command.py +85 -0
- cli/commands/knowledge/documents/update/presenter.py +37 -0
- cli/commands/knowledge/recover/__init__.py +0 -0
- cli/commands/knowledge/recover/command.py +46 -0
- cli/commands/knowledge/recover/presenter.py +79 -0
- cli/commands/knowledge/search/__init__.py +0 -0
- cli/commands/knowledge/search/command.py +218 -0
- cli/commands/knowledge/search/presenter.py +111 -0
- cli/commands/knowledge/synthesis/__init__.py +0 -0
- cli/commands/knowledge/synthesis/create/__init__.py +0 -0
- cli/commands/knowledge/synthesis/create/command.py +127 -0
- cli/commands/knowledge/synthesis/create/presenter.py +33 -0
- cli/commands/knowledge/synthesis/delete/__init__.py +0 -0
- cli/commands/knowledge/synthesis/delete/command.py +53 -0
- cli/commands/knowledge/synthesis/delete/presenter.py +31 -0
- cli/commands/knowledge/synthesis/get/__init__.py +0 -0
- cli/commands/knowledge/synthesis/get/command.py +55 -0
- cli/commands/knowledge/synthesis/get/presenter.py +114 -0
- cli/commands/knowledge/synthesis/list/__init__.py +0 -0
- cli/commands/knowledge/synthesis/list/command.py +132 -0
- cli/commands/knowledge/synthesis/list/presenter.py +84 -0
- cli/commands/knowledge/synthesis/refresh/__init__.py +0 -0
- cli/commands/knowledge/synthesis/refresh/command.py +42 -0
- cli/commands/knowledge/synthesis/refresh/presenter.py +33 -0
- cli/commands/knowledge/synthesis/update/__init__.py +0 -0
- cli/commands/knowledge/synthesis/update/command.py +76 -0
- cli/commands/knowledge/synthesis/update/presenter.py +41 -0
- cli/commands/models/__init__.py +0 -0
- cli/commands/models/list/__init__.py +0 -0
- cli/commands/models/list/command.py +84 -0
- cli/commands/models/list/presenter.py +114 -0
- cli/commands/organizations/__init__.py +0 -0
- cli/commands/organizations/create/command.py +32 -0
- cli/commands/organizations/create/presenter.py +9 -0
- cli/commands/pipelines/__init__.py +1 -0
- cli/commands/pipelines/approvals/__init__.py +1 -0
- cli/commands/pipelines/approvals/decide_command.py +77 -0
- cli/commands/pipelines/approvals/get_command.py +44 -0
- cli/commands/pipelines/approvals/presenter.py +56 -0
- cli/commands/pipelines/costs/__init__.py +1 -0
- cli/commands/pipelines/costs/command.py +57 -0
- cli/commands/pipelines/costs/daily_command.py +54 -0
- cli/commands/pipelines/costs/daily_presenter.py +59 -0
- cli/commands/pipelines/costs/presenter.py +37 -0
- cli/commands/pipelines/create/__init__.py +1 -0
- cli/commands/pipelines/create/command.py +103 -0
- cli/commands/pipelines/create/presenter.py +22 -0
- cli/commands/pipelines/env_vars/__init__.py +1 -0
- cli/commands/pipelines/env_vars/command.py +51 -0
- cli/commands/pipelines/env_vars/presenter.py +16 -0
- cli/commands/pipelines/execute/__init__.py +1 -0
- cli/commands/pipelines/execute/command.py +142 -0
- cli/commands/pipelines/execute/presenter.py +47 -0
- cli/commands/pipelines/executions/__init__.py +1 -0
- cli/commands/pipelines/executions/costs/__init__.py +1 -0
- cli/commands/pipelines/executions/costs/command.py +48 -0
- cli/commands/pipelines/executions/costs/presenter.py +29 -0
- cli/commands/pipelines/executions/costs_by_model/__init__.py +1 -0
- cli/commands/pipelines/executions/costs_by_model/command.py +50 -0
- cli/commands/pipelines/executions/costs_by_model/presenter.py +78 -0
- cli/commands/pipelines/executions/costs_by_step/__init__.py +1 -0
- cli/commands/pipelines/executions/costs_by_step/command.py +50 -0
- cli/commands/pipelines/executions/costs_by_step/presenter.py +72 -0
- cli/commands/pipelines/executions/get_command.py +38 -0
- cli/commands/pipelines/executions/list_command.py +123 -0
- cli/commands/pipelines/executions/presenter.py +131 -0
- cli/commands/pipelines/executions/rerun_command.py +41 -0
- cli/commands/pipelines/executions/update/__init__.py +1 -0
- cli/commands/pipelines/executions/update/command.py +110 -0
- cli/commands/pipelines/executions/update/presenter.py +28 -0
- cli/commands/pipelines/get/__init__.py +1 -0
- cli/commands/pipelines/get/command.py +33 -0
- cli/commands/pipelines/get/presenter.py +48 -0
- cli/commands/pipelines/list/__init__.py +1 -0
- cli/commands/pipelines/list/command.py +53 -0
- cli/commands/pipelines/list/presenter.py +66 -0
- cli/commands/pipelines/schedules/__init__.py +1 -0
- cli/commands/pipelines/schedules/create_command.py +119 -0
- cli/commands/pipelines/schedules/create_presenter.py +35 -0
- cli/commands/pipelines/schedules/delete_command.py +52 -0
- cli/commands/pipelines/schedules/env_vars_command.py +59 -0
- cli/commands/pipelines/schedules/env_vars_presenter.py +16 -0
- cli/commands/pipelines/schedules/get_command.py +38 -0
- cli/commands/pipelines/schedules/list_command.py +33 -0
- cli/commands/pipelines/schedules/once_command.py +90 -0
- cli/commands/pipelines/schedules/once_presenter.py +30 -0
- cli/commands/pipelines/schedules/presenter.py +104 -0
- cli/commands/pipelines/schedules/update_command.py +139 -0
- cli/commands/pipelines/schedules/update_presenter.py +29 -0
- cli/commands/render/__init__.py +0 -0
- cli/commands/render/html_to_image/__init__.py +0 -0
- cli/commands/render/html_to_image/command.py +170 -0
- cli/commands/schemas/__init__.py +0 -0
- cli/commands/schemas/create/__init__.py +0 -0
- cli/commands/schemas/create/command.py +122 -0
- cli/commands/schemas/create/presenter.py +53 -0
- cli/commands/schemas/delete/command.py +45 -0
- cli/commands/schemas/delete/presenter.py +9 -0
- cli/commands/schemas/get/__init__.py +0 -0
- cli/commands/schemas/get/command.py +56 -0
- cli/commands/schemas/get/presenter.py +129 -0
- cli/commands/schemas/list/__init__.py +0 -0
- cli/commands/schemas/list/command.py +64 -0
- cli/commands/schemas/list/presenter.py +133 -0
- cli/commands/schemas/update/__init__.py +0 -0
- cli/commands/schemas/update/command.py +369 -0
- cli/commands/schemas/update/presenter.py +53 -0
- cli/commands/sessions/__init__.py +1 -0
- cli/commands/sessions/delete/__init__.py +1 -0
- cli/commands/sessions/delete/command.py +47 -0
- cli/commands/sessions/delete/presenter.py +10 -0
- cli/commands/sessions/get/__init__.py +1 -0
- cli/commands/sessions/get/command.py +42 -0
- cli/commands/sessions/get/presenter.py +59 -0
- cli/commands/sessions/list/__init__.py +1 -0
- cli/commands/sessions/list/command.py +61 -0
- cli/commands/sessions/list/presenter.py +68 -0
- cli/commands/sessions/messages/__init__.py +1 -0
- cli/commands/sessions/messages/command.py +78 -0
- cli/commands/sessions/messages/presenter.py +79 -0
- cli/commands/shared_flags.py +500 -0
- cli/commands/sync/__init__.py +0 -0
- cli/commands/sync/command.py +45 -0
- cli/commands/sync/presenter.py +49 -0
- cli/commands/tags/__init__.py +1 -0
- cli/commands/tags/create/__init__.py +1 -0
- cli/commands/tags/create/command.py +60 -0
- cli/commands/tags/delete/__init__.py +1 -0
- cli/commands/tags/delete/command.py +47 -0
- cli/commands/tags/delete/presenter.py +10 -0
- cli/commands/tags/get/command.py +31 -0
- cli/commands/tags/get/presenter.py +23 -0
- cli/commands/tags/list/__init__.py +1 -0
- cli/commands/tags/list/command.py +52 -0
- cli/commands/tags/list/presenter.py +49 -0
- cli/commands/tags/update/command.py +64 -0
- cli/commands/tags/update/presenter.py +9 -0
- cli/commands/templates/__init__.py +0 -0
- cli/commands/templates/create/__init__.py +0 -0
- cli/commands/templates/create/command.py +152 -0
- cli/commands/templates/create/presenter.py +86 -0
- cli/commands/templates/delete/__init__.py +0 -0
- cli/commands/templates/delete/command.py +47 -0
- cli/commands/templates/delete/presenter.py +16 -0
- cli/commands/templates/get/__init__.py +0 -0
- cli/commands/templates/get/command.py +52 -0
- cli/commands/templates/get/presenter.py +233 -0
- cli/commands/templates/get_by_version/command.py +32 -0
- cli/commands/templates/get_by_version/presenter.py +30 -0
- cli/commands/templates/list/__init__.py +1 -0
- cli/commands/templates/list/command.py +102 -0
- cli/commands/templates/list/presenter.py +93 -0
- cli/commands/templates/render/__init__.py +0 -0
- cli/commands/templates/render/command.py +115 -0
- cli/commands/templates/render/presenter.py +276 -0
- cli/commands/templates/update/__init__.py +0 -0
- cli/commands/templates/update/command.py +199 -0
- cli/commands/templates/update/presenter.py +94 -0
- cli/commands/templates/version/__init__.py +1 -0
- cli/commands/templates/version/command.py +116 -0
- cli/commands/templates/version/presenter.py +100 -0
- cli/commands/tool_configs/__init__.py +0 -0
- cli/commands/tool_configs/create/__init__.py +0 -0
- cli/commands/tool_configs/create/command.py +118 -0
- cli/commands/tool_configs/create/presenter.py +53 -0
- cli/commands/tool_configs/delete/__init__.py +0 -0
- cli/commands/tool_configs/delete/command.py +47 -0
- cli/commands/tool_configs/delete/presenter.py +18 -0
- cli/commands/tool_configs/get/__init__.py +0 -0
- cli/commands/tool_configs/get/command.py +31 -0
- cli/commands/tool_configs/get/presenter.py +62 -0
- cli/commands/tool_configs/list/__init__.py +0 -0
- cli/commands/tool_configs/list/command.py +59 -0
- cli/commands/tool_configs/list/presenter.py +60 -0
- cli/commands/tool_configs/update/__init__.py +0 -0
- cli/commands/tool_configs/update/command.py +128 -0
- cli/commands/tool_configs/update/presenter.py +53 -0
- cli/commands/tools/__init__.py +1 -0
- cli/commands/tools/get/__init__.py +1 -0
- cli/commands/tools/get/command.py +42 -0
- cli/commands/tools/get/presenter.py +45 -0
- cli/commands/tools/list/__init__.py +1 -0
- cli/commands/tools/list/command.py +56 -0
- cli/commands/tools/list/presenter.py +44 -0
- cli/commands/users/__init__.py +0 -0
- cli/commands/users/create/command.py +53 -0
- cli/commands/users/create/presenter.py +9 -0
- cli/commands/whoami/__init__.py +0 -0
- cli/commands/whoami/command.py +42 -0
- cli/infrastructure/__init__.py +0 -0
- cli/infrastructure/auth_storage.py +71 -0
- cli/infrastructure/client_factory.py +36 -0
- cli/infrastructure/command.py +75 -0
- cli/infrastructure/config.py +188 -0
- cli/infrastructure/console.py +27 -0
- cli/infrastructure/editor.py +138 -0
- cli/infrastructure/error_display.py +178 -0
- cli/infrastructure/field_extractor.py +360 -0
- cli/infrastructure/file_content.py +210 -0
- cli/infrastructure/filter_parser.py +256 -0
- cli/infrastructure/formatters/__init__.py +0 -0
- cli/infrastructure/formatters/base.py +99 -0
- cli/infrastructure/formatters/compact_formatter.py +245 -0
- cli/infrastructure/formatters/json_formatter.py +84 -0
- cli/infrastructure/formatters/lines_formatter.py +102 -0
- cli/infrastructure/formatting/__init__.py +0 -0
- cli/infrastructure/formatting/fields.py +193 -0
- cli/infrastructure/forms/__init__.py +0 -0
- cli/infrastructure/forms/agent_picker.py +123 -0
- cli/infrastructure/forms/agent_tool_editor.py +384 -0
- cli/infrastructure/forms/agent_tools_manager.py +212 -0
- cli/infrastructure/forms/base_picker.py +469 -0
- cli/infrastructure/forms/components.py +126 -0
- cli/infrastructure/forms/json_schema_builder.py +149 -0
- cli/infrastructure/forms/model_picker.py +134 -0
- cli/infrastructure/forms/parsers.py +173 -0
- cli/infrastructure/forms/resolution_modal.py +302 -0
- cli/infrastructure/forms/schema_picker.py +137 -0
- cli/infrastructure/forms/tag_management_modal.py +103 -0
- cli/infrastructure/forms/tag_picker.py +207 -0
- cli/infrastructure/forms/template_picker.py +131 -0
- cli/infrastructure/forms/tool_config_picker.py +130 -0
- cli/infrastructure/forms/tool_picker.py +103 -0
- cli/infrastructure/injection/__init__.py +0 -0
- cli/infrastructure/injection/parser.py +302 -0
- cli/infrastructure/injection/resolver.py +399 -0
- cli/infrastructure/kv_parser.py +130 -0
- cli/infrastructure/local_storage.py +227 -0
- cli/infrastructure/macro_parser.py +215 -0
- cli/infrastructure/output.py +192 -0
- cli/infrastructure/provider_setup.py +81 -0
- cli/infrastructure/renderers/__init__.py +0 -0
- cli/infrastructure/renderers/entity_renderer.py +77 -0
- cli/infrastructure/renderers/list_renderer.py +114 -0
- cli/infrastructure/scope_utils.py +47 -0
- cli/infrastructure/spinner.py +101 -0
- cli/infrastructure/tui/__init__.py +0 -0
- cli/infrastructure/tui/clipboard.py +41 -0
- cli/infrastructure/tui/formatters.py +105 -0
- cli/infrastructure/tui/preview.py +14 -0
- cli/infrastructure/tui/selectable.py +198 -0
- cli/infrastructure/validation/__init__.py +0 -0
- cli/infrastructure/validation/tag_validation.py +74 -0
- cli/main.py +759 -0
- cli/tui/__init__.py +0 -0
- cli/tui/app.py +199 -0
- cli/tui/app_store.py +73 -0
- cli/tui/chat/__init__.py +0 -0
- cli/tui/chat/commands/__init__.py +0 -0
- cli/tui/chat/commands/base.py +65 -0
- cli/tui/chat/commands/create_session.py +135 -0
- cli/tui/chat/commands/load_session.py +119 -0
- cli/tui/chat/commands/regenerate.py +120 -0
- cli/tui/chat/commands/reload_session.py +63 -0
- cli/tui/chat/commands/send_message.py +190 -0
- cli/tui/chat/commands/undo.py +66 -0
- cli/tui/chat/editor.py +71 -0
- cli/tui/chat/messages.py +223 -0
- cli/tui/chat/pane.py +141 -0
- cli/tui/chat/renderers/__init__.py +0 -0
- cli/tui/chat/renderers/base.py +72 -0
- cli/tui/chat/renderers/markdown.py +250 -0
- cli/tui/chat/renderers/plain.py +83 -0
- cli/tui/chat/screen.py +1155 -0
- cli/tui/chat/services/__init__.py +0 -0
- cli/tui/chat/services/injection.py +386 -0
- cli/tui/chat/services/name_generator.py +256 -0
- cli/tui/chat/slash_commands.py +424 -0
- cli/tui/chat/store.py +280 -0
- cli/tui/chat/types.py +220 -0
- cli/tui/chat/widgets/__init__.py +0 -0
- cli/tui/chat/widgets/chat_header.py +75 -0
- cli/tui/chat/widgets/chat_input.py +362 -0
- cli/tui/chat/widgets/injection_popup.py +161 -0
- cli/tui/chat/widgets/message_display.py +287 -0
- cli/tui/chat/widgets/session_sidebar.py +214 -0
- cli/tui/chat/widgets/welcome_screen.py +290 -0
- cli/tui/screens/__init__.py +0 -0
- cli/tui/screens/agents.py +344 -0
- cli/tui/screens/base.py +301 -0
- cli/tui/screens/content.py +508 -0
- cli/tui/screens/dashboard.py +89 -0
- cli/tui/screens/models.py +96 -0
- cli/tui/screens/nav_screen.py +186 -0
- cli/tui/screens/schemas.py +522 -0
- cli/tui/screens/templates.py +734 -0
- cli/tui/screens/tool_configs.py +335 -0
- cli/tui/styles/__init__.py +0 -0
- cli/tui/widgets/__init__.py +0 -0
- cli/tui/widgets/agent_create_modal.py +139 -0
- cli/tui/widgets/agent_form_modal.py +659 -0
- cli/tui/widgets/agent_update_modal.py +299 -0
- cli/tui/widgets/base_form_modal.py +77 -0
- cli/tui/widgets/confirm_modal.py +75 -0
- cli/tui/widgets/help_modal.py +145 -0
- cli/tui/widgets/new_session_modal.py +328 -0
- cli/tui/widgets/schema_create_modal.py +271 -0
- cli/tui/widgets/schema_update_modal.py +188 -0
- cli/tui/widgets/status_footer.py +147 -0
- cli/tui/widgets/template_create_modal.py +502 -0
- cli/tui/widgets/template_update_modal.py +308 -0
- cli/tui/widgets/tool_config_create_modal.py +216 -0
- cli/tui/widgets/tool_config_update_modal.py +208 -0
|
@@ -0,0 +1,475 @@
|
|
|
1
|
+
"""Agent create command implementation."""
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
from typing import Annotated, Any, Optional, cast
|
|
6
|
+
from uuid import UUID
|
|
7
|
+
|
|
8
|
+
import typer
|
|
9
|
+
from pydantic import ValidationError
|
|
10
|
+
|
|
11
|
+
from cli.commands.agents.create.presenter import present_agent_create_success
|
|
12
|
+
from cli.commands.flag_utils import (
|
|
13
|
+
parse_tags_required,
|
|
14
|
+
require_exclusive,
|
|
15
|
+
validate_provider,
|
|
16
|
+
validate_scope,
|
|
17
|
+
)
|
|
18
|
+
from cli.infrastructure.command import async_command, authenticated_client
|
|
19
|
+
from cli.infrastructure.file_content import FileContentError, resolve_content
|
|
20
|
+
from alloy_runtime_types.dtos.agents import (
|
|
21
|
+
AgentModelConfig,
|
|
22
|
+
AgentToolConfig,
|
|
23
|
+
CreateAgentRequest,
|
|
24
|
+
)
|
|
25
|
+
from alloy_runtime_types.dtos.generation import GenerationParameters
|
|
26
|
+
from alloy_runtime_types.enums.ownership_scope import OwnershipScope
|
|
27
|
+
|
|
28
|
+
REQUEST_HEADERS = Annotated[
|
|
29
|
+
Optional[list[str]],
|
|
30
|
+
typer.Option(
|
|
31
|
+
"-H",
|
|
32
|
+
"--header",
|
|
33
|
+
help="Default request header (key:value). Repeatable. E.g., -H 'anthropic-beta:context-1m-2025-08-07'",
|
|
34
|
+
),
|
|
35
|
+
]
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def agents_create_command(
|
|
39
|
+
name: str = typer.Option(
|
|
40
|
+
"...",
|
|
41
|
+
"-n",
|
|
42
|
+
"--name",
|
|
43
|
+
help="Agent name",
|
|
44
|
+
),
|
|
45
|
+
provider: str = typer.Option(
|
|
46
|
+
"...",
|
|
47
|
+
"-p",
|
|
48
|
+
"--provider",
|
|
49
|
+
help="Provider (openai, anthropic, etc.)",
|
|
50
|
+
),
|
|
51
|
+
model: str = typer.Option(
|
|
52
|
+
"...",
|
|
53
|
+
"-M",
|
|
54
|
+
"--model",
|
|
55
|
+
help="Model name (gpt-4o, claude-3-sonnet, etc.)",
|
|
56
|
+
),
|
|
57
|
+
tags: str = typer.Option(
|
|
58
|
+
"...",
|
|
59
|
+
"-t",
|
|
60
|
+
"--tags",
|
|
61
|
+
help="Comma-separated tags",
|
|
62
|
+
),
|
|
63
|
+
description: Optional[str] = typer.Option(
|
|
64
|
+
None,
|
|
65
|
+
"-d",
|
|
66
|
+
"--description",
|
|
67
|
+
help="Agent description",
|
|
68
|
+
),
|
|
69
|
+
scope: Optional[str] = typer.Option(
|
|
70
|
+
None,
|
|
71
|
+
"--scope",
|
|
72
|
+
help="Scope: user, organization, global",
|
|
73
|
+
),
|
|
74
|
+
temperature: Optional[float] = typer.Option(
|
|
75
|
+
None,
|
|
76
|
+
"-T",
|
|
77
|
+
"--temperature",
|
|
78
|
+
help="Temperature (0.0-2.0)",
|
|
79
|
+
),
|
|
80
|
+
max_tokens: Optional[int] = typer.Option(
|
|
81
|
+
None,
|
|
82
|
+
"--max-tokens",
|
|
83
|
+
help="Max tokens to generate",
|
|
84
|
+
),
|
|
85
|
+
system_template: Optional[str] = typer.Option(
|
|
86
|
+
None,
|
|
87
|
+
"--system-template",
|
|
88
|
+
help="System template name or UUID",
|
|
89
|
+
),
|
|
90
|
+
tools: Optional[str] = typer.Option(
|
|
91
|
+
None,
|
|
92
|
+
"--tools",
|
|
93
|
+
help="JSON array of tool configs (or @file.json)",
|
|
94
|
+
),
|
|
95
|
+
tools_file: Optional[Path] = typer.Option(
|
|
96
|
+
None,
|
|
97
|
+
"--tools-file",
|
|
98
|
+
help="Path to JSON file with tool configs",
|
|
99
|
+
exists=True,
|
|
100
|
+
readable=True,
|
|
101
|
+
),
|
|
102
|
+
base_agent: Optional[UUID] = typer.Option(
|
|
103
|
+
None,
|
|
104
|
+
"--base-agent",
|
|
105
|
+
help="Base agent UUID to inherit configuration from",
|
|
106
|
+
),
|
|
107
|
+
system_version: Optional[UUID] = typer.Option(
|
|
108
|
+
None,
|
|
109
|
+
"--system-version",
|
|
110
|
+
help="Specific system instruction version UUID",
|
|
111
|
+
),
|
|
112
|
+
input_schema: Optional[UUID] = typer.Option(
|
|
113
|
+
None,
|
|
114
|
+
"--input-schema",
|
|
115
|
+
help="Input schema UUID",
|
|
116
|
+
),
|
|
117
|
+
output_schema: Optional[UUID] = typer.Option(
|
|
118
|
+
None,
|
|
119
|
+
"--output-schema",
|
|
120
|
+
help="Output schema UUID (mutually exclusive with --output-schema-def)",
|
|
121
|
+
),
|
|
122
|
+
output_schema_def: Optional[str] = typer.Option(
|
|
123
|
+
None,
|
|
124
|
+
"--output-schema-def",
|
|
125
|
+
help="Output schema definition JSON (or @file.json). Mutually exclusive with --output-schema.",
|
|
126
|
+
),
|
|
127
|
+
headers: REQUEST_HEADERS = None,
|
|
128
|
+
top_p: Optional[float] = typer.Option(
|
|
129
|
+
None,
|
|
130
|
+
"--top-p",
|
|
131
|
+
help="Nucleus sampling parameter (0.0-1.0)",
|
|
132
|
+
),
|
|
133
|
+
top_k: Optional[int] = typer.Option(
|
|
134
|
+
None,
|
|
135
|
+
"--top-k",
|
|
136
|
+
help="Top-k sampling parameter",
|
|
137
|
+
),
|
|
138
|
+
frequency_penalty: Optional[float] = typer.Option(
|
|
139
|
+
None,
|
|
140
|
+
"--frequency-penalty",
|
|
141
|
+
help="Frequency penalty (-2.0 to 2.0)",
|
|
142
|
+
),
|
|
143
|
+
presence_penalty: Optional[float] = typer.Option(
|
|
144
|
+
None,
|
|
145
|
+
"--presence-penalty",
|
|
146
|
+
help="Presence penalty (-2.0 to 2.0)",
|
|
147
|
+
),
|
|
148
|
+
seed: Optional[int] = typer.Option(
|
|
149
|
+
None,
|
|
150
|
+
"--seed",
|
|
151
|
+
help="Random seed for reproducible outputs",
|
|
152
|
+
),
|
|
153
|
+
stop: Optional[str] = typer.Option(
|
|
154
|
+
None,
|
|
155
|
+
"--stop",
|
|
156
|
+
help="Stop sequences (string or comma-separated for multiple)",
|
|
157
|
+
),
|
|
158
|
+
logprobs: Optional[bool] = typer.Option(
|
|
159
|
+
None,
|
|
160
|
+
"--logprobs/--no-logprobs",
|
|
161
|
+
help="Include log probabilities in response",
|
|
162
|
+
),
|
|
163
|
+
top_logprobs: Optional[int] = typer.Option(
|
|
164
|
+
None,
|
|
165
|
+
"--top-logprobs",
|
|
166
|
+
help="Number of top log probabilities to return (1-20)",
|
|
167
|
+
),
|
|
168
|
+
user: Optional[str] = typer.Option(
|
|
169
|
+
None,
|
|
170
|
+
"--user",
|
|
171
|
+
help="End-user ID for tracking and abuse monitoring",
|
|
172
|
+
),
|
|
173
|
+
) -> None:
|
|
174
|
+
"""Create a new AI agent.
|
|
175
|
+
|
|
176
|
+
Examples:
|
|
177
|
+
ai agents create -n "My Agent" -p openai -M gpt-4o -t "agent.llm"
|
|
178
|
+
ai agents create -n "Writer" -p anthropic -M claude-3-sonnet -t "agent.creative" -d "Creative writer" -T 0.9
|
|
179
|
+
ai agents create -n "Org Agent" -p openai -M gpt-4o -t "agent.llm,team.backend" --scope organization
|
|
180
|
+
ai agents create -n "With Tools" -p openai -M gpt-4o -t "agent" --tools '[{"tool_id": "web_search"}]'
|
|
181
|
+
ai agents create -n "With Tools" -p openai -M gpt-4o -t "agent" --tools-file tools.json
|
|
182
|
+
ai agents create -n "With Headers" -p openai -M gpt-4o -t "agent" -H 'anthropic-beta:context-1m-2025-08-07'
|
|
183
|
+
"""
|
|
184
|
+
require_exclusive(("--tools", tools), ("--tools-file", tools_file))
|
|
185
|
+
require_exclusive(
|
|
186
|
+
("--output-schema", output_schema), ("--output-schema-def", output_schema_def)
|
|
187
|
+
)
|
|
188
|
+
|
|
189
|
+
_execute_create_from_flags(
|
|
190
|
+
name=name,
|
|
191
|
+
provider=provider,
|
|
192
|
+
model=model,
|
|
193
|
+
tags=tags,
|
|
194
|
+
description=description,
|
|
195
|
+
scope=scope,
|
|
196
|
+
temperature=temperature,
|
|
197
|
+
max_tokens=max_tokens,
|
|
198
|
+
system_template=system_template,
|
|
199
|
+
tools=tools,
|
|
200
|
+
tools_file=tools_file,
|
|
201
|
+
base_agent=base_agent,
|
|
202
|
+
system_version=system_version,
|
|
203
|
+
input_schema=input_schema,
|
|
204
|
+
output_schema=output_schema,
|
|
205
|
+
output_schema_def=output_schema_def,
|
|
206
|
+
headers=headers,
|
|
207
|
+
top_p=top_p,
|
|
208
|
+
top_k=top_k,
|
|
209
|
+
frequency_penalty=frequency_penalty,
|
|
210
|
+
presence_penalty=presence_penalty,
|
|
211
|
+
seed=seed,
|
|
212
|
+
stop=stop,
|
|
213
|
+
logprobs=logprobs,
|
|
214
|
+
top_logprobs=top_logprobs,
|
|
215
|
+
user=user,
|
|
216
|
+
)
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
@async_command
|
|
220
|
+
async def _execute_create(request: CreateAgentRequest) -> None:
|
|
221
|
+
"""Execute the agent creation with the given request."""
|
|
222
|
+
async with authenticated_client() as (_config, client):
|
|
223
|
+
response = await client.create_agent(request)
|
|
224
|
+
|
|
225
|
+
present_agent_create_success(response)
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
def parse_tools(
|
|
229
|
+
tools: Optional[str],
|
|
230
|
+
tools_file: Optional[Path],
|
|
231
|
+
) -> list[AgentToolConfig] | None:
|
|
232
|
+
"""Parse tool configurations from CLI input.
|
|
233
|
+
|
|
234
|
+
Args:
|
|
235
|
+
tools: JSON string (or @file.json reference) containing tool configs
|
|
236
|
+
tools_file: Path to JSON file containing tool configs
|
|
237
|
+
|
|
238
|
+
Returns:
|
|
239
|
+
List of AgentToolConfig objects, or None if no tools provided
|
|
240
|
+
|
|
241
|
+
Raises:
|
|
242
|
+
typer.BadParameter: If JSON is invalid or doesn't match schema
|
|
243
|
+
"""
|
|
244
|
+
if tools is None and tools_file is None:
|
|
245
|
+
return None
|
|
246
|
+
|
|
247
|
+
if tools_file is not None:
|
|
248
|
+
try:
|
|
249
|
+
json_content = tools_file.read_text()
|
|
250
|
+
except IOError as e:
|
|
251
|
+
raise typer.BadParameter(f"Failed to read tools file: {e}")
|
|
252
|
+
else:
|
|
253
|
+
try:
|
|
254
|
+
json_content = resolve_content(tools)
|
|
255
|
+
except FileContentError as e:
|
|
256
|
+
raise typer.BadParameter(str(e))
|
|
257
|
+
|
|
258
|
+
if not json_content:
|
|
259
|
+
return None
|
|
260
|
+
|
|
261
|
+
try:
|
|
262
|
+
tools_data_raw: object = json.loads(json_content)
|
|
263
|
+
except json.JSONDecodeError as e:
|
|
264
|
+
raise typer.BadParameter(f"Invalid JSON in tools: {e}")
|
|
265
|
+
|
|
266
|
+
if not isinstance(tools_data_raw, list):
|
|
267
|
+
raise typer.BadParameter("Tools must be a JSON array")
|
|
268
|
+
|
|
269
|
+
tools_data: list[object] = cast(list[object], tools_data_raw)
|
|
270
|
+
|
|
271
|
+
if not tools_data:
|
|
272
|
+
return None
|
|
273
|
+
|
|
274
|
+
tool_configs: list[AgentToolConfig] = []
|
|
275
|
+
for i, tool_data in enumerate(tools_data):
|
|
276
|
+
if not isinstance(tool_data, dict):
|
|
277
|
+
raise typer.BadParameter(f"Tool at index {i} must be an object")
|
|
278
|
+
try:
|
|
279
|
+
tool_configs.append(AgentToolConfig(**cast(dict[str, Any], tool_data)))
|
|
280
|
+
except ValidationError as e:
|
|
281
|
+
errors = e.errors()
|
|
282
|
+
if errors:
|
|
283
|
+
first_error = errors[0]
|
|
284
|
+
field = ".".join(str(loc) for loc in first_error["loc"])
|
|
285
|
+
msg = first_error["msg"]
|
|
286
|
+
raise typer.BadParameter(f"Tool at index {i}: {field} - {msg}")
|
|
287
|
+
raise typer.BadParameter(f"Tool at index {i}: {e}")
|
|
288
|
+
|
|
289
|
+
return tool_configs
|
|
290
|
+
|
|
291
|
+
|
|
292
|
+
_parse_tools = parse_tools
|
|
293
|
+
|
|
294
|
+
|
|
295
|
+
def parse_output_schema_def(
|
|
296
|
+
output_schema_def: Optional[str],
|
|
297
|
+
) -> dict[str, Any] | None:
|
|
298
|
+
"""Parse output schema definition from CLI input.
|
|
299
|
+
|
|
300
|
+
Args:
|
|
301
|
+
output_schema_def: JSON string (or @file.json reference) containing schema
|
|
302
|
+
|
|
303
|
+
Returns:
|
|
304
|
+
Parsed schema dict, or None if not provided
|
|
305
|
+
|
|
306
|
+
Raises:
|
|
307
|
+
typer.BadParameter: If JSON is invalid
|
|
308
|
+
"""
|
|
309
|
+
if output_schema_def is None:
|
|
310
|
+
return None
|
|
311
|
+
|
|
312
|
+
try:
|
|
313
|
+
json_content = resolve_content(output_schema_def)
|
|
314
|
+
except FileContentError as e:
|
|
315
|
+
raise typer.BadParameter(str(e))
|
|
316
|
+
|
|
317
|
+
if not json_content:
|
|
318
|
+
return None
|
|
319
|
+
|
|
320
|
+
try:
|
|
321
|
+
schema_data: object = json.loads(json_content)
|
|
322
|
+
except json.JSONDecodeError as e:
|
|
323
|
+
raise typer.BadParameter(f"Invalid JSON in output-schema-def: {e}")
|
|
324
|
+
|
|
325
|
+
if not isinstance(schema_data, dict):
|
|
326
|
+
raise typer.BadParameter("Output schema definition must be a JSON object")
|
|
327
|
+
|
|
328
|
+
return cast(dict[str, Any], schema_data)
|
|
329
|
+
|
|
330
|
+
|
|
331
|
+
def parse_headers(
|
|
332
|
+
headers: Optional[list[str]],
|
|
333
|
+
) -> dict[str, str] | None:
|
|
334
|
+
"""Parse headers from CLI input.
|
|
335
|
+
|
|
336
|
+
Args:
|
|
337
|
+
headers: List of key:value strings
|
|
338
|
+
|
|
339
|
+
Returns:
|
|
340
|
+
Parsed headers dict, or None if not provided
|
|
341
|
+
|
|
342
|
+
Raises:
|
|
343
|
+
typer.BadParameter: If header format is invalid
|
|
344
|
+
"""
|
|
345
|
+
if headers is None:
|
|
346
|
+
return None
|
|
347
|
+
|
|
348
|
+
parsed: dict[str, str] = {}
|
|
349
|
+
for h in headers:
|
|
350
|
+
if ":" not in h:
|
|
351
|
+
raise typer.BadParameter(
|
|
352
|
+
f"Invalid header format '{h}'. Use 'key:value' format."
|
|
353
|
+
)
|
|
354
|
+
key, value = h.split(":", 1)
|
|
355
|
+
parsed[key.strip()] = value.strip()
|
|
356
|
+
|
|
357
|
+
return parsed if parsed else None
|
|
358
|
+
|
|
359
|
+
|
|
360
|
+
def parse_stop_sequences(stop: Optional[str]) -> str | list[str] | None:
|
|
361
|
+
"""Parse stop sequences from CLI input.
|
|
362
|
+
|
|
363
|
+
Args:
|
|
364
|
+
stop: Stop sequence string (comma-separated for multiple)
|
|
365
|
+
|
|
366
|
+
Returns:
|
|
367
|
+
Single string or list of strings, or None if not provided
|
|
368
|
+
"""
|
|
369
|
+
if stop is None:
|
|
370
|
+
return None
|
|
371
|
+
|
|
372
|
+
if "," in stop:
|
|
373
|
+
sequences = [s.strip() for s in stop.split(",") if s.strip()]
|
|
374
|
+
return sequences if sequences else None
|
|
375
|
+
|
|
376
|
+
return stop
|
|
377
|
+
|
|
378
|
+
|
|
379
|
+
def _execute_create_from_flags(
|
|
380
|
+
name: str,
|
|
381
|
+
provider: str,
|
|
382
|
+
model: str,
|
|
383
|
+
tags: str,
|
|
384
|
+
description: Optional[str],
|
|
385
|
+
scope: Optional[str],
|
|
386
|
+
temperature: Optional[float],
|
|
387
|
+
max_tokens: Optional[int],
|
|
388
|
+
system_template: Optional[str],
|
|
389
|
+
tools: Optional[str],
|
|
390
|
+
tools_file: Optional[Path],
|
|
391
|
+
base_agent: Optional[UUID],
|
|
392
|
+
system_version: Optional[UUID],
|
|
393
|
+
input_schema: Optional[UUID],
|
|
394
|
+
output_schema: Optional[UUID],
|
|
395
|
+
output_schema_def: Optional[str],
|
|
396
|
+
headers: Optional[list[str]],
|
|
397
|
+
top_p: Optional[float],
|
|
398
|
+
top_k: Optional[int],
|
|
399
|
+
frequency_penalty: Optional[float],
|
|
400
|
+
presence_penalty: Optional[float],
|
|
401
|
+
seed: Optional[int],
|
|
402
|
+
stop: Optional[str],
|
|
403
|
+
logprobs: Optional[bool],
|
|
404
|
+
top_logprobs: Optional[int],
|
|
405
|
+
user: Optional[str],
|
|
406
|
+
) -> None:
|
|
407
|
+
"""Build and execute agent creation from command flags."""
|
|
408
|
+
provider_enum = validate_provider(provider)
|
|
409
|
+
|
|
410
|
+
tag_list = parse_tags_required(tags)
|
|
411
|
+
|
|
412
|
+
model_config = AgentModelConfig(
|
|
413
|
+
provider_key=provider_enum,
|
|
414
|
+
provider_model_name=model,
|
|
415
|
+
preference_order=0,
|
|
416
|
+
)
|
|
417
|
+
|
|
418
|
+
ownership_scope = OwnershipScope.USER
|
|
419
|
+
if scope:
|
|
420
|
+
ownership_scope = validate_scope(scope)
|
|
421
|
+
|
|
422
|
+
gen_params = None
|
|
423
|
+
if any(
|
|
424
|
+
[
|
|
425
|
+
temperature is not None,
|
|
426
|
+
max_tokens is not None,
|
|
427
|
+
top_p is not None,
|
|
428
|
+
top_k is not None,
|
|
429
|
+
frequency_penalty is not None,
|
|
430
|
+
presence_penalty is not None,
|
|
431
|
+
seed is not None,
|
|
432
|
+
stop is not None,
|
|
433
|
+
logprobs is not None,
|
|
434
|
+
top_logprobs is not None,
|
|
435
|
+
user is not None,
|
|
436
|
+
]
|
|
437
|
+
):
|
|
438
|
+
gen_params = GenerationParameters(
|
|
439
|
+
temperature=temperature,
|
|
440
|
+
max_tokens=max_tokens,
|
|
441
|
+
top_p=top_p,
|
|
442
|
+
top_k=top_k,
|
|
443
|
+
frequency_penalty=frequency_penalty,
|
|
444
|
+
presence_penalty=presence_penalty,
|
|
445
|
+
seed=seed,
|
|
446
|
+
stop=parse_stop_sequences(stop),
|
|
447
|
+
logprobs=logprobs,
|
|
448
|
+
top_logprobs=top_logprobs,
|
|
449
|
+
user=user,
|
|
450
|
+
)
|
|
451
|
+
|
|
452
|
+
tool_configs = parse_tools(tools, tools_file)
|
|
453
|
+
|
|
454
|
+
parsed_output_schema = parse_output_schema_def(output_schema_def)
|
|
455
|
+
|
|
456
|
+
parsed_headers = parse_headers(headers)
|
|
457
|
+
|
|
458
|
+
request = CreateAgentRequest(
|
|
459
|
+
name=name,
|
|
460
|
+
models=[model_config],
|
|
461
|
+
tags=tag_list,
|
|
462
|
+
scope=ownership_scope,
|
|
463
|
+
description=description,
|
|
464
|
+
system_instruction_template=system_template,
|
|
465
|
+
generation_params=gen_params,
|
|
466
|
+
tools=tool_configs,
|
|
467
|
+
base_agent_id=base_agent,
|
|
468
|
+
system_instruction_version_id=system_version,
|
|
469
|
+
input_schema_id=input_schema,
|
|
470
|
+
output_schema_id=output_schema,
|
|
471
|
+
output_schema=parsed_output_schema,
|
|
472
|
+
default_request_headers=parsed_headers,
|
|
473
|
+
)
|
|
474
|
+
|
|
475
|
+
_execute_create(request)
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"""Field definitions for agent presentation."""
|
|
2
|
+
|
|
3
|
+
from cli.infrastructure.formatting.fields import (
|
|
4
|
+
format_datetime,
|
|
5
|
+
format_optional,
|
|
6
|
+
format_uuid,
|
|
7
|
+
)
|
|
8
|
+
from cli.infrastructure.renderers.entity_renderer import FieldConfig
|
|
9
|
+
from alloy_runtime_types.dtos.agents import CreateAgentResponse
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def format_models(response: CreateAgentResponse) -> str:
|
|
13
|
+
"""Format models list for display."""
|
|
14
|
+
return ", ".join(
|
|
15
|
+
f"{m.provider_key.value}:{m.provider_model_name}" for m in response.models
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def format_tools(response: CreateAgentResponse) -> str:
|
|
20
|
+
"""Format tools list for display."""
|
|
21
|
+
if not response.tools:
|
|
22
|
+
return "(none)"
|
|
23
|
+
return ", ".join(t.tool_id for t in response.tools)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def format_tags(response: CreateAgentResponse) -> str:
|
|
27
|
+
"""Format tags list for display."""
|
|
28
|
+
if not response.tags:
|
|
29
|
+
return "(none)"
|
|
30
|
+
return ", ".join(t.tag_path for t in response.tags)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def format_generation_params(response: CreateAgentResponse) -> str:
|
|
34
|
+
"""Format generation parameters for display."""
|
|
35
|
+
if not response.generation_params:
|
|
36
|
+
return "(default)"
|
|
37
|
+
|
|
38
|
+
params: list[str] = []
|
|
39
|
+
if response.generation_params.temperature is not None:
|
|
40
|
+
params.append(f"temp={response.generation_params.temperature}")
|
|
41
|
+
if response.generation_params.max_tokens is not None:
|
|
42
|
+
params.append(f"max_tokens={response.generation_params.max_tokens}")
|
|
43
|
+
if response.generation_params.reasoning_effort is not None:
|
|
44
|
+
params.append(f"reasoning={response.generation_params.reasoning_effort}")
|
|
45
|
+
|
|
46
|
+
return ", ".join(params) if params else "(default)"
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
AGENT_FIELDS = [
|
|
50
|
+
FieldConfig("id", "ID", lambda v: format_uuid(v, short=False)),
|
|
51
|
+
FieldConfig("name", "Name"),
|
|
52
|
+
FieldConfig("description", "Description", format_optional),
|
|
53
|
+
FieldConfig(
|
|
54
|
+
"organization_id",
|
|
55
|
+
"Organization ID",
|
|
56
|
+
lambda v: format_optional(v, lambda x: format_uuid(x, short=True)),
|
|
57
|
+
),
|
|
58
|
+
FieldConfig(
|
|
59
|
+
"user_id",
|
|
60
|
+
"User ID",
|
|
61
|
+
lambda v: format_optional(v, lambda x: format_uuid(x, short=True)),
|
|
62
|
+
),
|
|
63
|
+
FieldConfig("created_at", "Created At", format_datetime),
|
|
64
|
+
]
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"""Presenter for agent creation output."""
|
|
2
|
+
|
|
3
|
+
from cli.commands.agents.create.fields import (
|
|
4
|
+
format_generation_params,
|
|
5
|
+
format_models,
|
|
6
|
+
format_tags,
|
|
7
|
+
format_tools,
|
|
8
|
+
)
|
|
9
|
+
from cli.infrastructure.formatting.fields import (
|
|
10
|
+
format_datetime,
|
|
11
|
+
format_optional,
|
|
12
|
+
format_uuid,
|
|
13
|
+
)
|
|
14
|
+
from cli.infrastructure.output import OutputService
|
|
15
|
+
from cli.infrastructure.renderers.entity_renderer import FieldConfig
|
|
16
|
+
from alloy_runtime_types.dtos.agents import CreateAgentResponse
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def present_agent_create_success(response: CreateAgentResponse) -> None:
|
|
20
|
+
"""Present successful agent creation.
|
|
21
|
+
|
|
22
|
+
Args:
|
|
23
|
+
response: Agent creation response from server
|
|
24
|
+
"""
|
|
25
|
+
output = OutputService.get()
|
|
26
|
+
output.success("Agent created successfully")
|
|
27
|
+
|
|
28
|
+
fields = [
|
|
29
|
+
FieldConfig("id", "ID", lambda v: format_uuid(v, short=False)),
|
|
30
|
+
FieldConfig("name", "Name"),
|
|
31
|
+
FieldConfig("description", "Description", format_optional),
|
|
32
|
+
FieldConfig("models", "Models", lambda _: format_models(response)),
|
|
33
|
+
FieldConfig("tools", "Tools", lambda _: format_tools(response)),
|
|
34
|
+
FieldConfig("tags", "Tags", lambda _: format_tags(response)),
|
|
35
|
+
FieldConfig(
|
|
36
|
+
"generation_params",
|
|
37
|
+
"Generation Params",
|
|
38
|
+
lambda _: format_generation_params(response),
|
|
39
|
+
),
|
|
40
|
+
FieldConfig(
|
|
41
|
+
"system_instruction_version_id",
|
|
42
|
+
"System Prompt ID",
|
|
43
|
+
lambda v: format_optional(v, lambda x: format_uuid(x, short=False)),
|
|
44
|
+
),
|
|
45
|
+
FieldConfig(
|
|
46
|
+
"input_schema_id",
|
|
47
|
+
"Input Schema ID",
|
|
48
|
+
lambda v: format_optional(v, lambda x: format_uuid(x, short=False)),
|
|
49
|
+
),
|
|
50
|
+
FieldConfig(
|
|
51
|
+
"output_schema_id",
|
|
52
|
+
"Output Schema ID",
|
|
53
|
+
lambda v: format_optional(v, lambda x: format_uuid(x, short=False)),
|
|
54
|
+
),
|
|
55
|
+
FieldConfig(
|
|
56
|
+
"organization_id",
|
|
57
|
+
"Organization ID",
|
|
58
|
+
lambda v: format_optional(v, lambda x: format_uuid(x, short=True)),
|
|
59
|
+
),
|
|
60
|
+
FieldConfig(
|
|
61
|
+
"user_id",
|
|
62
|
+
"User ID",
|
|
63
|
+
lambda v: format_optional(v, lambda x: format_uuid(x, short=True)),
|
|
64
|
+
),
|
|
65
|
+
FieldConfig("created_at", "Created At", format_datetime),
|
|
66
|
+
]
|
|
67
|
+
|
|
68
|
+
output.entity(response, f"Agent: {response.name}", fields)
|
|
File without changes
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"""Agents delete command implementation."""
|
|
2
|
+
|
|
3
|
+
import typer
|
|
4
|
+
|
|
5
|
+
from cli.commands.agents.delete.presenter import present_delete_result
|
|
6
|
+
from cli.infrastructure.command import async_command, authenticated_client
|
|
7
|
+
from cli.infrastructure.console import Confirm
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def agents_delete_command(
|
|
11
|
+
agent: str = typer.Argument(
|
|
12
|
+
...,
|
|
13
|
+
help="Agent name or UUID",
|
|
14
|
+
),
|
|
15
|
+
yes: bool = typer.Option(
|
|
16
|
+
False,
|
|
17
|
+
"-y",
|
|
18
|
+
"--yes",
|
|
19
|
+
help="Skip confirmation",
|
|
20
|
+
),
|
|
21
|
+
) -> None:
|
|
22
|
+
"""Delete an agent.
|
|
23
|
+
|
|
24
|
+
Permanently removes the agent and associated models, tools, and tags.
|
|
25
|
+
Agents referenced by pipeline steps cannot be deleted.
|
|
26
|
+
|
|
27
|
+
Examples:
|
|
28
|
+
ai agents delete my-agent
|
|
29
|
+
ai agents delete 550e8400-e29b-41d4-a716-446655440000 -y
|
|
30
|
+
"""
|
|
31
|
+
_execute_delete(agent_identifier=agent, skip_confirm=yes)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
@async_command
|
|
35
|
+
async def _execute_delete(agent_identifier: str, skip_confirm: bool) -> None:
|
|
36
|
+
"""Execute delete agent operation."""
|
|
37
|
+
if not skip_confirm:
|
|
38
|
+
confirmed = Confirm.ask(
|
|
39
|
+
f"[yellow]Delete agent '{agent_identifier}'?[/yellow] This cannot be undone"
|
|
40
|
+
)
|
|
41
|
+
if not confirmed:
|
|
42
|
+
raise typer.Abort()
|
|
43
|
+
|
|
44
|
+
async with authenticated_client() as (_config, client):
|
|
45
|
+
response = await client.delete_agent(agent_identifier)
|
|
46
|
+
|
|
47
|
+
present_delete_result(response)
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"""Presenter for agent delete command output."""
|
|
2
|
+
|
|
3
|
+
from cli.infrastructure.output import OutputService
|
|
4
|
+
from alloy_runtime_types.dtos.agents import DeleteAgentResponse
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def present_delete_result(response: DeleteAgentResponse) -> None:
|
|
8
|
+
"""Present agent deletion result.
|
|
9
|
+
|
|
10
|
+
Args:
|
|
11
|
+
response: DeleteAgentResponse from server
|
|
12
|
+
"""
|
|
13
|
+
output = OutputService.get()
|
|
14
|
+
deleted = response.deleted_agent
|
|
15
|
+
|
|
16
|
+
output.success(f"Agent '{deleted.name}' deleted successfully")
|