Free lesson · GenAI Agent Engineering
Gemini API-ஐ அழைத்து கட்டமைக்கப்பட்ட பதில்களைத் திருப்பும் ஒரு Python செயலியை எழுதுங்கள்
platform proxy வழியாக Gemini API-க்கு prompt-களை அனுப்பி, பதிலை வடிவமைக்கும் ஒரு Python CLI செயலியை உருவாக்குங்கள். இந்த அத்தியாயம் முழுவதும் நீங்கள் containerize செய்யப் போகும் செயலி இதுதான்.
Course: Kubernetes Essentials for GenAI Engineers · Chapter 1 · Containerizing LLM Applications
Free to read — no subscription required.
அறிமுகம்
ஒரு Python சேவையை முதல் முறையாக Gemini API-உடன் இணைக்கும்போது, API key-ஐ ஒரு constant-இல் போட்டு, ஒரு request-ஐ உங்கள் route handler-இல் ஒட்டி, ship செய்துவிடுவதற்கான ஆசை வரும். அது ஒருமுறை வேலை செய்யும் — அதை deploy செய்ய வேண்டிய வரை. Hardcode செய்யப்பட்ட secret-கள் containerize செய்த கணமே உடைகின்றன, ad-hoc பிழை கையாளுதல் ஒவ்வொரு Gemini தடுமாற்றத்தையும் ஒரு 500 போலக் காட்டுகிறது, மேலும் ஒவ்வொரு request-க்கும் client-ஐ init செய்வது ஒவ்வொரு அழைப்பிலும் latency-ஐ வீணாக்குகிறது. இந்த ஒழுங்கைத் தவிர்க்கும் குழுக்கள், ஒரு key-ஐ rotate செய்ய image-ஐ மீண்டும் build செய்யும் நிலைக்கும், சீரான பிழை வடிவமே இல்லாத இடைவிடாத தோல்விகளைத் துரத்தும் நிலைக்கும் வந்து சேர்கின்றன.
இந்தப் பாடத்தின் முடிவில், environment variable-களிலிருந்து தனது Gemini உள்ளமைவை ஏற்றும், FastAPI-இன் lifespan hook வழியாக client-ஐ சரியாக ஒருமுறை மட்டும் initialize செய்யும், Gemini API-க்கு prompt-களை அனுப்பும், மற்றும் கணிக்கக்கூடிய பிழைச் சொற்பொருளுடன் கட்டமைக்கப்பட்ட JSON பதில்களைத் திருப்பித் தரும் ஒரு Python பயன்பாட்டை நீங்கள் எழுத முடியும் — அடுத்த பாடத்தில் ஒரு container-இல் போடத் தயாராக.
முக்கிய சொற்கள்
- Gemini API — Gemini குடும்பத்தின் பெரிய மொழி மாதிரிகளுக்கான Google-இன் HTTPS endpoint. இந்தப் பாடத்தின் பயன்பாடு இதற்கு ஒரு prompt-ஐ அனுப்பி உருவாக்கப்பட்ட உரையைத் திருப்பித் தருகிறது; இதன் request/response வடிவத்தை அறிந்திருப்பதே கீழே உள்ள wrapper code-ஐ அர்த்தமுள்ளதாக்குகிறது.
- google-generativeai — Gemini HTTP API-ஐ wrap செய்யும் அதிகாரப்பூர்வ Python SDK; prompt-in / text-out அழைப்புகளுக்காக
GenerativeModel.generate_content-ஐ வெளிப்படுத்துகிறது. கீழே உள்ளGeminiClientclass இதன் மேல் ஒரு மெல்லிய அடுக்கு. - FastAPI — வெளிப்புற அழைப்பாளர்கள் Gemini SDK-ஐ நேரடியாகப் பயன்படுத்தாமல் HTTP வழியாக prompt-களைச் சமர்ப்பிக்க, ஒரு
/generateendpoint-ஐ வெளிப்படுத்த இங்கே பயன்படுத்தப்படும் async Python web framework. - Pydantic BaseSettings — Gemini API key, model பெயர் மற்றும் timeout-ஐ environment variable-களிலிருந்து படித்து, தேவையான எந்த மதிப்பும் இல்லாவிட்டால் startup-இலேயே விரைவாகத் தோல்வியடையும் உள்ளமைவு ஏற்றி.
- lifespan context — பயன்பாட்டின் வாழ்நாளைச் சுற்றி setup மற்றும் teardown-ஐ இயக்கும் ஒரு FastAPI hook. ஒவ்வொரு request-இலும் அல்லாமல், startup-இல் ஒருமுறை மட்டும் Gemini client-ஐ உருவாக்க இங்கே பயன்படுத்தப்படுகிறது.
கருத்துகள்
அடுக்கு கட்டமைப்பு
இந்தச் சேவை மூன்று அடுக்குகளாகப் பிரிகிறது, ஒவ்வொன்றுக்கும் அதன் சொந்த உள்ளமைவு பொறுப்பு உள்ளது. FastAPI, HTTP மற்றும் Pydantic validation-ஐக் கையாளுகிறது; ஒரு GeminiClient class, API தொடர்பு மற்றும் பிழை மொழிமாற்றத்தை உடைமையாகக் கொண்டுள்ளது; ஒரு Settings module, environment variable-களிலிருந்து உள்ளமைவை ஏற்றுகிறது. இந்தப் பிரிப்பு secret-ஐ (API key) request கையாளும் logic-இலிருந்து தனிமைப்படுத்துகிறது, மேலும் code-ஐத் தொடாமல் அழைப்பு வடிவத்தை (timeout, max tokens) tune செய்ய அனுமதிக்கிறது.
Validation உள்ளீட்டை நிராகரித்தால் — prompt இல்லாமை, வெற்று string, வரம்பைத் தாண்டிய prompt — எந்த Gemini அழைப்பும் செய்யப்படுவதற்கு முன்பே FastAPI ஒரு 422-ஐத் திருப்பித் தருகிறது, இது quota பயன்பாட்டைக் கணிக்கக்கூடியதாக வைத்திருக்கிறது.
Environment Variable-கள் வழியாக உள்ளமைவு
pydantic_settings-இலிருந்து வரும் BaseSettings, ஒவ்வொரு config field-ஐயும் ஒரு type, ஒரு default மற்றும் எண் வரம்பு validator-களுடன் அறிவிக்கிறது. Startup-இல் இது environment variable-களிலிருந்து உண்மையான மதிப்புகளைப் படிக்கிறது, development-இல் ஒரு .env கோப்பிற்கு fallback ஆகிறது. தேவையான field-கள் ...-ஐ default ஆகப் பயன்படுத்துகின்றன, எனவே GEMINI_API_KEY இல்லாதபோது முதல் request-இல் தெளிவற்ற runtime பிழையை உருவாக்குவதற்குப் பதிலாக startup உடனடியாகத் தோல்வியடைகிறது. (Code Walkthrough பார்க்கவும்.)
Lifespan-ஆல் நிர்வகிக்கப்படும் Client Initialization
FastAPI-இன் lifespan async context manager, பயன்பாட்டின் வாழ்நாளைச் சுற்றி ஒருமுறை இயங்குகிறது. எடுத்துக்காட்டு இதைப் பயன்படுத்தி ஒரு GeminiClient-ஐ உருவாக்கி app.state-இல் சேமிக்கிறது. ஒவ்வொரு request-ம் ஒவ்வொரு அழைப்பிலும் மீண்டும் initialize செய்வதற்குப் பதிலாக அந்த client-ஐயும் — SDK-இன் அடிப்படை connection pool-ஐயும் — மீண்டும் பயன்படுத்துகிறது. இதன் பொருள், credential தோல்விகள் பயனர் traffic-இன் போது அல்லாமல் startup-இலேயே வெளிப்படும்.
எல்லையில் பிழை மொழிமாற்றம்
Gemini SDK, network timeout-கள், auth தோல்விகள் மற்றும் rate limit-களில் throw செய்யக்கூடும். generate method அழைப்பை try/except-இல் wrap செய்து HTTPException(502) ஆக மீண்டும் raise செய்கிறது, ஒவ்வொரு SDK தோல்வி முறையையும் ஒரே கணிக்கக்கூடிய HTTP பதிலுக்கு map செய்கிறது. Gemini எந்த part-ம் இல்லாத ஒரு பதிலைத் திருப்பித் தரும் நிலையை (பொதுவாக safety-filter செய்யப்பட்ட வெளியீடு) ஒரு தனி guard கையாண்டு, SDK-இன் தெளிவற்ற ValueError-க்குப் பதிலாக தெளிவான செய்தியுடன் அதே 502-ஐ உருவாக்குகிறது.
Code Walkthrough
இந்த walkthrough நான்கு கருத்துகளையும் ஒன்றாக விளக்குகிறது: BaseSettings வழியாக environment-ஆல் இயக்கப்படும் உள்ளமைவு, lifespan-ஆல் bootstrap செய்யப்பட்ட client initialization, request validation, மற்றும் எல்லையில் பிழை மொழிமாற்றம். முதல் snippet Settings-ஐ அறிவிக்கிறது; இரண்டாவது அதை ஒரு GeminiClient-உடன் ஒரு FastAPI பயன்பாட்டில் இணைக்கிறது.
Code snippetpython
1# settings.py 2from functools import lru_cache 3 4from pydantic import Field 5from pydantic_settings import BaseSettings, SettingsConfigDict 6 7class Settings(BaseSettings): 8 model_config = SettingsConfigDict(env_file=".env", case_sensitive=False) 9 10 gemini_api_key: str = Field(..., description="API key for Gemini") 11 gemini_model: str = Field(default="gemini-1.5-flash") 12 request_timeout: int = Field(default=30, ge=5, le=120) 13 max_output_tokens: int = Field(default=1024, ge=1, le=8192) 14 temperature: float = Field(default=0.7, ge=0.0, le=2.0) 15 16@lru_cache 17def get_settings() -> Settings: 18 return Settings()
gemini_api_key தனது default ஆக ...-ஐப் பயன்படுத்துகிறது, இது அதைத் தேவையானதாக்குகிறது — GEMINI_API_KEY set செய்யப்படாவிட்டால் பயன்பாடு startup-இலேயே விரைவாகத் தோல்வியடைகிறது. ge/le validator-கள் தவறான எண் மதிப்புகள் Gemini-ஐ அடைவதற்கு முன்பே தடுக்கின்றன. @lru_cache, process முழுவதும் ஒரே பகிரப்பட்ட Settings instance-ஐ உறுதி செய்கிறது.
Code snippetpython
1# main.py 2from contextlib import asynccontextmanager 3 4import google.generativeai as genai 5from fastapi import FastAPI, HTTPException 6from pydantic import BaseModel, Field 7 8from settings import get_settings 9 10class PromptRequest(BaseModel): 11 prompt: str = Field(..., min_length=1, max_length=10000) 12 temperature: float | None = Field(default=None, ge=0.0, le=2.0) 13 14class GeminiClient: 15 def __init__(self, settings): 16 genai.configure(api_key=settings.gemini_api_key) 17 self._model = genai.GenerativeModel(settings.gemini_model) 18 self._settings = settings 19 20 def generate(self, prompt: str, temperature: float | None = None) -> dict: 21 config = genai.types.GenerationConfig( 22 max_output_tokens=self._settings.max_output_tokens, 23 temperature=temperature or self._settings.temperature, 24 ) 25 try: 26 response = self._model.generate_content( 27 prompt, 28 generation_config=config, 29 request_options={"timeout": self._settings.request_timeout}, 30 ) 31 except Exception as exc: 32 raise HTTPException(status_code=502, detail=str(exc)) from exc 33 34 if not response.parts: 35 raise HTTPException(status_code=502, detail="Empty response from Gemini") 36 37 return { 38 "model": self._settings.gemini_model, 39 "prompt": prompt, 40 "generated_text": response.text, 41 } 42 43@asynccontextmanager 44async def lifespan(app: FastAPI): 45 app.state.client = GeminiClient(get_settings()) 46 yield 47 48app = FastAPI(title="Gemini LLM Service", lifespan=lifespan) 49 50@app.post("/generate") 51async def generate_text(request: PromptRequest): 52 return app.state.client.generate( 53 prompt=request.prompt, 54 temperature=request.temperature, 55 ) 56 57@app.get("/health") 58async def health_check(): 59 return {"status": "healthy"}
PromptRequest விளிம்பிலேயே 1 முதல் 10,000 எழுத்துகள் வரையான prompt-ஐக் கட்டாயப்படுத்துகிறது, எனவே வெற்று அல்லது அளவு மீறிய request ஒருபோதும் Gemini-ஐ அடையாது. lifespan context, startup-இல் ஒருமுறை GeminiClient-ஐ உருவாக்கி app.state-இல் சேமிக்கிறது. generate-இன் உள்ளே, try/except எந்த SDK exception-ஐயும் HTTP 502 ஆக மொழிமாற்றம் செய்கிறது, மேலும் response.parts சோதனை, .text raise செய்வதற்கு முன்பே safety-filter செய்யப்பட்ட நிலையைப் பிடிக்கிறது. /health endpoint, Gemini-ஐ அழைக்காமலே திரும்புகிறது, இது container probe-களுக்கு ஒரு மலிவான இலக்கைத் தருகிறது.
GEMINI_API_KEY-ஐ export செய்து uvicorn main:app --reload-ஐ இயக்கிய பின், Content-Type: application/json மற்றும் body {"prompt":"Say hello in one short sentence."} உடன் http://localhost:8000/generate-க்கு ஒரு POST, வெற்றல்லாத generated_text field உடன் ஒரு 200-ஐத் திருப்பித் தந்தால், அது வேலை செய்கிறது என்பதை நீங்கள் அறிவீர்கள்.
-க்கான நடைமுறையில்
மேலே உள்ள முறை — environment-ஆல் இயக்கப்படும் config, lifespan-ஆல் bootstrap செய்யப்பட்ட client, விளிம்பில் validation, எல்லையில் பிழை மொழிமாற்றம் — Gemini-ஆல் ஆதரிக்கப்படும் எந்த Python சேவைக்கும் பொருந்தும். அதை எப்படி விரிவுபடுத்துவது என்பது நீங்கள் எந்தப் பணிக்காகக் கட்டமைக்கிறீர்கள் என்பதைப் பொறுத்தது.
செய்ய வேண்டியவை மற்றும் செய்யக்கூடாதவை
செய்ய வேண்டியவை
- API key-ஐ ஒரு environment variable-இலிருந்து ஏற்றுங்கள் — secret-ஐ source control-க்கு வெளியே வைத்து, image-ஐ மீண்டும் build செய்யாமல் ஒவ்வொரு environment-க்கும் key-களை மாற்ற அனுமதிக்கிறது.
- Gemini client-ஐ lifespan hook-இல் ஒருமுறை மட்டும் initialize செய்யுங்கள் — SDK-இன் connection pool-ஐ மீண்டும் பயன்படுத்துகிறது, மேலும் credential தோல்விகளை traffic-இன் நடுவில் அல்லாமல் startup-இலேயே வெளிப்படுத்துகிறது.
- SDK exception-களை HTTP 502 ஆக மொழிமாற்றம் செய்யுங்கள் — அடிப்படைப் பிரச்சினை timeout, auth தோல்வி அல்லது rate limit எதுவாக இருந்தாலும், அழைப்பாளர்களுக்கு ஒரே கணிக்கக்கூடிய தோல்வி முறையைத் தருகிறது.
செய்யக்கூடாதவை
- API key அல்லது model பெயரை hardcode செய்யாதீர்கள் — ஒவ்வொரு environment மாற்றமும் ஒரு image rebuild ஆகிவிடும், மேலும் leak ஆன image, production credential-களை leak செய்யும்.
- முதலில்
response.parts-ஐச் சோதிக்காமல்response.text-ஐ அழைக்காதீர்கள் — safety-filter செய்யப்பட்ட Gemini பதில் part-கள் இல்லாத ஒரு செல்லுபடியான object ஆகும், மேலும்.textஒரு தெளிவற்றValueError-ஐ raise செய்யும். - Liveness probe-களுக்கு
/generateendpoint-ஐ மீண்டும் பயன்படுத்தாதீர்கள் — ஒவ்வொரு probe-ம் Gemini quota-வை வீணாக்குகிறது; API-ஐ அழைக்காமல் திரும்பும் ஒரு தனி/healthroute-ஐ வெளிப்படுத்துங்கள்.
A hands-on lab comes with this lesson — real code, in a cloud IDE. Create a free account to run it. No card.
Free account · no card · straight to the lab
Or get the full path — from
Listen to this lesson
Audio overviews of this lesson's labs and its chapter, from GenBodha Bytes.
- Structured Text Report GeneratorLab5 min
- Containerizing LLM ApplicationsChapter overview23 min
More free lessons in Kubernetes Essentials for GenAI Engineers
- Ch 1Write a Python app that calls the Gemini API and returns structured responsesYou are here
- Ch 1Write a Dockerfile and build a container image for the LLM app
- Ch 1Use Docker Compose to run the LLM app with supporting services
- Ch 2Deploy the LLM app as your first Kubernetes pod
- Ch 4Manage deployment lifecycle with kubectl rollout
- Ch 9Create a Helm chart for the LLM chat application
- Ch 9Use Kustomize bases and overlays for the LLM app