Research
Technology Review
We performed extensive research into various technologies for each component of our system to ensure we selected the most suitable tools for our project. Our selection was guided by several key factors such as: accessibility requirements, integration capabilities, and development efficiency. We also opted for Azure tools where possible to leverage our partnership with Avanade.
AI API Selection
We evaluated three main options for integrating the AI chatbot into our application [3]:
| Option | Pros | Cons |
|---|---|---|
| Azure OpenAI Assistant API |
|
|
| Azure OpenAI Chat Completions API |
|
|
| Local LLM Models |
|
|
Our partnership with Avanade provided access to Azure resources, making it free of charge to us. The Assistant API's built-in conversation management reduced development complexity. Initially, we were using the Chat Completions API with GPT-4o, but we found that the Assistant API was more suitable once we attempted to implement function calling. We chose GPT-4o-mini for its balance of performance and cost; it is approximately 17x cheaper than GPT-4o [4] while maintaining sufficient accuracy.
Frontend Framework
| Option | Pros | Cons |
|---|---|---|
| React |
|
|
| Vue |
|
|
CSS Framework
| Option | Pros | Cons |
|---|---|---|
| Tailwind CSS |
|
|
| Traditional CSS/SCSS |
|
|
We selected React as our frontend framework due to our team's familiarity with it and its extensive ecosystem. We were also confident that it would integrate well with our backend and any services we would need to use. Tailwind CSS was chosen for its utility-first approach, which allowed us to quickly create responsive designs and maintain accessibility standards. This was especially important for our project given our focus on accessibility.
Backend Framework
| Option | Pros | Cons |
|---|---|---|
| Flask (Python) |
|
|
| Express (Node.js) |
|
|
We selected Python for the backend framework primarily due to the teams experience with it and its simple integration with Azure services. It is also a simple and minimalist framework which allowed us to quickly set up our backend and focus on the core functionality of our application.
Testing Frameworks
Frontend Testing
| Option | Pros | Cons |
|---|---|---|
| Vitest + RTL |
|
|
| Jest + RTL |
|
|
Backend Testing
| Option | Pros | Cons |
|---|---|---|
| pytest |
|
|
| unittest |
|
|
For the frontend, RTL was essential as we are using React. Vitest and Jest were considered but we opted for Vitest as it is generally faster and has simpler configuration with Vite (which we are using) [5]. For the backend, we chose pytest as it has a useful fixtures system but we also utilised unittest.mock for mocking services.
Email Service
| Option | Pros | Cons |
|---|---|---|
| Gmail SMTP Server |
|
|
| Azure Communication Service |
|
|
Gmail SMTP was selected as our provider due to its reliability and ease of setup. While it has a daily sending limit, it is more than sufficient for our expected email volume. It also has extremely simple integration and configuration with Flask due to the Flask-Mail library.
Deployment
| Option | Pros | Cons |
|---|---|---|
| Azure Static Web App + App Service |
|
|
| Container Registry/Azure Container Apps |
|
|
We selected Azure Static Web Apps and App Service for deployment due to their simple CI/CD integration and simple set up [7]. We were running Docker locally but decided against containerization for deployment as we found it to be unnecessarily complex for our needs. We also chose Azure PostgreSQL for our database which allows us to represent complex relationships from our data model and has simple integration with our App Service.
Summary of Technical Decisions
To summarise we made the following technical decisions for our project:
| Component | Selected Technology |
|---|---|
| AI API | Azure OpenAI Assistant API with GPT-4o-mini |
| Frontend Framework | React |
| CSS Framework | Tailwind CSS |
| Backend Framework | Python Flask |
| Frontend Testing | Vitest + React Testing Library |
| Backend Testing | pytest |
| Email Service | Gmail SMTP with Flask-Mail |
| Deployment | Azure Static Web App + App Service |
| Database | PostgreSQL on Azure |
References
- Winnie Nwanne, "Choosing the Right Tool: A Comparative analysis of the Assistants API & Chat Completions API," TECHCOMMUNITY.MICROSOFT.COM, May 15, 2024. https://techcommunity.microsoft.com/blog/azure-ai-services-blog/choosing-the-right-tool-a-comparative-analysis-of-the-assistants-api--chat-compl/4140438 (accessed Mar. 14, 2025).
- OpenAI, "Pricing," OpenAI, 2024. https://openai.com/api/pricing/ (accessed Mar. 14, 2025).
- C. Tozzi, "Vitest vs. Jest: Choosing The Right Testing Framework," saucelabs.com, Sep. 20, 2023. https://saucelabs.com/resources/blog/vitest-vs-jest-comparison (accessed Mar. 14, 2025).
- "Send email from a printer, scanner, or app - G Suite Admin Help," Google.com, 2020. https://support.google.com/a/answer/176600?hl=en (accessed Mar. 14, 2025).
- "Comparing Container Apps with other Azure container options," learn.microsoft.com, Nov. 23, 2022. https://learn.microsoft.com/en-us/azure/container-apps/compare-options (accessed Mar. 14, 2025).
- RNIB, "Welcome to RNIB," RNIB, 2019. https://www.rnib.org.uk/ (accessed Mar. 22, 2025).
- D. Hub, "Dialogue Hub," Dialogue Hub, 2020. https://dialoguehub.co.uk/dialogue-cafe (accessed Mar. 22, 2025).