Documentation
¶
Overview ¶
Go Client Package for OpenAI Realtime Voice API ¶
This repository provides a Go package for building applications that create real-time, two-way voice conversations with an AI assistant using the OpenAI Realtime API. It is designed to be imported into your own Go projects, providing the core functionality to handle microphone input, low-latency audio streaming, and session management.
Index ¶
- type Client
- func (c *Client) Close() error
- func (c *Client) Connected() <-chan struct{}
- func (c *Client) DC() *webrtc.DataChannel
- func (c *Client) Done() <-chan struct{}
- func (c *Client) RegisterEventHandler(handler EventHandler) error
- func (c *Client) RegisterTrackLocalHandler(handler TrackLocalHandler) error
- func (c *Client) RegisterTrackRemoteHandler(handler TrackRemoteHandler) error
- func (c *Client) SetConfig(cfg *realtime.RealtimeSessionCreateRequestParam) error
- func (c *Client) Start() error
- func (c *Client) State() webrtc.PeerConnectionState
- type ClientEventType
- type ClientState
- type Event
- type EventHandler
- type EventParam
- type EventType
- type ServerEvent
- func (e *ServerEvent) EventType() EventType
- func (e *ServerEvent) IsClientEvent() bool
- func (e *ServerEvent) IsServerEvent() bool
- func (e *ServerEvent) MarshalJSON() ([]byte, error)
- func (e *ServerEvent) MarshalYAML() ([]byte, error)
- func (e *ServerEvent) UnmarshalJSON(data []byte) error
- func (e *ServerEvent) UnmarshalYAML(data []byte) error
- type ServerEventParamConversationItemAdded
- type ServerEventParamConversationItemDeleted
- type ServerEventParamConversationItemDone
- type ServerEventParamConversationItemInputAudioTranscriptionCompleted
- type ServerEventParamConversationItemInputAudioTranscriptionDelta
- type ServerEventParamConversationItemInputAudioTranscriptionFailed
- type ServerEventParamConversationItemInputAudioTranscriptionSegment
- type ServerEventParamConversationItemRetrieved
- type ServerEventParamConversationItemTruncated
- type ServerEventParamError
- type ServerEventParamInputAudioBufferCleared
- type ServerEventParamInputAudioBufferCommitted
- type ServerEventParamInputAudioBufferSpeechStarted
- type ServerEventParamInputAudioBufferSpeechStopped
- type ServerEventParamInputAudioBufferTimeoutTriggered
- type ServerEventParamMCPListToolsCompleted
- type ServerEventParamMCPListToolsFailed
- type ServerEventParamMCPListToolsInProgress
- type ServerEventParamOutputAudioBufferCleared
- type ServerEventParamOutputAudioBufferStarted
- type ServerEventParamOutputAudioBufferStopped
- type ServerEventParamRatelimitsUpdated
- type ServerEventParamResponseContentPartAdded
- type ServerEventParamResponseContentPartDone
- type ServerEventParamResponseCreated
- type ServerEventParamResponseDone
- type ServerEventParamResponseFunctionCallArgumentsDelta
- type ServerEventParamResponseFunctionCallArgumentsDone
- type ServerEventParamResponseMCPCallArgumentsDelta
- type ServerEventParamResponseMCPCallArgumentsDone
- type ServerEventParamResponseMCPCallCompleted
- type ServerEventParamResponseMCPCallFailed
- type ServerEventParamResponseMCPCallInProgress
- type ServerEventParamResponseOutputAudioDelta
- type ServerEventParamResponseOutputAudioDone
- type ServerEventParamResponseOutputAudioTranscriptDelta
- type ServerEventParamResponseOutputAudioTranscriptDone
- type ServerEventParamResponseOutputItemAdded
- type ServerEventParamResponseOutputItemDone
- type ServerEventParamResponseOutputTextDelta
- type ServerEventParamResponseOutputTextDone
- type ServerEventParamSessionCreated
- type ServerEventParamSessionUpdated
- type ServerEventType
- type TrackLocalHandler
- type TrackRemoteHandler
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type Client ¶
type Client struct {
// contains filtered or unexported fields
}
func (*Client) DC ¶
func (c *Client) DC() *webrtc.DataChannel
func (*Client) RegisterEventHandler ¶
func (c *Client) RegisterEventHandler(handler EventHandler) error
func (*Client) RegisterTrackLocalHandler ¶
func (c *Client) RegisterTrackLocalHandler(handler TrackLocalHandler) error
func (*Client) RegisterTrackRemoteHandler ¶
func (c *Client) RegisterTrackRemoteHandler(handler TrackRemoteHandler) error
func (*Client) SetConfig ¶
func (c *Client) SetConfig(cfg *realtime.RealtimeSessionCreateRequestParam) error
func (*Client) State ¶
func (c *Client) State() webrtc.PeerConnectionState
type ClientEventType ¶
type ClientEventType EventType
const ( ClientEventTypeSessionUpdate ClientEventType = "session.update" ClientEventTypeInputAudioBufferAppend ClientEventType = "input_audio_buffer.append" ClientEventTypeInputAudioBufferCommit ClientEventType = "input_audio_buffer.commit" ClientEventTypeInputAudioBufferClear ClientEventType = "input_audio_buffer.clear" ClientEventTypeConversationItemCreate ClientEventType = "conversation.item.create" ClientEventTypeConversationItemRetrieve ClientEventType = "conversation.item.retrieve" ClientEventTypeConversationItemTruncate ClientEventType = "conversation.item.truncate" ClientEventTypeConversationItemDelete ClientEventType = "conversation.item.delete" ClientEventTypeResponseCreate ClientEventType = "response.create" ClientEventTypeResponseCancel ClientEventType = "response.cancel" ClientEventTypeOutputAudioBufferClear ClientEventType = "output_audio_buffer.clear" )
Client event types
type ClientState ¶
type ClientState int
const ( ClientStateNew ClientState = iota ClientStateConnecting ClientStateConnected ClientStateDisconnected ClientStateFailed ClientStateClosed )
type EventHandler ¶
type EventHandler func(event *ServerEvent)
type ServerEvent ¶
type ServerEvent struct {
EventId string
Type ServerEventType
Param EventParam
}
func (*ServerEvent) EventType ¶
func (e *ServerEvent) EventType() EventType
func (*ServerEvent) IsClientEvent ¶
func (e *ServerEvent) IsClientEvent() bool
func (*ServerEvent) IsServerEvent ¶
func (e *ServerEvent) IsServerEvent() bool
func (*ServerEvent) MarshalJSON ¶
func (e *ServerEvent) MarshalJSON() ([]byte, error)
func (*ServerEvent) MarshalYAML ¶
func (e *ServerEvent) MarshalYAML() ([]byte, error)
func (*ServerEvent) UnmarshalJSON ¶
func (e *ServerEvent) UnmarshalJSON(data []byte) error
func (*ServerEvent) UnmarshalYAML ¶
func (e *ServerEvent) UnmarshalYAML(data []byte) error
type ServerEventParamConversationItemAdded ¶
conversation.item.added
func (*ServerEventParamConversationItemAdded) Json ¶
func (p *ServerEventParamConversationItemAdded) Json() map[string]any
type ServerEventParamConversationItemDeleted ¶
type ServerEventParamConversationItemDeleted struct {
ItemId string
}
conversation.item.deleted
func (*ServerEventParamConversationItemDeleted) Json ¶
func (p *ServerEventParamConversationItemDeleted) Json() map[string]any
type ServerEventParamConversationItemDone ¶
conversation.item.done
func (*ServerEventParamConversationItemDone) Json ¶
func (p *ServerEventParamConversationItemDone) Json() map[string]any
type ServerEventParamConversationItemInputAudioTranscriptionCompleted ¶
type ServerEventParamConversationItemInputAudioTranscriptionCompleted struct {
ItemId string
ContentIndex int
Transcript string
Usage map[string]any
}
conversation.item.input_audio_transcription.completed
func (*ServerEventParamConversationItemInputAudioTranscriptionCompleted) Json ¶
func (p *ServerEventParamConversationItemInputAudioTranscriptionCompleted) Json() map[string]any
type ServerEventParamConversationItemInputAudioTranscriptionDelta ¶
type ServerEventParamConversationItemInputAudioTranscriptionDelta struct {
ItemId string
ContentIndex int
Delta string
Obfuscation string
}
conversation.item.input_audio_transcription.delta
func (*ServerEventParamConversationItemInputAudioTranscriptionDelta) Json ¶
func (p *ServerEventParamConversationItemInputAudioTranscriptionDelta) Json() map[string]any
type ServerEventParamConversationItemInputAudioTranscriptionFailed ¶
type ServerEventParamConversationItemInputAudioTranscriptionFailed struct {
ItemId string
ContentIndex int
Error map[string]any
}
conversation.item.input_audio_transcription.failed
func (*ServerEventParamConversationItemInputAudioTranscriptionFailed) Json ¶
func (p *ServerEventParamConversationItemInputAudioTranscriptionFailed) Json() map[string]any
type ServerEventParamConversationItemInputAudioTranscriptionSegment ¶
type ServerEventParamConversationItemInputAudioTranscriptionSegment struct {
ItemId string
ContentIndex int
Text string
Id string
Speaker string
Start float64
End float64
}
conversation.item.input_audio_transcription.segment
func (*ServerEventParamConversationItemInputAudioTranscriptionSegment) Json ¶
func (p *ServerEventParamConversationItemInputAudioTranscriptionSegment) Json() map[string]any
type ServerEventParamConversationItemRetrieved ¶
conversation.item.retrieved
func (*ServerEventParamConversationItemRetrieved) Json ¶
func (p *ServerEventParamConversationItemRetrieved) Json() map[string]any
type ServerEventParamConversationItemTruncated ¶
type ServerEventParamConversationItemTruncated struct {
ItemId string
ContentIndex int
AudioEndMs int
}
conversation.item.truncated
func (*ServerEventParamConversationItemTruncated) Json ¶
func (p *ServerEventParamConversationItemTruncated) Json() map[string]any
type ServerEventParamError ¶
type ServerEventParamError struct {
Type string
EventId string
Code string
Message string
Param any
}
ServerEventParamError
func (*ServerEventParamError) Json ¶
func (p *ServerEventParamError) Json() map[string]any
type ServerEventParamInputAudioBufferCleared ¶
type ServerEventParamInputAudioBufferCleared struct{}
input_audio_buffer.cleared
func (*ServerEventParamInputAudioBufferCleared) Json ¶
func (p *ServerEventParamInputAudioBufferCleared) Json() map[string]any
type ServerEventParamInputAudioBufferCommitted ¶
input_audio_buffer.committed
func (*ServerEventParamInputAudioBufferCommitted) Json ¶
func (p *ServerEventParamInputAudioBufferCommitted) Json() map[string]any
type ServerEventParamInputAudioBufferSpeechStarted ¶
input_audio_buffer.speech_started
func (*ServerEventParamInputAudioBufferSpeechStarted) Json ¶
func (p *ServerEventParamInputAudioBufferSpeechStarted) Json() map[string]any
type ServerEventParamInputAudioBufferSpeechStopped ¶
input_audio_buffer.speech_stopped
func (*ServerEventParamInputAudioBufferSpeechStopped) Json ¶
func (p *ServerEventParamInputAudioBufferSpeechStopped) Json() map[string]any
type ServerEventParamInputAudioBufferTimeoutTriggered ¶
type ServerEventParamInputAudioBufferTimeoutTriggered struct {
AudioStartMs int
AudioEndMs int
ItemId string
}
input_audio_buffer.timeout_triggered
func (*ServerEventParamInputAudioBufferTimeoutTriggered) Json ¶
func (p *ServerEventParamInputAudioBufferTimeoutTriggered) Json() map[string]any
type ServerEventParamMCPListToolsCompleted ¶
type ServerEventParamMCPListToolsCompleted struct {
ItemId string
}
mcp_list_tools.completed
func (*ServerEventParamMCPListToolsCompleted) Json ¶
func (p *ServerEventParamMCPListToolsCompleted) Json() map[string]any
type ServerEventParamMCPListToolsFailed ¶
type ServerEventParamMCPListToolsFailed struct {
ItemId string
}
mcp_list_tools.failed
func (*ServerEventParamMCPListToolsFailed) Json ¶
func (p *ServerEventParamMCPListToolsFailed) Json() map[string]any
type ServerEventParamMCPListToolsInProgress ¶
type ServerEventParamMCPListToolsInProgress struct {
ItemId string
}
mcp_list_tools.in_progress
func (*ServerEventParamMCPListToolsInProgress) Json ¶
func (p *ServerEventParamMCPListToolsInProgress) Json() map[string]any
type ServerEventParamOutputAudioBufferCleared ¶
type ServerEventParamOutputAudioBufferCleared struct {
ResponseId string
}
output_audio_buffer.cleared
func (*ServerEventParamOutputAudioBufferCleared) Json ¶
func (p *ServerEventParamOutputAudioBufferCleared) Json() map[string]any
type ServerEventParamOutputAudioBufferStarted ¶
type ServerEventParamOutputAudioBufferStarted struct {
ResponseId string
}
output_audio_buffer.started
func (*ServerEventParamOutputAudioBufferStarted) Json ¶
func (p *ServerEventParamOutputAudioBufferStarted) Json() map[string]any
type ServerEventParamOutputAudioBufferStopped ¶
type ServerEventParamOutputAudioBufferStopped struct {
ResponseId string
}
output_audio_buffer.stopped
func (*ServerEventParamOutputAudioBufferStopped) Json ¶
func (p *ServerEventParamOutputAudioBufferStopped) Json() map[string]any
type ServerEventParamRatelimitsUpdated ¶
rate_limits.updated
func (*ServerEventParamRatelimitsUpdated) Json ¶
func (p *ServerEventParamRatelimitsUpdated) Json() map[string]any
type ServerEventParamResponseContentPartAdded ¶
type ServerEventParamResponseContentPartAdded struct {
ResponseId string
ItemId string
OutputIndex int
ContentIndex int
Part map[string]any
}
response.content_part.added
func (*ServerEventParamResponseContentPartAdded) Json ¶
func (p *ServerEventParamResponseContentPartAdded) Json() map[string]any
type ServerEventParamResponseContentPartDone ¶
type ServerEventParamResponseContentPartDone struct {
ResponseId string
ItemId string
OutputIndex int
ContentIndex int
Part map[string]any
}
response.content_part.done
func (*ServerEventParamResponseContentPartDone) Json ¶
func (p *ServerEventParamResponseContentPartDone) Json() map[string]any
type ServerEventParamResponseCreated ¶
response.created
func (*ServerEventParamResponseCreated) Json ¶
func (p *ServerEventParamResponseCreated) Json() map[string]any
type ServerEventParamResponseDone ¶
response.done
func (*ServerEventParamResponseDone) Json ¶
func (p *ServerEventParamResponseDone) Json() map[string]any
type ServerEventParamResponseFunctionCallArgumentsDelta ¶
type ServerEventParamResponseFunctionCallArgumentsDelta struct {
ResponseId string
ItemId string
OutputIndex int
CallId string
Delta string
}
response.function_call_arguments.delta
func (*ServerEventParamResponseFunctionCallArgumentsDelta) Json ¶
func (p *ServerEventParamResponseFunctionCallArgumentsDelta) Json() map[string]any
type ServerEventParamResponseFunctionCallArgumentsDone ¶
type ServerEventParamResponseFunctionCallArgumentsDone struct {
ResponseId string
ItemId string
OutputIndex int
CallId string
Arguments string
}
response.function_call_arguments.done
func (*ServerEventParamResponseFunctionCallArgumentsDone) Json ¶
func (p *ServerEventParamResponseFunctionCallArgumentsDone) Json() map[string]any
type ServerEventParamResponseMCPCallArgumentsDelta ¶
type ServerEventParamResponseMCPCallArgumentsDelta struct {
ResponseId string
ItemId string
OutputIndex int
Delta string
}
response.mcp_call_arguments.delta
func (*ServerEventParamResponseMCPCallArgumentsDelta) Json ¶
func (p *ServerEventParamResponseMCPCallArgumentsDelta) Json() map[string]any
type ServerEventParamResponseMCPCallArgumentsDone ¶
type ServerEventParamResponseMCPCallArgumentsDone struct {
ResponseId string
ItemId string
OutputIndex int
Arguments string
}
response.mcp_call_arguments.done
func (*ServerEventParamResponseMCPCallArgumentsDone) Json ¶
func (p *ServerEventParamResponseMCPCallArgumentsDone) Json() map[string]any
type ServerEventParamResponseMCPCallCompleted ¶
response.mcp_call.completed
func (*ServerEventParamResponseMCPCallCompleted) Json ¶
func (p *ServerEventParamResponseMCPCallCompleted) Json() map[string]any
type ServerEventParamResponseMCPCallFailed ¶
response.mcp_call.failed
func (*ServerEventParamResponseMCPCallFailed) Json ¶
func (p *ServerEventParamResponseMCPCallFailed) Json() map[string]any
type ServerEventParamResponseMCPCallInProgress ¶
response.mcp_call.in_progress
func (*ServerEventParamResponseMCPCallInProgress) Json ¶
func (p *ServerEventParamResponseMCPCallInProgress) Json() map[string]any
type ServerEventParamResponseOutputAudioDelta ¶
type ServerEventParamResponseOutputAudioDelta struct {
ResponseId string
ItemId string
OutputIndex int
ContentIndex int
Delta string
}
response.output_audio.delta
func (*ServerEventParamResponseOutputAudioDelta) Json ¶
func (p *ServerEventParamResponseOutputAudioDelta) Json() map[string]any
type ServerEventParamResponseOutputAudioDone ¶
type ServerEventParamResponseOutputAudioDone struct {
ResponseId string
ItemId string
OutputIndex int
ContentIndex int
}
response.output_audio.done
func (*ServerEventParamResponseOutputAudioDone) Json ¶
func (p *ServerEventParamResponseOutputAudioDone) Json() map[string]any
type ServerEventParamResponseOutputAudioTranscriptDelta ¶
type ServerEventParamResponseOutputAudioTranscriptDelta struct {
ResponseId string
ItemId string
OutputIndex int
ContentIndex int
Delta string
}
response.output_audio_transcript.delta
func (*ServerEventParamResponseOutputAudioTranscriptDelta) Json ¶
func (p *ServerEventParamResponseOutputAudioTranscriptDelta) Json() map[string]any
type ServerEventParamResponseOutputAudioTranscriptDone ¶
type ServerEventParamResponseOutputAudioTranscriptDone struct {
ResponseId string
ItemId string
OutputIndex int
ContentIndex int
Transcript string
}
response.output_audio_transcript.done
func (*ServerEventParamResponseOutputAudioTranscriptDone) Json ¶
func (p *ServerEventParamResponseOutputAudioTranscriptDone) Json() map[string]any
type ServerEventParamResponseOutputItemAdded ¶
type ServerEventParamResponseOutputItemAdded struct {
ResponseId string
OutputIndex int
Item map[string]any
}
response.output_item.added
func (*ServerEventParamResponseOutputItemAdded) Json ¶
func (p *ServerEventParamResponseOutputItemAdded) Json() map[string]any
type ServerEventParamResponseOutputItemDone ¶
type ServerEventParamResponseOutputItemDone struct {
ResponseId string
OutputIndex int
Item map[string]any
}
response.output_item.done
func (*ServerEventParamResponseOutputItemDone) Json ¶
func (p *ServerEventParamResponseOutputItemDone) Json() map[string]any
type ServerEventParamResponseOutputTextDelta ¶
type ServerEventParamResponseOutputTextDelta struct {
ResponseId string
ItemId string
OutputIndex int
ContentIndex int
Delta string
}
response.output_text.delta
func (*ServerEventParamResponseOutputTextDelta) Json ¶
func (p *ServerEventParamResponseOutputTextDelta) Json() map[string]any
type ServerEventParamResponseOutputTextDone ¶
type ServerEventParamResponseOutputTextDone struct {
ResponseId string
ItemId string
OutputIndex int
ContentIndex int
Text string
}
response.output_text.done
func (*ServerEventParamResponseOutputTextDone) Json ¶
func (p *ServerEventParamResponseOutputTextDone) Json() map[string]any
type ServerEventParamSessionCreated ¶
session.created
func (*ServerEventParamSessionCreated) Json ¶
func (p *ServerEventParamSessionCreated) Json() map[string]any
type ServerEventParamSessionUpdated ¶
session.updated
func (*ServerEventParamSessionUpdated) Json ¶
func (p *ServerEventParamSessionUpdated) Json() map[string]any
type ServerEventType ¶
type ServerEventType EventType
const ( ServerEventTypeError ServerEventType = "error" ServerEventTypeSessionCreated ServerEventType = "session.created" ServerEventTypeSessionUpdated ServerEventType = "session.updated" ServerEventTypeConversationItemAdded ServerEventType = "conversation.item.added" ServerEventTypeConversationItemDone ServerEventType = "conversation.item.done" ServerEventTypeConversationItemRetrieved ServerEventType = "conversation.item.retrieved" ServerEventTypeConversationItemInputAudioTranscriptionCompleted ServerEventType = "conversation.item.input_audio_transcription.completed" ServerEventTypeConversationItemInputAudioTranscriptionDelta ServerEventType = "conversation.item.input_audio_transcription.delta" ServerEventTypeConversationItemInputAudioTranscriptionSegment ServerEventType = "conversation.item.input_audio_transcription.segment" ServerEventTypeConversationItemInputAudioTranscriptionFailed ServerEventType = "conversation.item.input_audio_transcription.failed" ServerEventTypeConversationItemTruncated ServerEventType = "conversation.item.truncated" ServerEventTypeConversationItemDeleted ServerEventType = "conversation.item.deleted" ServerEventTypeInputAudioBufferCommitted ServerEventType = "input_audio_buffer.committed" ServerEventTypeInputAudioBufferCleared ServerEventType = "input_audio_buffer.cleared" ServerEventTypeInputAudioBufferSpeechStarted ServerEventType = "input_audio_buffer.speech_started" ServerEventTypeInputAudioBufferSpeechStopped ServerEventType = "input_audio_buffer.speech_stopped" ServerEventTypeInputAudioBufferTimeoutTriggered ServerEventType = "input_audio_buffer.timeout_triggered" ServerEventTypeOutputAudioBufferStarted ServerEventType = "output_audio_buffer.started" ServerEventTypeOutputAudioBufferStopped ServerEventType = "output_audio_buffer.stopped" ServerEventTypeOutputAudioBufferCleared ServerEventType = "output_audio_buffer.cleared" ServerEventTypeResponseCreated ServerEventType = "response.created" ServerEventTypeResponseDone ServerEventType = "response.done" ServerEventTypeResponseOutputItemAdded ServerEventType = "response.output_item.added" ServerEventTypeResponseOutputItemDone ServerEventType = "response.output_item.done" ServerEventTypeResponseContentPartAdded ServerEventType = "response.content_part.added" ServerEventTypeResponseContentPartDone ServerEventType = "response.content_part.done" ServerEventTypeResponseOutputTextDelta ServerEventType = "response.output_text.delta" ServerEventTypeResponseOutputTextDone ServerEventType = "response.output_text.done" ServerEventTypeResponseOutputAudioTranscriptDelta ServerEventType = "response.output_audio_transcript.delta" ServerEventTypeResponseOutputAudioTranscriptDone ServerEventType = "response.output_audio_transcript.done" ServerEventTypeResponseOutputAudioDelta ServerEventType = "response.output_audio.delta" ServerEventTypeResponseOutputAudioDone ServerEventType = "response.output_audio.done" ServerEventTypeResponseFunctionCallArgumentsDelta ServerEventType = "response.function_call_arguments.delta" ServerEventTypeResponseFunctionCallArgumentsDone ServerEventType = "response.function_call_arguments.done" ServerEventTypeResponseMCPCallArgumentsDelta ServerEventType = "response.mcp_call_arguments.delta" ServerEventTypeResponseMCPCallArgumentsDone ServerEventType = "response.mcp_call_arguments.done" ServerEventTypeResponseMCPCallInProgress ServerEventType = "response.mcp_call.in_progress" ServerEventTypeResponseMCPCallCompleted ServerEventType = "response.mcp_call.completed" ServerEventTypeResponseMCPCallFailed ServerEventType = "response.mcp_call.failed" ServerEventTypeMCPListToolsInProgress ServerEventType = "mcp_list_tools.in_progress" ServerEventTypeMCPListToolsCompleted ServerEventType = "mcp_list_tools.completed" ServerEventTypeMCPListToolsFailed ServerEventType = "mcp_list_tools.failed" ServerEventTypeRatelimitsUpdated ServerEventType = "rate_limits.updated" )
Server event types
type TrackLocalHandler ¶
type TrackLocalHandler func(track *webrtc.TrackLocalStaticSample)
type TrackRemoteHandler ¶
type TrackRemoteHandler func(track *webrtc.TrackRemote)