NeoGraph 0.16.0
A C++20 Graph Agent Engine Library — LangGraph for C++
Loading...
Searching...
No Matches
controlled_provider.h
1#pragma once
2
3#include <neograph/api.h>
4#include <neograph/provider.h>
5#include <neograph/runtime_context.h>
6
7#include <asio/awaitable.hpp>
8
9#include <cstdint>
10#include <memory>
11#include <optional>
12#include <string>
13#include <string_view>
14
15namespace neograph {
16
17struct ProviderDispatchReceiptData {
18 std::string dispatch_id;
19 std::string provider_binding_identity;
20 std::string assembly_receipt_id;
21 std::string normalized_request_digest;
22 std::string model;
23 ProviderMode mode = ProviderMode::Collect;
24};
25
27class NEOGRAPH_API ProviderDispatchReceipt final {
28public:
29 static constexpr std::uint32_t STORAGE_SCHEMA_VERSION = 1;
30
31 static ProviderDispatchReceipt create(ProviderDispatchReceiptData data);
32 static ProviderDispatchReceipt parse(std::string_view stored_bytes);
33
34 const std::string& dispatch_id() const noexcept;
35 const std::string& provider_binding_identity() const noexcept;
36 const std::string& assembly_receipt_id() const noexcept;
37 const std::string& normalized_request_digest() const noexcept;
38 const std::string& model() const noexcept;
39 ProviderMode mode() const noexcept;
40 const std::string& id() const noexcept;
41 std::string serialize_canonical() const;
42
43private:
44 struct Impl;
45 explicit ProviderDispatchReceipt(std::shared_ptr<const Impl> impl);
46 std::shared_ptr<const Impl> impl_;
47};
48
50enum class ProviderDispatchState : std::uint8_t {
51 Unavailable, Missing, AdmittedPending, Succeeded, Failed, ReconciliationRequired,
52};
53
54struct ProviderDispatchOutcomeReceiptData {
55 std::string dispatch_id;
56 std::string dispatch_receipt_id;
57 ProviderDispatchState state = ProviderDispatchState::ReconciliationRequired;
58 std::string response_digest;
59 std::string error;
60};
61
63class NEOGRAPH_API ProviderDispatchOutcomeReceipt final {
64public:
65 static constexpr std::uint32_t STORAGE_SCHEMA_VERSION = 1;
66
67 static ProviderDispatchOutcomeReceipt create(ProviderDispatchOutcomeReceiptData data);
68 static ProviderDispatchOutcomeReceipt parse(std::string_view stored_bytes);
69
70 const std::string& dispatch_id() const noexcept;
71 const std::string& dispatch_receipt_id() const noexcept;
72 ProviderDispatchState state() const noexcept;
73 const std::string& response_digest() const noexcept;
74 const std::string& error() const noexcept;
75 const std::string& id() const noexcept;
76 std::string serialize_canonical() const;
77
78private:
79 struct Impl;
80 explicit ProviderDispatchOutcomeReceipt(std::shared_ptr<const Impl> impl);
81 std::shared_ptr<const Impl> impl_;
82};
83
84enum class ProviderDispatchReceiptPutResult : std::uint8_t { Stored, AlreadyPresent, Conflict };
85
86enum class ProviderDispatchOutcomePutResult : std::uint8_t {
87 Stored,
88 AlreadyPresent,
89 Conflict,
90 MissingDispatch,
91};
92
94class NEOGRAPH_API ProviderDispatchReceiptStore {
95public:
96 virtual ~ProviderDispatchReceiptStore() = default;
97 virtual ProviderDispatchReceiptPutResult persist(const ProviderDispatchReceipt& receipt) = 0;
100 virtual ProviderDispatchReceiptPutResult persist(std::string_view owner_scope,
101 const ProviderDispatchReceipt& receipt) {
102 (void)owner_scope;
103 return persist(receipt);
104 }
107 virtual ProviderDispatchState state(std::string_view dispatch_id) const {
108 (void)dispatch_id;
109 return ProviderDispatchState::Unavailable;
110 }
111 virtual ProviderDispatchState state(std::string_view owner_scope,
112 std::string_view dispatch_id) const {
113 (void)owner_scope;
114 return state(dispatch_id);
115 }
116};
117
120public:
121 virtual ~ProviderDispatchOutcomeStore() = default;
122 virtual ProviderDispatchOutcomePutResult settle(
123 std::string_view owner_scope,
124 const ProviderDispatchOutcomeReceipt& outcome) = 0;
125 virtual std::optional<ProviderDispatchOutcomeReceipt> outcome(
126 std::string_view owner_scope,
127 std::string_view dispatch_id) const = 0;
128};
129
134public:
135 ~DurableProviderDispatchReceiptStore() override = default;
136};
137
142public:
149 ProviderDispatchReceiptPutResult persist(const ProviderDispatchReceipt& receipt) override;
150 ProviderDispatchReceiptPutResult persist(std::string_view owner_scope,
151 const ProviderDispatchReceipt& receipt) override;
152 ProviderDispatchState state(std::string_view dispatch_id) const override;
153 ProviderDispatchState state(std::string_view owner_scope,
154 std::string_view dispatch_id) const override;
155 ProviderDispatchOutcomePutResult settle(
156 std::string_view owner_scope,
157 const ProviderDispatchOutcomeReceipt& outcome) override;
158 std::optional<ProviderDispatchOutcomeReceipt> outcome(
159 std::string_view owner_scope,
160 std::string_view dispatch_id) const override;
161
162private:
163 struct Impl;
164 std::unique_ptr<Impl> impl_;
165};
166
167class NEOGRAPH_API ProviderDispatchOutcomePersistenceError final : public ProviderOutcomeError {
168public:
169 ProviderDispatchOutcomePersistenceError(sp::runtime::Result outcome, std::exception_ptr cause,
170 std::exception_ptr delivery_error = {})
171 : ProviderOutcomeError("Provider outcome settlement could not be persisted",
172 std::move(outcome), std::move(cause)),
173 delivery_error_(std::move(delivery_error)) {}
174 const std::exception_ptr& delivery_error() const noexcept { return delivery_error_; }
175private:
176 std::exception_ptr delivery_error_;
177};
178
183class NEOGRAPH_API ControlledProvider final {
184public:
185 ControlledProvider(std::shared_ptr<Provider> provider,
186 std::shared_ptr<ProviderDispatchReceiptStore> receipts,
187 std::string provider_binding_identity);
190 ControlledProvider& operator=(ControlledProvider&&) noexcept;
191 ControlledProvider(const ControlledProvider&) = delete;
192 ControlledProvider& operator=(const ControlledProvider&) = delete;
193
194 sp::runtime::Result dispatch(std::string dispatch_id,
195 const ContextAssemblyReceipt& assembly, ProviderRequest request);
196 sp::runtime::Result dispatch(std::string owner_scope, std::string dispatch_id,
197 const ContextAssemblyReceipt& assembly, ProviderRequest request);
198 asio::awaitable<sp::runtime::Result> dispatch_async(std::string dispatch_id,
199 const ContextAssemblyReceipt& assembly, ProviderRequest request);
200 asio::awaitable<sp::runtime::Result> dispatch_async(std::string owner_scope, std::string dispatch_id,
201 const ContextAssemblyReceipt& assembly, ProviderRequest request);
202 sp::runtime::Result dispatch_prepared(std::string dispatch_id,
203 const ContextAssemblyReceipt& assembly, PreparedProviderRequest request, ProviderBudgetClaim claim = {});
204 sp::runtime::Result dispatch_prepared(std::string owner_scope, std::string dispatch_id,
205 const ContextAssemblyReceipt& assembly, PreparedProviderRequest request, ProviderBudgetClaim claim = {});
206 asio::awaitable<sp::runtime::Result> dispatch_prepared_async(std::string dispatch_id,
207 const ContextAssemblyReceipt& assembly, PreparedProviderRequest request, ProviderBudgetClaim claim = {});
208 asio::awaitable<sp::runtime::Result> dispatch_prepared_async(std::string owner_scope, std::string dispatch_id,
209 const ContextAssemblyReceipt& assembly, PreparedProviderRequest request, ProviderBudgetClaim claim = {});
210
211private:
212 struct Impl;
213 static asio::awaitable<sp::runtime::Result> dispatch_impl(
214 std::shared_ptr<Impl> impl,
215 std::string owner_scope,
216 std::string dispatch_id,
217 ContextAssemblyReceipt assembly,
218 PreparedProviderRequest request, ProviderBudgetClaim claim);
219 std::shared_ptr<Impl> impl_;
220};
221
222} // namespace neograph
NEOGRAPH_API export/import macro for shared-library builds.
Evidence that one normalized provider request was assembled from one exact epoch.
Standalone write-ahead dispatch boundary.
Opt-in marker for receipt stores backed by durable storage.
Thread-safe in-memory receipt journal for standalone use and tests.
ProviderDispatchState state(std::string_view dispatch_id) const override
Returns durable progress for a dispatch id.
ProviderDispatchReceiptPutResult persist(std::string_view owner_scope, const ProviderDispatchReceipt &receipt) override
Scoped operations prevent one owner's dispatch id from colliding with another's.
Immutable terminal or reconciliation evidence for one admitted dispatch.
Optional terminal-outcome extension for receipt stores.
Durable write-ahead journal keyed by owner scope and dispatch_id; AlreadyPresent requires exact recei...
virtual ProviderDispatchReceiptPutResult persist(std::string_view owner_scope, const ProviderDispatchReceipt &receipt)
Scoped operations prevent one owner's dispatch id from colliding with another's.
virtual ProviderDispatchState state(std::string_view dispatch_id) const
Returns durable progress for a dispatch id.
Immutable proof that an assembled request was admitted to provider dispatch.
Post-dispatch host failure retaining the exact drained provider outcome.
Definition provider.h:204
Portable request controls remain the SDK's declared, family-specific fields.
Definition provider.h:190