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)