Files
openclaw/apps/ios/Sources/Voice/TalkRealtimeClientSession.swift
PollyBot13 8b99c45bbb fix: route iOS OpenAI realtime Talk through WebRTC (#98563)
* fix: route iOS OpenAI realtime talk through WebRTC

* fix(ios): harden native realtime routing

* fix(ios): preserve realtime route ownership

* fix(ios): balance realtime audio sessions

* chore(ios): sync native i18n inventory

* fix(ios): preserve Azure realtime relay

* fix(ios): harden realtime session recovery

* chore(ios): sync native i18n inventory

* fix(ios): preserve selected Azure realtime routing

* fix(ios): rotate terminal realtime sessions

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-02 12:49:23 -07:00

98 lines
2.2 KiB
Swift

import Foundation
struct TalkRealtimeClientCreateParams: Encodable {
var mode = "realtime"
var provider: String?
var transport = "webrtc"
var brain = "agent-consult"
var model: String?
var voice: String?
}
struct TalkRealtimeClientSession: Decodable {
let provider: String
let transport: String
let clientSecret: String
let offerUrl: String?
let offerHeaders: [String: String]?
let model: String?
let voice: String?
let expiresAt: Double?
var isWebRTC: Bool {
self.transport.caseInsensitiveCompare("webrtc") == .orderedSame
}
}
struct TalkRealtimeToolCallResponse: Decodable {
let runId: String?
let idempotencyKey: String?
}
struct TalkRealtimeServerEvent: Decodable {
let type: String
let error: TalkRealtimeServerError?
let itemId: String?
let item: TalkRealtimeServerItem?
let callId: String?
let name: String?
let delta: String?
let arguments: String?
let transcript: String?
let text: String?
enum CodingKeys: String, CodingKey {
case type
case error
case itemId = "item_id"
case item
case callId = "call_id"
case name
case delta
case arguments
case transcript
case text
}
var resolvedItemId: String? {
self.itemId ?? self.item?.id
}
var resolvedCallId: String? {
self.callId ?? self.item?.callId
}
var resolvedName: String? {
self.name ?? self.item?.name
}
var resolvedArguments: String? {
self.arguments ?? self.item?.arguments
}
var isMaximumDurationError: Bool {
guard self.type == "error", let message = self.error?.message?.lowercased() else { return false }
return message.contains("session") && message.contains("maximum duration")
}
}
struct TalkRealtimeServerError: Decodable {
let message: String?
}
struct TalkRealtimeServerItem: Decodable {
let id: String?
let type: String?
let callId: String?
let name: String?
let arguments: String?
enum CodingKeys: String, CodingKey {
case id
case type
case callId = "call_id"
case name
case arguments
}
}