0d3cb498a3
CI / Shell Format Check (push) Has been cancelled
CI / Check Ruby (3.4) (push) Has been cancelled
CI / CI Config (push) Has been cancelled
CI / Test on Node ${{ matrix.node }} and ${{ matrix.os }}${{ matrix.shard && format(' (shard {0}/3)', matrix.shard) || '' }} (push) Has been cancelled
CI / Build on Node ${{ matrix.node }} (push) Has been cancelled
CI / Style Check (push) Has been cancelled
CI / Generate Assets (push) Has been cancelled
CI / Check Python (3.14) (push) Has been cancelled
CI / Check Python (3.9) (push) Has been cancelled
CI / Build Docs (push) Has been cancelled
CI / Code Scan Action (push) Has been cancelled
CI / Site tests (push) Has been cancelled
CI / webui tests (push) Has been cancelled
CI / Run Integration Tests (push) Has been cancelled
CI / Run Smoke Tests (push) Has been cancelled
CI / Go Tests (push) Has been cancelled
CI / Share Test (push) Has been cancelled
CI / Redteam (Production API) (push) Has been cancelled
CI / Redteam (Staging API) (push) Has been cancelled
CI / GitHub Actions Lint (push) Has been cancelled
CI / Check Ruby (3.0) (push) Has been cancelled
release-please / release-please (push) Has been cancelled
release-please / build (push) Has been cancelled
release-please / publish-npm (push) Has been cancelled
release-please / publish-npm-backfill (push) Has been cancelled
release-please / docker (push) Has been cancelled
release-please / publish-code-scan-action (push) Has been cancelled
release-please / attest-code-scan-action (push) Has been cancelled
Deploy local.promptfoo.app / Deploy to Cloudflare Pages (push) Has been cancelled
Test and Publish Multi-arch Docker Image / test (push) Has been cancelled
Test and Publish Multi-arch Docker Image / build-docker-and-push-digests (map[digest-suffix:linux-amd64 platform:linux/amd64 runner:ubuntu-latest]) (push) Has been cancelled
Test and Publish Multi-arch Docker Image / build-docker-and-push-digests (map[digest-suffix:linux-arm64 platform:linux/arm64 runner:ubuntu-24.04-arm]) (push) Has been cancelled
Test and Publish Multi-arch Docker Image / merge-docker-digests (push) Has been cancelled
Test and Publish Multi-arch Docker Image / Attest Multi-arch Image (push) Has been cancelled
Validate Renovate Config / Validate Renovate Configuration (push) Has been cancelled
102 lines
2.1 KiB
Markdown
102 lines
2.1 KiB
Markdown
# config-websockets/streaming/server (OpenAI WebSocket Server)
|
|
|
|
Simple Node.js server using Express and native WebSockets that exposes two real-time endpoints to interact with the OpenAI Responses API.
|
|
|
|
## Requirements
|
|
|
|
- Node.js >= 18.17
|
|
- An OpenAI API key
|
|
|
|
## Setup
|
|
|
|
1. Install dependencies:
|
|
|
|
```bash
|
|
npm install
|
|
```
|
|
|
|
2. Configure environment:
|
|
|
|
- set `OPENAI_API_KEY` in your environment or use .env file
|
|
|
|
```bash
|
|
cp env.example .env
|
|
# edit .env and set OPENAI_API_KEY
|
|
```
|
|
|
|
3. Start the server (defaults to port 3300):
|
|
|
|
```bash
|
|
npm start
|
|
```
|
|
|
|
You can also run in dev mode with automatic restarts:
|
|
|
|
```bash
|
|
npm run dev
|
|
```
|
|
|
|
## HTTP
|
|
|
|
- Health check: `GET /health` → `{ "status": "ok" }`
|
|
|
|
## Real-time (WebSocket)
|
|
|
|
Two WebSocket upgrade paths are provided:
|
|
|
|
- `/ws` — non-streaming. Emits a single `response` when the OpenAI request completes.
|
|
- `/ws-stream` — streaming. Emits incremental `delta` and `message` events, then `done`.
|
|
|
|
Both endpoints accept the same request payload (model is configured via env):
|
|
|
|
```json
|
|
{ "input": "Hello there!" }
|
|
```
|
|
|
|
Model is read from `CHATBOT_MODEL` env var and defaults to `gpt-4.1-mini`.
|
|
|
|
### Client examples
|
|
|
|
Non-streaming (`/ws`):
|
|
|
|
```js
|
|
const ws = new WebSocket('ws://localhost:3300/ws');
|
|
|
|
ws.onopen = () => {
|
|
ws.send(JSON.stringify({ input: 'Hello there!' }));
|
|
};
|
|
|
|
ws.onmessage = (event) => {
|
|
const msg = JSON.parse(event.data);
|
|
// msg.type: 'ready' | 'response' | 'done' | 'error'
|
|
console.log(msg);
|
|
};
|
|
|
|
ws.onerror = (err) => console.error('ws error', err);
|
|
```
|
|
|
|
Streaming (`/ws-stream`):
|
|
|
|
```js
|
|
const ws = new WebSocket('ws://localhost:3300/ws-stream');
|
|
|
|
ws.onopen = () => {
|
|
ws.send(JSON.stringify({ input: 'Stream this please' }));
|
|
};
|
|
|
|
ws.onmessage = (event) => {
|
|
const msg = JSON.parse(event.data);
|
|
// msg.type: 'ready' | 'delta' | 'message' | 'done' | 'error'
|
|
if (msg.type === 'delta') process.stdout.write(msg.message || '');
|
|
else console.log(msg);
|
|
};
|
|
|
|
ws.onerror = (err) => console.error('ws error', err);
|
|
```
|
|
|
|
## Notes
|
|
|
|
- Configure port via `PORT` in `.env`.
|
|
- Configure model via `CHATBOT_MODEL` in `.env` (default: `gpt-4.1-mini`).
|
|
- Health route is `GET /health`. WebSocket upgrade paths are `/ws` and `/ws-stream`.
|