router-for-me/CLIProxyAPI · error
create upstream audio track: %w
Error message
create upstream audio track: %w
What it means
Same constructor as error 326 but for the upstream (OpenAI-facing) track toOpenAI. NewTrackLocalStaticRTP with the shared opusCodec capability; failure semantics are identical — malformed capability or a pion validation change. Not influenced by network or negotiation state.
Source
Thrown at internal/client/codex/live/media.go:344
return nil, "", fmt.Errorf("set downstream WebRTC offer: %w", errRemote)
}
toDesktop, errTrack := webrtc.NewTrackLocalStaticRTP(opusCodec, "audio", "codex-live")
if errTrack != nil {
_ = session.Close()
return nil, "", fmt.Errorf("create downstream audio track: %w", errTrack)
}
downstreamSender, errTrack := downstream.AddTrack(toDesktop)
if errTrack != nil {
_ = session.Close()
return nil, "", fmt.Errorf("add downstream audio track: %w", errTrack)
}
go drainRTCP("downstream", downstreamSender, session.done)
toOpenAI, errTrack := webrtc.NewTrackLocalStaticRTP(opusCodec, "audio", "codex-live")
if errTrack != nil {
_ = session.Close()
return nil, "", fmt.Errorf("create upstream audio track: %w", errTrack)
}
upstreamSender, errTrack := upstream.AddTrack(toOpenAI)
if errTrack != nil {
_ = session.Close()
return nil, "", fmt.Errorf("add upstream audio track: %w", errTrack)
}
go drainRTCP("upstream", upstreamSender, session.done)
downstream.OnTrack(func(track *webrtc.TrackRemote, _ *webrtc.RTPReceiver) {
if !strings.EqualFold(track.Codec().MimeType, webrtc.MimeTypeOpus) {
return
}
go relayRTP("downstream-to-upstream", track, toOpenAI, session.done)
})
upstream.OnTrack(func(track *webrtc.TrackRemote, _ *webrtc.RTPReceiver) {
if !strings.EqualFold(track.Codec().MimeType, webrtc.MimeTypeOpus) {
return
}View on GitHub (pinned to 78f0c4079e)
Solutions
- Restore opusCodec constants (MimeTypeOpus, 48000, 2 channels)
- Pin pion/webrtc version; treat occurrence as a build/code defect
Defensive patterns
Strategy: validation
Prevention
- Keep opusCodec constants immutable and shared between both tracks
- Run the media relay unit tests after any pion version bump
When it happens
Trigger: Identical to 326: modified opusCodec constant or pion/webrtc version behavior change.
Common situations: Unreachable with shipped constants; a defensive error path kept for API-contract safety.
Related errors
- create downstream audio track: %w
- add downstream audio track: %w
- add upstream audio track: %w
- upstream WebRTC offer is empty
- downstream WebRTC answer is empty
AI-assisted analysis of router-for-me/CLIProxyAPI@78f0c4079e (2026-08-15).
Data as JSON: /api/errors/2e4e60f8d67e667f.
Report an issue: GitHub.