Download web.py from lin7zhi/2api: direct link, hf CLI and curl.
- Browser
- Download file 6.38 kB
-
https://huggingface.co/spaces/lin7zhi/2api/resolve/main/web.py
- Command line
-
hf download hf://spaces/lin7zhi/2api/web.py
-
curl -L -o web.py https://huggingface.co/spaces/lin7zhi/2api/resolve/main/web.py
6.38 kB
| """ | |
| Main Web Integration - Integrates all routers and modules | |
| 集合router并开启主服务 | |
| """ | |
| import asyncio | |
| from contextlib import asynccontextmanager | |
| from fastapi import FastAPI, Response | |
| from fastapi.middleware.cors import CORSMiddleware | |
| from fastapi.staticfiles import StaticFiles | |
| from config import get_server_host, get_server_port | |
| from log import log | |
| # Import managers and utilities | |
| from src.credential_manager import CredentialManager | |
| # Import all routers | |
| from src.router.antigravity.openai import router as antigravity_openai_router | |
| from src.router.antigravity.gemini import router as antigravity_gemini_router | |
| from src.router.antigravity.anthropic import router as antigravity_anthropic_router | |
| from src.router.antigravity.model_list import router as antigravity_model_list_router | |
| from src.router.geminicli.openai import router as openai_router | |
| from src.router.geminicli.gemini import router as gemini_router | |
| from src.router.geminicli.anthropic import router as geminicli_anthropic_router | |
| from src.router.geminicli.model_list import router as geminicli_model_list_router | |
| from src.task_manager import shutdown_all_tasks | |
| from src.web_routes import router as web_router | |
| # 全局凭证管理器 | |
| global_credential_manager = None | |
| async def lifespan(app: FastAPI): | |
| """应用生命周期管理""" | |
| global global_credential_manager | |
| log.info("启动 GCLI2API 主服务") | |
| # 初始化配置缓存(优先执行) | |
| try: | |
| import config | |
| await config.init_config() | |
| log.info("配置缓存初始化成功") | |
| except Exception as e: | |
| log.error(f"配置缓存初始化失败: {e}") | |
| # 初始化全局凭证管理器 | |
| try: | |
| global_credential_manager = CredentialManager() | |
| await global_credential_manager.initialize() | |
| log.info("凭证管理器初始化成功") | |
| except Exception as e: | |
| log.error(f"凭证管理器初始化失败: {e}") | |
| global_credential_manager = None | |
| # OAuth回调服务器将在需要时按需启动 | |
| yield | |
| # 清理资源 | |
| log.info("开始关闭 GCLI2API 主服务") | |
| # 首先关闭所有异步任务 | |
| try: | |
| await shutdown_all_tasks(timeout=10.0) | |
| log.info("所有异步任务已关闭") | |
| except Exception as e: | |
| log.error(f"关闭异步任务时出错: {e}") | |
| # 然后关闭凭证管理器 | |
| if global_credential_manager: | |
| try: | |
| await global_credential_manager.close() | |
| log.info("凭证管理器已关闭") | |
| except Exception as e: | |
| log.error(f"关闭凭证管理器时出错: {e}") | |
| log.info("GCLI2API 主服务已停止") | |
| # 创建FastAPI应用 | |
| app = FastAPI( | |
| title="GCLI2API", | |
| description="Gemini API proxy with OpenAI compatibility", | |
| version="2.0.0", | |
| lifespan=lifespan, | |
| ) | |
| # CORS中间件 | |
| app.add_middleware( | |
| CORSMiddleware, | |
| allow_origins=["*"], | |
| allow_credentials=True, | |
| allow_methods=["*"], | |
| allow_headers=["*"], | |
| ) | |
| # 挂载路由器 | |
| # OpenAI兼容路由 - 处理OpenAI格式请求 | |
| app.include_router(openai_router, prefix="", tags=["OpenAI Compatible API"]) | |
| # Gemini原生路由 - 处理Gemini格式请求 | |
| app.include_router(gemini_router, prefix="", tags=["Gemini Native API"]) | |
| # Geminicli模型列表路由 - 处理Gemini格式的模型列表请求 | |
| app.include_router(geminicli_model_list_router, prefix="", tags=["Geminicli Model List"]) | |
| # Antigravity路由 - 处理OpenAI格式请求并转换为Antigravity API | |
| app.include_router(antigravity_openai_router, prefix="", tags=["Antigravity OpenAI API"]) | |
| # Antigravity路由 - 处理Gemini格式请求并转换为Antigravity API | |
| app.include_router(antigravity_gemini_router, prefix="", tags=["Antigravity Gemini API"]) | |
| # Antigravity模型列表路由 - 处理Gemini格式的模型列表请求 | |
| app.include_router(antigravity_model_list_router, prefix="", tags=["Antigravity Model List"]) | |
| # Antigravity Anthropic Messages 路由 - Anthropic Messages 格式兼容 | |
| app.include_router(antigravity_anthropic_router, prefix="", tags=["Antigravity Anthropic Messages"]) | |
| # Geminicli Anthropic Messages 路由 - Anthropic Messages 格式兼容 (Geminicli) | |
| app.include_router(geminicli_anthropic_router, prefix="", tags=["Geminicli Anthropic Messages"]) | |
| # Web路由 - 包含认证、凭证管理和控制面板功能 | |
| app.include_router(web_router, prefix="", tags=["Web Interface"]) | |
| # 静态文件路由 - 服务docs目录下的文件(如捐赠图片) | |
| app.mount("/docs", StaticFiles(directory="docs"), name="docs") | |
| # 静态文件路由 - 服务front目录下的文件(HTML、JS、CSS等) | |
| app.mount("/front", StaticFiles(directory="front"), name="front") | |
| # 保活接口(仅响应 HEAD) | |
| async def keepalive() -> Response: | |
| return Response(status_code=200) | |
| def get_credential_manager(): | |
| """获取全局凭证管理器实例""" | |
| return global_credential_manager | |
| # 导出给其他模块使用 | |
| __all__ = ["app", "get_credential_manager"] | |
| async def main(): | |
| """异步主启动函数""" | |
| from hypercorn.asyncio import serve | |
| from hypercorn.config import Config | |
| # 日志系统现在直接使用环境变量,无需初始化 | |
| # 从环境变量或配置获取端口和主机 | |
| port = await get_server_port() | |
| host = await get_server_host() | |
| log.info("=" * 60) | |
| log.info("启动 GCLI2API") | |
| log.info("=" * 60) | |
| log.info(f"控制面板: http://127.0.0.1:{port}") | |
| log.info("=" * 60) | |
| log.info("API端点:") | |
| log.info(f" Geminicli (OpenAI格式): http://127.0.0.1:{port}/v1") | |
| log.info(f" Geminicli (Claude格式): http://127.0.0.1:{port}/v1") | |
| log.info(f" Geminicli (Gemini格式): http://127.0.0.1:{port}") | |
| log.info(f" Antigravity (OpenAI格式): http://127.0.0.1:{port}/antigravity/v1") | |
| log.info(f" Antigravity (Claude格式): http://127.0.0.1:{port}/antigravity/v1") | |
| log.info(f" Antigravity (Gemini格式): http://127.0.0.1:{port}/antigravity") | |
| # 配置hypercorn | |
| config = Config() | |
| config.bind = [f"{host}:{port}"] | |
| config.accesslog = "-" | |
| config.errorlog = "-" | |
| config.loglevel = "INFO" | |
| # 设置连接超时 | |
| config.keep_alive_timeout = 600 # 10分钟 | |
| config.read_timeout = 600 # 10分钟读取超时 | |
| await serve(app, config) | |
| if __name__ == "__main__": | |
| asyncio.run(main()) | |