DEV Community

Dhruvin Bhingradiya
Dhruvin Bhingradiya

Posted on

The Gemini API: From Code to Production with CI/CD Automation

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)
Enter fullscreen mode Exit fullscreen mode

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()

Enter fullscreen mode Exit fullscreen mode

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"]

Enter fullscreen mode Exit fullscreen mode
  • 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

Enter fullscreen mode Exit fullscreen mode
  • 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.

Top comments (0)