@@ -71,25 +71,19 @@ def generate_completion(args: argparse.Namespace) -> None:
7171
7272 case ${words[1]} in
7373 api)
74- # API subcommands
75- local api_commands="chat completions models files fine-tuning embeddings audio images moderations assistants threads runs messages"
76- if [[ ${cword} -eq 2 ]]; then
77- COMPREPLY=($(compgen -W "${api_commands}" -- "${cur}"))
78- fi
74+ # API subcommands - use full command names as registered in CLI
75+ local api_commands="chat.completions.create completions.create models.list models.retrieve models.delete files.create files.list files.retrieve files.delete images.generate images.edit images.create_variation audio.transcriptions.create audio.translations.create fine_tuning.jobs.create fine_tuning.jobs.list fine_tuning.jobs.retrieve fine_tuning.jobs.cancel fine_tuning.jobs.list_events"
76+ COMPREPLY=($(compgen -W "${api_commands}" -- "${cur}"))
7977 ;;
8078 tools)
8179 # Tools subcommands
82- local tools_commands=""
83- if [[ ${cword} -eq 2 ]]; then
84- COMPREPLY=($(compgen -W "${tools_commands}" -- "${cur}"))
85- fi
80+ local tools_commands="fine_tunes.prepare_data migrate grit"
81+ COMPREPLY=($(compgen -W "${tools_commands}" -- "${cur}"))
8682 ;;
8783 complete)
8884 # Complete subcommand - shell names
8985 local shells="bash zsh fish powershell"
90- if [[ ${cword} -eq 2 ]]; then
91- COMPREPLY=($(compgen -W "${shells}" -- "${cur}"))
92- fi
86+ COMPREPLY=($(compgen -W "${shells}" -- "${cur}"))
9387 ;;
9488 esac
9589}
@@ -147,22 +141,37 @@ def generate_completion(args: argparse.Namespace) -> None:
147141 api)
148142 local -a api_commands
149143 api_commands=(
150- 'chat:Chat completions API'
151- 'completions:Completions API'
152- 'models:Models API'
153- 'files:Files API'
154- 'fine-tuning:Fine-tuning API'
155- 'embeddings:Embeddings API'
156- 'audio:Audio API'
157- 'images:Images API'
158- 'moderations:Moderations API'
159- 'assistants:Assistants API'
160- 'threads:Threads API'
161- 'runs:Runs API'
162- 'messages:Messages API'
144+ 'chat.completions.create:Create chat completion'
145+ 'completions.create:Create completion'
146+ 'models.list:List models'
147+ 'models.retrieve:Retrieve model'
148+ 'models.delete:Delete model'
149+ 'files.create:Create file'
150+ 'files.list:List files'
151+ 'files.retrieve:Retrieve file'
152+ 'files.delete:Delete file'
153+ 'images.generate:Generate image'
154+ 'images.edit:Edit image'
155+ 'images.create_variation:Create image variation'
156+ 'audio.transcriptions.create:Create transcription'
157+ 'audio.translations.create:Create translation'
158+ 'fine_tuning.jobs.create:Create fine-tuning job'
159+ 'fine_tuning.jobs.list:List fine-tuning jobs'
160+ 'fine_tuning.jobs.retrieve:Retrieve fine-tuning job'
161+ 'fine_tuning.jobs.cancel:Cancel fine-tuning job'
162+ 'fine_tuning.jobs.list_events:List fine-tuning job events'
163163 )
164164 _describe 'api command' api_commands
165165 ;;
166+ tools)
167+ local -a tools_commands
168+ tools_commands=(
169+ 'fine_tunes.prepare_data:Prepare data for fine-tuning'
170+ 'migrate:Migrate to new API version'
171+ 'grit:Run grit'
172+ )
173+ _describe 'tools command' tools_commands
174+ ;;
166175 complete)
167176 local -a shells
168177 shells=(
@@ -207,6 +216,32 @@ def generate_completion(args: argparse.Namespace) -> None:
207216complete -c openai -l azure-ad-token -d 'A token from Azure Active Directory'
208217complete -c openai -s V -l version -d 'Show version'
209218
219+ # api subcommands
220+ complete -c openai -n '__fish_seen_subcommand_from api' -a 'chat.completions.create' -d 'Create chat completion'
221+ complete -c openai -n '__fish_seen_subcommand_from api' -a 'completions.create' -d 'Create completion'
222+ complete -c openai -n '__fish_seen_subcommand_from api' -a 'models.list' -d 'List models'
223+ complete -c openai -n '__fish_seen_subcommand_from api' -a 'models.retrieve' -d 'Retrieve model'
224+ complete -c openai -n '__fish_seen_subcommand_from api' -a 'models.delete' -d 'Delete model'
225+ complete -c openai -n '__fish_seen_subcommand_from api' -a 'files.create' -d 'Create file'
226+ complete -c openai -n '__fish_seen_subcommand_from api' -a 'files.list' -d 'List files'
227+ complete -c openai -n '__fish_seen_subcommand_from api' -a 'files.retrieve' -d 'Retrieve file'
228+ complete -c openai -n '__fish_seen_subcommand_from api' -a 'files.delete' -d 'Delete file'
229+ complete -c openai -n '__fish_seen_subcommand_from api' -a 'images.generate' -d 'Generate image'
230+ complete -c openai -n '__fish_seen_subcommand_from api' -a 'images.edit' -d 'Edit image'
231+ complete -c openai -n '__fish_seen_subcommand_from api' -a 'images.create_variation' -d 'Create image variation'
232+ complete -c openai -n '__fish_seen_subcommand_from api' -a 'audio.transcriptions.create' -d 'Create transcription'
233+ complete -c openai -n '__fish_seen_subcommand_from api' -a 'audio.translations.create' -d 'Create translation'
234+ complete -c openai -n '__fish_seen_subcommand_from api' -a 'fine_tuning.jobs.create' -d 'Create fine-tuning job'
235+ complete -c openai -n '__fish_seen_subcommand_from api' -a 'fine_tuning.jobs.list' -d 'List fine-tuning jobs'
236+ complete -c openai -n '__fish_seen_subcommand_from api' -a 'fine_tuning.jobs.retrieve' -d 'Retrieve fine-tuning job'
237+ complete -c openai -n '__fish_seen_subcommand_from api' -a 'fine_tuning.jobs.cancel' -d 'Cancel fine-tuning job'
238+ complete -c openai -n '__fish_seen_subcommand_from api' -a 'fine_tuning.jobs.list_events' -d 'List fine-tuning job events'
239+
240+ # tools subcommands
241+ complete -c openai -n '__fish_seen_subcommand_from tools' -a 'fine_tunes.prepare_data' -d 'Prepare data for fine-tuning'
242+ complete -c openai -n '__fish_seen_subcommand_from tools' -a 'migrate' -d 'Migrate to new API version'
243+ complete -c openai -n '__fish_seen_subcommand_from tools' -a 'grit' -d 'Run grit'
244+
210245# complete subcommand
211246complete -c openai -n '__fish_seen_subcommand_from complete' -a 'bash' -d 'Bash completion'
212247complete -c openai -n '__fish_seen_subcommand_from complete' -a 'zsh' -d 'Zsh completion'
@@ -230,19 +265,9 @@ def generate_completion(args: argparse.Namespace) -> None:
230265 param($wordToComplete, $commandAst, $cursorPosition)
231266
232267 $commandElements = $commandAst.CommandElements
233- $command = @(
234- 'complete'
235- for ($i = 1; $i -lt $commandElements.Count; $i++) {
236- $element = $commandElements[$i]
237- if ($element -isnot [StringConstantExpressionAst]) {
238- break
239- }
240- if ($element.Value.StartsWith('-')) {
241- break
242- }
243- $element.Value
244- }
245- ) -join ';'
268+
269+ # Get the subcommand (second element if present)
270+ $subcommand = if ($commandElements.Count -ge 2) { $commandElements[1].Value } else { '' }
246271
247272 $completions = @(
248273 # Main commands
@@ -251,7 +276,35 @@ def generate_completion(args: argparse.Namespace) -> None:
251276 [CompletionResult]::new('complete', 'complete', [CompletionResultType]::Command, 'Generate shell completion scripts')
252277 )
253278
254- if ($command -eq 'complete') {
279+ if ($subcommand -eq 'api') {
280+ $completions = @(
281+ [CompletionResult]::new('chat.completions.create', 'chat.completions.create', [CompletionResultType]::ParameterValue, 'Create chat completion')
282+ [CompletionResult]::new('completions.create', 'completions.create', [CompletionResultType]::ParameterValue, 'Create completion')
283+ [CompletionResult]::new('models.list', 'models.list', [CompletionResultType]::ParameterValue, 'List models')
284+ [CompletionResult]::new('models.retrieve', 'models.retrieve', [CompletionResultType]::ParameterValue, 'Retrieve model')
285+ [CompletionResult]::new('models.delete', 'models.delete', [CompletionResultType]::ParameterValue, 'Delete model')
286+ [CompletionResult]::new('files.create', 'files.create', [CompletionResultType]::ParameterValue, 'Create file')
287+ [CompletionResult]::new('files.list', 'files.list', [CompletionResultType]::ParameterValue, 'List files')
288+ [CompletionResult]::new('files.retrieve', 'files.retrieve', [CompletionResultType]::ParameterValue, 'Retrieve file')
289+ [CompletionResult]::new('files.delete', 'files.delete', [CompletionResultType]::ParameterValue, 'Delete file')
290+ [CompletionResult]::new('images.generate', 'images.generate', [CompletionResultType]::ParameterValue, 'Generate image')
291+ [CompletionResult]::new('images.edit', 'images.edit', [CompletionResultType]::ParameterValue, 'Edit image')
292+ [CompletionResult]::new('images.create_variation', 'images.create_variation', [CompletionResultType]::ParameterValue, 'Create image variation')
293+ [CompletionResult]::new('audio.transcriptions.create', 'audio.transcriptions.create', [CompletionResultType]::ParameterValue, 'Create transcription')
294+ [CompletionResult]::new('audio.translations.create', 'audio.translations.create', [CompletionResultType]::ParameterValue, 'Create translation')
295+ [CompletionResult]::new('fine_tuning.jobs.create', 'fine_tuning.jobs.create', [CompletionResultType]::ParameterValue, 'Create fine-tuning job')
296+ [CompletionResult]::new('fine_tuning.jobs.list', 'fine_tuning.jobs.list', [CompletionResultType]::ParameterValue, 'List fine-tuning jobs')
297+ [CompletionResult]::new('fine_tuning.jobs.retrieve', 'fine_tuning.jobs.retrieve', [CompletionResultType]::ParameterValue, 'Retrieve fine-tuning job')
298+ [CompletionResult]::new('fine_tuning.jobs.cancel', 'fine_tuning.jobs.cancel', [CompletionResultType]::ParameterValue, 'Cancel fine-tuning job')
299+ [CompletionResult]::new('fine_tuning.jobs.list_events', 'fine_tuning.jobs.list_events', [CompletionResultType]::ParameterValue, 'List fine-tuning job events')
300+ )
301+ } elseif ($subcommand -eq 'tools') {
302+ $completions = @(
303+ [CompletionResult]::new('fine_tunes.prepare_data', 'fine_tunes.prepare_data', [CompletionResultType]::ParameterValue, 'Prepare data for fine-tuning')
304+ [CompletionResult]::new('migrate', 'migrate', [CompletionResultType]::ParameterValue, 'Migrate to new API version')
305+ [CompletionResult]::new('grit', 'grit', [CompletionResultType]::ParameterValue, 'Run grit')
306+ )
307+ } elseif ($subcommand -eq 'complete') {
255308 $completions = @(
256309 [CompletionResult]::new('bash', 'bash', [CompletionResultType]::ParameterValue, 'Bash completion')
257310 [CompletionResult]::new('zsh', 'zsh', [CompletionResultType]::ParameterValue, 'Zsh completion')
0 commit comments