CRITICAL — routing exceptions must precede any command: when the user explicitly requests scripted / CI / no-guardrails / raw raw CRUD creation of an Endpoint, immediately read ../arkcli-infer-endpoint/SKILL.md and let it take over; before the handoff is complete, authentication checks, model queries, or other commands are prohibited.
Prerequisite: First use Read to read ../arkcli-shared/SKILL.md to obtain the shared authentication/configuration/write-operation guard rules.
Model clarification in creation intent
As long as the user's ultimate goal is still "create / new / deploy an Endpoint," even if a complete model ID has not yet been provided, you must remain in the arkcli-deploy workflow;arkcli-models at this point it is only a temporarily invoked read-only candidate query capability, and the creation task must not be rerouted into pure model discovery.
Candidates must come fromthis round's ArkCLI live structured output; completion from model memory, examples, or old version numbers is prohibited.
The query budget is exactly one Bash call in the current user turn. Before execution, determine the keyword, filter conditions, and --size。models search 's keyword is a single catalog substring; do not combine multiple concepts into a space-separated phrase: first choose the one ASCII token that best narrows the scope, and put the remaining conditions into flags in the same call or jq local filtering. For example, for "Doubao code model" use keyword code, then in the same pipeline filter by name 's doubao|seed filter; for "image generation" use seedream. When unsure of a stable token, prefer omitting the keyword and using the existing structured filter; submitting an untranslated Chinese phrase directly and then changing words to retry is prohibited. If worried about overly long output, put the field projection directly into the same pipeline, for example
arkcli models search "<keyword>" --size 0 --format json | jq -c '{items: [(.items // [])[] | {name, primary_version, lifecycle_status, input_modalities, output_modalities}]}'.
Regardless of whether this call succeeds, returns empty results, is truncated, or fails, you must not change keywords, increase pagination, rerun the same command, or call ArkCLI once more just to reformat; use only the captured stdout, and if information is insufficient, stop truthfully.
- No model given at all: execute one bounded query, for example
arkcli models search --size 10 --format json. If the user has already stated the purpose or modality, add the corresponding keyword /--modalityto the same query. - Only a brand, series, or family name is given(for example "Doubao" or "Seed 2"): execute one
arkcli models search <keyword> --size 10 --format json; the family name is not a complete ID that can be passed directly to--modelthe full ID of - From the same returned
items, read the existing fields such asname、primary_version、lifecycle_statusand modality. Prefer retaining candidates wherelifecycle_status=Publishedand whose name does not containinternal/test. When the status is missing or not Published, you may only truthfully mark it as unverified, and must not call it "deployable." The complete model ID is determined according to the model query contract:primary_versionWhen non-empty, use the returned value to precisely compose<name>-<primary_version>, and only when empty use<name>; this is a structured field combination, not guessing the version from naming or date patterns. Do not on your own append tonamethe suffixespro、liteor any version suffix that was not returned. - 0 usable candidates: state that nothing was found this round, and ask the user to supplement the purpose, modality, or keyword; do not guess one and continue.
- 1 available candidate: repeat the full ID returned in this round and ask the user to confirm; if the user has requested that this round be query-only, then stop here.
- Multiple available candidates: list the condensed candidates and their full IDs, and ask the user to make an explicit choice; if there are still too many candidates, narrow the scope based on the user's purpose, and do not arbitrarily select the first item.
Convergence boundary for the clarification stage: after the first search in this round returns,do not execute models searchagain, and do not execute models get, price queries, or other detail calls in a loop over the candidates. Only after the user has selected a single candidate and then explicitly requests comparison of some missing attribute should one targeted query be added in a subsequent round. Before the model has uniquely determined it, do not execute +deploy、infer endpoint create or Raw API creation.
The Endpoint name should not block the above read-only candidate queries; after the model is selected, collect the name and confirm the final creation parameters.
New flag --set-default <modality>: after successful deployment, automatically set the new endpoint as the default resource for that modality (text / image / video) of the active profile. It takes effect only when the deployment actually succeeds and the user explicitly passes the modality; on failure, only warn to stderr and do not block the main deployment flow. See ../arkcli-shared/references/profile-defaults.md。
Write operations + billing:+deploy Creating an online inference Endpoint is a real write operation and will generate billable resources. This workflow depends on online probing,does not support --dry-run; the final parameters must be explicitly confirmed with the user before execution.
Model activation is an independent billable write action, and in non-interactive environments it must never be activated automatically: if the target base model has not yet been activated,+deploy will trigger "activate model" (an account-level billable write).In non-TTY environments such as agents / CI / pipelines, activation is hard-rejected—--yes will not allow it either(--yes It is used only in a real human interactive terminal to skip [y/N]). When it is hit, the CLI returns model_activation_required + a console link; youmust end this round and hand the matter of "activation (billing)" together with the link back to the human, so that the human can confirm in an interactive terminal or activate it in the web console.It is strictly forbidden to add --yes / echo Y / set ARKCLI_ALLOW_HEADLESS_ACTIVATION yourself to activate it on the user's behalf—printing a line like "please confirm" and then adding --yes yourself in the same round and running away is equivalent to not asking at all.ARKCLI_ALLOW_HEADLESS_ACTIVATION=1 It is reserved only for truly unattended automation (CI pipelines), and is not something an agent should set.
Real-name verification prerequisite (hard gate for activation-type actions):+deploy will trigger model activation,The first stepis to first arkcli auth status read volc_sso.identity.verified——false and stop immediately, paste the real-name verification page https://console.volcengine.com/user/authentication/detail/ to the user, and pause and wait (see ../arkcli-auth/references/realname-gate.md)。Do nottry +deployfirst, and after hitting an invalid model-id / model not activated error, go back and check real-name verification—those errors will lead you astray.
Hard boundary for speech models: For TTS / ASR / dubbing / reading aloud / podcasts / voice design / real-time voice interaction, or when the model name matches doubao-seed-tts-*、doubao-seed-asr-*、seedasr-* ,do not execute +deploy. In arkcli, these models currently support only models search for plaza discovery; they cannot create an Endpoint, nor can model activation be used to bypass this.
Sample code:+deploy automatically rendered after creation + independent command +code-example
Both paths are available, and both use OpenTOP OpenGetSampleCode:
+deployAutomatically render after successful creation: write the multilingual invocation examples for this endpoint to./ark-examples/<ep-id>/(use the ep-id as the directly callable model id; the examples call the endpoint you just created directly), and print a one-line persistence summary to stderr. Best-effort — if examples cannot be fetched, only soft-prompt; this does not affect Endpoint creation/startup.- Standalone command
arkcli +code-example: generate examples separately by base model name/version, convert to../arkcli-code-example/SKILL.md; note that it is provided by model-version, and some versions' backends have no group and will return not found; when missing, fall back toark-examples/static examples or the Ark console example code page.
Subcommand enumeration (there is only this one)
| Invoke | Description |
|---|---|
arkcli +deploy --name <ep-name> --model <model-id> [...] |
Create Endpoint; execution means real creation |
⚠️ There is no
arkcli deploy .../arkcli endpoint create/arkcli +deploy createand other subcommands. The entire capability is just one+deploycommand plus flags.
Anti-hallucination checklist
- Before delivery, read the return values and acceptance boundaries: distinguish new creation/reuse, creation/inference verification, and example generation success/soft failure. Use real stdout, stderr, and files as evidence; do not repeatedly create billable resources because of example or default-setting failures.
--name、--modelrequired- Model versions, prices, and quotas may only cite the structured results returned by this round's read-only commands;do not fabricate model versions or prices. When a query fails or you are not logged in, clearly mark it as "not yet verified"; do not substitute "typical prices" or guessed values
- After a query failure, do not fill in dependent fields: if any authentication, model, price, or resource query fails, keep the corresponding field as "not yet verified" and clearly point out the source of the failure; do not continue to assert specific amounts, idle billing policies, exact model versions, or "there is no existing Endpoint"
- When checking existing Endpoints, use
arkcli resources list --format jsonand then filter by the returned fields;do not add undocumented--filteror otherresources list --helpflags that do not exist in - JSON-type flags (
--rate-limit/--moderation/--intelligent-router/--tags, etc.) field names are always PascalCase:Rpm、Tpm、Strategy、Mode, notrpm/tpm - The flags of the standalone
+code-exampleare--model(base model name/versioned id) +--language, not--endpoint-id:arkcli +code-example --model <id> --language python(for details see../arkcli-code-example/SKILL.md) +deployAfter successful creation,automaticallyrender the examples to./ark-examples/<ep-id>/(by ep-id); if you want another copy by base model name, run+code-example- When the model is not activated,
+deployactivation ishard-rejected under non-TTY,--yesis also not allowed;Do not fill in--yes/echo Yyourself / setARKCLI_ALLOW_HEADLESS_ACTIVATION; activation (billing) must be handed back to a human to handle in the terminal / console - Speech models (TTS / ASR / podcast / voice / real-time voice interaction) being searchable in the marketplace does not mean they are deployable; when such a model is matched, stop at
arkcli models search <keyword>, do not give the+deploycommand
Model clarification in creation intent
As long as the user's ultimate goal is still "create / new / deploy Endpoint", even if a complete model ID has not yet been given, you must stay in the arkcli-deploy workflow;arkcli-models at this point is only a read-only candidate query capability for temporary invocation, and the creation task must not be rerouted into pure model discovery.
Candidates must come fromThis round ArkCLI's real-time structured output; completion from model memory, examples, or old version numbers is prohibited.
First determine the user's hard conditions and keywords; on the first attempt use models search "<keyword>" --size 10 --format json; if there are no keywords, omit it. Keywords use substrings of real names/families; capabilities and modalities use real flags; do not concatenate multiple natural-language concepts into a model name. If a complete result for this round already exists, reuse it.
- No model given at all: query by purpose/output modality; if there is no purpose, show real-time representatives for selection; do not list model names from memory.
- Only brand/family: recall using that family keyword; for empty results, first follow search's normalization and recovery chain to correct once; do not treat the brand as an exact ID.
- Candidate fields: read the real
display_name/name/primary_version/lifecycle_status/input_modalities/output_modalities/create_time/update_time. For new integrations, prefer Published; exclude recommendations whose names explicitly indicate internal/test and those that are Shutdown/Retiring; unknown status does not mean deployable. Only concatenate when the version is non-emptyname-version; do not guess dates; custom models retaincm-...identity. - Sorting and coverage: by default, strictly sort in descending order by the real
create_time, with the most recently created/published candidates first; only when the user explicitly asks for "recently updated" sort in descending order byupdate_time. It is prohibited to pin an old model to the top because of historical preference or because it was mentioned earlier in the context; you may remind in the question body, but must not change the order or invent "recommended/mainstay/flagship" labels. Do not pass off names, timestamps inside IDs, or search's default relevance as creation time; when time is missing/unparseable, mark it as unknown and do not fabricate sorting. When there is no preference, show 5–8 representatives, covering actually existing text, multimodal, image, and video; if there are hard task conditions, list only matches and do not mix in other tasks just to fill the count. label uses the original display name; description includes the full ID, modality, and status. - 0/1/N: if 0, state it truthfully and ask one key follow-up condition; if 1, restate the real ID; if N, use the host-provided structured selection capability, stop before the user selects, and do not choose the first item for them. Do not create when only a query/command is requested.
- Recovery is not unlimited retrying: separate stderr from stdout and check the exit code. First read the complete JSON already saved by the tool; if there is truly no complete capture, the same read-only query may be re-fetched to a file, but options must not be generated from a truncated preview. If successful but empty, normalizing keywords or relaxing one non-hard preference is allowed, with explanation; authentication/permission failures are not treated as empty, and identity must not be switched. If it is still incomplete/no match, report the boundary and conditions to be supplemented; do not repeat blind queries.
- Return to the creation flow: only after selecting the exact target, read the required details/real request fields. Stop when the version or modality is explicitly unsupported; do not use activate to fix a wrong version. The user selecting a model does not equal approval to create; finally execute according to the shared authorization flow;
+deploydoes not support--dry-run, do not invent a preview flag.
For a concise field template, see search reference. The following is local sorting of the saved complete candidates, without adding new API requests:
jq '[.items[]
| select(.lifecycle_status == "Published")
| select((.name | test("internal|test"; "i")) | not)
| {display_name,name,primary_version,lifecycle_status,input_modalities,output_modalities,create_time}]
| sort_by(.create_time // "") | reverse' "$candidate_file"
First check whether the top-level items is an array and whether the key fields are complete; if time is missing, it can only be marked "time unknown". This projection is not a verification of account deployability; do not loop get/price endpoints for each candidate; only supplement the evidence needed to complete the current task.
Routing decision
- The user wants to create / deploy an Endpoint, but the model is missing or only a brand / family name is given → still route to this
arkcli-deployskill; perform one real-time read-only query as in the previous section and let the user choose; do not create directly - User already has a model ID + wants to formally deploy → restate
model/name/region; after confirmation, executearkcli +deploy --name <ep> --model <id> - User wants to deploy / integrate a speech model, or the model name looks like
*-tts-*/*-asr-*/seedasr-*→ redirect toarkcli-modelsexplaining "only square search is supported, Endpoint creation is not supported" - When the user passes a custom model ID (
cm-xxxxx), before actually creating, first check whether there is already an Endpoint referencing that custom model with statusRunning; if so, reuse it directly and output the existingendpoint-id, and will not create a second billable resource. This online reuse decision is also one of the reasons+deploycannot provide a reliable offline Client Preview - User has an urgent tone and asks to "create immediately" → do not skip confirmation, restate
model/name/region - has already obtained via
arkcli infer endpoint createobtainedId→ do notagain+deploycreate a second one, redirect toarkcli-infer-endpoint; for a call example, redirect toarkcli-code-example(generated by model name)
anti-trigger (route elsewhere, attach the complete command to avoid downstream hallucination)
| User intent | Route to | Complete example command |
|---|---|---|
| Just want to try the model effect / one-off generation | arkcli-chat / arkcli-gen |
arkcli +chat --model <id> '...' or arkcli +gen --model <id> '...' |
| want a call example for a model | arkcli-code-example |
arkcli +code-example --model <model-id> --language python(generated by model name/version; if version is missing, fall back to a static example or the console examples page) |
| Only want to discover / compare models, no Endpoint creation intent yet | arkcli-models |
arkcli models search <keyword> or arkcli models list |
| Speech model deployment / TTS access point / ASR Endpoint | arkcli-models |
arkcli models search <keyword>(square discovery only; Endpoint creation is currently not supported) |
| 401 / authentication failure | arkcli-auth |
arkcli auth status, if necessary arkcli auth login |
| profile / region / project does not match expectations | arkcli-config |
For identity summary use arkcli auth whoami --format json; for default resources use arkcli resources list --format json. Only explicit Profile management uses the profile show/list |
| scripted / CI / need fine-grained control over each parameter, skip guardrails | arkcli-infer-endpoint |
arkcli infer endpoint create --model <id> --name <ep> |
Typical flow
- From model selection to formal integration:
arkcli auth status→arkcli models search/get→ restate and confirm the final model, name, and billing impact →arkcli +deploy ...(a custom model with an existing Running Endpoint will be reused) - Switch from trial to formal integration:
arkcli +chat/arkcli +genverify the effect → restate the final parameters and confirm → actually create - Do call integration after creation:
+deployhas already automatically written the example to./ark-examples/<ep-id>/, just use it directly; if you want to produce another copy by base model name, runarkcli +code-example --model <model-id> --language <lang>(if some versions have no example, fall back toark-examples/static example or the console examples page)
For detailed flags, JSON field examples, and error codes, see references/arkcli-deploy.md。
Reference
- arkcli-chat -- quick chat trial, does not create an Endpoint
- arkcli-gen -- one-step image/video generation
- arkcli-models -- confirm model ID before deployment
- arkcli-code-example -- generate call code when an endpoint already exists
- arkcli-shared -- authentication and global parameters