Advertisement
Guest User

Untitled

a guest
Feb 2nd, 2025
423
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.84 KB | None | 0 0
  1. from flask import Flask, request, Response, jsonify
  2. import requests
  3. import os
  4. import time
  5. from functools import lru_cache
  6.  
  7. app = Flask(__name__)
  8.  
  9. # Configuration
  10. # Configure with your specific Azure endpoint and model
  11. AZURE_MODEL_NAME = "DeepSeek-R1"  # Must match exactly what Azure expects
  12. AZURE_BASE_URL = os.getenv("AZURE_ENDPOINT", "https://<SERVER_NAME>.services.ai.azure.com")
  13. AZURE_API_KEY = os.getenv("AZURE_API_KEY", "<API_KEY>")  # Set this in your environment
  14.  
  15. # Add favicon handler to prevent 404 errors
  16.  
  17. @app.route('/v1/chat/completions/deployments/<path:model>/chat/completions', methods=['POST'])
  18. def chat_completion(model):
  19.     """Handle chat completion requests (POST only)"""
  20.     azure_url = f"{AZURE_BASE_URL}/models/chat/completions"
  21.    
  22.     # Prepare headers with Azure authentication
  23.     headers = {
  24.         "Content-Type": "application/json",
  25.         "api-key": AZURE_API_KEY,
  26.         "extra-parameters": "pass-through"
  27.     }
  28.    
  29.     # Remove potentially problematic headers
  30.     original_headers = dict(request.headers)
  31.     original_headers.pop("Host", None)
  32.     original_headers.pop("Accept-Encoding", None)
  33.    
  34.     try:
  35.         original_body = request.get_json()
  36.     except Exception as e:
  37.         return jsonify({"error": "Invalid JSON body"}), 400
  38.    
  39.     modified_body = {
  40.         **original_body,
  41.         "model": AZURE_MODEL_NAME,
  42.     }
  43.    
  44.     try:
  45.         azure_response = requests.post(
  46.             azure_url,
  47.             headers=headers,
  48.             params={"api-version": "2024-05-01-preview"},
  49.             json=modified_body,
  50.             stream=True
  51.         )
  52.         azure_response.raise_for_status()
  53.     except requests.exceptions.RequestException as e:
  54.         return jsonify({"error": str(e)}), 500
  55.    
  56.     def generate():
  57.         for chunk in azure_response.iter_content(chunk_size=1024):
  58.             yield chunk
  59.    
  60.     response_headers = dict(azure_response.headers)
  61.     # Remove problematic encoding headers
  62.     response_headers.pop("Content-Encoding", None)
  63.     response_headers.pop("Transfer-Encoding", None)
  64.    
  65.     return Response(
  66.         generate(),
  67.         status=azure_response.status_code,
  68.         headers=response_headers,
  69.         content_type=azure_response.headers.get('Content-Type', 'application/json')
  70.     )
  71.  
  72. @app.route('/favicon.ico')
  73. def favicon():
  74.     return Response(status=204)
  75.  
  76. #@lru_cache(maxsize=1)
  77. def get_azure_models():
  78.     """Fetch actual models from Azure with caching"""
  79.     try:
  80.         response = requests.get(
  81.             f"{AZURE_BASE_URL}/openai/models?api-version=2024-10-21",
  82.             headers={"api-key": AZURE_API_KEY},
  83.             # params={"api-version": "2024-10-21"},
  84.             timeout=5
  85.         )
  86.         print(response)
  87.         response.raise_for_status()
  88.         return response.json().get('data', [])
  89.     except requests.exceptions.RequestException as e:
  90.         app.logger.error(f"Azure model fetch failed: {str(e)}")
  91.         return []
  92.  
  93. def map_azure_model(azure_model):
  94.     """Map Azure model schema to OpenAI-compatible format"""
  95.     capabilities = azure_model.get('capabilities', {})
  96.     deprecation = azure_model.get('deprecation', {})
  97.    
  98.     return {
  99.         "id": azure_model.get('id', 'unknown'),
  100.         "object": "model",
  101.         "created": azure_model.get('created_at', int(time.time())),
  102.         "owned_by": "azure-ai",
  103.         "permission": [{
  104.             "id": f"modelperm-{azure_model['id'].lower()}",
  105.             "object": "model_permission",
  106.             "created": azure_model.get('created_at', int(time.time())),
  107.             "allow_create_engine": False,
  108.             "allow_sampling": capabilities.get('inference', False),
  109.             "allow_logprobs": True,
  110.             "allow_search_indices": False,
  111.             "allow_view": True,
  112.             "allow_fine_tuning": capabilities.get('fine_tune', False),
  113.             "organization": "*",
  114.             "group": None,
  115.             "is_blocking": False
  116.         }],
  117.         "root": azure_model.get('model', azure_model.get('id')),
  118.         "parent": azure_model.get('model', None)
  119.     }
  120.  
  121. @app.route('/v1/models', methods=['GET'])
  122. @app.route('/v1/chat/completions/models', methods=['GET'])
  123. def list_models():
  124.     """Dynamic model listing from Azure"""
  125.     try:
  126.         azure_models = get_azure_models()
  127.         openai_models = [map_azure_model(m) for m in azure_models]
  128.        
  129.         return jsonify({
  130.             "object": "list",
  131.             "data": openai_models
  132.         })
  133.        
  134.     except Exception as e:
  135.         app.logger.error(f"Model list error: {str(e)}")
  136.         return jsonify({
  137.             "error": {
  138.                 "message": "Failed to fetch models",
  139.                 "type": "server_error",
  140.                 "code": 500
  141.             }
  142.         }), 500
  143.  
  144. if __name__ == '__main__':
  145.     app.run(host='localhost', port=8080, debug=False)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement