Entropic 2.14.3
Local-first agentic inference engine
Loading...
Searching...
No Matches
constitutional_validator.h
Go to the documentation of this file.
1// SPDX-License-Identifier: Apache-2.0
34#pragma once
35
42
43#include <atomic>
44#include <functional>
45#include <mutex>
46#include <utility>
47#include <optional>
48#include <string>
49#include <unordered_map>
50
51namespace entropic {
52
63 InferenceInterface* inference;
64};
65
85public:
94 const std::string& constitution_text);
95
105 HookInterface* hook_iface,
106 InferenceInterface* inference);
107
114 void detach(HookInterface* hook_iface);
115
127 bool should_validate(const std::string& identity_name) const;
128
137 const std::string& identity_name, bool enabled);
138
145 void set_tier_rules(
146 const std::string& identity_name,
147 const std::vector<std::string>& rules);
148
160 void set_global_enabled(bool enabled);
161
180 std::function<std::pair<std::string, std::string>(
181 const std::string&)> resolver);
182
202 const std::string& content,
203 const std::string& tier,
204 const char* messages_json);
205
213
214 // ── gh#30 (v2.1.5): consumer-driven retry controls ──────
215
229 void set_auto_retry(bool enabled);
230
237 bool auto_retry_enabled() const;
238
252
266
279 void (*cb)(int attempt_n, void* user_data), void* user_data);
280
307 void (*start_cb)(void* user_data),
308 void (*end_cb)(void* user_data),
309 void* user_data);
310
317 const ConstitutionalValidationConfig& config() const { return config_; }
318
334 static int hook_callback(
335 entropic_hook_point_t hook_point,
336 const char* context_json,
337 char** modified_json,
338 void* user_data);
339
347 std::string build_critique_prompt(const std::string& content) const;
348
355 void append_turn_evidence(std::string& prompt) const;
356
364 static CritiqueResult parse_critique(const std::string& json_str);
365
366private:
375 CritiqueResult run_critique(const std::string& content);
376
384 std::string build_critique_messages(const std::string& content) const;
385
392 std::string build_critique_params() const;
393
403 std::string revise(
404 const std::string& original,
405 const CritiqueResult& critique,
406 const char* messages_json);
407
414 void store_result(const ValidationResult& result);
415
422 void log_verdict(const ValidationResult& result) const;
423
434 ValidationResult run_validation_loop(
435 const std::string& content,
436 const std::string& tier,
437 const char* messages_json);
438
449 ValidationResult apply_revisions(
450 ValidationResult result,
451 const CritiqueResult& initial_critique,
452 const char* messages_json);
453
463 std::string attempt_revision(
464 const std::string& content,
465 const CritiqueResult& critique,
466 const char* messages_json);
467
475 std::string build_single_turn_json(
476 const std::string& prompt) const;
477
487 std::string build_revision_messages(
488 const std::string& original,
489 const CritiqueResult& critique,
490 const char* messages_json) const;
491
499 std::string build_feedback_text(
500 const CritiqueResult& critique) const;
501
511 std::string inject_feedback_into_messages(
512 const std::string& original,
513 const std::string& feedback,
514 const char* messages_json) const;
515
525 int handle_hook(const char* context_json, char** modified_json);
526
534 static void write_modified_json(
535 const std::string& content, char** modified_json);
536
545 static std::string extract_json_string(
546 const char* json, const char* key);
547
555 static std::string extract_string_after_colon(const char* pos);
556
565 static bool extract_compliant_field(
566 const std::string& json, CritiqueResult& result);
567
575 static void extract_violations(
576 const std::string& json, CritiqueResult& result);
577
586 static std::optional<Violation> extract_next_violation(
587 const std::string& json, size_t& pos);
588
596 static void extract_revised_field(
597 const std::string& json, CritiqueResult& result);
598
600 std::string constitution_text_;
601 InferenceInterface* inference_ = nullptr;
602 ValidationContext context_;
603
605 bool global_enabled_;
607 std::function<std::pair<std::string, std::string>(const std::string&)>
608 marker_resolver_;
609 mutable std::mutex marker_mutex_;
611 std::unordered_map<std::string, bool> identity_overrides_;
613 std::unordered_map<std::string, std::vector<std::string>> tier_rules_;
614 mutable std::mutex overrides_mutex_;
615
639 static const std::string& current_tier();
644 static const std::string& current_tool_context();
649 static const std::string& current_tool_evidence();
654 static const std::string& current_system_prompt();
662 static void set_turn_context(const std::string& tier,
663 const std::string& tool_context,
664 const std::string& tool_evidence,
665 const std::string& system_prompt);
666
668 ValidationResult last_result_;
669 mutable std::mutex result_mutex_;
670
671 // ── gh#30 (v2.1.5): consumer-driven retry controls ─────
675 std::atomic<bool> auto_retry_enabled_{true};
676
682 struct PendingValidationState {
683 ValidationResult result;
684 CritiqueResult critique;
685 std::string messages_json;
686 std::string tier;
691 std::string system_prompt;
692 };
695 std::optional<PendingValidationState> pending_state_;
696 mutable std::mutex pending_mutex_;
697
708 struct AttemptBoundaryCb {
709 void (*cb)(int, void*) = nullptr;
710 void* user_data = nullptr;
711 };
712 AttemptBoundaryCb attempt_boundary_;
713 mutable std::mutex attempt_boundary_mutex_;
714
724 struct CritiqueCallbacks {
725 void (*start_cb)(void*) = nullptr;
726 void (*end_cb)(void*) = nullptr;
727 void* user_data = nullptr;
728 };
729 CritiqueCallbacks critique_cbs_;
730 mutable std::mutex critique_cbs_mutex_;
731};
732
733} // namespace entropic
Post-generation constitutional compliance validator.
bool auto_retry_enabled() const
Whether auto-revision is currently enabled.
void set_global_enabled(bool enabled)
Toggle the global validation gate at runtime.
entropic_error_t attach(HookInterface *hook_iface, InferenceInterface *inference)
Register this validator as a POST_GENERATE hook.
static int hook_callback(entropic_hook_point_t hook_point, const char *context_json, char **modified_json, void *user_data)
POST_GENERATE hook callback for constitutional validation.
void set_marker_resolver(std::function< std::pair< std::string, std::string >(const std::string &)> resolver)
Register a per-tier reasoning-delimiter resolver (gh#108).
void set_tier_rules(const std::string &identity_name, const std::vector< std::string > &rules)
Set per-identity validation rules from frontmatter.
void append_turn_evidence(std::string &prompt) const
Append this turn's tool manifest and evidence to a prompt.
entropic_error_t accept_last()
Finalize the cached attempt as the validation result.
entropic_error_t resume_retry()
Resume the revision pass after a paused validation.
const ConstitutionalValidationConfig & config() const
Get the config (read-only after construction).
bool should_validate(const std::string &identity_name) const
Check if validation is enabled for a given identity.
void set_critique_callbacks(void(*start_cb)(void *user_data), void(*end_cb)(void *user_data), void *user_data)
Register the critique start/end callback pair (gh#50).
static CritiqueResult parse_critique(const std::string &json_str)
Parse critique JSON into structured result (exposed for testing).
ValidationResult validate(const std::string &content, const std::string &tier, const char *messages_json)
Run the validation pipeline on generated content.
ValidationResult last_result() const
Get the last validation result.
void set_attempt_boundary_cb(void(*cb)(int attempt_n, void *user_data), void *user_data)
Register the attempt-boundary callback.
void set_auto_retry(bool enabled)
Enable or disable automatic revision after rejection.
std::string build_critique_prompt(const std::string &content) const
Build the critique prompt (exposed for testing).
void detach(HookInterface *hook_iface)
Deregister the POST_GENERATE hook.
void set_identity_validation(const std::string &identity_name, bool enabled)
Set per-identity validation override.
Configuration structs with defaults.
Error types for cross-.so error reporting.
entropic_error_t
Error codes returned by all C API functions.
Definition error.h:37
Hook point enum and callback types for engine lifecycle hooks.
entropic_hook_point_t
Hook points in the engine lifecycle.
Definition hooks.h:39
Hook dispatch interface injected into engine subsystems.
Function pointer types for core-to-inference communication.
Activate model on GPU (WARM → ACTIVE).
@ enabled
Named in enabled_mcpjson_servers, or enable-all is set.
@ optional
optional: every escape asks the host's path approver
@ tier
The TIER's identity frontmatter grammar: stem (gh#154).
Constitutional validation pipeline configuration.
Definition config.h:1177
Structured result from a single critique generation pass.
Definition validation.h:44
Context passed through hook user_data.
class ConstitutionalValidator * validator
Validator instance.
InferenceInterface * inference
For critique generation.
Constitutional validation types — critique results and violations.