core_api/node/contracts/
agent_audio.rs1use 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}