Configuration for a CLI-based LLM provider.
Pure data — loaded from TOML or constructed in code. This is what
makes CLIProvider universal: a new CLI client is just a config entry,
no Elixir code needed.
Core Fields
name— atom identifying this provider (e.g.:claude_code,:droid)binary— executable name (must be in PATH)subcommand— optional subcommand prepended to args (e.g."exec"for droid)provider_type— always:clidefault_timeout— timeout in ms (default: 1_800_000 = 30 min)default_model— real model string used only when GC owns the defaultmodel_resolution— how model selection works for this CLI provider::gc_default,:provider_runtime, or:explicit_onlyflags— map of opt key → CLI flag (e.g.%{model: "--model", auto: "--auto"})prompt_position—:last(default) or:flagged(e.g. claude uses-p)prompt_flag— flag before the prompt whenprompt_position == :flagged(e.g.-p)prefix_args— args always prepended (e.g.["--print"]for claude)stdin_hack— wrap with/bin/sh -c 'exec "$0" "$@" < /dev/null'(claude needs this)install_hint— shown in not_installed error messageprompt_transport— optional semantic prompt transport (:last,:flagged,:stdin)system_prompt_transport— optional semantic system prompt strategycwd_flag— optional explicit cwd flag for capability introspectionadd_dir_flag— optional explicit add-dir flag for capability introspectionoutput_mode— optional output mode (:stdout_text,:final_message_only,:json)non_interactive_args— optional args enabling non-interactive executionauto_approve_args— optional args enabling unattended executionsandbox_bypass_args— optional args for stronger sandbox/approval bypasspreflight— optional declarative preflight configuration
System Prompt File Transform
system_prompt_file_transform— declares how to prepare the system prompt file before passing it to the CLI. When nil, the file is passed as-is (backward-compatible default).Supported transforms:
:agent_spec_yaml— generates a YAML agent spec file plus a siblingsystem.mdcontaining the raw prompt. Used by Kimi CLI's--agent-file. Generates the nested structure Kimi expects:version: 1 agent: extend: default name: <agent_name> system_prompt_path: ./system.md model: <model> # when available
The transform resolves field values with this precedence:
- Dispatch opts (
:agent_name,:model) — caller-supplied file_transform_defaults(TOML config) — provider-level defaults- Built-in fallbacks (name: "llm_core_agent", version: 1, extend: "default")
file_transform_defaults— optional map of default values for the transform. Providers declare these in TOML under[providers.<id>.cli.file_transform_defaults]. Keys likeversion,extend,name,modelare passed to the transform as fallback context.
Output Capture
output_file_flag— CLI flag that writes the final response to a file (e.g."--output-last-message"for Codex). When set, the runtime creates a temp file, passes it via this flag, and reads the response from the file instead of stdout.output_strip_patterns— list of regex pattern strings applied to stdout output to strip banners, session noise, or decorators before building the response. Applied only to stdout-based output (not file capture).
Summary
Types
@type t() :: %LlmCore.LLM.CLIProvider.Config{ add_dir_flag: String.t() | nil, auto_approve_args: [String.t()], binary: String.t(), cwd_flag: String.t() | nil, default_model: String.t() | nil, default_timeout: pos_integer(), file_transform_defaults: map(), flags: %{required(atom()) => String.t()}, install_hint: String.t() | nil, model_resolution: :gc_default | :provider_runtime | :explicit_only, name: atom(), non_interactive_args: [String.t()], output_file_flag: String.t() | nil, output_mode: :stdout_text | :final_message_only | :json | nil, output_strip_patterns: [String.t()], prefix_args: [String.t()], preflight: map(), prompt_flag: String.t() | nil, prompt_position: :last | :flagged, prompt_transport: :last | :flagged | :stdin | nil, provider_type: :cli, sandbox_bypass_args: [String.t()], stdin_hack: boolean(), subcommand: String.t() | nil, system_prompt_file_transform: :agent_spec_yaml | nil, system_prompt_transport: :flag | :file_flag | :inline_fallback | :unsupported | nil }