pub struct DecisionControllerBinding {
pub id: String,
pub policy: DecisionPolicyIdentity,
pub authority: DecisionAuthority,
pub seat_id: Option<String>,
pub permission_profile_id: Option<String>,
pub command_subject: Option<EntityRef>,
}Fields§
§id: String§policy: DecisionPolicyIdentity§seat_id: Option<String>§permission_profile_id: Option<String>§command_subject: Option<EntityRef>Implementations§
Source§impl DecisionControllerBinding
impl DecisionControllerBinding
Sourcepub fn new(
id: impl Into<String>,
policy: DecisionPolicyIdentity,
authority: DecisionAuthority,
) -> DecisionControllerBinding
pub fn new( id: impl Into<String>, policy: DecisionPolicyIdentity, authority: DecisionAuthority, ) -> DecisionControllerBinding
Examples found in repository?
examples/uncertainty_resolution.rs (lines 153-159)
146fn random_branch() -> Result<(), Box<dyn std::error::Error>> {
147 let mut canwu = Canwu::demo(202)?;
148 canwu.register_plugin(&UncertaintyPlugin)?;
149 enqueue_ticket(
150 &mut canwu,
151 RANDOM_TICKET,
152 1,
153 DecisionControllerBinding::new(
154 "law-random-controller",
155 DecisionPolicyIdentity::new(DecisionPolicyKind::Random, "weighted-random", "1"),
156 DecisionAuthority::Actor {
157 actor: Canwu::demo_ids().commander,
158 },
159 ),
160 )?;
161 let selection_at = SimTime::EPOCH + SimDuration::days(1);
162 canwu.schedule_calendar_boundary(selection_at, vec![SystemCadence::Daily])?;
163 canwu.step_canonical()?.expect("random source boundary");
164 canwu
165 .step_canonical()?
166 .expect("generated decision resolution boundary");
167 let trace = canwu
168 .decision_trace(canwu_api::DecisionTraceId::new(1))
169 .expect("random decision trace");
170 println!("random_trace={}", serde_json::to_string(trace)?);
171 Ok(())
172}
173
174fn llm_interface_branch() -> Result<(), Box<dyn std::error::Error>> {
175 let mut canwu = Canwu::demo(202)?;
176 let ticket_id = DecisionTicketId::new(2);
177 enqueue_ticket(
178 &mut canwu,
179 ticket_id,
180 10,
181 DecisionControllerBinding::new(
182 "law-llm-controller",
183 DecisionPolicyIdentity::new(DecisionPolicyKind::Llm, "strict-law-selector", "1"),
184 DecisionAuthority::Actor {
185 actor: Canwu::demo_ids().commander,
186 },
187 ),
188 )?;
189 let mut policy = QueuedLlmPolicy::new(
190 "strict-law-selector",
191 "1",
192 LlmModelIdentity {
193 provider: "not-connected".to_owned(),
194 model: "host-selected-model".to_owned(),
195 prompt_contract: "return one existing option_id and no new action".to_owned(),
196 },
197 );
198 let ticket = canwu.decision_ticket(ticket_id).expect("LLM ticket");
199 let request = policy.external_request(ticket);
200 println!("llm_request={}", serde_json::to_string(&request)?);
201
202 // A real host sends `request` to its model and parses a strict structured
203 // answer. This example supplies the same response object without making a
204 // network call.
205 policy.submit(
206 ticket_id,
207 ExternalDecisionResponse {
208 ticket_version: request.ticket_version,
209 option_id: "pass".to_owned(),
210 provider: "not-connected".to_owned(),
211 request_id: "example-response-1".to_owned(),
212 metadata: BTreeMap::new(),
213 },
214 )?;
215 let evaluation = canwu.drive_decision(
216 canwu.time(),
217 0,
218 DecisionRequestId::new(12),
219 None,
220 ticket_id,
221 &policy,
222 )?;
223 assert!(matches!(evaluation, DecisionEvaluation::Prepared(_)));
224 canwu.step_canonical()?.expect("LLM decision boundary");
225 Ok(())
226}More examples
examples/decision_ticket.rs (lines 31-37)
29fn open_aid_request(canwu: &mut Canwu, ids: DemoIds) -> Result<(), Box<dyn std::error::Error>> {
30 let now = canwu.time();
31 let controller = DecisionControllerBinding::new(
32 "warlord-b-ai",
33 DecisionPolicyIdentity::new(DecisionPolicyKind::Utility, "aid-utility", "1"),
34 DecisionAuthority::Actor {
35 actor: ids.commander,
36 },
37 )
38 .with_command_subject(EntityRef::Army(ids.army));
39
40 canwu.enqueue_decision(
41 now,
42 0,
43 DecisionIngressRequest::new(
44 DecisionRequestId::new(1),
45 canwu.revision(),
46 DecisionMutation::RegisterController { controller },
47 ),
48 )?;
49 canwu.enqueue_decision(
50 now,
51 0,
52 DecisionIngressRequest::new(
53 DecisionRequestId::new(2),
54 canwu.revision(),
55 DecisionMutation::Open {
56 ticket: DecisionTicketDraft {
57 id: DecisionTicketId::new(1),
58 definition: "beiyang.request-military-aid".to_owned(),
59 decision_maker: EntityRef::Person(ids.commander),
60 assigned_controller: "warlord-b-ai".to_owned(),
61 summary: "Neighboring warlord requests immediate military aid".to_owned(),
62 context: DecisionContext::new(
63 "beiyang.aid-request.v1",
64 json!({
65 "requester": "warlord-a",
66 "battle": "ongoing-front",
67 "common_enemy": true
68 }),
69 ),
70 options: vec![DecisionOption {
71 action: DecisionAction::None,
72 utility_inputs: BTreeMap::from([
73 ("home_defense".to_owned(), 80),
74 ("alliance".to_owned(), -40),
75 ]),
76 ..DecisionOption::new("decline", "Decline aid")
77 }],
78 deadline: Some(now + SimDuration::days(2)),
79 },
80 },
81 ),
82 )?;
83 canwu.step_canonical()?.expect("decision intake boundary");
84 Ok(())
85}pub fn with_seat( self, seat_id: impl Into<String>, permission_profile_id: impl Into<String>, ) -> DecisionControllerBinding
Sourcepub fn with_command_subject(
self,
command_subject: EntityRef,
) -> DecisionControllerBinding
pub fn with_command_subject( self, command_subject: EntityRef, ) -> DecisionControllerBinding
Examples found in repository?
examples/decision_ticket.rs (line 38)
29fn open_aid_request(canwu: &mut Canwu, ids: DemoIds) -> Result<(), Box<dyn std::error::Error>> {
30 let now = canwu.time();
31 let controller = DecisionControllerBinding::new(
32 "warlord-b-ai",
33 DecisionPolicyIdentity::new(DecisionPolicyKind::Utility, "aid-utility", "1"),
34 DecisionAuthority::Actor {
35 actor: ids.commander,
36 },
37 )
38 .with_command_subject(EntityRef::Army(ids.army));
39
40 canwu.enqueue_decision(
41 now,
42 0,
43 DecisionIngressRequest::new(
44 DecisionRequestId::new(1),
45 canwu.revision(),
46 DecisionMutation::RegisterController { controller },
47 ),
48 )?;
49 canwu.enqueue_decision(
50 now,
51 0,
52 DecisionIngressRequest::new(
53 DecisionRequestId::new(2),
54 canwu.revision(),
55 DecisionMutation::Open {
56 ticket: DecisionTicketDraft {
57 id: DecisionTicketId::new(1),
58 definition: "beiyang.request-military-aid".to_owned(),
59 decision_maker: EntityRef::Person(ids.commander),
60 assigned_controller: "warlord-b-ai".to_owned(),
61 summary: "Neighboring warlord requests immediate military aid".to_owned(),
62 context: DecisionContext::new(
63 "beiyang.aid-request.v1",
64 json!({
65 "requester": "warlord-a",
66 "battle": "ongoing-front",
67 "common_enemy": true
68 }),
69 ),
70 options: vec![DecisionOption {
71 action: DecisionAction::None,
72 utility_inputs: BTreeMap::from([
73 ("home_defense".to_owned(), 80),
74 ("alliance".to_owned(), -40),
75 ]),
76 ..DecisionOption::new("decline", "Decline aid")
77 }],
78 deadline: Some(now + SimDuration::days(2)),
79 },
80 },
81 ),
82 )?;
83 canwu.step_canonical()?.expect("decision intake boundary");
84 Ok(())
85}Trait Implementations§
Source§impl Clone for DecisionControllerBinding
impl Clone for DecisionControllerBinding
Source§fn clone(&self) -> DecisionControllerBinding
fn clone(&self) -> DecisionControllerBinding
Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from
source. Read moreSource§impl Debug for DecisionControllerBinding
impl Debug for DecisionControllerBinding
Source§impl<'de> Deserialize<'de> for DecisionControllerBinding
impl<'de> Deserialize<'de> for DecisionControllerBinding
Source§fn deserialize<__D>(
__deserializer: __D,
) -> Result<DecisionControllerBinding, <__D as Deserializer<'de>>::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(
__deserializer: __D,
) -> Result<DecisionControllerBinding, <__D as Deserializer<'de>>::Error>where
__D: Deserializer<'de>,
Deserialize this value from the given Serde deserializer. Read more
impl Eq for DecisionControllerBinding
Source§impl Serialize for DecisionControllerBinding
impl Serialize for DecisionControllerBinding
Source§fn serialize<__S>(
&self,
__serializer: __S,
) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>where
__S: Serializer,
fn serialize<__S>(
&self,
__serializer: __S,
) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>where
__S: Serializer,
Serialize this value into the given Serde serializer. Read more
impl StructuralPartialEq for DecisionControllerBinding
Auto Trait Implementations§
impl Freeze for DecisionControllerBinding
impl RefUnwindSafe for DecisionControllerBinding
impl Send for DecisionControllerBinding
impl Sync for DecisionControllerBinding
impl Unpin for DecisionControllerBinding
impl UnsafeUnpin for DecisionControllerBinding
impl UnwindSafe for DecisionControllerBinding
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more