Entropic 2.14.3
Local-first agentic inference engine
Loading...
Searching...
No Matches
backend.h
Go to the documentation of this file.
1// SPDX-License-Identifier: Apache-2.0
32#pragma once
33
40
41#include <atomic>
42#include <cstdint>
43#include <functional>
44#include <mutex>
45#include <string>
46#include <string_view>
47#include <vector>
48
49namespace entropic {
50
70public:
71 virtual ~InferenceBackend() = default;
72
73 /* ── Lifecycle (template methods — own the state machine) ── */
74
81 bool load(const ModelConfig& config);
82
88 bool activate();
89
94 void deactivate();
95
100 void unload();
101
123
124 /* ── Generation (require ACTIVE state) ───────────────── */
125
135 const std::vector<Message>& messages,
136 const GenerationParams& params);
137
159 const std::vector<Message>& messages,
161 std::atomic<bool>& cancel);
162
173 const std::vector<Message>& messages,
175 std::function<void(std::string_view token)> on_token,
176 std::atomic<bool>& cancel);
177
195 const std::vector<Message>& messages,
197 std::function<void(std::string_view token)> on_token,
198 std::atomic<bool>& cancel);
199
208 const std::string& prompt,
209 const GenerationParams& params);
210
211 /* ── Evaluation (require ACTIVE state) ─────────────── */
212
229 const int32_t* tokens,
230 int n_tokens);
231
243 float compute_perplexity(
244 const int32_t* tokens,
245 int n_tokens);
246
247 /* ── Queries (lock-free) ─────────────────────────────── */
248
255 ModelState state() const { return state_.load(std::memory_order_acquire); }
256
263 bool is_active() const { return state() == ModelState::ACTIVE; }
264
271 bool is_loaded() const { return state() != ModelState::COLD; }
272
278 int count_tokens(const std::string& text) const;
279
287 virtual std::vector<int32_t> tokenize_text(
288 const std::string& text) const { return {}; }
289
296 int context_length() const { return config_.context_length; }
297
309 virtual void clear_prompt_cache() {}
310
326 virtual std::string tool_call_close_marker() const { return ""; }
327
334 const ModelConfig& config() const { return config_; }
335
336 /* ── Capability queries (v1.9.13) ────────────────────── */
337
349 bool supports(BackendCapability cap) const;
350
360 std::vector<BackendCapability> capabilities() const;
361
362 /* ── Backend metadata (v1.9.13) ──────────────────────── */
363
375 BackendInfo info() const;
376
393 virtual std::string active_tool_grammar() const { return {}; }
394
395 /* ── Model state management (v1.9.13) ────────────────── */
396
408 bool save_state(int seq_id, std::vector<uint8_t>& buffer) const;
409
417 bool restore_state(int seq_id, const std::vector<uint8_t>& buffer);
418
429 bool clear_state(int seq_id = -1);
430
431 /* ── Multi-sequence generation (v1.9.13) ─────────────── */
432
445 int seq_id,
446 const std::vector<Message>& messages,
447 const GenerationParams& params);
448
460 int seq_id,
461 const std::vector<Message>& messages,
463 std::function<void(std::string_view token)> on_token,
464 std::atomic<bool>& cancel);
465
466 /* ── Same-prefix batch generation (gh#98, v2.8.0) ────── */
467
483 std::vector<GenerationResult> generate_batch(
484 const std::vector<std::vector<Message>>& requests,
485 const std::vector<GenerationParams>& params,
486 std::atomic<bool>& cancel);
487
488protected:
489 /* ── Subclass overrides (20%) ────────────────────────── */
490
497 virtual bool do_load(const ModelConfig& config) = 0;
498
503 virtual bool do_activate() = 0;
504
519 virtual bool do_load_active(const ModelConfig& config) {
520 return do_load(config) && do_activate();
521 }
522
523public:
542 virtual void forget_session_kv(const std::string& session_key) {
543 (void)session_key;
544 }
545
546protected:
547
552 virtual void do_deactivate() = 0;
553
558 virtual void do_unload() = 0;
559
568 const std::vector<Message>& messages,
569 const GenerationParams& params) = 0;
570
589 const std::vector<Message>& messages,
591 std::atomic<bool>& cancel) {
592 (void)cancel;
593 return do_generate(messages, params);
594 }
595
611 virtual std::vector<GenerationResult> do_generate_batch(
612 const std::vector<std::vector<Message>>& requests,
613 const std::vector<GenerationParams>& params,
614 std::atomic<bool>& cancel) {
615 std::vector<GenerationResult> out;
616 out.reserve(requests.size());
617 for (std::size_t i = 0; i < requests.size(); ++i) {
618 out.push_back(do_generate(requests[i], params[i], cancel));
619 }
620 return out;
621 }
622
633 const std::vector<Message>& messages,
635 std::function<void(std::string_view token)> on_token,
636 std::atomic<bool>& cancel) = 0;
637
662 const std::vector<Message>& messages,
664 std::function<void(std::string_view token)> on_token,
665 std::atomic<bool>& cancel);
666
675 const std::string& prompt,
676 const GenerationParams& params) = 0;
677
684 virtual int do_count_tokens(const std::string& text) const = 0;
685
702 const int32_t* tokens,
703 int n_tokens) = 0;
704
705 /* ── New overridable methods (v1.9.13) ───────────────── */
706
716 virtual bool do_supports(BackendCapability cap) const;
717
726 virtual std::string do_backend_name() const = 0;
727
736 virtual BackendInfo do_info() const;
737
745 virtual bool do_save_state(int seq_id,
746 std::vector<uint8_t>& buffer) const;
747
755 virtual bool do_restore_state(int seq_id,
756 const std::vector<uint8_t>& buffer);
757
764 virtual bool do_clear_state(int seq_id);
765
778 int seq_id,
779 const std::vector<Message>& messages,
780 const GenerationParams& params);
781
796 int seq_id,
797 const std::vector<Message>& messages,
799 std::function<void(std::string_view token)> on_token,
800 std::atomic<bool>& cancel);
801
802 std::string last_error_;
803
811
825 bool promote_to_active();
826
833 void set_hooks(const HookInterface& hooks) { hooks_ = hooks; }
834
835protected:
843 std::atomic<ModelState> state_{ModelState::COLD};
844
845private:
846 ModelConfig config_;
847 std::mutex transition_mutex_;
848 std::mutex eval_mutex_;
849 HookInterface hooks_;
850};
851
852} // namespace entropic
Backend capability flags and metadata for architecture-agnostic queries.
Concrete base class for inference backends (80% logic).
Definition backend.h:69
virtual bool do_load_active(const ModelConfig &config)
Load COLD → ACTIVE in one step.
Definition backend.h:519
virtual GenerationResult do_complete(const std::string &prompt, const GenerationParams &params)=0
Subclass raw completion.
virtual GenerationResult do_generate_streaming_seq(int seq_id, const std::vector< Message > &messages, const GenerationParams &params, std::function< void(std::string_view token)> on_token, std::atomic< bool > &cancel)
Streaming generation with sequence ID.
Definition backend.cpp:847
GenerationResult generate_seq(int seq_id, const std::vector< Message > &messages, const GenerationParams &params)
Generate with explicit sequence ID.
Definition backend.cpp:698
virtual LogprobResult do_evaluate_logprobs(const int32_t *tokens, int n_tokens)=0
Backend-specific logprob evaluation.
GenerationResult generate_speculative(const std::vector< Message > &messages, const GenerationParams &params, std::function< void(std::string_view token)> on_token, std::atomic< bool > &cancel)
Generate via the speculative-decoding kernel (v2.1.11).
Definition backend.cpp:362
float compute_perplexity(const int32_t *tokens, int n_tokens)
Compute perplexity for a token sequence.
Definition backend.cpp:517
virtual std::string active_tool_grammar() const
The tool-call GBNF the last render derived, if any (gh#154).
Definition backend.h:393
virtual std::vector< GenerationResult > do_generate_batch(const std::vector< std::vector< Message > > &requests, const std::vector< GenerationParams > &params, std::atomic< bool > &cancel)
Subclass same-prefix batch generation (gh#98, v2.8.0).
Definition backend.h:611
std::string last_error_
Last error message for diagnostics.
Definition backend.h:802
virtual BackendInfo do_info() const
Populate backend metadata.
Definition backend.cpp:774
virtual GenerationResult do_generate_streaming(const std::vector< Message > &messages, const GenerationParams &params, std::function< void(std::string_view token)> on_token, std::atomic< bool > &cancel)=0
Subclass streaming generation.
bool save_state(int seq_id, std::vector< uint8_t > &buffer) const
Save model state to buffer.
Definition backend.cpp:625
void set_hooks(const HookInterface &hooks)
Set the hook dispatch interface.
Definition backend.h:833
bool supports(BackendCapability cap) const
Query whether this backend supports a capability.
Definition backend.cpp:575
bool restore_state(int seq_id, const std::vector< uint8_t > &buffer)
Restore model state from buffer.
Definition backend.cpp:650
bool activate()
Promote to GPU (WARM → ACTIVE).
Definition backend.cpp:88
virtual bool do_restore_state(int seq_id, const std::vector< uint8_t > &buffer)
Restore model state.
Definition backend.cpp:802
virtual int do_count_tokens(const std::string &text) const =0
Subclass token counting.
virtual bool do_supports(BackendCapability cap) const
Declare supported capabilities.
Definition backend.cpp:764
void deactivate()
Release GPU layers (ACTIVE → WARM).
Definition backend.cpp:132
bool promote_to_active()
WARM → ACTIVE promotion.
Definition backend.cpp:105
virtual void do_unload()=0
Full unload.
virtual bool do_activate()=0
Promote loaded model to GPU.
BackendInfo info() const
Get backend metadata.
Definition backend.cpp:610
bool is_active() const
True when state is ACTIVE.
Definition backend.h:263
ModelState state() const
Current lifecycle state (lock-free read).
Definition backend.h:255
virtual bool do_load(const ModelConfig &config)=0
Load model into CPU RAM.
virtual GenerationResult do_generate_speculative(const std::vector< Message > &messages, const GenerationParams &params, std::function< void(std::string_view token)> on_token, std::atomic< bool > &cancel)
Subclass speculative-decoding streaming generation.
Definition backend.cpp:400
virtual void clear_prompt_cache()
Invalidate any backend-owned prompt/KV caches.
Definition backend.h:309
virtual void do_deactivate()=0
Release GPU, keep CPU.
virtual std::vector< int32_t > tokenize_text(const std::string &text) const
Tokenize text to token IDs.
Definition backend.h:287
virtual GenerationResult do_generate(const std::vector< Message > &messages, const GenerationParams &params)=0
Subclass generation.
std::vector< BackendCapability > capabilities() const
Get all supported capabilities as a vector.
Definition backend.cpp:591
void unload()
Full unload (→ COLD).
Definition backend.cpp:159
const ModelConfig & config() const
Stored model config.
Definition backend.h:334
virtual void forget_session_kv(const std::string &session_key)
Drop one session's resident KV and release its slot (gh#165).
Definition backend.h:542
virtual std::string tool_call_close_marker() const
The tool-call CLOSE marker for the active chat format (gh#103).
Definition backend.h:326
bool clear_state(int seq_id=-1)
Clear/reset model state for a sequence.
Definition backend.cpp:675
virtual GenerationResult do_generate_seq(int seq_id, const std::vector< Message > &messages, const GenerationParams &params)
Generate with sequence ID.
Definition backend.cpp:828
virtual std::string do_backend_name() const =0
Return backend name identifier.
bool is_loaded() const
True when state is WARM or ACTIVE.
Definition backend.h:271
std::vector< GenerationResult > generate_batch(const std::vector< std::vector< Message > > &requests, const std::vector< GenerationParams > &params, std::atomic< bool > &cancel)
Generate N independent same-prefix requests together.
Definition backend.cpp:293
GenerationResult generate(const std::vector< Message > &messages, const GenerationParams &params)
Generate a complete response.
Definition backend.cpp:234
bool load(const ModelConfig &config)
Load model into CPU RAM (COLD → WARM).
Definition backend.cpp:54
virtual bool do_clear_state(int seq_id)
Clear/reset model state.
Definition backend.cpp:815
int count_tokens(const std::string &text) const
Count tokens using model's tokenizer.
Definition backend.cpp:558
virtual bool do_save_state(int seq_id, std::vector< uint8_t > &buffer) const
Save model state (KV cache or hidden state).
Definition backend.cpp:788
bool fire_model_load_hook(const ModelConfig &config)
Fire ON_MODEL_LOAD pre-hook.
Definition backend.cpp:533
GenerationResult generate_streaming(const std::vector< Message > &messages, const GenerationParams &params, std::function< void(std::string_view token)> on_token, std::atomic< bool > &cancel)
Generate with per-token streaming callback.
Definition backend.cpp:325
LogprobResult evaluate_logprobs(const int32_t *tokens, int n_tokens)
Evaluate per-token log-probabilities for a token sequence.
Definition backend.cpp:459
virtual GenerationResult do_generate(const std::vector< Message > &messages, const GenerationParams &params, std::atomic< bool > &cancel)
Subclass batch generation with cancel-flag support.
Definition backend.h:588
int context_length() const
Model's context window size.
Definition backend.h:296
bool load_and_activate(const ModelConfig &config)
Bring a model to ACTIVE in as few file reads as possible.
Definition backend.cpp:200
GenerationResult complete(const std::string &prompt, const GenerationParams &params)
Raw text completion without chat template.
Definition backend.cpp:422
GenerationResult generate_streaming_seq(int seq_id, const std::vector< Message > &messages, const GenerationParams &params, std::function< void(std::string_view token)> on_token, std::atomic< bool > &cancel)
Streaming generation with explicit sequence ID.
Definition backend.cpp:730
std::atomic< ModelState > state_
State transition slot accessible to subclasses for test-only injection.
Definition backend.h:843
Configuration structs with defaults.
int * cancel
Consumer's cancel flag, nullable.
Definition engine.cpp:4074
Generation output with metrics.
Hook dispatch interface injected into engine subsystems.
Per-token log-probability evaluation result.
Message struct for conversation history.
Activate model on GPU (WARM → ACTIVE).
BackendCapability
Capabilities that an inference backend may or may not support.
@ tokens
Gate on generated tokens since the last tool call.
@ optional
optional: every escape asks the host's path approver
ModelState
C++ enum class for model VRAM lifecycle states.
Definition config.h:96
@ ACTIVE
GPU layers loaded, full speed.
@ COLD
On disk only, no RAM consumed.
Backend metadata for introspection.
Generation parameters for a single inference call.
Definition config.h:389
Result of a single generation call.
Per-token log-probability evaluation result.
Model configuration for a single tier.
Definition config.h:154
int context_length
Context window size (512–131072)
Definition config.h:157