File size: 5,499 Bytes
bed5cc5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
"""
Cursor Rules Generator - API Routes

This module implements the API routes for the Cursor Rules Generator.
"""

from flask import Flask, request, jsonify
from flask_cors import CORS
import os
import json

from ..config.settings import Settings
from ..llm.factory import LLMAdapterFactory
from ..engine.rule_generator import RuleGenerator

# Create Flask app
app = Flask(__name__)

# Configure CORS
CORS(app, resources={r"/api/*": {"origins": Settings.CORS_ORIGINS}})

# Initialize components
rule_generator = RuleGenerator()
factory = LLMAdapterFactory()

@app.route('/api/providers', methods=['GET'])
def get_providers():
    """Get a list of supported LLM providers.
    
    Returns:
        JSON: A list of provider information
    """
    providers = factory.get_supported_providers()
    
    # Format the response
    result = []
    for provider_id, provider_name in providers.items():
        result.append({
            'id': provider_id,
            'name': provider_name
        })
    
    return jsonify(result)

@app.route('/api/rule-types', methods=['GET'])
def get_rule_types():
    """Get a list of supported rule types.
    
    Returns:
        JSON: A list of rule type information
    """
    rule_types = rule_generator.get_rule_types()
    return jsonify(rule_types)

@app.route('/api/validate-api-key', methods=['POST'])
def validate_api_key():
    """Validate an API key for a specific provider.
    
    Request JSON:
        provider: The LLM provider
        api_key: The API key to validate
    
    Returns:
        JSON: Validation result
    """
    data = request.json
    
    if not data or 'provider' not in data or 'api_key' not in data:
        return jsonify({
            'valid': False,
            'message': 'Missing required parameters'
        }), 400
    
    provider = data['provider']
    api_key = data['api_key']
    
    try:
        # Create and initialize the adapter
        adapter = factory.create_adapter(provider)
        
        # Validate the API key
        valid = adapter.validate_api_key(api_key)
        
        if valid:
            return jsonify({
                'valid': True,
                'message': 'API key is valid'
            })
        else:
            return jsonify({
                'valid': False,
                'message': 'Invalid API key'
            })
    except Exception as e:
        return jsonify({
            'valid': False,
            'message': str(e)
        }), 500

@app.route('/api/models', methods=['POST'])
def get_models():
    """Get a list of available models for a specific provider.
    
    Request JSON:
        provider: The LLM provider
        api_key: The API key for the provider
    
    Returns:
        JSON: A list of model information
    """
    data = request.json
    
    if not data or 'provider' not in data or 'api_key' not in data:
        return jsonify({
            'error': 'Missing required parameters'
        }), 400
    
    provider = data['provider']
    api_key = data['api_key']
    
    try:
        # Create and initialize the adapter
        adapter = factory.create_adapter(provider)
        adapter.initialize(api_key)
        
        # Get available models
        models = adapter.get_available_models()
        
        return jsonify(models)
    except Exception as e:
        return jsonify({
            'error': str(e)
        }), 500

@app.route('/api/generate-rule', methods=['POST'])
def generate_rule():
    """Generate a Cursor Rule.
    
    Request JSON:
        provider: The LLM provider
        api_key: The API key for the provider
        model: The model ID to use
        rule_type: The type of rule to generate
        description: A short description of the rule's purpose
        content: The main content of the rule
        parameters: Additional parameters for rule generation
    
    Returns:
        JSON: The generated rule
    """
    data = request.json
    
    # Validate required parameters
    required_params = ['provider', 'api_key', 'model', 'rule_type', 'description', 'content']
    for param in required_params:
        if param not in data:
            return jsonify({
                'error': f'Missing required parameter: {param}'
            }), 400
    
    # Extract parameters
    provider = data['provider']
    api_key = data['api_key']
    model = data['model']
    rule_type = data['rule_type']
    description = data['description']
    content = data['content']
    parameters = data.get('parameters', {})
    
    # Validate rule type
    if not rule_generator.validate_rule_type(rule_type):
        return jsonify({
            'error': f'Invalid rule type: {rule_type}'
        }), 400
    
    try:
        # Generate the rule
        rule = rule_generator.create_rule(
            provider=provider,
            model=model,
            rule_type=rule_type,
            description=description,
            content=content,
            api_key=api_key,
            parameters=parameters
        )
        
        return jsonify({
            'rule': rule
        })
    except Exception as e:
        return jsonify({
            'error': str(e)
        }), 500

def create_app():
    """Create and configure the Flask application.
    
    Returns:
        Flask: The configured Flask application
    """
    return app

if __name__ == '__main__':
    # Run the app
    app.run(
        host=Settings.API_HOST,
        port=Settings.API_PORT,
        debug=Settings.DEBUG
    )