""" LLM API endpoints to be added to app.py Add these imports at the top and routes before the error handlers """ # ==================== ADD THIS IMPORT AT THE TOP ==================== # from llm_config import LLMConfig # llm_config = LLMConfig() # ==================== ADD THESE ROUTES BEFORE ERROR HANDLERS ==================== @app.route('/api/llm/config', methods=['GET']) def get_llm_config(): """獲取 LLM API 配置狀態""" try: config_data = {} for api_name, api_config in llm_config.apis.items(): config_data[api_name] = { 'name': api_config['name'], 'enabled': api_config['enabled'], 'endpoint': api_config['endpoint'], 'api_key': api_config['api_key'][:8] + '...' if api_config['api_key'] else '' } return jsonify(config_data) except Exception as e: return jsonify({ 'success': False, 'error': f'獲取配置失敗: {str(e)}' }), 500 @app.route('/api/llm/test/', methods=['GET']) def test_llm_api(api_name): """測試單個 LLM API 連線""" try: if api_name not in llm_config.apis: return jsonify({ 'success': False, 'message': f'不支援的 API: {api_name}' }), 400 # 執行連線測試 if api_name == 'gemini': success, message = llm_config.test_gemini_connection() elif api_name == 'deepseek': success, message = llm_config.test_deepseek_connection() elif api_name == 'openai': success, message = llm_config.test_openai_connection() else: return jsonify({ 'success': False, 'message': f'未實作的 API: {api_name}' }), 400 return jsonify({ 'success': success, 'message': message }) except Exception as e: return jsonify({ 'success': False, 'message': f'測試失敗: {str(e)}' }), 500 @app.route('/api/llm/test-all', methods=['GET']) def test_all_llm_apis(): """測試所有已配置的 LLM API""" try: results = llm_config.test_all_connections() response = {} for api_name, (success, message) in results.items(): response[api_name] = { 'success': success, 'message': message } return jsonify({ 'success': True, 'results': response }) except Exception as e: return jsonify({ 'success': False, 'error': f'測試失敗: {str(e)}' }), 500 @app.route('/api/llm/generate', methods=['POST']) def generate_llm_text(): """ 使用 LLM API 生成文字 Request body: { "api": "gemini" | "deepseek" | "openai", "prompt": "提示詞", "max_tokens": 2000 } """ try: data = request.get_json() if not data: return jsonify({ 'success': False, 'error': '請提供有效的 JSON 資料' }), 400 api_name = data.get('api', 'gemini') prompt = data.get('prompt', '') max_tokens = data.get('max_tokens', 2000) if not prompt: return jsonify({ 'success': False, 'error': '請提供提示詞' }), 400 # 執行文字生成 if api_name == 'gemini': success, result = llm_config.generate_text_gemini(prompt, max_tokens) elif api_name == 'deepseek': success, result = llm_config.generate_text_deepseek(prompt, max_tokens) elif api_name == 'openai': model = data.get('model', 'gpt-3.5-turbo') success, result = llm_config.generate_text_openai(prompt, model, max_tokens) else: return jsonify({ 'success': False, 'error': f'不支援的 API: {api_name}' }), 400 if success: return jsonify({ 'success': True, 'text': result }) else: return jsonify({ 'success': False, 'error': result }), 500 except Exception as e: return jsonify({ 'success': False, 'error': f'生成失敗: {str(e)}' }), 500 # ==================== ADD ROUTE FOR API TEST PAGE ==================== @app.route('/api-test') def api_test_page(): """返回 API 測試頁面""" return send_from_directory('.', 'api_test.html')