erllama_model_backend behaviour (erllama v0.11.0)
View SourceBehaviour describing the operations the erllama_model gen_statem
needs from a backing inference engine.
Two backends ship in v0.2:
erllama_model_stub — deterministic phash2-based stubs; used
by tests that don't have a GGUF on disk. erllama_model_llama — real llama.cpp via the NIF.
Future backends (mock for fault injection, remote for distributed inference, etc.) can plug in via this same surface.
Summary
Types
-type chat_request() :: #{messages := [chat_message()], system => binary() | undefined, tools => [chat_tool()] | undefined}.
-type sampler_opts() :: #{grammar => binary(), grammar_lazy => boolean(), trigger_patterns => [binary()], trigger_tokens => [erllama:token_id()], grammar_prefill => binary(), repetition_penalty => float(), frequency_penalty => float(), presence_penalty => float(), penalty_last_n => integer(), top_k => non_neg_integer(), top_p => float(), min_p => float(), typical_p => float(), top_n_sigma => float(), xtc_probability => float(), xtc_threshold => float(), dynatemp_range => float(), dynatemp_exponent => float(), min_keep => pos_integer(), dry_multiplier => float(), dry_base => float(), dry_allowed_length => integer(), dry_penalty_last_n => integer(), dry_sequence_breakers => [binary()], mirostat => 0 | 1 | 2, mirostat_tau => float(), mirostat_eta => float(), logit_bias => [{erllama:token_id(), number()}], ignore_eos => boolean(), infill => boolean(), logprobs => non_neg_integer(), temperature => float(), seed => non_neg_integer()}.
-type sampler_ref() :: term().
-type seq_id() :: non_neg_integer().
-type state() :: term().
-type step_op() :: {prefill, [erllama:token_id()]} | {decode, sampler_ref()}.
-type step_result() :: prefilled | {token, erllama:token_id(), 0 | 1} | {token, erllama:token_id(), 0 | 1, {float(), [{erllama:token_id(), float()}]}} | {thinking_token, erllama:token_id()} | thinking_end.
Callbacks
-callback apply_chat_template(state(), Request :: chat_request()) -> {ok, [erllama:token_id()]} | {error, term()}.
-callback configure_sampler(state(), sampler_opts()) -> {ok, state()} | {error, term()}.
-callback decode_one(state(), ContextTokens :: [erllama:token_id()]) -> {ok, erllama:token_id()} | {eog, erllama:token_id()} | {error, term()}.
-callback detokenize(state(), [erllama:token_id()]) -> binary() | {error, term()}.
-callback detokenize(state(), [erllama:token_id()], map()) -> binary() | {error, term()}.
-callback embed(state(), [erllama:token_id()]) -> {ok, [float()]} | {error, term()}.
-callback extra_metadata(state()) -> #{model_size_bytes => non_neg_integer(), total_layers => non_neg_integer(), n_gpu_layers => integer(), family => map()}.
-callback kv_pack(state(), Tokens :: [erllama:token_id()]) -> binary() | {error, term()}.
-callback kv_pack(state(), Tokens :: [erllama:token_id()], seq_id()) -> binary() | {error, term()}.
-callback prefill(state(), [erllama:token_id()]) -> ok | {error, term()}.
-callback sampler_free(sampler_ref()) -> ok | {error, term()}.
-callback sampler_new(state(), sampler_opts()) -> {ok, sampler_ref()} | {error, term()}.
-callback seq_rm_last(state(), NTokens :: pos_integer()) -> ok | {error, term()}.
-callback seq_rm_last(state(), seq_id(), NTokens :: pos_integer()) -> ok | {error, term()}.
-callback terminate(state()) -> ok.
-callback tokenize(state(), Text :: binary()) -> [erllama:token_id()] | {error, term()}.
-callback verify(state(), PrefixTokens :: [erllama:token_id()], Candidates :: [erllama:token_id()], K :: pos_integer()) -> {ok, AcceptedCount :: non_neg_integer(), NextToken :: erllama:token_id() | eos, NewState :: state()} | {error, term()}.