Skip to main content

TelegramConfig

Struct TelegramConfig 

pub struct TelegramConfig {
Show 17 fields pub enabled: bool, pub bot_token: String, pub api_base_url: String, pub stream_mode: StreamMode, pub draft_update_interval_ms: u64, pub multi_message_delay_ms: u64, pub debounce_ms: Option<u64>, pub interrupt_on_new_message: bool, pub mention_only: bool, pub per_user_session: bool, pub passive_group_context: bool, pub ack_reactions: Option<bool>, pub proxy_url: Option<String>, pub approval_timeout_secs: u64, pub excluded_tools: Vec<String>, pub reply_min_interval_secs: u64, pub reply_queue_depth_max: u16,
}
Expand description

Telegram bot channel configuration.

Fields§

§enabled: bool

Whether this channel is active. The runtime only loads channels whose enabled = true. Default: false so an operator who pastes a partial [channels.<type>.<alias>] block doesn’t accidentally bring a channel live before the rest of its config is filled in.

§bot_token: String

Telegram Bot API token (from @BotFather). #[serde(default)] so a config that omits or later has it pruned (e.g. a freshly created alias with an empty token, stripped by prune_empty_leaves before write) still deserializes as an empty string - instead of failing with missing field 'bot_token' and getting dropped by the resilient salvage pass. validate_bot_token below still requires a real token once enabled = true.

§api_base_url: String

Telegram Bot API base URL. Defaults to the official Telegram endpoint; set to a local Bot API server URL when self-hosting Telegram’s bot API.

§stream_mode: StreamMode

Streaming mode for progressive response delivery via message edits.

§draft_update_interval_ms: u64

Minimum interval (ms) between draft message edits to avoid rate limits.

§multi_message_delay_ms: u64

Minimum delay (ms) between successive multi_message narration messages (and before the approval prompt) for one recipient. Does not apply to the fixed pacing between physical fragments of a single over-4096-character message. Only used when stream_mode = "multi_message".

§debounce_ms: Option<u64>

Inbound message debounce window in milliseconds for this Telegram alias. When set, overrides the global [channels].debounce_ms for this channel only. 0 or unset falls back to the global value.

§interrupt_on_new_message: bool

When true, a newer Telegram message from the same sender in the same chat cancels the in-flight request and starts a fresh response with preserved history.

§mention_only: bool

When true, only respond to messages that @-mention the bot in groups. Direct messages are always processed.

§per_user_session: bool

When true (default), group-chat sessions key on the sender, so distinct members of the same group (or forum topic) each get an isolated conversation context (matches the existing behavior). When false, all members of a group chat share one session scoped to the chat (and forum topic, when present), so the agent keeps full conversation context regardless of which member writes. Sharing the session shares its session-scoped controls too: any member’s /new resets the shared history for the whole group/topic, and a member’s session-level /model route override applies to everyone in it, while /stop and message debouncing stay personal to each sender. 1-on-1 chats are unaffected (chat_id is already unique per user-bot pair).

§passive_group_context: bool

When true in Telegram group chats, unaddressed messages that pass sender/chat authorization are recorded as passive conversation context without starting an agent turn. Lets the bot follow the discussion and answer with full context when later @-mentioned. Default: false.

Recording passive messages requires mention_only = true: with the default mention_only = false the bot already answers every authorized group message, so no unaddressed message is left to record.

Shared history is not gated that way. Enabling this flag puts every group/topic message on one shared session, the way per_user_session = false does, whatever mention_only says and whatever per_user_session says, because an observation filed in the observed member’s own session could never answer the participant who later @-mentions the bot. Members therefore share conversation context and the session-scoped controls that come with it, so any member’s /new resets the history for the whole group/topic. Scheduling stays personal: message debouncing, /stop and interruption still key on the sender.

§ack_reactions: Option<bool>

Override for the top-level ack_reactions setting. When None, the channel falls back to [channels].ack_reactions. When set explicitly, it takes precedence.

§proxy_url: Option<String>

Per-channel proxy URL (http, https, socks5, socks5h). Overrides the global [proxy] setting for this channel only.

§approval_timeout_secs: u64

How long (seconds) to wait for the operator to tap an inline-keyboard button on a tool approval prompt before auto-denying. Default: 120.

§excluded_tools: Vec<String>

Tools excluded from this channel’s tool spec. When set, these tools are not exposed to the model when responding via this channel.

§reply_min_interval_secs: u64

Per-(channel, recipient) outbound pacing floor in seconds. Range: 0..=REPLY_MIN_INTERVAL_MAX_SECS (0 disables).

§reply_queue_depth_max: u16

Per-(channel, recipient) outbound pacing queue depth. Range: 0..=REPLY_QUEUE_DEPTH_CEILING. When reply_min_interval_secs > 0 and this value is 0, the pacing wrapper substitutes DEFAULT_REPLY_QUEUE_DEPTH (16). When the queue is full, the newest send is dropped and a WARN is logged.

Implementations§

Source§

impl TelegramConfig

Source

pub fn configurable_prefix() -> &'static str

Returns the #[prefix] value for this Configurable struct.

Source

pub fn init_requires_explicit_config() -> bool

True when this struct has a required leaf field that a bare/ancestor-prefix init_defaults scaffold must not materialize (it would fill the field with its Rust Default, which prune_empty_leaves then strips on save, leaving a partial sub-table that fails strict reload). Explicitly targeting this section (or a descendant of it) still scaffolds regardless of this flag, so the section can be materialized for the operator to fill in.

Source

pub fn secret_fields(&self) -> Vec<SecretFieldInfo>

Returns metadata about all #[secret] fields on this struct and nested children.

Source

pub fn secret_field_terminals() -> Vec<&'static str>

Source

pub fn encrypt_secrets(&mut self, store: &SecretStore) -> Result<(), Error>

Encrypt all secret fields in place using the provided store.

Source

pub fn decrypt_secrets(&mut self, store: &SecretStore) -> Result<(), Error>

Decrypt all secret fields in place using the provided store.

Source

pub fn set_secret(&mut self, name: &str, value: String) -> Result<(), Error>

Set a secret field by its full dotted name, dispatching to nested children.

Source

pub fn prop_fields(&self) -> Vec<PropFieldInfo>

Returns metadata about all property fields on this struct and nested children.

Source

pub fn get_prop(&self, name: &str) -> Result<String, Error>

Get a property value by its full dotted name, returning it as a display string.

Source

pub fn set_prop(&mut self, name: &str, value_str: &str) -> Result<(), Error>

Set a property value by its full dotted name, parsing from string.

Source

pub fn prop_is_secret(name: &str) -> bool

Check if a property name refers to a secret field (static, no instance needed).

Source

pub fn init_defaults(&mut self, prefix: Option<&str>) -> Vec<&'static str>

Instantiate None nested sections whose prefix matches. Returns the prefixes that were initialized.

Source

pub fn map_key_sections() -> Vec<MapKeySection>

Enumerate every map-keyed (HashMap<String, T>) and list-shaped (Vec<T>) section discoverable from this Configurable’s tree. The dashboard / CLI consume this to surface “+ Add” affordances without hardcoding the section list.

Source

pub fn nested_section_help(name: &str) -> Option<&'static str>

Help blurb for a #[nested] field on this struct, sourced from the field-level /// docstring. Returns None for unknown names so callers can fall through to a different lookup.

Source

pub fn nested_section_group(name: &str) -> Option<&'static str>

Source

pub fn get_map_keys(&self, section_path: &str) -> Option<Vec<String>>

Return the current alias keys at section_path, or None if the path doesn’t resolve to a map-keyed section in this tree.

Source

pub fn nested_option_entries(&self) -> Vec<NestedOptionEntry>

Source

pub fn create_map_key( &mut self, section_path: &str, map_key: &str, ) -> Result<bool, String>

Source

pub fn delete_map_key( &mut self, section_path: &str, map_key: &str, ) -> Result<bool, String>

Source

pub fn rename_map_key( &mut self, section_path: &str, map_key: &str, new_key: &str, ) -> Result<bool, String>

Source§

impl TelegramConfig

Source

pub fn validate_bot_token(&self, alias: &str) -> Result<(), Error>

Validate this alias’s bot-token placeholder and enabled-state rules.

Trait Implementations§

Source§

impl ChannelConfig for TelegramConfig

Source§

fn name() -> &'static str

human-readable name
Source§

fn desc() -> &'static str

short description
Source§

impl Clone for TelegramConfig

Source§

fn clone(&self) -> TelegramConfig

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · §

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

Performs copy-assignment from source. Read more
Source§

impl Debug for TelegramConfig

Source§

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

Formats the value using the given formatter. Read more
Source§

impl Default for TelegramConfig

Source§

fn default() -> TelegramConfig

Returns the “default value” for a type. Read more
Source§

impl<'de> Deserialize<'de> for TelegramConfig

Source§

fn deserialize<__D>( __deserializer: __D, ) -> Result<TelegramConfig, <__D as Deserializer<'de>>::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl HasReplyPacing for TelegramConfig

Source§

impl JsonSchema for TelegramConfig

Source§

fn schema_name() -> Cow<'static, str>

The name of the generated JSON Schema. Read more
Source§

fn schema_id() -> Cow<'static, str>

Returns a string that uniquely identifies the schema produced by this type. Read more
Source§

fn json_schema(generator: &mut SchemaGenerator) -> Schema

Generates a JSON Schema for this type. Read more
Source§

fn inline_schema() -> bool

Whether JSON Schemas generated for this type should be included directly in parent schemas, rather than being re-used where possible using the $ref keyword. Read more
Source§

impl MaskSecrets for TelegramConfig

Source§

impl Serialize for TelegramConfig

Source§

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

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
§

impl<'a, T, E> AsTaggedExplicit<'a, E> for T
where T: 'a,

§

fn explicit(self, class: Class, tag: u32) -> TaggedParser<'a, Explicit, Self, E>

§

impl<'a, T, E> AsTaggedImplicit<'a, E> for T
where T: 'a,

§

fn implicit( self, class: Class, constructed: bool, tag: u32, ) -> TaggedParser<'a, Implicit, Self, E>

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
§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

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> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,

Source§

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

Source§

fn __clone_box(&self, _: Private) -> *mut ()

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

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

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
§

impl<T> Instrument for T

§

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

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

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> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
§

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

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Sized + 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
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Sized + 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
§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
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.
§

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

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

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
§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

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