UserPromptSubmitEvent

Struct UserPromptSubmitEvent 

Source
pub struct UserPromptSubmitEvent {
    pub prompt: String,
    pub history: Vec<Value>,
}
Expand description

Event fired before processing user input, enabling content moderation and prompt enhancement.

This event is triggered whenever a user submits a prompt to the agent, before the agent begins processing it. Use this to implement content moderation, add context, inject instructions, or track user interactions.

§Use Cases

  • Content moderation: Filter inappropriate or harmful user inputs
  • Prompt enhancement: Add system context, timestamps, or user information
  • Input validation: Ensure prompts meet format or length requirements
  • Usage tracking: Log user interactions for analytics or billing
  • Context injection: Add relevant background information to every prompt

§Fields

  • prompt: The user’s original input text
  • history: Read-only snapshot of the conversation history before this prompt

§Example: Content Moderation

use open_agent::{UserPromptSubmitEvent, HookDecision};

async fn content_moderator(event: UserPromptSubmitEvent) -> Option<HookDecision> {
    // Block prompts containing banned words
    let banned_words = ["spam", "malware", "hack"];

    for word in banned_words {
        if event.prompt.to_lowercase().contains(word) {
            return Some(HookDecision::block(
                format!("Content policy violation: contains '{}'", word)
            ));
        }
    }
    None // Allow clean prompts
}

§Example: Automatic Context Enhancement

use open_agent::{UserPromptSubmitEvent, HookDecision};

async fn add_context(event: UserPromptSubmitEvent) -> Option<HookDecision> {
    // Add helpful context to every user prompt
    let enhanced = format!(
        "{}\n\n---\nContext: User timezone is UTC, current session started at 2025-11-07",
        event.prompt
    );

    Some(HookDecision::modify_prompt(
        enhanced,
        "Added session context"
    ))
}

§Example: Usage Tracking

use open_agent::{UserPromptSubmitEvent, HookDecision};

async fn track_usage(event: UserPromptSubmitEvent) -> Option<HookDecision> {
    // Log every user interaction for analytics
    println!(
        "[ANALYTICS] User submitted prompt of {} characters at history depth {}",
        event.prompt.len(),
        event.history.len()
    );

    // Could also:
    // - Update usage quotas
    // - Send to analytics service
    // - Check rate limits

    None // Don't modify the prompt
}

§Modification Behavior

If you return HookDecision::modify_prompt(), the modified prompt completely replaces the original user input before the agent processes it. This is powerful but should be used carefully to avoid confusing the user or the agent.

Fields§

§prompt: String

The user’s original input prompt text

§history: Vec<Value>

Snapshot of conversation history (read-only) - does not include this prompt yet

Implementations§

Source§

impl UserPromptSubmitEvent

Source

pub fn new(prompt: String, history: Vec<Value>) -> Self

Creates a new UserPromptSubmitEvent.

This constructor is typically called by the agent runtime when processing user input, not by user code. Users receive instances of this struct in their hook handlers.

Trait Implementations§

Source§

impl Clone for UserPromptSubmitEvent

Source§

fn clone(&self) -> UserPromptSubmitEvent

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for UserPromptSubmitEvent

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more