import requests import os from services.ai_service import AIService # Note that Cloudflare's AI workers are still in beta. # https://developers.cloudflare.com/workers-ai/ class CloudflareAIService(AIService): def __init__(self): super().__init__() self.cloudflare_account_id = os.getenv("CLOUDFLARE_ACCOUNT_ID") self.cloudflare_api_token = os.getenv("CLOUDFLARE_API_TOKEN") self.api_base_url = f'https://api.cloudflare.com/client/v4/accounts/{self.cloudflare_account_id}/ai/run/' self.headers = {"Authorization": f'Bearer {self.cloudflare_api_token}'} # base endpoint, used by the others def run(self, model, input): response = requests.post( f"{self.api_base_url}{model}", headers=self.headers, json=input) return response.json() # https://developers.cloudflare.com/workers-ai/models/llm/ def run_llm(self, messages, latest_user_message=None, stream=True): input = { "messages": [ {"role": "system", "content": "You are a friendly assistant"}, {"role": "user", "content": sentence} ] } return self.run("@cf/meta/llama-2-7b-chat-int8", input) # https://developers.cloudflare.com/workers-ai/models/translation/ def run_text_translation(self, sentence, source_language, target_language): return self.run('@cf/meta/m2m100-1.2b', { "text": sentence, "source_lang": source_language, "target_lang": target_language }) # https://developers.cloudflare.com/workers-ai/models/sentiment-analysis/ def run_text_sentiment(self, sentence): return self.run("@cf/huggingface/distilbert-sst-2-int8", {"text": sentence}) # https://developers.cloudflare.com/workers-ai/models/image-classification/ def run_image_classification(self, image_url): response = requests.get(image_url) if response.status_code != 200: return {"error": "There was a problem downloading the image."} if response.status_code == 200: data = response.content inputs = {"image": list(data)} return self.run("@cf/microsoft/resnet-50", inputs) # https://developers.cloudflare.com/workers-ai/models/embedding/ def run_embeddings(self, texts, size="medium"): models = { "small": "@cf/baai/bge-small-en-v1.5", # 384 output dimensions "medium": "@cf/baai/bge-base-en-v1.5", # 768 output dimensions "large": "@cf/baai/bge-large-en-v1.5" # 1024 output dimensions } return self.run(models[size], {"text": texts})