File size: 2,677 Bytes
53ea588
 
 
2f49513
 
 
 
53ea588
2f49513
53ea588
 
2f49513
53ea588
 
 
153165b
 
660e83c
 
 
 
 
2f49513
153165b
 
 
 
 
 
 
 
 
 
53ea588
 
 
2f49513
53ea588
 
 
 
4fa815b
53ea588
 
 
 
2f49513
53ea588
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#!/bin/sh
set -eu

# Default to voice_agent_webrtc_langgraph if EXAMPLE_NAME is not set
EXAMPLE_NAME="${EXAMPLE_NAME:-voice_agent_webrtc_langgraph}"
EXAMPLE_PATH="/app/examples/${EXAMPLE_NAME}"

# Optionally load a local .env next to this example if present
if [ -f "${EXAMPLE_PATH}/.env" ]; then
    # shellcheck disable=SC1091
    set -a
    . "${EXAMPLE_PATH}/.env"
    set +a
fi

# If a remote prompt URL is provided, download it and export ZERO_SHOT_AUDIO_PROMPT
if [ -n "${ZERO_SHOT_AUDIO_PROMPT_URL:-}" ]; then
    case "$ZERO_SHOT_AUDIO_PROMPT_URL" in
        *"github.com"*"/blob"*)
            ZERO_SHOT_AUDIO_PROMPT_URL="${ZERO_SHOT_AUDIO_PROMPT_URL}?raw=1"
            ;;
    esac
    PROMPT_TARGET="${ZERO_SHOT_AUDIO_PROMPT:-${EXAMPLE_PATH}/audio_prompt.wav}"
    mkdir -p "$(dirname "$PROMPT_TARGET")"
    if [ ! -f "$PROMPT_TARGET" ]; then
        echo "Downloading ZERO_SHOT_AUDIO_PROMPT from $ZERO_SHOT_AUDIO_PROMPT_URL"
        if ! curl -fsSL "$ZERO_SHOT_AUDIO_PROMPT_URL" -o "$PROMPT_TARGET"; then
            echo "Failed to download audio prompt from URL: $ZERO_SHOT_AUDIO_PROMPT_URL" >&2
        fi
    fi
    export ZERO_SHOT_AUDIO_PROMPT="$PROMPT_TARGET"
fi

# All dependencies and langgraph CLI are installed at build time

# Start langgraph dev from within the internal agents directory (background)
LANGGRAPH_DIR="${EXAMPLE_PATH}/agents"
LANGGRAPH_PID=""
if [ -d "$LANGGRAPH_DIR" ]; then
    LG_HOST="${LANGGRAPH_HOST:-0.0.0.0}"
    LANGGRAPH_PORT="${LANGGRAPH_PORT:-2024}"
    sh -c "cd \"$LANGGRAPH_DIR\" && exec uv run langgraph dev --no-browser --host \"$LG_HOST\" --port \"$LANGGRAPH_PORT\"" &
    LANGGRAPH_PID=$!
fi

# Run the voice agent app in background
cd "${EXAMPLE_PATH}"
uv run pipeline.py &
PIPELINE_PID=$!

# Wait until the pipeline HTTP endpoint is ready
ATTEMPTS=0
MAX_ATTEMPTS=30
until curl -fsS http://127.0.0.1:7860/get_prompt >/dev/null 2>&1; do
    ATTEMPTS=$((ATTEMPTS + 1))
    if [ "$ATTEMPTS" -ge "$MAX_ATTEMPTS" ]; then
        echo "Pipeline failed to become ready in time" >&2
        wait "$PIPELINE_PID" 2>/dev/null || true
        exit 1
    fi
    sleep 1
done

# Ensure children are terminated when this script exits
cleanup() {
    for p in $PIPELINE_PID $LANGGRAPH_PID; do
        if [ -n "$p" ] && kill -0 "$p" 2>/dev/null; then
            kill "$p" 2>/dev/null || true
        fi
    done
}
trap cleanup EXIT INT TERM

# Monitor background jobs and exit if any of them exits
while :; do
    for p in $PIPELINE_PID $LANGGRAPH_PID; do
        [ -z "$p" ] && continue
        if ! kill -0 "$p" 2>/dev/null; then
            wait "$p" 2>/dev/null || true
            exit 1
        fi
    done
    sleep 1
done