- 添加MinIO用户文件系统配置选项(BEAVER_MINIO_ROOT_USER等) - 更新外部连接器配置结构,包括BASE_URL和认证令牌设置 - 改进connector provider支持更多类型(official, feishu_bot等) - 实现Mistral模型推理模式支持reasoning_effort参数 - 增强外部连接器策略配置和运行时配置管理 - 添加connector bridge事件验证和安全保护机制 - 优化任务路由逻辑,区分simple_chat和new_task场景 - 更新初始技能工具提示配置,分离authoring admin功能
77 lines
3.1 KiB
Python
77 lines
3.1 KiB
Python
from __future__ import annotations
|
|
|
|
from typing import Any
|
|
|
|
from fastapi import FastAPI, Header, HTTPException
|
|
from fastapi.responses import JSONResponse
|
|
|
|
from external_connector.models import ConnectorSessionRequest, SendRequest
|
|
from external_connector.providers.base import ConnectorProvider
|
|
|
|
|
|
def create_app(*, provider: ConnectorProvider, api_token: str) -> FastAPI:
|
|
app = FastAPI(title="External Connector")
|
|
|
|
def require_auth(authorization: str | None) -> None:
|
|
if not api_token:
|
|
raise HTTPException(status_code=503, detail="Connector API token is not configured")
|
|
if authorization != f"Bearer {api_token}":
|
|
raise HTTPException(status_code=401, detail="Invalid connector token")
|
|
|
|
@app.get("/health")
|
|
def health() -> dict[str, Any]:
|
|
return provider.health()
|
|
|
|
@app.get("/connectors")
|
|
def connectors(authorization: str | None = Header(default=None)) -> list[dict[str, Any]]:
|
|
require_auth(authorization)
|
|
return provider.connectors()
|
|
|
|
@app.post("/connector-sessions")
|
|
def start_session(
|
|
payload: ConnectorSessionRequest,
|
|
authorization: str | None = Header(default=None),
|
|
) -> dict[str, Any]:
|
|
require_auth(authorization)
|
|
return provider.start_session(payload.model_dump(by_alias=True))
|
|
|
|
@app.get("/connector-sessions/{session_id}")
|
|
def get_session(session_id: str, authorization: str | None = Header(default=None)) -> dict[str, Any]:
|
|
require_auth(authorization)
|
|
try:
|
|
return provider.get_session(session_id)
|
|
except KeyError:
|
|
raise HTTPException(status_code=404, detail="Connector session not found")
|
|
|
|
@app.post("/connector-sessions/{session_id}/cancel")
|
|
def cancel_session(session_id: str, authorization: str | None = Header(default=None)) -> dict[str, Any]:
|
|
require_auth(authorization)
|
|
provider.cancel_session(session_id)
|
|
return {"ok": True}
|
|
|
|
@app.post("/connections/{connection_id}/logout")
|
|
def logout(connection_id: str, authorization: str | None = Header(default=None)) -> dict[str, Any]:
|
|
require_auth(authorization)
|
|
provider.logout(connection_id)
|
|
return {"ok": True}
|
|
|
|
@app.post("/send", response_model=None)
|
|
def send(payload: SendRequest, authorization: str | None = Header(default=None)) -> JSONResponse | dict[str, Any]:
|
|
require_auth(authorization)
|
|
result = dict(provider.send(payload.model_dump(by_alias=True)))
|
|
status_code = int(result.pop("httpStatus", 200))
|
|
if status_code != 200:
|
|
return JSONResponse(status_code=status_code, content=result)
|
|
return result
|
|
|
|
if hasattr(provider, "handle_event"):
|
|
@app.post("/feishu/events", response_model=None)
|
|
def feishu_events(payload: dict[str, Any]) -> JSONResponse | dict[str, Any]:
|
|
result = dict(provider.handle_event(payload)) # type: ignore[attr-defined]
|
|
status_code = int(result.pop("httpStatus", 200))
|
|
if status_code != 200:
|
|
return JSONResponse(status_code=status_code, content=result)
|
|
return result
|
|
|
|
return app
|