diff --git a/.env.example b/.env.example
new file mode 100644
index 000000000..f1ca09d94
--- /dev/null
+++ b/.env.example
@@ -0,0 +1,2 @@
+# Environment variables for the demo
+OPENAI_API_KEY=
diff --git a/backend/.gitignore b/backend/.gitignore
new file mode 100644
index 000000000..8d35cb327
--- /dev/null
+++ b/backend/.gitignore
@@ -0,0 +1,2 @@
+__pycache__
+*.pyc
diff --git a/backend/README.md b/backend/README.md
new file mode 100644
index 000000000..07c6e42b7
--- /dev/null
+++ b/backend/README.md
@@ -0,0 +1,4 @@
+# Backend
+
+This folder contains the Python backend using FastAPI and the OpenAI Agents SDK.
+Run `uvicorn backend.main:app --reload` to start the development server.
diff --git a/backend/__init__.py b/backend/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/backend/main.py b/backend/main.py
new file mode 100644
index 000000000..36a944bbc
--- /dev/null
+++ b/backend/main.py
@@ -0,0 +1,8 @@
+from fastapi import FastAPI
+
+app = FastAPI()
+
+
+@app.get("/health")
+def health() -> dict[str, str]:
+ return {"status": "ok"}
diff --git a/backend/pyproject.toml b/backend/pyproject.toml
new file mode 100644
index 000000000..2e686c451
--- /dev/null
+++ b/backend/pyproject.toml
@@ -0,0 +1,12 @@
+[project]
+name = "banking-backend"
+version = "0.1.0"
+requires-python = ">=3.11"
+dependencies = [
+ "fastapi",
+ "uvicorn",
+ "openai",
+]
+
+[tool.ruff]
+line-length = 88
diff --git a/backend/tests/test_main.py b/backend/tests/test_main.py
new file mode 100644
index 000000000..3134b84ca
--- /dev/null
+++ b/backend/tests/test_main.py
@@ -0,0 +1,9 @@
+from fastapi.testclient import TestClient
+from backend.main import app
+
+
+def test_health() -> None:
+ client = TestClient(app)
+ response = client.get("/health")
+ assert response.status_code == 200
+ assert response.json() == {"status": "ok"}
diff --git a/docs/banking-demo.md b/docs/banking-demo.md
new file mode 100644
index 000000000..6867886c2
--- /dev/null
+++ b/docs/banking-demo.md
@@ -0,0 +1,3 @@
+# Agentic Private Banker Demo
+
+This document provides a high-level overview of the multi-agent banking prototype.
diff --git a/frontend/.gitignore b/frontend/.gitignore
new file mode 100644
index 000000000..a60845048
--- /dev/null
+++ b/frontend/.gitignore
@@ -0,0 +1,3 @@
+node_modules
+.next
+out
diff --git a/frontend/README.md b/frontend/README.md
new file mode 100644
index 000000000..94eee0718
--- /dev/null
+++ b/frontend/README.md
@@ -0,0 +1,4 @@
+# Frontend
+
+This folder contains the NextJS frontend for the Agentic Private Banker demo.
+Run `npm install` and `npm run dev` to start the development server.
diff --git a/frontend/next.config.js b/frontend/next.config.js
new file mode 100644
index 000000000..91ef62f0d
--- /dev/null
+++ b/frontend/next.config.js
@@ -0,0 +1,6 @@
+/** @type {import('next').NextConfig} */
+const nextConfig = {
+ reactStrictMode: true,
+};
+
+module.exports = nextConfig;
diff --git a/frontend/package.json b/frontend/package.json
new file mode 100644
index 000000000..4a8f880b9
--- /dev/null
+++ b/frontend/package.json
@@ -0,0 +1,15 @@
+{
+ "name": "banking-frontend",
+ "version": "0.1.0",
+ "private": true,
+ "scripts": {
+ "dev": "next dev",
+ "build": "next build",
+ "start": "next start"
+ },
+ "dependencies": {
+ "next": "latest",
+ "react": "latest",
+ "react-dom": "latest"
+ }
+}
diff --git a/frontend/pages/index.tsx b/frontend/pages/index.tsx
new file mode 100644
index 000000000..46f8e3bf0
--- /dev/null
+++ b/frontend/pages/index.tsx
@@ -0,0 +1,10 @@
+import React from 'react';
+
+export default function Home() {
+ return (
+
+
Agentic Private Banker (Demo)
+
Prototype frontend using NextJS.
+
+ );
+}
diff --git a/frontend/public/.gitkeep b/frontend/public/.gitkeep
new file mode 100644
index 000000000..e69de29bb
diff --git a/frontend/tests/example.test.ts b/frontend/tests/example.test.ts
new file mode 100644
index 000000000..9fc42213e
--- /dev/null
+++ b/frontend/tests/example.test.ts
@@ -0,0 +1,2 @@
+// Placeholder test file for frontend
+export {}; // to make this a module
diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json
new file mode 100644
index 000000000..93a83a407
--- /dev/null
+++ b/frontend/tsconfig.json
@@ -0,0 +1,19 @@
+{
+ "compilerOptions": {
+ "target": "es5",
+ "lib": ["dom", "dom.iterable", "esnext"],
+ "allowJs": true,
+ "skipLibCheck": true,
+ "strict": false,
+ "forceConsistentCasingInFileNames": true,
+ "noEmit": true,
+ "esModuleInterop": true,
+ "module": "esnext",
+ "moduleResolution": "node",
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "jsx": "preserve"
+ },
+ "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"],
+ "exclude": ["node_modules"]
+}
diff --git a/start.sh b/start.sh
new file mode 100755
index 000000000..90e5e585f
--- /dev/null
+++ b/start.sh
@@ -0,0 +1,6 @@
+#!/bin/bash
+# Start frontend and backend for the Agentic Private Banker demo
+
+( cd backend && uvicorn backend.main:app --reload & )
+( cd frontend && npm run dev & )
+wait
diff --git a/test_repo/.env.example b/test_repo/.env.example
new file mode 100644
index 000000000..c3bf676e9
--- /dev/null
+++ b/test_repo/.env.example
@@ -0,0 +1,3 @@
+# Example environment variables.
+OPENAI_API_KEY=your-key-here
+BACKEND_URL=http://localhost:8000
diff --git a/test_repo/__init__.py b/test_repo/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/test_repo/backend/.gitignore b/test_repo/backend/.gitignore
new file mode 100644
index 000000000..d594efd4b
--- /dev/null
+++ b/test_repo/backend/.gitignore
@@ -0,0 +1,3 @@
+__pycache__
+*.pyc
+.env
diff --git a/test_repo/backend/README.md b/test_repo/backend/README.md
new file mode 100644
index 000000000..90acca2b0
--- /dev/null
+++ b/test_repo/backend/README.md
@@ -0,0 +1,3 @@
+# Backend
+
+This folder contains the FastAPI backend for the banking demo.
diff --git a/test_repo/backend/__init__.py b/test_repo/backend/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/test_repo/backend/main.py b/test_repo/backend/main.py
new file mode 100644
index 000000000..e0b18ef1f
--- /dev/null
+++ b/test_repo/backend/main.py
@@ -0,0 +1,11 @@
+"""FastAPI backend for the banking demo."""
+
+from fastapi import FastAPI
+
+app = FastAPI()
+
+
+@app.get("/health")
+def health() -> dict[str, str]:
+ """Return service health status."""
+ return {"status": "ok"}
diff --git a/test_repo/backend/pyproject.toml b/test_repo/backend/pyproject.toml
new file mode 100644
index 000000000..e3db0cc21
--- /dev/null
+++ b/test_repo/backend/pyproject.toml
@@ -0,0 +1,8 @@
+[project]
+name = "banking-demo-backend"
+version = "0.1.0"
+dependencies = [
+ "fastapi",
+ "uvicorn",
+ "openai",
+]
diff --git a/test_repo/backend/tests/test_demo_main.py b/test_repo/backend/tests/test_demo_main.py
new file mode 100644
index 000000000..f7a1d428d
--- /dev/null
+++ b/test_repo/backend/tests/test_demo_main.py
@@ -0,0 +1,11 @@
+from fastapi.testclient import TestClient
+
+from test_repo.backend.main import app
+
+client = TestClient(app)
+
+
+def test_health() -> None:
+ response = client.get("/health")
+ assert response.status_code == 200
+ assert response.json() == {"status": "ok"}
diff --git a/test_repo/docs/banking-demo.md b/test_repo/docs/banking-demo.md
new file mode 100644
index 000000000..3a5a799ea
--- /dev/null
+++ b/test_repo/docs/banking-demo.md
@@ -0,0 +1,3 @@
+# Banking Demo Prototype
+
+This document outlines the high-level structure for the banking demo prototype.
diff --git a/test_repo/frontend/.gitignore b/test_repo/frontend/.gitignore
new file mode 100644
index 000000000..a60845048
--- /dev/null
+++ b/test_repo/frontend/.gitignore
@@ -0,0 +1,3 @@
+node_modules
+.next
+out
diff --git a/test_repo/frontend/README.md b/test_repo/frontend/README.md
new file mode 100644
index 000000000..bd357b001
--- /dev/null
+++ b/test_repo/frontend/README.md
@@ -0,0 +1,3 @@
+# Frontend
+
+This folder contains the Next.js prototype for the banking demo.
diff --git a/test_repo/frontend/components/.gitkeep b/test_repo/frontend/components/.gitkeep
new file mode 100644
index 000000000..e69de29bb
diff --git a/test_repo/frontend/next.config.js b/test_repo/frontend/next.config.js
new file mode 100644
index 000000000..91ef62f0d
--- /dev/null
+++ b/test_repo/frontend/next.config.js
@@ -0,0 +1,6 @@
+/** @type {import('next').NextConfig} */
+const nextConfig = {
+ reactStrictMode: true,
+};
+
+module.exports = nextConfig;
diff --git a/test_repo/frontend/package.json b/test_repo/frontend/package.json
new file mode 100644
index 000000000..4be04b515
--- /dev/null
+++ b/test_repo/frontend/package.json
@@ -0,0 +1,15 @@
+{
+ "name": "banking-demo-frontend",
+ "version": "0.1.0",
+ "scripts": {
+ "dev": "next dev",
+ "build": "next build",
+ "start": "next start",
+ "test": "echo \"No tests\""
+ },
+ "dependencies": {
+ "next": "14.0.0",
+ "react": "18.2.0",
+ "react-dom": "18.2.0"
+ }
+}
diff --git a/test_repo/frontend/pages/index.tsx b/test_repo/frontend/pages/index.tsx
new file mode 100644
index 000000000..4eb73e503
--- /dev/null
+++ b/test_repo/frontend/pages/index.tsx
@@ -0,0 +1,8 @@
+import React from 'react';
+
+// Home page for the prototype.
+const Home: React.FC = () => {
+ return Prototype Frontend
;
+};
+
+export default Home;
diff --git a/test_repo/frontend/public/.gitkeep b/test_repo/frontend/public/.gitkeep
new file mode 100644
index 000000000..e69de29bb
diff --git a/test_repo/frontend/tests/example.test.ts b/test_repo/frontend/tests/example.test.ts
new file mode 100644
index 000000000..dd00d3b02
--- /dev/null
+++ b/test_repo/frontend/tests/example.test.ts
@@ -0,0 +1,3 @@
+test('placeholder', () => {
+ expect(true).toBe(true);
+});
diff --git a/test_repo/frontend/tsconfig.json b/test_repo/frontend/tsconfig.json
new file mode 100644
index 000000000..93a83a407
--- /dev/null
+++ b/test_repo/frontend/tsconfig.json
@@ -0,0 +1,19 @@
+{
+ "compilerOptions": {
+ "target": "es5",
+ "lib": ["dom", "dom.iterable", "esnext"],
+ "allowJs": true,
+ "skipLibCheck": true,
+ "strict": false,
+ "forceConsistentCasingInFileNames": true,
+ "noEmit": true,
+ "esModuleInterop": true,
+ "module": "esnext",
+ "moduleResolution": "node",
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "jsx": "preserve"
+ },
+ "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"],
+ "exclude": ["node_modules"]
+}
diff --git a/test_repo/start.sh b/test_repo/start.sh
new file mode 100755
index 000000000..b03b0ef4a
--- /dev/null
+++ b/test_repo/start.sh
@@ -0,0 +1,5 @@
+#!/bin/bash
+# Launch backend and frontend for the demo.
+
+(cd "$(dirname "$0")/backend" && uvicorn main:app --reload &)
+(cd "$(dirname "$0")/frontend" && npm run dev)