Skip to main content

core_api/node/contracts/
agent_audio.rs

1use serde::{Deserialize, Serialize};
2
3pub const SUBMIT_TARGET: &str = "/app/agent/audio/submit";
4
5#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
6#[serde(rename_all = "camelCase")]
7pub enum AgentAudioTriggerKind {
8    WakeWord,
9    FollowUp,
10}
11
12#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
13#[serde(rename_all = "camelCase", deny_unknown_fields)]
14pub struct AgentAudioTrigger {
15    #[serde(rename = "type")]
16    pub kind: AgentAudioTriggerKind,
17    #[serde(default, skip_serializing_if = "Option::is_none")]
18    pub wake_word_id: Option<String>,
19}
20
21#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
22#[serde(rename_all = "camelCase", deny_unknown_fields)]
23pub struct AgentAudioSource {
24    pub smart_speaker_id: String,
25    pub input_device_id: String,
26}
27
28#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
29#[serde(rename_all = "camelCase", deny_unknown_fields)]
30pub struct AgentAudioArtifact {
31    pub uri: String,
32    pub mime_type: String,
33    pub duration_ms: u64,
34}
35
36#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
37#[serde(rename_all = "camelCase", deny_unknown_fields)]
38pub struct AgentAudioSubmitRequest {
39    pub request_id: String,
40    pub source: AgentAudioSource,
41    pub trigger: AgentAudioTrigger,
42    #[serde(default, skip_serializing_if = "Option::is_none")]
43    pub conversation_id: Option<String>,
44    pub audio: AgentAudioArtifact,
45}
46
47#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
48#[serde(rename_all = "camelCase", deny_unknown_fields)]
49pub struct AgentAudioSubmitResponse {
50    pub accepted: bool,
51    pub interaction_id: String,
52    #[serde(default, skip_serializing_if = "Option::is_none")]
53    pub conversation_id: Option<String>,
54}
55
56#[cfg(test)]
57mod tests {
58    use super::*;
59
60    #[test]
61    fn wake_word_trigger_has_a_stable_wire_shape() {
62        let value = serde_json::to_value(AgentAudioTrigger {
63            kind: AgentAudioTriggerKind::WakeWord,
64            wake_word_id: Some("hello_meow_meow".to_string()),
65        })
66        .expect("serialize trigger");
67        assert_eq!(value["type"], "wakeWord");
68        assert_eq!(value["wakeWordId"], "hello_meow_meow");
69    }
70}