123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- from dotenv import load_dotenv
- from fastapi import Body, FastAPI, responses
- from modal import Image, Secret, Stub, asgi_app
- from embedchain import Pipeline
- load_dotenv(".env")
- image = Image.debian_slim().pip_install(
- "embedchain",
- "embedchain[dataloaders]",
- )
- stub = Stub(
- name="embedchain-app",
- image=image,
- secrets=[Secret.from_dotenv(".env")],
- )
- web_app = FastAPI()
- embedchain_app = Pipeline(name="embedchain-modal-app")
- @web_app.post("/add")
- async def add(
- source: str = Body(..., description="Source to be added"),
- data_type: str | None = Body(None, description="Type of the data source"),
- ):
- """
- Adds a new source to the EmbedChain app.
- Expects a JSON with a "source" and "data_type" key.
- "data_type" is optional.
- """
- if source and data_type:
- embedchain_app.add(source, data_type)
- elif source:
- embedchain_app.add(source)
- else:
- return {"message": "No source provided."}
- return {"message": f"Source '{source}' added successfully."}
- @web_app.post("/query")
- async def query(question: str = Body(..., description="Question to be answered")):
- """
- Handles a query to the EmbedChain app.
- Expects a JSON with a "question" key.
- """
- if not question:
- return {"message": "No question provided."}
- answer = embedchain_app.query(question)
- return {"answer": answer}
- @web_app.get("/chat")
- async def chat(question: str = Body(..., description="Question to be answered")):
- """
- Handles a chat request to the EmbedChain app.
- Expects a JSON with a "question" key.
- """
- if not question:
- return {"message": "No question provided."}
- response = embedchain_app.chat(question)
- return {"response": response}
- @web_app.get("/")
- async def root():
- return responses.RedirectResponse(url="/docs")
- @stub.function(image=image)
- @asgi_app()
- def fastapi_app():
- return web_app
|