ai-api-ollama / backend /api /image.ts
cygon
Initial deployment with Ollama support
d61feef
import { api, APIError } from "encore.dev/api";
import { auth, validateApiKey } from "../utils/auth";
import { checkRateLimit } from "../utils/rate_limit";
import { metrics } from "../utils/metrics";
import { imageService } from "../services/image_service";
import type { ImageGenerationRequest, ImageGenerationResponse } from "../types/models";
export const generate = api<ImageGenerationRequest, ImageGenerationResponse>(
{ expose: true, method: "POST", path: "/image/generate", auth: false },
async (req) => {
const startTime = Date.now();
try {
const authHeader = auth();
const authData = validateApiKey(authHeader);
checkRateLimit(authData.apiKey, authData.tier);
metrics.incrementRequests("/image/generate");
if (!req.prompt) {
throw APIError.invalidArgument("prompt is required");
}
const response = await imageService.generate(req);
metrics.recordResponseTime(Date.now() - startTime);
return response;
} catch (error) {
metrics.incrementErrors();
if (error && typeof error === 'object' && 'statusCode' in error && error.statusCode === 429) {
const err = error as any;
throw APIError.resourceExhausted(err.message).withDetails({
limit: err.limit,
remaining: err.remaining,
reset_at: err.resetAt,
});
}
throw error instanceof Error ? error : APIError.internal(String(error));
}
}
);