Entropic 2.9.4
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
513 const std::vector<Message>& messages,
514 const GenerationParams& params,
515 std::atomic<bool>& cancel) {
516 (void)cancel;
517 return do_generate(messages, params);
518 }
519
535 virtual std::vector<GenerationResult> do_generate_batch(
536 const std::vector<std::vector<Message>>& requests,
537 const std::vector<GenerationParams>& params,
538 std::atomic<bool>& cancel) {
539 std::vector<GenerationResult> out;
540 out.reserve(requests.size());
541 for (std::size_t i = 0; i < requests.size(); ++i) {
542 out.push_back(do_generate(requests[i], params[i], cancel));
543 }
544 return out;
545 }
546
557 const std::vector<Message>& messages,
558 const GenerationParams& params,
559 std::function<void(std::string_view token)> on_token,
560 std::atomic<bool>& cancel) = 0;
561
586 const std::vector<Message>& messages,
587 const GenerationParams& params,
588 std::function<void(std::string_view token)> on_token,
589 std::atomic<bool>& cancel);
590
599 const std::string& prompt,
600 const GenerationParams& params) = 0;
601
608 virtual int do_count_tokens(const std::string& text) const = 0;
609
626 const int32_t* tokens,
627 int n_tokens) = 0;
628
629 /* ── New overridable methods (v1.9.13) ───────────────── */
630
640 virtual bool do_supports(BackendCapability cap) const;
641
650 virtual std::string do_backend_name() const = 0;
651
660 virtual BackendInfo do_info() const;
661
669 virtual bool do_save_state(int seq_id,
670 std::vector<uint8_t>& buffer) const;
671
679 virtual bool do_restore_state(int seq_id,
680 const std::vector<uint8_t>& buffer);
681
688 virtual bool do_clear_state(int seq_id);
689
702 int seq_id,
703 const std::vector<Message>& messages,
704 const GenerationParams& params);
705
720 int seq_id,
721 const std::vector<Message>& messages,
722 const GenerationParams& params,
723 std::function<void(std::string_view token)> on_token,
724 std::atomic<bool>& cancel);
725
726 std::string last_error_;
727
735
742 void set_hooks(const HookInterface& hooks) { hooks_ = hooks; }
743
744protected:
752 std::atomic<ModelState> state_{ModelState::COLD};
753
754private:
755 ModelConfig config_;
756 std::mutex transition_mutex_;
757 std::mutex eval_mutex_;
758 HookInterface hooks_;
759};
760
761} // 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:774
GenerationResult generate_seq(int seq_id, const std::vector< Message > &messages, const GenerationParams &params)
Generate with explicit sequence ID.
Definition backend.cpp:625
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:302
float compute_perplexity(const int32_t *tokens, int n_tokens)
Compute perplexity for a token sequence.
Definition backend.cpp:455
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:535
std::string last_error_
Last error message for diagnostics.
Definition backend.h:726
virtual BackendInfo do_info() const
Populate backend metadata.
Definition backend.cpp:701
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:554
void set_hooks(const HookInterface &hooks)
Set the hook dispatch interface.
Definition backend.h:742
bool supports(BackendCapability cap) const
Query whether this backend supports a capability.
Definition backend.cpp:512
bool restore_state(int seq_id, const std::vector< uint8_t > &buffer)
Restore model state from buffer.
Definition backend.cpp:578
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:729
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:691
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:540
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:340
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:522
void unload()
Full unload (→ COLD).
Definition backend.cpp:139
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:602
virtual GenerationResult do_generate_seq(int seq_id, const std::vector< Message > &messages, const GenerationParams &params)
Generate with sequence ID.
Definition backend.cpp:755
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:235
GenerationResult generate(const std::vector< Message > &messages, const GenerationParams &params)
Generate a complete response.
Definition backend.cpp:182
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:742
int count_tokens(const std::string &text) const
Count tokens using model's tokenizer.
Definition backend.cpp:496
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:715
bool fire_model_load_hook(const ModelConfig &config)
Fire ON_MODEL_LOAD pre-hook.
Definition backend.cpp:471
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:265
LogprobResult evaluate_logprobs(const int32_t *tokens, int n_tokens)
Evaluate per-token log-probabilities for a token sequence.
Definition backend.cpp:397
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:512
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:165
GenerationResult complete(const std::string &prompt, const GenerationParams &params)
Raw text completion without chat template.
Definition backend.cpp:362
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:657
std::atomic< ModelState > state_
State transition slot accessible to subclasses for test-only injection.
Definition backend.h:752
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:302
Result of a single generation call.
Per-token log-probability evaluation result.
Model configuration for a single tier.
Definition config.h:148
int context_length
Context window size (512–131072)
Definition config.h:151