From 9a6557395595f2491ea253048acf65442ed70418 Mon Sep 17 00:00:00 2001 From: Tony Kipkemboi Date: Tue, 22 Jul 2025 13:55:27 -0400 Subject: [PATCH] Feature/update docs (#3205) * docs: add create_directory parameter * docs: remove string guardrails to focus on function guardrails * docs: remove get help from docs.json * docs: update pt-BR docs.json changes --- docs/docs.json | 10 -- docs/en/concepts/tasks.mdx | 171 ++++++++++++++---------------- docs/pt-BR/concepts/tasks.mdx | 190 ++++++++++++++-------------------- 3 files changed, 160 insertions(+), 211 deletions(-) diff --git a/docs/docs.json b/docs/docs.json index 553842ba2..b6cded1a0 100644 --- a/docs/docs.json +++ b/docs/docs.json @@ -32,11 +32,6 @@ "href": "https://chatgpt.com/g/g-qqTuUWsBY-crewai-assistant", "icon": "robot" }, - { - "anchor": "Get Help", - "href": "mailto:support@crewai.com", - "icon": "headset" - }, { "anchor": "Releases", "href": "https://github.com/crewAIInc/crewAI/releases", @@ -372,11 +367,6 @@ "href": "https://chatgpt.com/g/g-qqTuUWsBY-crewai-assistant", "icon": "robot" }, - { - "anchor": "Obter Ajuda", - "href": "mailto:support@crewai.com", - "icon": "headset" - }, { "anchor": "Lançamentos", "href": "https://github.com/crewAIInc/crewAI/releases", diff --git a/docs/en/concepts/tasks.mdx b/docs/en/concepts/tasks.mdx index 0ac1e2c3a..ff4389528 100644 --- a/docs/en/concepts/tasks.mdx +++ b/docs/en/concepts/tasks.mdx @@ -54,10 +54,11 @@ crew = Crew( | **Markdown** _(optional)_ | `markdown` | `Optional[bool]` | Whether the task should instruct the agent to return the final answer formatted in Markdown. Defaults to False. | | **Config** _(optional)_ | `config` | `Optional[Dict[str, Any]]` | Task-specific configuration parameters. | | **Output File** _(optional)_ | `output_file` | `Optional[str]` | File path for storing the task output. | +| **Create Directory** _(optional)_ | `create_directory` | `Optional[bool]` | Whether to create the directory for output_file if it doesn't exist. Defaults to True. | | **Output JSON** _(optional)_ | `output_json` | `Optional[Type[BaseModel]]` | A Pydantic model to structure the JSON output. | | **Output Pydantic** _(optional)_ | `output_pydantic` | `Optional[Type[BaseModel]]` | A Pydantic model for task output. | | **Callback** _(optional)_ | `callback` | `Optional[Any]` | Function/object to be executed after task completion. | -| **Guardrail** _(optional)_ | `guardrail` | `Optional[Union[Callable, str]]` | Function or string description to validate task output before proceeding to next task. | +| **Guardrail** _(optional)_ | `guardrail` | `Optional[Callable]` | Function to validate task output before proceeding to next task. | ## Creating Tasks @@ -87,7 +88,6 @@ research_task: expected_output: > A list with 10 bullet points of the most relevant information about {topic} agent: researcher - guardrail: ensure each bullet contains a minimum of 100 words reporting_task: description: > @@ -334,9 +334,7 @@ Task guardrails provide a way to validate and transform task outputs before they are passed to the next task. This feature helps ensure data quality and provides feedback to agents when their output doesn't meet specific criteria. -**Guardrails can be defined in two ways:** -1. **Function-based guardrails**: Python functions that implement custom validation logic -2. **String-based guardrails**: Natural language descriptions that are automatically converted to LLM-powered validation +Guardrails are implemented as Python functions that contain custom validation logic, giving you complete control over the validation process and ensuring reliable, deterministic results. ### Function-Based Guardrails @@ -378,82 +376,7 @@ blog_task = Task( - On success: it returns a tuple of `(bool, Any)`. For example: `(True, validated_result)` - On Failure: it returns a tuple of `(bool, str)`. For example: `(False, "Error message explain the failure")` -### String-Based Guardrails -String-based guardrails allow you to describe validation criteria in natural language. When you provide a string instead of a function, CrewAI automatically converts it to an `LLMGuardrail` that uses an AI agent to validate the task output. - -#### Using String Guardrails in Python - -```python Code -from crewai import Task - -# Simple string-based guardrail -blog_task = Task( - description="Write a blog post about AI", - expected_output="A blog post under 200 words", - agent=blog_agent, - guardrail="Ensure the blog post is under 200 words and includes practical examples" -) - -# More complex validation criteria -research_task = Task( - description="Research AI trends for 2025", - expected_output="A comprehensive research report", - agent=research_agent, - guardrail="Ensure each finding includes a credible source and is backed by recent data from 2024-2025" -) -``` - -#### Using String Guardrails in YAML - -```yaml -research_task: - description: Research the latest AI developments - expected_output: A list of 10 bullet points about AI - agent: researcher - guardrail: ensure each bullet contains a minimum of 100 words - -validation_task: - description: Validate the research findings - expected_output: A validation report - agent: validator - guardrail: confirm all sources are from reputable publications and published within the last 2 years -``` - -#### How String Guardrails Work - -When you provide a string guardrail, CrewAI automatically: -1. Creates an `LLMGuardrail` instance using the string as validation criteria -2. Uses the task's agent LLM to power the validation -3. Creates a temporary validation agent that checks the output against your criteria -4. Returns detailed feedback if validation fails - -This approach is ideal when you want to use natural language to describe validation rules without writing custom validation functions. - -### LLMGuardrail Class - -The `LLMGuardrail` class is the underlying mechanism that powers string-based guardrails. You can also use it directly for more advanced control: - -```python Code -from crewai import Task -from crewai.tasks.llm_guardrail import LLMGuardrail -from crewai.llm import LLM - -# Create a custom LLMGuardrail with specific LLM -custom_guardrail = LLMGuardrail( - description="Ensure the response contains exactly 5 bullet points with proper citations", - llm=LLM(model="gpt-4o-mini") -) - -task = Task( - description="Research AI safety measures", - expected_output="A detailed analysis with bullet points", - agent=research_agent, - guardrail=custom_guardrail -) -``` - -**Note**: When you use a string guardrail, CrewAI automatically creates an `LLMGuardrail` instance using your task's agent LLM. Using `LLMGuardrail` directly gives you more control over the validation process and LLM selection. ### Error Handling Best Practices @@ -881,21 +804,87 @@ These validations help in maintaining the consistency and reliability of task ex ## Creating Directories when Saving Files -You can now specify if a task should create directories when saving its output to a file. This is particularly useful for organizing outputs and ensuring that file paths are correctly structured. +The `create_directory` parameter controls whether CrewAI should automatically create directories when saving task outputs to files. This feature is particularly useful for organizing outputs and ensuring that file paths are correctly structured, especially when working with complex project hierarchies. + +### Default Behavior + +By default, `create_directory=True`, which means CrewAI will automatically create any missing directories in the output file path: ```python Code -# ... - -save_output_task = Task( - description='Save the summarized AI news to a file', - expected_output='File saved successfully', - agent=research_agent, - tools=[file_save_tool], - output_file='outputs/ai_news_summary.txt', - create_directory=True +# Default behavior - directories are created automatically +report_task = Task( + description='Generate a comprehensive market analysis report', + expected_output='A detailed market analysis with charts and insights', + agent=analyst_agent, + output_file='reports/2025/market_analysis.md', # Creates 'reports/2025/' if it doesn't exist + markdown=True ) +``` -#... +### Disabling Directory Creation + +If you want to prevent automatic directory creation and ensure that the directory already exists, set `create_directory=False`: + +```python Code +# Strict mode - directory must already exist +strict_output_task = Task( + description='Save critical data that requires existing infrastructure', + expected_output='Data saved to pre-configured location', + agent=data_agent, + output_file='secure/vault/critical_data.json', + create_directory=False # Will raise RuntimeError if 'secure/vault/' doesn't exist +) +``` + +### YAML Configuration + +You can also configure this behavior in your YAML task definitions: + +```yaml tasks.yaml +analysis_task: + description: > + Generate quarterly financial analysis + expected_output: > + A comprehensive financial report with quarterly insights + agent: financial_analyst + output_file: reports/quarterly/q4_2024_analysis.pdf + create_directory: true # Automatically create 'reports/quarterly/' directory + +audit_task: + description: > + Perform compliance audit and save to existing audit directory + expected_output: > + A compliance audit report + agent: auditor + output_file: audit/compliance_report.md + create_directory: false # Directory must already exist +``` + +### Use Cases + +**Automatic Directory Creation (`create_directory=True`):** +- Development and prototyping environments +- Dynamic report generation with date-based folders +- Automated workflows where directory structure may vary +- Multi-tenant applications with user-specific folders + +**Manual Directory Management (`create_directory=False`):** +- Production environments with strict file system controls +- Security-sensitive applications where directories must be pre-configured +- Systems with specific permission requirements +- Compliance environments where directory creation is audited + +### Error Handling + +When `create_directory=False` and the directory doesn't exist, CrewAI will raise a `RuntimeError`: + +```python Code +try: + result = crew.kickoff() +except RuntimeError as e: + # Handle missing directory error + print(f"Directory creation failed: {e}") + # Create directory manually or use fallback location ``` Check out the video below to see how to use structured outputs in CrewAI: diff --git a/docs/pt-BR/concepts/tasks.mdx b/docs/pt-BR/concepts/tasks.mdx index 2b9672257..8489245da 100644 --- a/docs/pt-BR/concepts/tasks.mdx +++ b/docs/pt-BR/concepts/tasks.mdx @@ -54,10 +54,11 @@ crew = Crew( | **Markdown** _(opcional)_ | `markdown` | `Optional[bool]` | Se a tarefa deve instruir o agente a retornar a resposta final formatada em Markdown. O padrão é False. | | **Config** _(opcional)_ | `config` | `Optional[Dict[str, Any]]` | Parâmetros de configuração específicos da tarefa. | | **Arquivo de Saída** _(opcional)_| `output_file` | `Optional[str]` | Caminho do arquivo para armazenar a saída da tarefa. | +| **Criar Diretório** _(opcional)_ | `create_directory` | `Optional[bool]` | Se deve criar o diretório para output_file caso não exista. O padrão é True. | | **Saída JSON** _(opcional)_ | `output_json` | `Optional[Type[BaseModel]]` | Um modelo Pydantic para estruturar a saída em JSON. | | **Output Pydantic** _(opcional)_ | `output_pydantic` | `Optional[Type[BaseModel]]` | Um modelo Pydantic para a saída da tarefa. | | **Callback** _(opcional)_ | `callback` | `Optional[Any]` | Função/objeto a ser executado após a conclusão da tarefa. | -| **Guardrail** _(opcional)_ | `guardrail` | `Optional[Union[Callable, str]]` | Função ou descrição em string para validar a saída da tarefa antes de prosseguir para a próxima tarefa. | +| **Guardrail** _(opcional)_ | `guardrail` | `Optional[Callable]` | Função para validar a saída da tarefa antes de prosseguir para a próxima tarefa. | ## Criando Tarefas @@ -87,7 +88,6 @@ research_task: expected_output: > Uma lista com 10 tópicos em bullet points das informações mais relevantes sobre {topic} agent: researcher - guardrail: garanta que cada bullet point contenha no mínimo 100 palavras reporting_task: description: > @@ -332,9 +332,7 @@ analysis_task = Task( Guardrails (trilhas de proteção) de tarefas fornecem uma maneira de validar e transformar as saídas das tarefas antes que elas sejam passadas para a próxima tarefa. Esse recurso assegura a qualidade dos dados e oferece feedback aos agentes quando sua saída não atende a critérios específicos. -**Guardrails podem ser definidos de duas maneiras:** -1. **Guardrails baseados em função**: Funções Python que implementam lógica de validação customizada -2. **Guardrails baseados em string**: Descrições em linguagem natural que são automaticamente convertidas em validação baseada em LLM +Guardrails são implementados como funções Python que contêm lógica de validação customizada, proporcionando controle total sobre o processo de validação e garantindo resultados confiáveis e determinísticos. ### Guardrails Baseados em Função @@ -376,82 +374,7 @@ blog_task = Task( - Em caso de sucesso: retorna uma tupla `(True, resultado_validado)` - Em caso de falha: retorna uma tupla `(False, "mensagem de erro explicando a falha")` -### Guardrails Baseados em String -Guardrails baseados em string permitem que você descreva critérios de validação em linguagem natural. Quando você fornece uma string em vez de uma função, o CrewAI automaticamente a converte em um `LLMGuardrail` que usa um agente de IA para validar a saída da tarefa. - -#### Usando Guardrails de String em Python - -```python Code -from crewai import Task - -# Guardrail simples baseado em string -blog_task = Task( - description="Escreva um post de blog sobre IA", - expected_output="Um post de blog com menos de 200 palavras", - agent=blog_agent, - guardrail="Garanta que o post do blog tenha menos de 200 palavras e inclua exemplos práticos" -) - -# Critérios de validação mais complexos -research_task = Task( - description="Pesquise tendências de IA para 2025", - expected_output="Um relatório abrangente de pesquisa", - agent=research_agent, - guardrail="Garanta que cada descoberta inclua uma fonte confiável e seja respaldada por dados recentes de 2024-2025" -) -``` - -#### Usando Guardrails de String em YAML - -```yaml -research_task: - description: Pesquise os últimos desenvolvimentos em IA - expected_output: Uma lista de 10 bullet points sobre IA - agent: researcher - guardrail: garanta que cada bullet point contenha no mínimo 100 palavras - -validation_task: - description: Valide os achados da pesquisa - expected_output: Um relatório de validação - agent: validator - guardrail: confirme que todas as fontes são de publicações respeitáveis e publicadas nos últimos 2 anos -``` - -#### Como Funcionam os Guardrails de String - -Quando você fornece um guardrail de string, o CrewAI automaticamente: -1. Cria uma instância `LLMGuardrail` usando a string como critério de validação -2. Usa o LLM do agente da tarefa para alimentar a validação -3. Cria um agente temporário de validação que verifica a saída contra seus critérios -4. Retorna feedback detalhado se a validação falhar - -Esta abordagem é ideal quando você quer usar linguagem natural para descrever regras de validação sem escrever funções de validação customizadas. - -### Classe LLMGuardrail - -A classe `LLMGuardrail` é o mecanismo subjacente que alimenta os guardrails baseados em string. Você também pode usá-la diretamente para maior controle avançado: - -```python Code -from crewai import Task -from crewai.tasks.llm_guardrail import LLMGuardrail -from crewai.llm import LLM - -# Crie um LLMGuardrail customizado com LLM específico -custom_guardrail = LLMGuardrail( - description="Garanta que a resposta contenha exatamente 5 bullet points com citações adequadas", - llm=LLM(model="gpt-4o-mini") -) - -task = Task( - description="Pesquise medidas de segurança em IA", - expected_output="Uma análise detalhada com bullet points", - agent=research_agent, - guardrail=custom_guardrail -) -``` - -**Nota**: Quando você usa um guardrail de string, o CrewAI automaticamente cria uma instância `LLMGuardrail` usando o LLM do agente da sua tarefa. Usar `LLMGuardrail` diretamente lhe dá mais controle sobre o processo de validação e seleção de LLM. ### Melhores Práticas de Tratamento de Erros @@ -902,26 +825,7 @@ task = Task( ) ``` -#### Use uma abordagem no-code para validação -```python Code -from crewai import Task - -task = Task( - description="Gerar dados em JSON", - expected_output="Objeto JSON válido", - guardrail="Garanta que a resposta é um objeto JSON válido" -) -``` - -#### Usando YAML - -```yaml -research_task: - ... - guardrail: garanta que cada bullet tenha no mínimo 100 palavras - ... -``` ```python Code @CrewBase @@ -1037,21 +941,87 @@ task = Task( ## Criando Diretórios ao Salvar Arquivos -Agora é possível especificar se uma tarefa deve criar diretórios ao salvar sua saída em arquivo. Isso é útil para organizar outputs e garantir que os caminhos estejam corretos. +O parâmetro `create_directory` controla se o CrewAI deve criar automaticamente diretórios ao salvar saídas de tarefas em arquivos. Este recurso é particularmente útil para organizar outputs e garantir que os caminhos de arquivos estejam estruturados corretamente, especialmente ao trabalhar com hierarquias de projetos complexas. + +### Comportamento Padrão + +Por padrão, `create_directory=True`, o que significa que o CrewAI criará automaticamente qualquer diretório ausente no caminho do arquivo de saída: ```python Code -# ... - -save_output_task = Task( - description='Salve o resumo das notícias de IA em um arquivo', - expected_output='Arquivo salvo com sucesso', - agent=research_agent, - tools=[file_save_tool], - output_file='outputs/ai_news_summary.txt', - create_directory=True +# Comportamento padrão - diretórios são criados automaticamente +report_task = Task( + description='Gerar um relatório abrangente de análise de mercado', + expected_output='Uma análise detalhada de mercado com gráficos e insights', + agent=analyst_agent, + output_file='reports/2025/market_analysis.md', # Cria 'reports/2025/' se não existir + markdown=True ) +``` -#... +### Desabilitando a Criação de Diretórios + +Se você quiser evitar a criação automática de diretórios e garantir que o diretório já exista, defina `create_directory=False`: + +```python Code +# Modo estrito - o diretório já deve existir +strict_output_task = Task( + description='Salvar dados críticos que requerem infraestrutura existente', + expected_output='Dados salvos em localização pré-configurada', + agent=data_agent, + output_file='secure/vault/critical_data.json', + create_directory=False # Gerará RuntimeError se 'secure/vault/' não existir +) +``` + +### Configuração YAML + +Você também pode configurar este comportamento em suas definições de tarefas YAML: + +```yaml tasks.yaml +analysis_task: + description: > + Gerar análise financeira trimestral + expected_output: > + Um relatório financeiro abrangente com insights trimestrais + agent: financial_analyst + output_file: reports/quarterly/q4_2024_analysis.pdf + create_directory: true # Criar automaticamente o diretório 'reports/quarterly/' + +audit_task: + description: > + Realizar auditoria de conformidade e salvar no diretório de auditoria existente + expected_output: > + Um relatório de auditoria de conformidade + agent: auditor + output_file: audit/compliance_report.md + create_directory: false # O diretório já deve existir +``` + +### Casos de Uso + +**Criação Automática de Diretórios (`create_directory=True`):** +- Ambientes de desenvolvimento e prototipagem +- Geração dinâmica de relatórios com pastas baseadas em datas +- Fluxos de trabalho automatizados onde a estrutura de diretórios pode variar +- Aplicações multi-tenant com pastas específicas do usuário + +**Gerenciamento Manual de Diretórios (`create_directory=False`):** +- Ambientes de produção com controles rígidos do sistema de arquivos +- Aplicações sensíveis à segurança onde diretórios devem ser pré-configurados +- Sistemas com requisitos específicos de permissão +- Ambientes de conformidade onde a criação de diretórios é auditada + +### Tratamento de Erros + +Quando `create_directory=False` e o diretório não existe, o CrewAI gerará um `RuntimeError`: + +```python Code +try: + result = crew.kickoff() +except RuntimeError as e: + # Tratar erro de diretório ausente + print(f"Falha na criação do diretório: {e}") + # Criar diretório manualmente ou usar local alternativo ``` Veja o vídeo abaixo para aprender como utilizar saídas estruturadas no CrewAI: