CrewAI Deployment Issue with Permisson in AWS Lambda

Good day all,
I have a fastapi application API’s that connect to my CrewAI agents. It is working fine as expected in local. The CrewAI agent uses the PDFSearchTool of CrewAI. The PDFSearchTool create a vector DB of the PDF that is connected. So the code creates a folder ‘db\’ parallel to main.py.

Now I am trying to deploy this application to AWS Lambda. But when I deployed my container to Lambda, I started getting exceptions. So I realized we can only create folders inside the ‘temp\’ folder. To change the position of the data creating I added few lines to the code but still getting the same error.

The added codes are:

#in main.py:
# Override default config directory
import os
os.environ["MEM0_DIR"] = "/tmp/mem0_config"
os.environ["CONFIG_DIR"] = "/tmp/embedchain"
os.environ["EMBEDCHAIN_CONFIG_DIR"] = "/tmp/.embedchain"
os.environ["CHROMA_DB_DIR"] = "/tmp/db"
#in crew.py
import os
from chromadb.config import Settings
chroma_settings = Settings(
    chroma_db_impl="chromadb.db.impl.sqlite",
    persist_directory="/tmp/db"  # This is the correct field name
)

os.environ["CHROMA_DB_DIR"] = "/tmp/db"
os.makedirs("/tmp/db", exist_ok=True)

from app.config.config import Config
from crewai_tools import PDFSearchTool
from crewai import Agent, Crew, Process, Task
from crewai.project import CrewBase, agent, crew, task
from app.utils.helper.agent_settings import get_verbose_config

from embedchain import App
embedchain_app = App(config={"chroma_settings": chroma_settings})

pdf_file = Config.get_env_path("PDF_PATH")


@CrewBase
class SomeCrew():

    agents_config = 'config/agents.yaml'
    tasks_config = 'config/tasks.yaml'

    # Get the information from environment
    setup_verbose = get_verbose_config()
    pdf_tools = PDFSearchTool(pdf=pdf_file, app=embedchain_app)


    @agent
    def some_agent(self) -> Agent:
        return Agent(
            config=self.agents_config['some_agent'],
            tools=[
                self.pdf_tools
            ],
            verbose=self.setup_verbose
        )

    @task
    def some_task(self) -> Task:
        ....

    @crew
    def crew(self) -> Crew:
        ....

And the error I am still getting is,

{
  "errorMessage": "Unable to generate pydantic-core schema for <class 'crewai_tools.tools.stagehand_tool.stagehand_tool.AvailableModel'>. Set `arbitrary_types_allowed=True` in the model_config to ignore this error or implement `__get_pydantic_core_schema__` on your type to fully support it.\n\nIf you got this error by calling handler(<some type>) within `__get_pydantic_core_schema__` then you likely need to call `handler.generate_schema(<some type>)` since we do not call `__get_pydantic_core_schema__` on `<some type>` otherwise to avoid infinite recursion.\n\nFor further information visit https://errors.pydantic.dev/2.11/u/schema-for-unknown-type",
  "errorType": "PydanticSchemaGenerationError",
  "requestId": "",
  "stackTrace": [
    "  File \"/var/lang/lib/python3.12/importlib/__init__.py\", line 90, in import_module\n    return _bootstrap._gcd_import(name[level:], package, level)\n",
    "  File \"<frozen importlib._bootstrap>\", line 1387, in _gcd_import\n",
    "  File \"<frozen importlib._bootstrap>\", line 1360, in _find_and_load\n",
    "  File \"<frozen importlib._bootstrap>\", line 1331, in _find_and_load_unlocked\n",
    "  File \"<frozen importlib._bootstrap>\", line 935, in _load_unlocked\n",
    "  File \"<frozen importlib._bootstrap_external>\", line 999, in exec_module\n",
    "  File \"<frozen importlib._bootstrap>\", line 488, in _call_with_frames_removed\n",
    "  File \"/var/task/main.py\", line 23, in <module>\n    from app.api.agent.router import router as agent_router\n",
    "  File \"/var/task/app/api/agent/router.py\", line 2, in <module>\n    from app.api.agent.some_agent import router as some_agent_router\n",
    "  File \"/var/task/app/api/agent/some_agent.py\", line 4, in <module>\n    from app.agents.somaeagent.some_crew import SomeCrew\n",
    "  File \"/var/task/app/agents/something/some_crew.py\", line 3, in <module>\n    from crewai_tools import PDFSearchTool\n",
    "  File \"/var/lang/lib/python3.12/site-packages/crewai_tools/__init__.py\", line 9, in <module>\n    from .tools import (\n",
    "  File \"/var/lang/lib/python3.12/site-packages/crewai_tools/tools/__init__.py\", line 70, in <module>\n    from .stagehand_tool.stagehand_tool import StagehandTool\n",
    "  File \"/var/lang/lib/python3.12/site-packages/crewai_tools/tools/stagehand_tool/__init__.py\", line 1, in <module>\n    from .stagehand_tool import StagehandTool\n",
    "  File \"/var/lang/lib/python3.12/site-packages/crewai_tools/tools/stagehand_tool/stagehand_tool.py\", line 90, in <module>\n    class StagehandTool(BaseTool):\n",
    "  File \"/var/lang/lib/python3.12/site-packages/pydantic/_internal/_model_construction.py\", line 237, in __new__\n    complete_model_class(\n",
    "  File \"/var/lang/lib/python3.12/site-packages/pydantic/_internal/_model_construction.py\", line 597, in complete_model_class\n    schema = gen_schema.generate_schema(cls)\n",
    "  File \"/var/lang/lib/python3.12/site-packages/pydantic/_internal/_generate_schema.py\", line 706, in generate_schema\n    schema = self._generate_schema_inner(obj)\n",
    "  File \"/var/lang/lib/python3.12/site-packages/pydantic/_internal/_generate_schema.py\", line 999, in _generate_schema_inner\n    return self._model_schema(obj)\n",
    "  File \"/var/lang/lib/python3.12/site-packages/pydantic/_internal/_generate_schema.py\", line 832, in _model_schema\n    {k: self._generate_md_field_schema(k, v, decorators) for k, v in fields.items()},\n",
    "  File \"/var/lang/lib/python3.12/site-packages/pydantic/_internal/_generate_schema.py\", line 1201, in _generate_md_field_schema\n    common_field = self._common_field_schema(name, field_info, decorators)\n",
    "  File \"/var/lang/lib/python3.12/site-packages/pydantic/_internal/_generate_schema.py\", line 1367, in _common_field_schema\n    schema = self._apply_annotations(\n",
    "  File \"/var/lang/lib/python3.12/site-packages/pydantic/_internal/_generate_schema.py\", line 2279, in _apply_annotations\n    schema = get_inner_schema(source_type)\n",
    "  File \"/var/lang/lib/python3.12/site-packages/pydantic/_internal/_schema_generation_shared.py\", line 83, in __call__\n    schema = self._handler(source_type)\n",
    "  File \"/var/lang/lib/python3.12/site-packages/pydantic/_internal/_generate_schema.py\", line 2261, in inner_handler\n    schema = self._generate_schema_inner(obj)\n",
    "  File \"/var/lang/lib/python3.12/site-packages/pydantic/_internal/_generate_schema.py\", line 1004, in _generate_schema_inner\n    return self.match_type(obj)\n",
    "  File \"/var/lang/lib/python3.12/site-packages/pydantic/_internal/_generate_schema.py\", line 1118, in match_type\n    return self._match_generic_type(obj, origin)\n",
    "  File \"/var/lang/lib/python3.12/site-packages/pydantic/_internal/_generate_schema.py\", line 1141, in _match_generic_type\n    return self._union_schema(obj)\n",
    "  File \"/var/lang/lib/python3.12/site-packages/pydantic/_internal/_generate_schema.py\", line 1429, in _union_schema\n    choices.append(self.generate_schema(arg))\n",
    "  File \"/var/lang/lib/python3.12/site-packages/pydantic/_internal/_generate_schema.py\", line 706, in generate_schema\n    schema = self._generate_schema_inner(obj)\n",
    "  File \"/var/lang/lib/python3.12/site-packages/pydantic/_internal/_generate_schema.py\", line 1004, in _generate_schema_inner\n    return self.match_type(obj)\n",
    "  File \"/var/lang/lib/python3.12/site-packages/pydantic/_internal/_generate_schema.py\", line 1122, in match_type\n    return self._unknown_type_schema(obj)\n",
    "  File \"/var/lang/lib/python3.12/site-packages/pydantic/_internal/_generate_schema.py\", line 634, in _unknown_type_schema\n    raise PydanticSchemaGenerationError(\n"
  ]
}

Can anyone please help me to resolve the issue?

Honestly, I can’t quite tell why something’s going wrong with the StagehandTool (docs here), especially since it looks like you’re only using the PDFSearchTool in your setup. Someone with more AWS Lambda experience might be able to give you better guidance on that front.

From my end, let me try to simplify what you seem to be aiming for, which is customizing the directory where your ChromaDB and other files will live. Oh, and in the example below, I’m also setting up the embedding configurations just to make the example a bit more complete.

from crewai_tools import PDFSearchTool
import os

os.environ["GOOGLE_API_KEY"] = "<YOUR-KEY>"

embedchain_config = {
    "embedder": {
        "provider": "google",
        "config": {
            "model": "models/text-embedding-004",
            "task_type": "RETRIEVAL_DOCUMENT"
        }
    },
    "vectordb": {
        "provider": "chroma",
        "config": {
            "dir": "/tmp/db",
            "allow_reset": True
        }
    }
}

pdf_tool = PDFSearchTool(
    pdf=pdf_file,
    config=embedchain_config
)
1 Like