Spaces:
Running
Running
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
|