Skip to content

Commit 2086168

Browse files
simer11-jingclaude
andcommitted
fix(cli): address code review feedback for shell completion
- Fix api subcommands to use correct full names (e.g., chat.completions.create) - Add tools subcommands (fine_tunes.prepare_data, migrate, grit) - Fix PowerShell complete subcommand detection logic Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
1 parent 92f9f91 commit 2086168

1 file changed

Lines changed: 92 additions & 39 deletions

File tree

src/openai/cli/_completion.py

Lines changed: 92 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -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:
207216
complete -c openai -l azure-ad-token -d 'A token from Azure Active Directory'
208217
complete -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
211246
complete -c openai -n '__fish_seen_subcommand_from complete' -a 'bash' -d 'Bash completion'
212247
complete -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

Comments
 (0)