AIstudioProxyAPI / server.py
hins111's picture
Upload 11 files
6a0eaad verified
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
)