Spaces:
Paused
Paused
| import asyncio | |
| import multiprocessing | |
| import random | |
| import time | |
| import json | |
| from typing import List, Optional, Dict, Any, Union, AsyncGenerator, Tuple, Callable, Set | |
| import os | |
| import traceback | |
| from contextlib import asynccontextmanager | |
| import sys | |
| import platform | |
| import logging | |
| import logging.handlers | |
| import socket # 保留 socket 以便在 __main__ 中进行简单的直接运行提示 | |
| from asyncio import Queue, Lock, Future, Task, Event | |
| from fastapi import FastAPI, Request, HTTPException | |
| from fastapi.responses import JSONResponse, StreamingResponse, FileResponse | |
| from fastapi import WebSocket, WebSocketDisconnect | |
| from pydantic import BaseModel | |
| from playwright.async_api import Page as AsyncPage, Browser as AsyncBrowser, Playwright as AsyncPlaywright, Error as PlaywrightAsyncError, expect as expect_async, BrowserContext as AsyncBrowserContext, Locator, TimeoutError | |
| from playwright.async_api import async_playwright | |
| from urllib.parse import urljoin, urlparse | |
| import uuid | |
| import datetime | |
| import aiohttp | |
| import stream | |
| import queue | |
| # --- 配置模块导入 --- | |
| from config import * | |
| # --- models模块导入 --- | |
| from models import ( | |
| FunctionCall, | |
| ToolCall, | |
| MessageContentItem, | |
| Message, | |
| ChatCompletionRequest, | |
| ClientDisconnectedError, | |
| StreamToLogger, | |
| WebSocketConnectionManager, | |
| WebSocketLogHandler | |
| ) | |
| # --- logging_utils模块导入 --- | |
| from logging_utils import setup_server_logging, restore_original_streams | |
| # --- browser_utils模块导入 --- | |
| from browser_utils import ( | |
| _initialize_page_logic, | |
| _close_page_logic, | |
| signal_camoufox_shutdown, | |
| _handle_model_list_response, | |
| detect_and_extract_page_error, | |
| save_error_snapshot, | |
| get_response_via_edit_button, | |
| get_response_via_copy_button, | |
| _wait_for_response_completion, | |
| _get_final_response_content, | |
| get_raw_text_content, | |
| switch_ai_studio_model, | |
| load_excluded_models, | |
| _handle_initial_model_state_and_storage, | |
| _set_model_from_page_display | |
| ) | |
| # --- api_utils模块导入 --- | |
| from api_utils import ( | |
| generate_sse_chunk, | |
| generate_sse_stop_chunk, | |
| generate_sse_error_chunk, | |
| use_helper_get_response, | |
| use_stream_response, | |
| clear_stream_queue, | |
| prepare_combined_prompt, | |
| validate_chat_request, | |
| _process_request_refactored, | |
| create_app, | |
| queue_worker | |
| ) | |
| # --- stream queue --- | |
| STREAM_QUEUE:Optional[multiprocessing.Queue] = None | |
| STREAM_PROCESS = None | |
| # --- Global State --- | |
| playwright_manager: Optional[AsyncPlaywright] = None | |
| browser_instance: Optional[AsyncBrowser] = None | |
| page_instance: Optional[AsyncPage] = None | |
| is_playwright_ready = False | |
| is_browser_connected = False | |
| is_page_ready = False | |
| is_initializing = False | |
| # --- 全局代理配置 --- | |
| PLAYWRIGHT_PROXY_SETTINGS: Optional[Dict[str, str]] = None | |
| global_model_list_raw_json: Optional[List[Any]] = None | |
| parsed_model_list: List[Dict[str, Any]] = [] | |
| model_list_fetch_event = asyncio.Event() | |
| current_ai_studio_model_id: Optional[str] = None | |
| model_switching_lock: Optional[Lock] = None | |
| excluded_model_ids: Set[str] = set() | |
| request_queue: Optional[Queue] = None | |
| processing_lock: Optional[Lock] = None | |
| worker_task: Optional[Task] = None | |
| page_params_cache: Dict[str, Any] = {} | |
| params_cache_lock: Optional[Lock] = None | |
| logger = logging.getLogger("AIStudioProxyServer") | |
| log_ws_manager = None | |
| # --- FastAPI App 定义 --- | |
| app = create_app() | |
| # --- Main Guard --- | |
| if __name__ == "__main__": | |
| import uvicorn | |
| port = int(os.environ.get("PORT", 2048)) | |
| uvicorn.run( | |
| "server:app", | |
| host="0.0.0.0", | |
| port=port, | |
| log_level="info", | |
| access_log=False | |
| ) |