-
Notifications
You must be signed in to change notification settings - Fork 1.6k
Translated English(en) into Brazilian Portuguese (pt_br) #609
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
+8,820
−0
Open
Changes from all commits
Commits
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
172 changes: 172 additions & 0 deletions
units/pt_br/_toctree.yml
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,172 @@ | ||
| - title: Unidade 0. Bem-vindos ao curso | ||
| sections: | ||
| - local: unit0/introduction | ||
| title: Bem-vindos ao curso 🤗 | ||
| - local: unit0/onboarding | ||
| title: Integração | ||
| - local: unit0/discord101 | ||
| title: (Opcional) Discord 101 | ||
| - title: Live 1. Como o curso funciona e sessão de perguntas e respostas | ||
| sections: | ||
| - local: communication/live1 | ||
| title: Live 1. Como o curso funciona e sessão de perguntas e respostas | ||
| - title: Unidade 1. Introdução aos Agentes | ||
| sections: | ||
| - local: unit1/introduction | ||
| title: Introdução | ||
| - local: unit1/what-are-agents | ||
| title: O que é um Agente? | ||
| - local: unit1/quiz1 | ||
| title: Quiz Rápido 1 | ||
| - local: unit1/what-are-llms | ||
| title: O que são LLMs? | ||
| - local: unit1/messages-and-special-tokens | ||
| title: Mensagens e Tokens Especiais | ||
| - local: unit1/tools | ||
| title: O que são Ferramentas? | ||
| - local: unit1/quiz2 | ||
| title: Quiz Rápido 2 | ||
| - local: unit1/agent-steps-and-structure | ||
| title: Compreendendo Agentes de IA através do Ciclo Pensamento-Ação-Observação | ||
| - local: unit1/thoughts | ||
| title: Pensamento, Raciocínio Interno e a Abordagem Re-Act | ||
| - local: unit1/actions | ||
| title: Ações, Permitindo que o Agente Interaja com seu Ambiente | ||
| - local: unit1/observations | ||
| title: Observar, Integrando Feedback para Refletir e Adaptar | ||
| - local: unit1/dummy-agent-library | ||
| title: Biblioteca de Agente Fictício | ||
| - local: unit1/tutorial | ||
| title: Vamos Criar Nosso Primeiro Agente Usando smolagents | ||
| - local: unit1/final-quiz | ||
| title: Quiz Final da Unidade 1 | ||
| - local: unit1/conclusion | ||
| title: Conclusão | ||
| - title: Unidade 2. Frameworks para Agentes de IA | ||
| sections: | ||
| - local: unit2/introduction | ||
| title: Frameworks para Agentes de IA | ||
| - title: Unidade 2.1 O framework smolagents | ||
| sections: | ||
| - local: unit2/smolagents/introduction | ||
| title: Introdução ao smolagents | ||
| - local: unit2/smolagents/why_use_smolagents | ||
| title: Por que usar smolagents? | ||
| - local: unit2/smolagents/quiz1 | ||
| title: Quiz Rápido 1 | ||
| - local: unit2/smolagents/code_agents | ||
| title: Construindo Agentes que Usam Código | ||
| - local: unit2/smolagents/tool_calling_agents | ||
| title: Escrevendo ações como trechos de código ou objetos JSON | ||
| - local: unit2/smolagents/tools | ||
| title: Ferramentas | ||
| - local: unit2/smolagents/retrieval_agents | ||
| title: Agentes de Recuperação | ||
| - local: unit2/smolagents/quiz2 | ||
| title: Quiz Rápido 2 | ||
| - local: unit2/smolagents/multi_agent_systems | ||
| title: Sistemas Multi-Agente | ||
| - local: unit2/smolagents/vision_agents | ||
| title: Agentes de Visão e Navegador | ||
| - local: unit2/smolagents/final_quiz | ||
| title: Quiz Final | ||
| - local: unit2/smolagents/conclusion | ||
| title: Conclusão | ||
| - title: Unidade 2.2 O framework LlamaIndex | ||
| sections: | ||
| - local: unit2/llama-index/introduction | ||
| title: Introdução ao LlamaIndex | ||
| - local: unit2/llama-index/llama-hub | ||
| title: Introdução ao LlamaHub | ||
| - local: unit2/llama-index/components | ||
| title: O que são Componentes no LlamaIndex? | ||
| - local: unit2/llama-index/tools | ||
| title: Usando Ferramentas no LlamaIndex | ||
| - local: unit2/llama-index/quiz1 | ||
| title: Quiz Rápido 1 | ||
| - local: unit2/llama-index/agents | ||
| title: Usando Agentes no LlamaIndex | ||
| - local: unit2/llama-index/workflows | ||
| title: Criando Fluxos de Trabalho Agênticos no LlamaIndex | ||
| - local: unit2/llama-index/quiz2 | ||
| title: Quiz Rápido 2 | ||
| - local: unit2/llama-index/conclusion | ||
| title: Conclusão | ||
| - title: Unidade 2.3 O framework LangGraph | ||
| sections: | ||
| - local: unit2/langgraph/introduction | ||
| title: Introdução ao LangGraph | ||
| - local: unit2/langgraph/when_to_use_langgraph | ||
| title: O que é LangGraph? | ||
| - local: unit2/langgraph/building_blocks | ||
| title: Blocos de Construção do LangGraph | ||
| - local: unit2/langgraph/first_graph | ||
| title: Construindo seu Primeiro LangGraph | ||
| - local: unit2/langgraph/document_analysis_agent | ||
| title: Grafo de Análise de Documentos | ||
| - local: unit2/langgraph/quiz1 | ||
| title: Quiz Rápido 1 | ||
| - local: unit2/langgraph/conclusion | ||
| title: Conclusão | ||
| - title: Unidade 3. Caso de Uso para RAG Agêntico | ||
| sections: | ||
| - local: unit3/agentic-rag/introduction | ||
| title: Introdução ao Caso de Uso para RAG Agêntico | ||
| - local: unit3/agentic-rag/agentic-rag | ||
| title: Geração Aumentada por Recuperação Agêntica (RAG) | ||
| - local: unit3/agentic-rag/invitees | ||
| title: Criando uma Ferramenta RAG para Histórias de Convidados | ||
| - local: unit3/agentic-rag/tools | ||
| title: Construindo e Integrando Ferramentas para seu Agente | ||
| - local: unit3/agentic-rag/agent | ||
| title: Criando seu Agente de Gala | ||
| - local: unit3/agentic-rag/conclusion | ||
| title: Conclusão | ||
| - title: Unidade 4. Projeto Final - Criar, Testar e Certificar seu Agente | ||
| sections: | ||
| - local: unit4/introduction | ||
| title: Introdução à Unidade Final | ||
| - local: unit4/what-is-gaia | ||
| title: O que é GAIA? | ||
| - local: unit4/hands-on | ||
| title: O Hands-On Final | ||
| - local: unit4/get-your-certificate | ||
| title: Obtenha seu Certificado de Excelência | ||
| - local: unit4/conclusion | ||
| title: Conclusão do Curso | ||
| - local: unit4/additional-readings | ||
| title: O que você deveria aprender agora? | ||
| - title: Unidade Bônus 1. Ajuste fino de um LLM para Chamada de Funções | ||
| sections: | ||
| - local: bonus-unit1/introduction | ||
| title: Introdução | ||
| - local: bonus-unit1/what-is-function-calling | ||
| title: O que é Chamada de Funções? | ||
| - local: bonus-unit1/fine-tuning | ||
| title: Vamos Fazer o Ajuste Fino do seu modelo para Chamada de Funções | ||
| - local: bonus-unit1/conclusion | ||
| title: Conclusão | ||
| - title: Unidade Bônus 2. Observabilidade e Avaliação de Agentes | ||
| sections: | ||
| - local: bonus-unit2/introduction | ||
| title: Introdução | ||
| - local: bonus-unit2/what-is-agent-observability-and-evaluation | ||
| title: O que é observabilidade e avaliação de agentes? | ||
| - local: bonus-unit2/monitoring-and-evaluating-agents-notebook | ||
| title: Monitorando e avaliando agentes | ||
| - local: bonus-unit2/quiz | ||
| title: Quiz | ||
| - title: Unidade Bônus 3. Agentes em Jogos com Pokémon | ||
| sections: | ||
| - local: bonus-unit3/introduction | ||
| title: Introdução | ||
| - local: bonus-unit3/state-of-art | ||
| title: O Estado da Arte no Uso de LLMs em Jogos | ||
| - local: bonus-unit3/from-llm-to-agents | ||
| title: De LLMs para Agentes de IA | ||
| - local: bonus-unit3/building_your_pokemon_agent | ||
| title: Construa seu Próprio Agente de Batalha Pokémon | ||
| - local: bonus-unit3/launching_agent_battle | ||
| title: Lançando seu Agente de Batalha Pokémon | ||
| - local: bonus-unit3/conclusion | ||
| title: Conclusão |
13 changes: 13 additions & 0 deletions
units/pt_br/bonus-unit1/conclusion.mdx
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,13 @@ | ||
| # Conclusão [[conclusion]] | ||
|
|
||
| Parabéns por concluir esta primeira Unidade Bônus 🥳 | ||
|
|
||
| Você acabou de **dominar a compreensão de chamadas de função e como ajustar seu modelo para executá-las**! | ||
|
|
||
| Se pudermos deixar apenas um conselho agora, é para você **fazer fine-tuning em modelos diferentes**. A **melhor maneira de aprender é colocando a mão na massa.** | ||
|
|
||
| Na próxima unidade, você vai aprender a usar **frameworks de ponta como `smolagents`, `LlamaIndex` e `LangGraph`**. | ||
|
|
||
| Por fim, adoraríamos **saber o que você achou do curso e como podemos melhorá-lo**. Se tiver algum feedback, por favor 👉 [preencha este formulário](https://docs.google.com/forms/d/e/1FAIpQLSe9VaONn0eglax0uTwi29rIn4tM7H2sYmmybmG5jJNlE5v0xA/viewform?usp=dialog) | ||
|
|
||
| ### Continue aprendendo, continue incrível 🤗 |
48 changes: 48 additions & 0 deletions
units/pt_br/bonus-unit1/fine-tuning.mdx
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,48 @@ | ||
| # Vamos Fazer Fine-Tuning do Seu Modelo para Function Calling | ||
|
|
||
| Estamos prontos para ajustar nosso primeiro modelo para function calling 🔥. | ||
|
|
||
| ## Como treinamos nosso modelo para function calling? | ||
|
|
||
| > Resposta: precisamos de **dados** | ||
|
|
||
| O processo de treinamento de um modelo pode ser dividido em 3 etapas: | ||
|
|
||
| 1. **O modelo é pré-treinado em uma grande quantidade de dados**. O resultado dessa etapa é um **modelo pré-treinado**. Por exemplo, [google/gemma-2-2b](https://huggingface.co/google/gemma-2-2b). É um modelo base e sabe apenas **prever o próximo token sem grandes capacidades de seguir instruções**. | ||
|
|
||
| 2. Para ser útil em um contexto de chat, o modelo precisa então ser **ajustado (fine-tuned)** para seguir instruções. Nessa etapa, ele pode ser treinado pelos criadores, pela comunidade open-source, por você ou por qualquer pessoa. Por exemplo, [google/gemma-2-2b-it](https://huggingface.co/google/gemma-2-2b-it) é um modelo ajustado para instruções pela equipe do projeto Gemma, do Google. | ||
|
|
||
| 3. O modelo pode então ser **alinhado** às preferências do criador. Pense, por exemplo, em um modelo de atendimento ao cliente que jamais deve ser grosseiro. | ||
|
|
||
| Produtos completos como Gemini ou Mistral **passam pelas 3 etapas**, enquanto os modelos disponíveis no Hugging Face podem ter completado uma ou mais dessas fases. | ||
|
|
||
| Neste tutorial, vamos construir um modelo com function calling a partir do [google/gemma-2-2b-it](https://huggingface.co/google/gemma-2-2b-it). Escolhemos o modelo já ajustado [google/gemma-2-2b-it](https://huggingface.co/google/gemma-2-2b-it) em vez do modelo base [google/gemma-2-2b](https://huggingface.co/google/gemma-2-2b) porque ele já foi melhorado para o nosso caso de uso. | ||
|
|
||
| Partir do modelo apenas pré-treinado **exigiria muito mais treinamento para aprender a seguir instruções, conversar E executar function calling**. | ||
|
|
||
| Ao começar pelo modelo ajustado para instruções, **minimizamos a quantidade de informação que o nosso modelo precisa aprender**. | ||
|
|
||
| ## LoRA (Low-Rank Adaptation of Large Language Models) | ||
|
|
||
| LoRA é uma técnica de treinamento popular e leve que **reduz significativamente o número de parâmetros treináveis**. | ||
|
|
||
| Ela funciona **inserindo um pequeno conjunto de novos pesos como um adaptador dentro do modelo para serem treinados**. Isso torna o treinamento com LoRA muito mais rápido, eficiente em memória e gera pesos menores (algumas centenas de MB), fáceis de armazenar e compartilhar. | ||
|
|
||
| <img src="https://huggingface.co/datasets/agents-course/course-images/resolve/main/en/unit1/blog_multi-lora-serving_LoRA.gif" alt="LoRA inference" width="50%"/> | ||
|
|
||
| LoRA atua adicionando pares de matrizes de decomposição de posto baixo às camadas do Transformer, normalmente focando nas camadas lineares. Durante o treinamento, "congelamos" o restante do modelo e atualizamos apenas os pesos desses adaptadores recém-adicionados. | ||
|
|
||
| Ao fazer isso, o número de **parâmetros** que precisamos treinar cai bastante, já que apenas os pesos dos adaptadores são atualizados. | ||
|
|
||
| Durante a inferência, a entrada passa tanto pelo adaptador quanto pelo modelo base; também é possível fundir esses pesos com o modelo base, sem gerar latência adicional. | ||
|
|
||
| LoRA é especialmente útil para adaptar modelos de linguagem **grandes** a tarefas ou domínios específicos mantendo os requisitos de recursos sob controle. Isso ajuda a reduzir a memória **necessária** para treinar um modelo. | ||
|
|
||
| Se quiser aprender mais sobre como LoRA funciona, confira este [tutorial](https://huggingface.co/learn/nlp-course/chapter11/4?fw=pt). | ||
|
|
||
| ## Fazendo Fine-Tuning de um Modelo para Function Calling | ||
|
|
||
| Você pode acessar o notebook do tutorial 👉 [aqui](https://huggingface.co/agents-course/notebooks/blob/main/bonus-unit1/bonus-unit1.ipynb). | ||
|
|
||
| Depois, clique em [](https://colab.research.google.com/#fileId=https://huggingface.co/agents-course/notebooks/blob/main/bonus-unit1/bonus-unit1.ipynb) para executá-lo em um Notebook Colab. | ||
|
|
52 changes: 52 additions & 0 deletions
units/pt_br/bonus-unit1/introduction.mdx
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,52 @@ | ||
| # Introdução | ||
|
|
||
|  | ||
|
|
||
| Bem-vindo a esta primeira **Unidade Bônus**, na qual você vai aprender a **fazer fine-tuning de um Large Language Model (LLM) para chamadas de função**. | ||
|
|
||
| Quando falamos de LLMs, function calling está rapidamente se tornando uma técnica indispensável. | ||
|
|
||
| A ideia é que, em vez de depender apenas de abordagens baseadas em prompt como fizemos na Unidade 1, o function calling treina seu modelo para **tomar ações e interpretar observações durante a fase de treinamento**, deixando sua IA mais robusta. | ||
|
|
||
| > **Quando devo fazer esta Unidade Bônus?** | ||
| > | ||
| > Esta seção é **opcional** e mais avançada do que a Unidade 1, então sinta-se à vontade para fazê-la agora ou revisitá-la quando seu conhecimento tiver evoluído com este curso. | ||
| > | ||
| > Mas não se preocupe, esta Unidade Bônus foi concebida para trazer todas as informações necessárias. Vamos guiá-lo por cada conceito essencial de fine-tuning para chamadas de função, mesmo que você ainda não domine todos os detalhes desse processo. | ||
|
|
||
| A melhor forma de aproveitar esta Unidade Bônus é: | ||
|
|
||
| 1. Saber como fazer fine-tuning de um LLM com Transformers; se ainda não souber, [confira isto](https://huggingface.co/learn/nlp-course/chapter3/1?fw=pt). | ||
| 2. Conhecer o `SFTTrainer` para ajustar o modelo; para saber mais, [acesse esta documentação](https://huggingface.co/learn/nlp-course/en/chapter11/1). | ||
|
|
||
| --- | ||
|
|
||
| ## O que você vai aprender | ||
|
|
||
| 1. **Function Calling** | ||
| Como LLMs modernos estruturam suas conversas, permitindo acionar **Ferramentas**. | ||
|
|
||
| 2. **LoRA (Low-Rank Adaptation)** | ||
| Um método de fine-tuning **leve e eficiente** que reduz o custo computacional e de armazenamento. LoRA torna o treinamento de grandes modelos *mais rápido, barato e fácil* de colocar em produção. | ||
|
|
||
| 3. **O ciclo Pensar → Agir → Observar** em modelos com function calling | ||
| Uma abordagem simples e poderosa para estruturar como o seu modelo decide quando (e como) chamar funções, acompanhar etapas intermediárias e interpretar resultados vindos de ferramentas externas ou APIs. | ||
|
|
||
| 4. **Novos tokens especiais** | ||
| Vamos apresentar **marcadores especiais** que ajudam o modelo a diferenciar entre: | ||
| - raciocínio interno ("chain-of-thought"); | ||
| - chamadas de função enviadas; | ||
| - respostas que retornam de ferramentas externas. | ||
|
|
||
| --- | ||
|
|
||
| Ao final desta unidade bônus, você será capaz de: | ||
|
|
||
| - **Entender** o funcionamento interno de APIs no contexto de Ferramentas; | ||
| - **Fazer fine-tuning** de um modelo usando a técnica LoRA; | ||
| - **Implementar** e **ajustar** o ciclo Pensar → Agir → Observar para criar fluxos de trabalho robustos e fáceis de manter para function calling; | ||
| - **Criar e utilizar** tokens especiais para separar de forma fluida o raciocínio interno das ações externas do modelo. | ||
|
|
||
| E você **terá ajustado seu próprio modelo para realizar chamadas de função.** 🔥 | ||
|
|
||
| Vamos mergulhar em **function calling**! |
78 changes: 78 additions & 0 deletions
units/pt_br/bonus-unit1/what-is-function-calling.mdx
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,78 @@ | ||
| # O que é Function Calling? | ||
|
|
||
| Function calling é uma **maneira de um LLM executar ações em seu ambiente**. Ele foi [introduzido pela primeira vez no GPT-4](https://openai.com/index/function-calling-and-other-api-updates/) e depois reproduzido em outros modelos. | ||
|
|
||
| Assim como as ferramentas de um Agente, function calling dá ao modelo a capacidade de **agir sobre o ambiente**. Entretanto, essa capacidade **é aprendida pelo modelo** e depende **menos de prompting do que outras técnicas baseadas em agentes**. | ||
|
|
||
| Na Unidade 1, o agente **não aprendeu a usar as ferramentas**; apenas fornecemos a lista e confiamos que o modelo **conseguiria generalizar para definir um plano usando essas Ferramentas**. | ||
|
|
||
| Aqui, **com function calling, o agente passa por fine-tuning (treinamento) para usar Ferramentas**. | ||
|
|
||
| ## Como o modelo "aprende" a tomar uma ação? | ||
|
|
||
| Na Unidade 1, exploramos o fluxo de trabalho geral de um agente. Depois que o usuário fornece ferramentas ao agente e o instrui com uma solicitação, o modelo passa pelo ciclo: | ||
|
|
||
| 1. *Pensar*: Quais ações preciso executar para atingir o objetivo? | ||
| 2. *Agir*: Formatar a ação com os parâmetros corretos e interromper a geração. | ||
| 3. *Observar*: Receber o resultado da execução. | ||
|
|
||
| Em uma conversa "típica" com um modelo via API, as mensagens alternam entre usuário e assistente, como neste exemplo: | ||
|
|
||
| ```python | ||
| conversation = [ | ||
| {"role": "user", "content": "I need help with my order"}, | ||
| {"role": "assistant", "content": "I'd be happy to help. Could you provide your order number?"}, | ||
| {"role": "user", "content": "It's ORDER-123"}, | ||
| ] | ||
| ``` | ||
|
|
||
| Function calling adiciona **novos papéis à conversa**! | ||
|
|
||
| 1. Um novo papel para uma **Ação** | ||
| 2. Um novo papel para uma **Observação** | ||
|
|
||
| Se usarmos a [API da Mistral](https://docs.mistral.ai/capabilities/function_calling/) como exemplo, ela ficaria assim: | ||
|
|
||
| ```python | ||
| conversation = [ | ||
| { | ||
| "role": "user", | ||
| "content": "What's the status of my transaction T1001?" | ||
| }, | ||
| { | ||
| "role": "assistant", | ||
| "content": "", | ||
| "function_call": { | ||
| "name": "retrieve_payment_status", | ||
| "arguments": "{\"transaction_id\": \"T1001\"}" | ||
| } | ||
| }, | ||
| { | ||
| "role": "tool", | ||
| "name": "retrieve_payment_status", | ||
| "content": "{\"status\": \"Paid\"}" | ||
| }, | ||
| { | ||
| "role": "assistant", | ||
| "content": "Your transaction T1001 has been successfully paid." | ||
| } | ||
| ] | ||
| ``` | ||
|
|
||
| > ... Mas você disse que existe um novo papel para chamadas de função? | ||
|
|
||
| **Sim e não**. Neste caso, e em muitas outras APIs, o modelo formata a ação que deve executar como uma mensagem de "assistant". O template de chat então representa isso com **tokens especiais** para function calling. | ||
|
|
||
| - `[AVAILABLE_TOOLS]` – Início da lista de ferramentas disponíveis | ||
| - `[/AVAILABLE_TOOLS]` – Fim da lista de ferramentas disponíveis | ||
| - `[TOOL_CALLS]` – Chamada a uma ferramenta (ou seja, uma "Ação") | ||
| - `[TOOL_RESULTS]` – "Observa" o resultado da ação | ||
| - `[/TOOL_RESULTS]` – Fim da observação (ou seja, o modelo pode voltar a decodificar) | ||
|
|
||
| Falaremos novamente sobre function calling ao longo do curso, mas, se quiser se aprofundar, confira [esta excelente seção da documentação](https://docs.mistral.ai/capabilities/function_calling/). | ||
|
|
||
| --- | ||
|
|
||
| Agora que entendemos o que é function calling e como ele funciona, vamos **adicionar essas capacidades a um modelo que ainda não as possui**: o [google/gemma-2-2b-it](https://huggingface.co/google/gemma-2-2b-it), incluindo novos tokens especiais no modelo. | ||
|
|
||
| Para conseguir fazer isso, **precisamos primeiro compreender fine-tuning e LoRA**. |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.