69 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			69 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 
								 | 
							
								# SPDX-License-Identifier: AGPL-3.0-or-later
							 | 
						||
| 
								 | 
							
								"""Cloudflare AI engine"""
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								from json import loads, dumps
							 | 
						||
| 
								 | 
							
								from searx.exceptions import SearxEngineAPIException
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								about = {
							 | 
						||
| 
								 | 
							
								    "website": 'https://ai.cloudflare.com',
							 | 
						||
| 
								 | 
							
								    "wikidata_id": None,
							 | 
						||
| 
								 | 
							
								    "official_api_documentation": 'https://developers.cloudflare.com/workers-ai',
							 | 
						||
| 
								 | 
							
								    "use_official_api": True,
							 | 
						||
| 
								 | 
							
								    "require_api_key": True,
							 | 
						||
| 
								 | 
							
								    "results": 'JSON',
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								cf_account_id = ''
							 | 
						||
| 
								 | 
							
								cf_ai_api = ''
							 | 
						||
| 
								 | 
							
								cf_ai_gateway = ''
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								cf_ai_model = ''
							 | 
						||
| 
								 | 
							
								cf_ai_model_display_name = 'Cloudflare AI'
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Assistant messages hint to the AI about the desired output format. Not all models support this role.
							 | 
						||
| 
								 | 
							
								cf_ai_model_assistant = 'Keep your answers as short and effective as possible.'
							 | 
						||
| 
								 | 
							
								# System messages define the AI's personality. You can use them to set rules and how you expect the AI to behave.
							 | 
						||
| 
								 | 
							
								cf_ai_model_system = 'You are a self-aware language model who is honest and direct about any question from the user.'
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def request(query, params):
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    params['query'] = query
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    params['url'] = f'https://gateway.ai.cloudflare.com/v1/{cf_account_id}/{cf_ai_gateway}/workers-ai/{cf_ai_model}'
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    params['method'] = 'POST'
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    params['headers']['Authorization'] = f'Bearer {cf_ai_api}'
							 | 
						||
| 
								 | 
							
								    params['headers']['Content-Type'] = 'application/json'
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    params['data'] = dumps(
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            'messages': [
							 | 
						||
| 
								 | 
							
								                {'role': 'assistant', 'content': cf_ai_model_assistant},
							 | 
						||
| 
								 | 
							
								                {'role': 'system', 'content': cf_ai_model_system},
							 | 
						||
| 
								 | 
							
								                {'role': 'user', 'content': params['query']},
							 | 
						||
| 
								 | 
							
								            ]
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    ).encode('utf-8')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    return params
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def response(resp):
							 | 
						||
| 
								 | 
							
								    results = []
							 | 
						||
| 
								 | 
							
								    json = loads(resp.text)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if 'error' in json:
							 | 
						||
| 
								 | 
							
								        raise SearxEngineAPIException('Cloudflare AI error: ' + json['error'])
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if 'result' in json:
							 | 
						||
| 
								 | 
							
								        results.append(
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                'content': json['result']['response'],
							 | 
						||
| 
								 | 
							
								                'infobox': cf_ai_model_display_name,
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        )
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    return results
							 |