Skip to main content

Sending Text Messages to AI Agents

Overview ​

In addition to voice conversation, you can send text messages directly to the AI Agent during an active call. This allows for mixed-mode communication where users can both speak and type messages to the AI Assistant.

Method Signature ​

func sendAIAssistantMessage(_ message: String) -> Bool

Parameters ​

ParameterTypeDescription
messageStringThe text message to send to the AI Assistant

Returns ​

Bool - Returns true if the message was sent successfully, false otherwise

Basic Usage ​

// Send a text message to the AI Agent during an active call
let success = client.sendAIAssistantMessage("Hello, can you help me with my account?")

if success {
print("Message sent successfully")
} else {
print("Failed to send message")
}

Complete Example ​

class AIConversationViewController: UIViewController {
private let client = TxClient()
@IBOutlet weak var messageTextField: UITextField!
@IBOutlet weak var sendButton: UIButton!

override func viewDidLoad() {
super.viewDidLoad()
setupMessageSending()
}

private func setupMessageSending() {
sendButton.addTarget(self, action: #selector(sendButtonTapped), for: .touchUpInside)
}

@objc private func sendButtonTapped() {
guard let message = messageTextField.text, !message.isEmpty else {
showAlert("Please enter a message")
return
}

sendTextMessage(message)
}

private func sendTextMessage(_ message: String) {
let success = client.sendAIAssistantMessage(message)

if success {
print("Text message sent: \(message)")
messageTextField.text = ""
addMessageToUI(message, isUser: true)
} else {
showAlert("Failed to send message. Check connection.")
}
}

private func addMessageToUI(_ message: String, isUser: Bool) {
// Add message to conversation UI
let messageView = createMessageBubble(text: message, isUser: isUser)
conversationStackView.addArrangedSubview(messageView)
scrollToBottom()
}

private func showAlert(_ message: String) {
let alert = UIAlertController(title: "Error", message: message, preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "OK", style: .default))
present(alert, animated: true)
}
}

extension AIConversationViewController: TxClientDelegate {
func onCallStateUpdated(callState: CallState, callId: UUID) {
switch callState {
case .ACTIVE:
enableTextMessaging()
case .DONE:
disableTextMessaging()
default:
break
}
}

private func enableTextMessaging() {
messageTextField.isEnabled = true
sendButton.isEnabled = true
}

private func disableTextMessaging() {
messageTextField.isEnabled = false
sendButton.isEnabled = false
}
}

Advanced Usage with Call State Checking ​

class AIMessageManager {
private let client: TxClient

init(client: TxClient) {
self.client = client
}

func sendMessage(_ message: String) -> Bool {
guard isAICallActive() else {
print("Cannot send message: No active AI call")
return false
}

return client.sendAIAssistantMessage(message)
}

private func isAICallActive() -> Bool {
return client.calls.values.contains { $0.callState == .ACTIVE }
}

func sendMessageWithConfirmation(_ message: String, completion: @escaping (Bool) -> Void) {
let success = sendMessage(message)
completion(success)
}
}

Error Handling ​

private func sendTextMessageWithErrorHandling(_ message: String) {
// Check if we have an active AI call
guard hasActiveCall() else {
showError("No active AI conversation. Please start a call first.")
return
}

// Send the message
let success = client.sendAIAssistantMessage(message)

if success {
showMessageSent(message)
} else {
showError("Failed to send message")
}
}

private func hasActiveCall() -> Bool {
return client.calls.values.contains { $0.callState == .ACTIVE }
}

private func showError(_ message: String) {
let alert = UIAlertController(title: "Error", message: message, preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "OK", style: .default))
present(alert, animated: true)
}

private func showMessageSent(_ message: String) {
print("Message sent successfully: \(message)")
}

Important Notes ​

  • Active Call Required: You must have an active call established before sending text messages
  • AI Assistant Only: The sendAIAssistantMessage method is only available during AI Assistant conversations
  • Transcript Integration: Text messages sent this way will appear in transcript updates alongside spoken conversation
  • Processing: The AI Agent will process and respond to text messages just like spoken input
  • Mixed Communication: Users can seamlessly switch between voice and text communication

Best Practices ​

  1. Validate Input: Always check that messages are not empty before sending
  2. Check Call State: Verify an active AI call exists before sending messages
  3. User Feedback: Provide visual feedback when messages are sent
  4. Error Handling: Handle network errors and call state issues gracefully
  5. UI Updates: Update the conversation UI immediately for better user experience

Integration with Transcript Updates ​

Text messages will appear in the transcript updates:

cancellable = client.aiAssistantManager.subscribeToTranscriptUpdates { [weak self] transcript in
DispatchQueue.main.async {
transcript.forEach { item in
switch item.role {
case "user":
// This includes both spoken words and text messages
self?.displayUserMessage(item.content, item.timestamp)
case "assistant":
// AI responses to both voice and text
self?.displayAssistantMessage(item.content, item.timestamp)
default:
break
}
}
}
}

This feature enables rich conversational experiences where users can seamlessly switch between voice and text communication with the AI Assistant.