The Gemini API: From Code to Production with CI/CD Automation
Dhruvin Bhingradiya
Posted on November 25, 2024
Introduction
Software development is where creativity meets logic, and the Gemini API project was a perfect example. I built this API to process prompts with custom instructions and paired it with a CI/CD pipeline for seamless testing and deployment. In this post, I’ll share how I brought it all together, the challenges I faced, and what I learned along the way.
Setting Up the Gemini API
At the core of the Gemini API is a simple yet powerful idea: take a user’s prompt, process it, and return a meaningful response tailored to their instructions. I chose Flask for its simplicity and flexibility.
What the API Does
Prompt Handling:
The API accepts user prompts and processes them based on specific
instructions.
Custom Instructions: Users can pass parameters to customize the output.
Key Features:
- A /generate endpoint for prompt processing.
- Modular and scalable design for future enhancements.
- Robust error handling for reliability. Here’s a snippet of the core function, generate_content, that powers the API:
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/generate', methods=['POST'])
def generate_content():
data = request.get_json()
prompt = data.get('prompt', '')
instructions = data.get('instructions', {})
# Process the prompt and instructions
result = {
"prompt": prompt,
"instructions": instructions,
"response": f"Processed prompt: {prompt} with instructions: {instructions}"
}
return jsonify(result)
This function was the heart of the API. It took inputs, applied processing logic, and returned structured outputs.
Testing the API
Testing was a critical part of my development process. I wanted to ensure that the Gemini API worked as expected under various scenarios.
Unit Testing
To validate individual components, I wrote unit tests for the API. For instance, I tested how well the /generate endpoint handled different inputs.
Example Test:
import unittest
from app import app
class TestGeminiAPI(unittest.TestCase):
def setUp(self):
self.app = app.test_client()
self.app.testing = True
def test_generate_content(self):
response = self.app.post('/generate', json={
"prompt": "Hello, world!",
"instructions": {"style": "friendly"}
})
self.assertEqual(response.status_code, 200)
self.assertIn("Processed prompt", response.get_json()['response'])
if __name__ == '__main__':
unittest.main()
Integration Testing
Integration tests were essential for testing the entire workflow. These tests ensured that the API could handle multiple requests simultaneously and provided consistent results.
Challenges in Testing
I initially struggled with creating realistic test scenarios. Mock data and edge case testing helped me refine the process and build confidence in the API's reliability.
Setting Up CI/CD with GitHub Actions
One of the most exciting parts of this project was setting up a CI/CD pipeline. I chose GitHub Actions because of its seamless integration with my workflow.
Steps in the Pipeline
- Building Docker Images: I containerized the API using Docker to ensure consistent environments.
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "app.py"]
- Automating Tests: I configured the pipeline to run tests automatically for every pull request. Here’s a sample of my CI workflow:
name: CI Pipeline
on:
push:
branches:
- main
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.9'
- name: Install dependencies
run: pip install -r requirements.txt
- name: Run tests
run: python -m unittest discover
- Deploying to Production: After successful tests, the pipeline deployed the API to a production environment using Docker Compose and SSH.
What I Learned About CI/CD
Time-Saving: Automation reduced the time spent on repetitive tasks.
Error Reduction: CI/CD minimized human errors in testing and deployment.
Consistency: Docker ensured that the application ran identically in all environments.
yaml
Copy code
Conclusion
Working on the Gemini API was an enriching experience. I learned so much about API design, testing strategies, and CI/CD pipelines. Some key takeaways for me were:
Testing is not just about catching bugs; it’s about building confidence in your code.
Automating workflows with CI/CD is a game-changer for productivity.
Overcoming challenges teaches you as much as—if not more than—success.
Future Plans
Add caching to speed up API responses.
Expand the API to support additional input formats.
Implement a monitoring system to track the health of the production environment.
Posted on November 25, 2024
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.