Build an AI agent that reads and writes to a Progress OpenEdge database and books automotive service appointments. This workshop is designed for OpenEdge developers with no prior Python/agent experience. You’ll follow a guided path, copying working examples at each step and learning how they fit together.
We’ll use PASOE WEB Transport services for data access, a small Python driver to call those services, and a LiveKit agent (with OpenAI) that converses with users, manages car records, and schedules bookings. We’ll initially run the agent through the LiveKit Agents Playground and if time, implement a React front end and python token service to complete the app.
- OpenEdge WEB transport services for
CarandBookingrecords. - A small, testable Python driver (
OEDatabaseDriver) that calls those REST endpoints. - A LiveKit agent that uses function tools to call your driver:
- Lookup/add car details.
- Offer/confirm bookings.
- A multi-agent version showing a handoff from an Account agent → Booking agent.
- (Optional, if time permits) A lightweight React + Token server demo UI.
- (Optional, if time permits) A bookings MCP Server and dynamic MCP Client.
You’ll copy the code for each step from the provided examples/ folders and focus on wiring/config + understanding.
- Progress OpenEdge Developers Kit (CLASSROOM edition is sufficient) — Progress OpenEdge Developers Kit
- Visual Studio Code (Code editor for Python and JavaScript) — Visual Studio Code
- Node.js (for React frontend) — Node.js
- Python 3.10+ (venv)
- A modern browser with microphone access (if testing voice)
- Accounts/keys:
- LiveKit (API key/secret, URL)
- OpenAI (API key)
You’ll place secrets in a local
.envfile during setup.
- Progress OpenEdge Developers Kit
- Visual Studio Code
- Python downloads
- LiveKit
- LiveKit Agents Playground
- OpenAI Platform
- Node.js
/openedge/ # ABL handlers/services templates for Car/Booking and test app
/python/
/step2/ # OEDatabaseDriver env sanity-check
/step3/ # save_car() via POST
/step4/ # get_car() via GET + dataclass
/step5/ # Single-agent (car lookup/add) with LiveKit
/step6/ # Adds booking tools + driver methods
/step7/ # Multi-agent architecture AccountAgent → BookingAgent handoff
/step10/ # (Optional) MCP Server and dynamic client
/frontend/ # (Optional) React demo UI
/token-server/ # (Optional) LiveKit token server (Python)
README.md
-
Create working directories:
C:\OpenEdge\WRK\oeautos C:\OpenEdge\WRK\oeautos\db -
Create an empty database:
prodb oeautos empty -
Load schema file:
load oeautos.df -
Add
oeautosdatabase to Progress OE Explorer and start it (make a note of the port number i.e 25150). -
Create a new Progress Application Server with the following settings:
- Instance name:
oeautos - AdminServer:
localhost - Location: Local
- Security model: Developer
- Instance Directory:
C:\OpenEdge\WRK\oeautos\PAS - Autostart: checked
- Instance name:
-
Edit the
oeautosABL application configuration:- Startup parameters:
-db oeautos -H localhost -S 25150 - Add
C:\OpenEdge\WRK\oeautosto PROPATH
- Startup parameters:
-
Start the AppServer.
-
In OE Developer:
- Choose
C:\OpenEdge\WRK\oeautosas the new workspace - Create a new OpenEdge project named AgentTools
- Server project
- Transport: WEB
- Finish → Open Perspective
- Delete AgentTools → PASOEContent → WEB-INF → openedge → AgentToolsHandler.cls (we will create our own)
- Delete Defined Services → AgentToolsService (we will create are own)
- Choose
-
Add database to project:
- Right-click project → Properties → Progress OpenEdge → Database Connections → Configure database connections
- Click New to add new connection for
oeautosserver. - Connection name: oeautos
- Physical name: db\oeautos
- Host name: localhost
- Service/Port: 25150
- Press Next to Finish, then Apply and Close
- Select checkbox next to the new connection, Apply and Close
-
Add Server to project:
- Right-click project → New → Server
- Select Progress Software Corporation → Progress Application Server for OpenEdge, press Next
- Press Configure
- Select your local Explorer connection in the list, and press Edit
- Enter the correct User name and Password values to connect to OpenEdge Explorer, press Finish
- Press Apply and close
- Select [machine-name].oeautos in Progress Application Server for OpenEdge
- Select oeautos under ABL Application and press Finish
-
Add a new web handler:
- Name:
carHandler - Select GET and POST method stubs
- Copy in template code
- Name:
-
Add WEB service:
- Right-click project → New → ABL Service
- Transport: WEB
- Service name:
carService - Under WebHandler, select Select Existing
- Press Browse
- Select the class carHandler and press OK
- Press Add to add a Resource URI
- Enter /carService as the Resource URI
- Press Finish
-
Publish the service to the
oeautosserver:- In the Servers panel, right click oeautos in .. and select Add and Remove
- Select carService in the Available list, and press Add>
- Press Finish
See the Step 2 documentation for details.
-
Install VS Code and Python (if you don't already have them):
-
Create directory
C:\Work\Agentand open it in VS Code. -
Create and activate a virtual environment:
py -m venv .venv .\.venv\Scripts\Activate.ps1 -
Create a
C:\Work\Agent\requirements.txtfile and add:python-dotenvThen install:
pip install -r requirements.txt -
Create a
.envfile with:OE_SERVICE_URL=http://localhost:8080/AgentTools/web/ -
Copy
OEDatabaseDriver.pyStep 2 code toC:\Work\Agent\OEDatabaseDriver.py(load.envand printOE_SERVICE_URL). -
Run the code to test:
py OEDatabaseDriver.py
See the Step 3 documentation for details.
-
Copy
requirements.txtandOEDatabaseDriver.pyfrom Step 3 intoC:\Work\Agent(note:requestshas been added torequirements.txt). -
Install new dependencies:
pip install -r requirements.txt -
Review the
save_carmethod. -
Run the code to test:
py OEDatabaseDriver.py
-
Use
OpenEdge\ViewCars.wto confirm the record has been created.
See the Step 4 documentation for details.
-
Copy
OEDatabaseDriver.pyfrom Step 4 intoC:\Work\Agent. -
Review the
get_carmethod. -
Run the code to test:
py OEDatabaseDriver.py
See the Step 5 documentation for details.
-
Copy contents of Step 5 into
C:\Work\Agent. -
Install new dependencies:
pip install -r requirements.txt -
Create a LiveKit account:
- Go to LiveKit
- Click Start Building and create an account
- Create your first project (for example:
PUG Challenge) - Complete any onboarding steps
- In Settings → API Keys, reveal the secret and copy the credentials
- Paste the values into your
.envfile
-
Create an OpenAI account:
- Create an account at OpenAI Platform
- From the account settings, create a new API key
- Add
OPENAI_API_KEY=[YOUR KEY]to your.envfile and save
-
Review the code.
-
Start the agent:
py main.py dev
-
Log into the LiveKit Agents Playground and connect.
-
Verify the agent can create and look up cars in the database.
See the Step 6 documentation for details.
-
Add a new OpenEdge web handler for bookings (
bookingHandler) — copy code from Step 6. -
Add a new ABL Service (
bookingService) with transport WEB and service namebookingService. -
Select existing Web Handler:
bookingHandler. -
Add resource URIs:
/booking/booking/{method}
-
Save your changes and publish to the server.
-
Copy in code from Step 6 and review.
-
Start the agent:
py main.py dev
-
Log into the LiveKit Agents Playground and connect.
-
Verify the agent can create and look up bookings in the database.
See the Step 7 documentation for details.
-
Copy in code from Step 7 and review.
-
Start the agent:
py main.py dev
-
Log into the LiveKit Agents Playground and check agent behaviour.
See the Frontend documentation for details.
-
If you don’t already have it, download and install Node.js.
-
Open a new terminal and change directory to
C:\Work. -
Scaffold a Vite React app:
npm create vite@latest frontend -- --template react
-
Open the
frontenddirectory in a new VS Code window. -
Install dependencies:
npm install npm install @livekit/components-react @livekit/components-styles livekit-client --save
-
Delete
C:\Work\frontend\src\assetsandC:\Work\frontend\public(if present). -
Copy in contents of
frontend\step 1from the examples. -
Log in to LiveKit, go to Settings → API Keys → Generate Token.
-
Copy the token into
src/components/LiveKitModal.jsx(as indicated in the frontend example). -
Create a
.envfile and enter:
VITE_LIVEKIT_URL=[YOUR LIVEKIT URL]
- Run the front end with:
npm run devSee the Token Server documentation for details.
-
Create directory
C:\Work\TokenServerand open it in VS Code. -
Open a new terminal.
-
Create a virtual environment:
py -m venv .venv -
Activate the virtual environment:
.\.venv\Scripts\Activate.ps1
-
Copy the TokenServer example files from the workshop.
-
Install requirements:
pip install -r requirements.txt -
Enter LiveKit values into
.env. -
Start the server:
py server.py
-
Copy contents of
frontend\step 2(optional) and run the frontend if desired:npm run dev
See the MCP Server documentation for details.
-
Copy in code from Step 10 and review.
-
Install requirements:
pip install -r requirements.txt -
Start the agent:
py main.py dev
-
Log into the LiveKit Agents Playground and check agent behaviour.
In the LiveKit Agents Playground:
-
The agent greets and asks for your registration.
-
Provide a reg (e.g.,
AB12 CDE).- If found, it shows car details.
- If not, it asks for make, model, year and adds the car.
-
The agent asks if you’d like to book an appointment or check existing.
-
Try: “Book me in for the next available date for an annual service.”
- Agent retrieves next slot, confirms, and saves the booking.
-
Ask “What’s my next booking?” to verify.
- Python venv: keep dependencies isolated (
python -m venv .venv→ activate →pip install -r requirements.txt). - .env: never commit secrets; store
OE_SERVICE_URL, LiveKit & OpenAI keys locally. - Run steps: each
python/stepXfolder contains a small script (main.pyor similar) to run that step.
- PASOE service not reachable: confirm it’s published, note the correct port/context, and that
OE_SERVICE_URLends with/rest/. - LiveKit connection: verify
LIVEKIT_URL,LIVEKIT_API_KEY, andLIVEKIT_API_SECRETin.env. - OpenAI: ensure
OPENAI_API_KEYis set and your model name is valid for your account.
- Whitespace = blocks (no
END.). Indentation is syntax. - Run files directly (
python myfile.py); manage deps with venv + pip (requirements.txt). - Functions use
defand return values directly (multiple returns via tuples). - Dataclasses (
@dataclass) create light DTOs for records likeCar. - Requests library is the go‑to for HTTP calls (
requests.get/post,r.json()). - OO Basics:
class,__init__,self(likeTHIS-OBJECT, but explicit). Inherit withclass Sub(Super):.
MIT
- LiveKit Agents
- Progress OpenEdge
- OpenAI