crewAIInc / crewAI

Framework for orchestrating role-playing, autonomous AI agents. By fostering collaborative intelligence, CrewAI empowers agents to work together seamlessly, tackling complex tasks.
https://crewai.com
MIT License
20.43k stars 2.82k forks source link

[BUG] custom prompt_file isn't loaded #1384

Open KGuzikowski opened 3 weeks ago

KGuzikowski commented 3 weeks ago

Description

When I pass a custom prompt_file to Crew it doesn't get loaded and the crew uses a default one from its source code.

After reading logs I can see that my custom prompt_file doesn't get loaded.

This is weird, I put print in the crew kick-off code and in I18N load_prompts and it prints many times, once it loads my file and others it doesn't get it and loads default and then kicks off with the default one. Below I provide logs.

Steps to Reproduce

  1. Define custom prompt_file.
  2. Pass it to the crew.
  3. See logs.

Expected behavior

Uses my custom prompt_file

Screenshots/Code snippets

The crew:

class CustomCrew:
    def __init__(
        self,
        prompt_file: str = "../prompts/crew_ai_prompts/prompting_template_llama.json",
    ):
        self.prompt_file = prompt_file

        self.llm = LLM(...)

    def run(self):
        agents = CustomAgents()
        tasks = CustomTasks()

        # Define agents and tasks
        ...

        crew = Crew(
            agents=[...],
            tasks=[...],
            process=Process.sequential,
            manager_llm=self.llm,
            memory=True,
            embedder={
                "provider": "ollama",
                "config": {
                    "model": "mxbai-embed-large",
                }
            },
            prompt_file=self.prompt_file,
            output_log_file="final_logs.txt",
            share_crew=False,
            verbose=True,
        )

        result = crew.kickoff()
        return result

Prints in Crew -> kickoff function:

print()
print()
print('IN KICKOFF')
print('self.prompt_file:', self.prompt_file)
print()
print()

I18N class with prints:

class I18N(BaseModel):
    _prompts: Dict[str, Dict[str, str]] = PrivateAttr()
    prompt_file: Optional[str] = Field(
        default=None,
        description="Path to the prompt_file file to load",
    )

    @model_validator(mode="after")
    def load_prompts(self) -> "I18N":
        """Load prompts from a JSON file."""
        print()
        print()
        print('IN I18N load_prompts')
        print('self.prompt_file:', self.prompt_file)

        try:
            if self.prompt_file:
                with open(self.prompt_file, "r", encoding="utf-8") as f:
                    self._prompts = json.load(f)
                    print('OPENED PROMPT FILE')
                    print('self._prompts:')
                    print(self._prompts)
            else:
                print('There is no prompt file')
                print('Loading default prompts')
                dir_path = os.path.dirname(os.path.realpath(__file__))
                prompts_path = os.path.join(dir_path, "../translations/en.json")
                print('default prompts_path:', prompts_path)

                with open(prompts_path, "r", encoding="utf-8") as f:
                    self._prompts = json.load(f)
        except FileNotFoundError:
            raise Exception(f"Prompt file '{self.prompt_file}' not found.")
        except json.JSONDecodeError:
            raise Exception("Error decoding JSON from the prompts file.")

        if not self._prompts:
            self._prompts = {}

        print()
        print()

        return self

    def slice(self, slice: str) -> str:
        return self.retrieve("slices", slice)

    def errors(self, error: str) -> str:
        return self.retrieve("errors", error)

    def tools(self, error: str) -> str:
        return self.retrieve("tools", error)

    def retrieve(self, kind, key) -> str:
        try:
            return self._prompts[kind][key]
        except Exception as _:
            raise Exception(f"Prompt for '{kind}':'{key}'  not found.")

Operating System

Ubuntu 24.04

Python Version

3.11

crewAI Version

0.67.1

crewAI Tools Version

0.12.1

Virtual Environment

Conda

Evidence

  1. Before the crew starts, upon the crew ai import I get these logs:
    
    IN I18N load_prompts
    self.prompt_file: None
    There is no prompt file
    Loading default prompts
    default prompts_path: /path/lib/python3.11/site-packages/crewai/utilities/../translations/en.json

IN I18N load_prompts self.prompt_file: None There is no prompt file Loading default prompts default prompts_path: /path/lib/python3.11/site-packages/crewai/utilities/../translations/en.json

IN I18N load_prompts self.prompt_file: None There is no prompt file Loading default prompts default prompts_path: /path/lib/python3.11/site-packages/crewai/utilities/../translations/en.json

IN I18N load_prompts self.prompt_file: None There is no prompt file Loading default prompts default prompts_path: /path/lib/python3.11/site-packages/crewai/utilities/../translations/en.json

IN I18N load_prompts self.prompt_file: None There is no prompt file Loading default prompts default prompts_path: /path/lib/python3.11/site-packages/crewai/utilities/../translations/en.json


2. Then I input the path to the custom prompt file.
3. Then I see the following logs:

IN I18N load_prompts self.prompt_file: None There is no prompt file Loading default prompts default prompts_path: /path/lib/python3.11/site-packages/crewai/utilities/../translations/en.json

IN I18N load_prompts self.prompt_file: None There is no prompt file Loading default prompts default prompts_path: /path/lib/python3.11/site-packages/crewai/utilities/../translations/en.json

IN I18N load_prompts self.prompt_file: None There is no prompt file Loading default prompts default prompts_path: /path/lib/python3.11/site-packages/crewai/utilities/../translations/en.json

IN I18N load_prompts self.prompt_file: None There is no prompt file Loading default prompts default prompts_path: /path/lib/python3.11/site-packages/crewai/utilities/../translations/en.json

IN I18N load_prompts self.prompt_file: None There is no prompt file Loading default prompts default prompts_path: /path/lib/python3.11/site-packages/crewai/utilities/../translations/en.json

IN I18N load_prompts self.prompt_file: None There is no prompt file Loading default prompts default prompts_path: /path/lib/python3.11/site-packages/crewai/utilities/../translations/en.json

IN I18N load_prompts self.prompt_file: None There is no prompt file Loading default prompts default prompts_path: /path/lib/python3.11/site-packages/crewai/utilities/../translations/en.json

IN I18N load_prompts self.prompt_file: None There is no prompt file Loading default prompts default prompts_path: /path/lib/python3.11/site-packages/crewai/utilities/../translations/en.json

IN I18N load_prompts self.prompt_file: None There is no prompt file Loading default prompts default prompts_path: /path/lib/python3.11/site-packages/crewai/utilities/../translations/en.json

IN I18N load_prompts self.prompt_file: None There is no prompt file Loading default prompts default prompts_path: /path/lib/python3.11/site-packages/crewai/utilities/../translations/en.json

IN I18N load_prompts self.prompt_file: None There is no prompt file Loading default prompts default prompts_path: /path/lib/python3.11/site-packages/crewai/utilities/../translations/en.json

IN I18N load_prompts self.prompt_file: None There is no prompt file Loading default prompts default prompts_path: /path/lib/python3.11/site-packages/crewai/utilities/../translations/en.json

IN I18N load_prompts self.prompt_file: None There is no prompt file Loading default prompts default prompts_path: /path/lib/python3.11/site-packages/crewai/utilities/../translations/en.json

IN I18N load_prompts self.prompt_file: None There is no prompt file Loading default prompts default prompts_path: /path/lib/python3.11/site-packages/crewai/utilities/../translations/en.json

IN I18N load_prompts self.prompt_file: None There is no prompt file Loading default prompts default prompts_path: /path/lib/python3.11/site-packages/crewai/utilities/../translations/en.json

IN I18N load_prompts self.prompt_file: None There is no prompt file Loading default prompts default prompts_path: /path/lib/python3.11/site-packages/crewai/utilities/../translations/en.json

IN I18N load_prompts self.prompt_file: None There is no prompt file Loading default prompts default prompts_path: /path/lib/python3.11/site-packages/crewai/utilities/../translations/en.json

IN I18N load_prompts self.prompt_file: None There is no prompt file Loading default prompts default prompts_path: /path/lib/python3.11/site-packages/crewai/utilities/../translations/en.json

IN I18N load_prompts self.prompt_file: None There is no prompt file Loading default prompts default prompts_path: /path/lib/python3.11/site-packages/crewai/utilities/../translations/en.json

IN I18N load_prompts self.prompt_file: None There is no prompt file Loading default prompts default prompts_path: /path/lib/python3.11/site-packages/crewai/utilities/../translations/en.json

IN KICKOFF self.prompt_file: ./src/prompts/crew_ai_prompts/from-gpt-4o.json

IN I18N load_prompts self.prompt_file: ./src/prompts/crew_ai_prompts/from-gpt-4o.json OPENED PROMPT FILE self._prompts: {...}

IN I18N load_prompts self.prompt_file: ./src/prompts/crew_ai_prompts/from-gpt-4o.json OPENED PROMPT FILE self._prompts: {...}

IN I18N load_prompts self.prompt_file: None There is no prompt file Loading default prompts default prompts_path: /path/lib/python3.11/site-packages/crewai/utilities/../translations/en.json

IN I18N load_prompts self.prompt_file: ./src/prompts/crew_ai_prompts/from-gpt-4o.json OPENED PROMPT FILE self._prompts: {...}

IN I18N load_prompts self.prompt_file: None There is no prompt file Loading default prompts default prompts_path: /path/lib/python3.11/site-packages/crewai/utilities/../translations/en.json

IN I18N load_prompts self.prompt_file: ./src/prompts/crew_ai_prompts/from-gpt-4o.json OPENED PROMPT FILE self._prompts: {...}

IN I18N load_prompts self.prompt_file: None There is no prompt file Loading default prompts default prompts_path: /path/lib/python3.11/site-packages/crewai/utilities/../translations/en.json

IN I18N load_prompts self.prompt_file: ./src/prompts/crew_ai_prompts/from-gpt-4o.json OPENED PROMPT FILE self._prompts: {...}

IN I18N load_prompts self.prompt_file: None There is no prompt file Loading default prompts default prompts_path: /path/lib/python3.11/site-packages/crewai/utilities/../translations/en.json

IN I18N load_prompts self.prompt_file: ./src/prompts/crew_ai_prompts/from-gpt-4o.json OPENED PROMPT FILE self._prompts: {...}

IN I18N load_prompts self.prompt_file: None There is no prompt file Loading default prompts default prompts_path: /path/lib/python3.11/site-packages/crewai/utilities/../translations/en.json

IN I18N load_prompts self.prompt_file: ./src/prompts/crew_ai_prompts/from-gpt-4o.json OPENED PROMPT FILE self._prompts: {...}

IN I18N load_prompts self.prompt_file: None There is no prompt file Loading default prompts default prompts_path: /path/lib/python3.11/site-packages/crewai/utilities/../translations/en.json



4. The crew starts working...

### Possible Solution

Don't know yet...I don't

### Additional context

None
shankinson commented 1 week ago

I noticed a similar issue, which may be related.

The Task class uses the default I18N without loading the passed in prompt file. https://github.com/crewAIInc/crewAI/blob/main/src/crewai/task.py#L54

This is unlike the agent, which has the I18N set to one with the prompt file https://github.com/crewAIInc/crewAI/blob/main/src/crewai/crew.py#L469-L472

You can get around it by doing something like this when creating your tasks:

Task(
        config=self.tasks_config['reporting_task'],
    output_file='report.md',
    i18n=I18N(prompt_file="/path/to/your/prompts/en.json")
)
shankinson commented 1 week ago

I also found another spot where the prompt file appears to not be used. Opened a PR for that here https://github.com/crewAIInc/crewAI/pull/1440