This AI-powered application transforms raw Azure DevOps work item data into value-driven, stakeholder-focused release notes. It analyzes technical details and value propositions to craft communications tailored for executives, sales, marketing, and support teams.
- Connects directly to Azure DevOps using a Personal Access Token (PAT).
- Fetches work items based on Release Version and an optional Iteration Path.
- Uses a Large Language Model (LLM) to generate tailored release notes for different audiences.
- Provides a review screen to approve, reject, or edit the AI-generated content.
- Compiles all approved notes into a final Markdown document, ready for distribution.
- React
- TypeScript
- Tailwind CSS
- Google Gemini API
The application is designed to be model-agnostic, allowing you to switch from the default Google Gemini provider to another LLM service like AWS Bedrock. This is managed through a simple abstraction layer.
services/geminiService.ts: This file contains the specific implementation for calling the Google Gemini API.services/llmService.ts: This is the central abstraction layer or "router". It determines which underlying LLM service to use based on a configuration constant. Your application components should only call functions from this file, not from the specific service files.
Follow these steps to integrate a new LLM provider:
Step 1: Create a New Service File
Create a new file in the services directory for your provider. For example, services/bedrockService.ts.
Step 2: Implement the Provider Logic
Inside your new file (services/bedrockService.ts), you must implement and export a function named generateSingleItemNote. This function must have the same signature as the one in geminiService.ts:
// Example: services/bedrockService.ts
import { WorkItem, StakeholderNotes } from "../types";
// You will need to install and import the AWS SDK
// import { BedrockClient, ... } from "@aws-sdk/client-bedrock";
export async function generateSingleItemNote(
item: WorkItem,
model: string // e.g., 'anthropic.claude-v2'
): Promise<StakeholderNotes> {
// 1. Format the work item data into a prompt for your chosen model.
const prompt = `...`; // Construct your prompt here
// 2. Initialize and configure your AWS Bedrock client.
// const client = new BedrockClient(...);
// 3. Make the API call to AWS Bedrock.
// const response = await client.send(...);
// 4. Parse the response from Bedrock. It must be parsed into
// a JSON object that matches the `StakeholderNotes` interface.
const parsedNotes: StakeholderNotes = JSON.parse(response.body);
// 5. Return the parsed notes.
return parsedNotes;
}Step 3: Register the New Provider in the Abstraction Layer
Open services/llmService.ts.
-
Import your new function at the top of the file. It's best to rename it on import to avoid naming conflicts.
// services/llmService.ts import { generateSingleItemNote as generateWithGemini } from "./geminiService"; import { generateSingleItemNote as generateWithBedrock } from "./bedrockService"; // Add this line
-
Update the
case 'BEDROCK'inside thegenerateSingleItemNotefunction to call your new implementation.// services/llmService.ts // ... inside the generateSingleItemNote function switch (LLM_PROVIDER) { case 'GEMINI': return generateWithGemini(item, model); case 'BEDROCK': // Replace the placeholder with your new function return generateWithBedrock(item, model); // ... }
Step 4: Switch the Active Provider
Finally, still in services/llmService.ts, change the LLM_PROVIDER constant to activate your new service.
// services/llmService.ts
const LLM_PROVIDER: 'GEMINI' | 'BEDROCK' = 'BEDROCK'; // Change 'GEMINI' to 'BEDROCK'That's it. The application will now route all AI generation requests through your new AWS Bedrock service without any changes needed in the UI components.