Entropic 2.11.1
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
109
110 /* ── Generation (require ACTIVE state) ───────────────── */
111
121 const std::vector<Message>& messages,
122 const GenerationParams& params);
123
145 const std::vector<Message>& messages,
146 const GenerationParams& params,
147 std::atomic<bool>& cancel);
148
159 const std::vector<Message>& messages,
160 const GenerationParams& params,
161 std::function<void(std::string_view token)> on_token,
162 std::atomic<bool>& cancel);
163
181 const std::vector<Message>& messages,
182 const GenerationParams& params,
183 std::function<void(std::string_view token)> on_token,
184 std::atomic<bool>& cancel);
185
194 const std::string& prompt,
195 const GenerationParams& params);
196
197 /* ── Evaluation (require ACTIVE state) ─────────────── */
198
215 const int32_t* tokens,
216 int n_tokens);
217
229 float compute_perplexity(
230 const int32_t* tokens,
231 int n_tokens);
232
233 /* ── Queries (lock-free) ─────────────────────────────── */
234
241 ModelState state() const { return state_.load(std::memory_order_acquire); }
242
249 bool is_active() const { return state() == ModelState::ACTIVE; }
250
257 bool is_loaded() const { return state() != ModelState::COLD; }
258
264 int count_tokens(const std::string& text) const;
265
273 virtual std::vector<int32_t> tokenize_text(
274 const std::string& text) const { return {}; }
275
282 int context_length() const { return config_.context_length; }
283
295 virtual void clear_prompt_cache() {}
296
312 virtual std::string tool_call_close_marker() const { return ""; }
313
320 const ModelConfig& config() const { return config_; }
321
322 /* ── Capability queries (v1.9.13) ────────────────────── */
323
335 bool supports(BackendCapability cap) const;
336
346 std::vector<BackendCapability> capabilities() const;
347
348 /* ── Backend metadata (v1.9.13) ──────────────────────── */
349
361 BackendInfo info() const;
362
363 /* ── Model state management (v1.9.13) ────────────────── */
364
376 bool save_state(int seq_id, std::vector<uint8_t>& buffer) const;
377
385 bool restore_state(int seq_id, const std::vector<uint8_t>& buffer);
386
397 bool clear_state(int seq_id = -1);
398
399 /* ── Multi-sequence generation (v1.9.13) ─────────────── */
400
413 int seq_id,
414 const std::vector<Message>& messages,
415 const GenerationParams& params);
416
428 int seq_id,
429 const std::vector<Message>& messages,
430 const GenerationParams& params,
431 std::function<void(std::string_view token)> on_token,
432 std::atomic<bool>& cancel);
433
434 /* ── Same-prefix batch generation (gh#98, v2.8.0) ────── */
435
451 std::vector<GenerationResult> generate_batch(
452 const std::vector<std::vector<Message>>& requests,
453 const std::vector<GenerationParams>& params,
454 std::atomic<bool>& cancel);
455
456protected:
457 /* ── Subclass overrides (20%) ────────────────────────── */
458
465 virtual bool do_load(const ModelConfig& config) = 0;
466
471 virtual bool do_activate() = 0;
472
477 virtual void do_deactivate() = 0;
478
483 virtual void do_unload() = 0;
484
493 const std::vector<Message>& messages,
494 const GenerationParams& params) = 0;
495
514 const std::vector<Message>& messages,
515 const GenerationParams& params,
516 std::atomic<bool>& cancel) {
517 (void)cancel;
518 return do_generate(messages, params);
519 }
520
536 virtual std::vector<GenerationResult> do_generate_batch(
537 const std::vector<std::vector<Message>>& requests,
538 const std::vector<GenerationParams>& params,
539 std::atomic<bool>& cancel) {
540 std::vector<GenerationResult> out;
541 out.reserve(requests.size());
542 for (std::size_t i = 0; i < requests.size(); ++i) {
543 out.push_back(do_generate(requests[i], params[i], cancel));
544 }
545 return out;
546 }
547
558 const std::vector<Message>& messages,
559 const GenerationParams& params,
560 std::function<void(std::string_view token)> on_token,
561 std::atomic<bool>& cancel) = 0;
562
587 const std::vector<Message>& messages,
588 const GenerationParams& params,
589 std::function<void(std::string_view token)> on_token,
590 std::atomic<bool>& cancel);
591
600 const std::string& prompt,
601 const GenerationParams& params) = 0;
602
609 virtual int do_count_tokens(const std::string& text) const = 0;
610
627 const int32_t* tokens,
628 int n_tokens) = 0;
629
630 /* ── New overridable methods (v1.9.13) ───────────────── */
631
641 virtual bool do_supports(BackendCapability cap) const;
642
651 virtual std::string do_backend_name() const = 0;
652
661 virtual BackendInfo do_info() const;
662
670 virtual bool do_save_state(int seq_id,
671 std::vector<uint8_t>& buffer) const;
672
680 virtual bool do_restore_state(int seq_id,
681 const std::vector<uint8_t>& buffer);
682
689 virtual bool do_clear_state(int seq_id);
690
703 int seq_id,
704 const std::vector<Message>& messages,
705 const GenerationParams& params);
706
721 int seq_id,
722 const std::vector<Message>& messages,
723 const GenerationParams& params,
724 std::function<void(std::string_view token)> on_token,
725 std::atomic<bool>& cancel);
726
727 std::string last_error_;
728
736
743 void set_hooks(const HookInterface& hooks) { hooks_ = hooks; }
744
745protected:
753 std::atomic<ModelState> state_{ModelState::COLD};
754
755private:
756 ModelConfig config_;
757 std::mutex transition_mutex_;
758 std::mutex eval_mutex_;
759 HookInterface hooks_;
760};
761
762} // namespace entropic
Backend capability flags and metadata for architecture-agnostic queries.
Concrete base class for inference backends (80% logic).
Definition backend.h:69
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:800
GenerationResult generate_seq(int seq_id, const std::vector< Message > &messages, const GenerationParams &params)
Generate with explicit sequence ID.
Definition backend.cpp:651
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:315
float compute_perplexity(const int32_t *tokens, int n_tokens)
Compute perplexity for a token sequence.
Definition backend.cpp:470
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:536
std::string last_error_
Last error message for diagnostics.
Definition backend.h:727
virtual BackendInfo do_info() const
Populate backend metadata.
Definition backend.cpp:727
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:578
void set_hooks(const HookInterface &hooks)
Set the hook dispatch interface.
Definition backend.h:743
bool supports(BackendCapability cap) const
Query whether this backend supports a capability.
Definition backend.cpp:528
bool restore_state(int seq_id, const std::vector< uint8_t > &buffer)
Restore model state from buffer.
Definition backend.cpp:603
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:755
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:717
void deactivate()
Release GPU layers (ACTIVE → WARM).
Definition backend.cpp:117
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:563
bool is_active() const
True when state is ACTIVE.
Definition backend.h:249
ModelState state() const
Current lifecycle state (lock-free read).
Definition backend.h:241
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:353
virtual void clear_prompt_cache()
Invalidate any backend-owned prompt/KV caches.
Definition backend.h:295
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:273
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:544
void unload()
Full unload (→ COLD).
Definition backend.cpp:144
const ModelConfig & config() const
Stored model config.
Definition backend.h:320
virtual std::string tool_call_close_marker() const
The tool-call CLOSE marker for the active chat format (gh#103).
Definition backend.h:312
bool clear_state(int seq_id=-1)
Clear/reset model state for a sequence.
Definition backend.cpp:628
virtual GenerationResult do_generate_seq(int seq_id, const std::vector< Message > &messages, const GenerationParams &params)
Generate with sequence ID.
Definition backend.cpp:781
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:257
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:246
GenerationResult generate(const std::vector< Message > &messages, const GenerationParams &params)
Generate a complete response.
Definition backend.cpp:187
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:768
int count_tokens(const std::string &text) const
Count tokens using model's tokenizer.
Definition backend.cpp:511
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:741
bool fire_model_load_hook(const ModelConfig &config)
Fire ON_MODEL_LOAD pre-hook.
Definition backend.cpp:486
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:278
LogprobResult evaluate_logprobs(const int32_t *tokens, int n_tokens)
Evaluate per-token log-probabilities for a token sequence.
Definition backend.cpp:412
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:513
int context_length() const
Model's context window size.
Definition backend.h:282
bool load_and_activate(const ModelConfig &config)
Convenience: load() + activate().
Definition backend.cpp:170
GenerationResult complete(const std::string &prompt, const GenerationParams &params)
Raw text completion without chat template.
Definition backend.cpp:375
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:683
std::atomic< ModelState > state_
State transition slot accessible to subclasses for test-only injection.
Definition backend.h:753
Configuration structs with defaults.
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.
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:313
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