|
|
""" |
|
|
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 |
|
|
|
|
|
|
|
|
from src.credential_manager import CredentialManager |
|
|
|
|
|
|
|
|
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 |
|
|
|
|
|
|
|
|
@asynccontextmanager |
|
|
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 |
|
|
|
|
|
|
|
|
|
|
|
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 主服务已停止") |
|
|
|
|
|
|
|
|
|
|
|
app = FastAPI( |
|
|
title="GCLI2API", |
|
|
description="Gemini API proxy with OpenAI compatibility", |
|
|
version="2.0.0", |
|
|
lifespan=lifespan, |
|
|
) |
|
|
|
|
|
|
|
|
app.add_middleware( |
|
|
CORSMiddleware, |
|
|
allow_origins=["*"], |
|
|
allow_credentials=True, |
|
|
allow_methods=["*"], |
|
|
allow_headers=["*"], |
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
app.include_router(openai_router, prefix="", tags=["OpenAI Compatible API"]) |
|
|
|
|
|
|
|
|
app.include_router(gemini_router, prefix="", tags=["Gemini Native API"]) |
|
|
|
|
|
|
|
|
app.include_router(geminicli_model_list_router, prefix="", tags=["Geminicli Model List"]) |
|
|
|
|
|
|
|
|
app.include_router(antigravity_openai_router, prefix="", tags=["Antigravity OpenAI API"]) |
|
|
|
|
|
|
|
|
app.include_router(antigravity_gemini_router, prefix="", tags=["Antigravity Gemini API"]) |
|
|
|
|
|
|
|
|
app.include_router(antigravity_model_list_router, prefix="", tags=["Antigravity Model List"]) |
|
|
|
|
|
|
|
|
app.include_router(antigravity_anthropic_router, prefix="", tags=["Antigravity Anthropic Messages"]) |
|
|
|
|
|
|
|
|
app.include_router(geminicli_anthropic_router, prefix="", tags=["Geminicli Anthropic Messages"]) |
|
|
|
|
|
|
|
|
app.include_router(web_router, prefix="", tags=["Web Interface"]) |
|
|
|
|
|
|
|
|
app.mount("/docs", StaticFiles(directory="docs"), name="docs") |
|
|
|
|
|
|
|
|
app.mount("/front", StaticFiles(directory="front"), name="front") |
|
|
|
|
|
|
|
|
|
|
|
@app.head("/keepalive") |
|
|
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") |
|
|
|
|
|
|
|
|
config = Config() |
|
|
config.bind = [f"{host}:{port}"] |
|
|
config.accesslog = "-" |
|
|
config.errorlog = "-" |
|
|
config.loglevel = "INFO" |
|
|
|
|
|
|
|
|
config.keep_alive_timeout = 600 |
|
|
config.read_timeout = 600 |
|
|
|
|
|
await serve(app, config) |
|
|
|
|
|
|
|
|
if __name__ == "__main__": |
|
|
asyncio.run(main()) |
|
|
|