import json from fastapi import FastAPI, Request from fastapi.responses import JSONResponse, FileResponse from fastapi.staticfiles import StaticFiles from fastapi.middleware.cors import CORSMiddleware from pydantic import BaseModel from typing import Optional, List, Dict, Union from factool.factool import Factool foundation_model = 'gpt-4' factool_instance = Factool(foundation_model) app = FastAPI() app.add_middleware( CORSMiddleware, allow_origins=["https://chat.openai.com"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) class FactCheckRequest(BaseModel): prompt: str response: str entry_point: Optional[str] class FactCheckResponse(BaseModel): fact_check_result: List[Dict[str, Union[str, List[str]]]] fact_checks = {} @app.post("/fact_check_kbqa") async def fact_check_kbqa(request_data: FactCheckRequest): request_obj = FactCheckRequest(**request_data.dict()) fact_check_result = await factool_instance.run_for_plugin([{'prompt': request_obj.prompt, 'response': request_obj.response, 'category': 'kbqa'}]) fact_check_id = len(fact_checks) + 1 fact_checks[fact_check_id] = fact_check_result return JSONResponse(content={"fact_check_id": fact_check_id, "fact_check_result": fact_check_result}) @app.post("/fact_check_code") async def fact_check_code(request_data: FactCheckRequest): request_obj = FactCheckRequest(**request_data.dict()) fact_check_result = await factool_instance.run_for_plugin([{'prompt': request_obj.prompt, 'response': request_obj.response, 'category': 'code', 'entry_point': request_obj.entry_point}]) fact_check_id = len(fact_checks) + 1 fact_checks[fact_check_id] = fact_check_result return JSONResponse(content={"fact_check_id": fact_check_id, "fact_check_result": fact_check_result}) @app.post("/fact_check_math") async def fact_check_math(request_data: FactCheckRequest): request_obj = FactCheckRequest(**request_data.dict()) fact_check_result = await factool_instance.run_for_plugin([{'prompt': request_obj.prompt, 'response': request_obj.response, 'category': 'math'}]) fact_check_id = len(fact_checks) + 1 fact_checks[fact_check_id] = fact_check_result return JSONResponse(content={"fact_check_id": fact_check_id, "fact_check_result": fact_check_result}) @app.post("/fact_check_scientific_literature") async def fact_check_scientific_literature(request_data: FactCheckRequest): request_obj = FactCheckRequest(**request_data.dict()) fact_check_result = await factool_instance.run_for_plugin([{'prompt': request_obj.prompt, 'response': request_obj.response, 'category': 'scientific'}]) fact_check_id = len(fact_checks) + 1 fact_checks[fact_check_id] = fact_check_result return JSONResponse(content={"fact_check_id": fact_check_id, "fact_check_result": fact_check_result}) @app.get("/get_fact_check/{fact_check_id}") async def get_fact_check(fact_check_id: int): if fact_check_id in fact_checks: fact_check_result = fact_checks[fact_check_id] return JSONResponse(content={"fact_check_id": fact_check_id, "fact_check_result": fact_check_result}) else: return JSONResponse(content={"error": "Fact check not found"}) @app.get("/logo.png") async def plugin_logo(): filename = "logo.png" return FileResponse(filename, media_type="image/png") @app.get("/.well-known/ai-plugin.json") async def read_plugin_manifest(): return FileResponse(".well-known/ai-plugin.json") @app.get("/openapi.yaml") async def openapi_spec(): return FileResponse("./openapi.yaml") def main(): import uvicorn uvicorn.run(app, host="0.0.0.0", port=5003, log_level="info") if __name__ == "__main__": main()