Skip to content

Integrate Memory Modules into Your AI Assistant

Overview

Memory modules are crucial components in building AI assistants that can retain context, personalize interactions, and provide coherent responses over time. By integrating memory modules, your assistant can remember previous conversations, utilize environment variables, and retrieve relevant information to enhance user experience. This tutorial will guide you through configuring and using memory modules.

Configuration

To leverage memory modules in your assistant, you need to define their configurations in a YAML file. This configuration specifies the types of memory modules and their parameters, allowing your assistant to store and access different kinds of information.

Configuration Parameters

  • memory_config: Top-level key for memory module configurations.
  • memory_modules: A list of memory modules to integrate.
    • memory_name: A unique identifier for the memory module.
    • memory_class: The class name of the memory module.
    • kwargs: Additional parameters specific to the memory module.

Here’s an example configuration (config.yaml):

memory_config:  # Top-level configuration for all memory modules
  memory_modules:  # List of memory modules to integrate
    - memory_name: chat_history  # Unique identifier for this memory module
      memory_class: ChatMemoryModule  # Class that implements conversation history storage
      kwargs:  # Configuration parameters for ChatMemoryModule
        n_rounds: 5  # Default number of conversation rounds to retrieve (overridable at runtime)
        max_context: 5000  # Maximum character count for retrieved history (overridable at runtime)
    - memory_name: env_variable  # Unique identifier for environment variables memory
      memory_class: VariableMemoryModule  # Class that stores key-value pairs
      kwargs:  # Configuration parameters for VariableMemoryModule
        variables:  # Dictionary of environment variables
          event_title: "FIFA World Cup"  # Title of the event
          event_year: "2022"  # Year of the event
          supporting_team: "Brazil"  # User's favorite team
          main_competitors: "Argentina, Germany, France"  # Main competing teams

orchestrator:  # Orchestrator configuration for managing agent interactions
  agent_list:  # List of agents available to the orchestrator
    - agent_name: "Search Agent"  # Agent that performs web searches
    - agent_name: "Memory Insight Agent"  # Agent that uses memory for context-aware responses

utility_agents:  # Definitions of utility agents
  - agent_class: SearchAgent  # Built-in search agent class
    agent_name: "Search Agent"  # Name referenced by orchestrator
    agent_description: "The Search Agent retrieves information from the web."  # Description of agent capabilities

  - agent_class: CustomAgent  # Custom agent class (user-defined)
    agent_name: "Memory Insight Agent"  # Name referenced by orchestrator
    agent_description: "The Memory Insight Agent can help you by utilizing stored memory to provide context-aware responses about different sports tournaments."  # Description of agent capabilities

Memory Modules & Basics

Chat History Memory Module (ChatMemoryModule)

The Chat History Memory Module is designed to store and retrieve past conversation rounds, enabling your AI assistant to maintain context across interactions.

Purpose

Store previous conversation rounds to maintain context and provide coherent, contextually-aware responses.

Configuration Parameters

  • n_rounds (optional): Default number of maximum conversation rounds to retrieve. If not specified, defaults to 3. Can be overridden during retrieval.
  • max_context (optional): Maximum total character count for retrieved conversation history. If not specified, defaults to 10,000 characters. Can be overridden during retrieval.

Understanding Conversation Rounds

A conversation round is a fundamental concept in chat memory management. It represents a complete interaction cycle:

What is a Round?

  • One round = One user message + All subsequent agent/assistant responses before the next user message
  • Rounds help organize conversation history into logical interaction units
  • Each round starts with a user role message and includes all following messages until the next user message

Visual Example:

Round 1:
  user: "What is the weather today?"
  assistant: "Let me check the weather for you."
  weather_agent: "It's sunny and 72°F."

Round 2:
  user: "Should I bring an umbrella?"
  assistant: "Based on the sunny weather, you won't need an umbrella today."

Round 3:
  user: "Thanks!"
  assistant: "You're welcome! Have a great day!"

In this example:

  • Round 1 contains 3 messages (1 user + 2 agent responses)
  • Round 2 contains 2 messages (1 user + 1 agent response)
  • Round 3 contains 2 messages (1 user + 1 agent response)
  • Total: 3 rounds with 7 messages

Why Rounds Matter:

  • When you set n_rounds=2, you retrieve the last 2 complete interaction cycles (not 2 individual messages)
  • Rounds preserve the context of multi-agent conversations
  • Memory limits like n_rounds=5 mean "keep the last 5 user interactions and all their responses"

Understanding Character Limits

The chat history memory system manages conversation context using character-based limits (not token-based). When retrieving memory, you can control how much history is returned using the n_rounds parameter (limits the number of conversation rounds) and the max_context parameter (limits the total character count). See Configuration Parameters for default values and how to override them.

How Chat History Truncation Works

When the conversation history exceeds the specified limits, the system automatically manages the content:

  1. Oldest-First Dropping: When multiple rounds don't fit within the character limit, older conversation rounds are dropped first
  2. Front Truncation: If even a single round exceeds the character limit, the system keeps the most recent characters from that round, truncating from the beginning
  3. Truncation Notice: When content is truncated, a notice is automatically prepended: "Notice: Chat history truncated due to maximum context window. "
  4. Priority: More recent content is always prioritized to maintain the most relevant context
Handling Single Large Messages

When a single message exceeds the max_context limit, special truncation logic applies to preserve the most recent and relevant information:

How It Works:

  1. The system first reserves space for the truncation notice (~65 characters)
  2. Calculates the remaining budget: effective_budget = max_context - notice_length
  3. If multiple messages exist in the round, older messages are dropped first
  4. If only one message remains and still exceeds the limit, front truncation is applied:
  5. The beginning of the message is removed
  6. The last N characters are kept (where N = effective_budget)
  7. The truncation notice is prepended to the kept portion

Visual Example:

Suppose you have max_context=1000 and a single message with 2000 characters:

Original message (2000 chars):
"The 2022 FIFA World Cup in Qatar featured 32 teams competing across multiple stages.
[...middle content...]
Argentina ultimately defeated France in a dramatic penalty shootout to claim the title."

After truncation (fits within 1000 chars):
"Notice: Chat history truncated due to maximum context window. ...across multiple stages.
The knockout rounds featured upsets, with Morocco reaching the semi-finals. Argentina
ultimately defeated France in a dramatic penalty shootout to claim the title."
│                                                              │
│                                                              │
└─ Truncation notice (~65 chars)                              └─ Last ~935 chars preserved

The beginning is removed, but the conclusion and outcome are preserved.

Environment Variable Memory Module (VariableMemoryModule)

The Environment Variable Memory Module stores key-value pairs that can be used to personalize your AI assistant's responses based on user preferences, context, or application state.

Purpose

Store environment variables (key-value pairs) that can be used to personalize responses and maintain application-specific context across conversations.

Configuration Parameters

  • variables: A dictionary of key-value pairs representing environment variables.

How Stored Variables Are Used

Environment variables are typically included in agent prompts to provide context and personalization. For example:

memory_config:
  memory_modules:
    - memory_name: env_variable
      memory_class: VariableMemoryModule
      kwargs:
        variables:
          event_title: "FIFA World Cup"
          event_year: "2022"
          supporting_team: "Brazil"

These variables can then be retrieved and included in your agent's prompt to provide personalized context.

Adding or Overriding Variables at Runtime

You can dynamically add or update environment variables during runtime using the add_memory() method described below.

Memory API methods

This section covers the API methods available for interacting with memory modules.

retrieve_memory()

The retrieve_memory() method retrieves memory content as a formatted string. This method works with both chat history and environment variable memory modules.

Parameters

The method accepts the following parameters:

  • source (required): The memory module name (e.g., "chat_history")
  • n_rounds (optional): Number of most recent conversation rounds to retrieve. Overrides the default set in configuration
  • max_context (optional): Maximum total character count for the retrieved content. Overrides the default set in configuration
  • format (optional): Return format - either 'str' (default, human-readable) or 'json_string' (JSON array format)
  • truncation_notice (optional): Custom message to use when content is truncated (chat history only)
  • no_history_message (optional): Custom message to return when no history exists (chat history only)

Applicable to: Both chat history (source="chat_history") and environment variables (source="env_variable").

Note that n_rounds, max_context, format, truncation_notice, and no_history_message are specific to chat history retrieval.

Returned Format

For Chat History (source="chat_history"):

The default 'str' format returns memory in the pattern <role>: <content>, where:

  • <role>: The agent or user role that generated the message
    • "user" - User messages
    • Agent names (e.g., "orchestrator", "Memory Insight Agent", "Search Agent")
  • <content>: The actual message content

Rounds are separated by blank lines for readability.

For Environment Variables (source="env_variable"):

Returns a string representation of the stored key-value pairs:

event_title: "FIFA World Cup"
event_year: "2022"
supporting_team: "Brazil"

Note: The retrieve_memory() method returns the memory content directly as a string, not as a response object. This makes it easy to use the retrieved information in your applications.

add_memory()

The add_memory() method adds or updates environment variables in memory. This is particularly useful for dynamic personalization at runtime.

Note: This method is used for environment variables only and does not apply to chat history. Chat history is automatically managed by the system as conversations occur.

Parameters

  • source (required): The memory module name (typically "env_variable")
  • variables_dict (required): A dictionary containing the key-value pairs to add or update

Usage

# Add environment variables to memory
await dc.add_memory(
    source="env_variable",
    variables_dict={
        "user_preference": "dark_mode",
        "language": "English",
        "timezone": "UTC"
    }
)

Key Points:

  • New variables are added to the existing memory
  • Existing variables with the same key are updated
  • Useful for maintaining dynamic application state throughout a session
  • Changes persist for the duration of the session

Parsing and Handling Retrieved Memory

When working with retrieved memory, you may need to parse the content for use in your application:

For Chat History:

  • Parse line-by-line for string format (role: content pattern)
  • Use JSON parsing for format="json_string" to get structured message objects

For Environment Variables:

  • Parse the key-value pairs as needed
  • Use the values to personalize prompts and agent behavior

See the "Examples" section below for practical code examples.

Examples

This section demonstrates how to use memory modules in your AI assistant through practical code examples.

Define Your Custom Python Agent

First, define a custom agent that utilizes the memory modules. For example, a simple agent that responds based on user queries, environment variables, and chat history:

import asyncio
import os
from typing import Optional

from air import AsyncAIRefinery, DistillerClient
from dotenv import load_dotenv

load_dotenv() # loads your API_KEY from your local '.env' file
api_key=str(os.getenv("API_KEY"))



async def memory_insight_agent(
    query: str, env_variable: Optional[dict] = None, chat_history: Optional[str] = None
):
    """
    A simple agent that generates responses based on user queries,
    environment variables, and chat history.

    Args:
        query (str): User query to be processed.
        env_variables (dict): Environment variables that can be used to personalize responses.
        chat_history (str): Previous conversation rounds to maintain context.

    Returns:
        str: Assistant's response.
    """
    # Construct the prompt with environment variables and chat history
    prompt = f"""
    You are a helpful personal assistant focused on the FIFA World Cup 2022. Use the user's environment variables and previous conversation to provide a personalized and relevant response to the user's query. Ensure that your response is informed by their preferences and past interactions.

    Environment Variables:
    {env_variable}

    Chat History:
    {chat_history}

    User Query: {query}
    Assistant:
    """

    # Initialize the AsyncAIRefinery client using the authenticated credentials
    client = AsyncAIRefinery(api_key=api_key)

    # print(prompt)

    # Get the response from the language model
    response = await client.chat.completions.create(
        messages=[{"role": "user", "content": prompt}],
        model="meta-llama/Llama-3.1-70B-Instruct",
    )

    # Return the assistant's response
    return str(response.choices[0].message.content).strip()

Initialize the Distiller Client and Add Memory Modules

Next, initialize the DistillerClient, create a project, define custom agent mappings, and add memory entries.

async def custom_demo():
    """
    Demonstrates the use of environment variables and chat history as memory in an AI assistant focused on the FIFA World Cup 2022.
    """
    # Initialize a Distiller client for managing interactions
    distiller_client = DistillerClient(api_key=api_key)

    # Create/register a new Distiller project
    distiller_client.create_project(config_path="config.yaml", project="memory_tutorial")


    # Define custom agent mappings
    executor_dict = {
        "Memory Insight Agent": memory_insight_agent,
    }

    # Use the Distiller client
    async with distiller_client(
        project="memory_tutorial",
        uuid="test_user",
        executor_dict=executor_dict,
    ) as dc:

        # Add environment variables to the memory
        await dc.add_memory(
            source="env_variable",
            variables_dict={
                "match_location": "Qatar",
                "fan_experience": "High excitement and engagement",
            },
        )
        print("\n[INFO] Environment variables added to memory.")

        # List of user queries to process
        queries = [
            "Who are our main competitors in this world cup?",
            "Which country is hosting the tournament?",
        ]

        print("\n\n=== Custom Demo ===")
        for query in queries:
            responses = await dc.query(query=query)
            print("-------------------------")
            print(f"\nUser Query: {query}")
            async for response in responses:
                print(f"Response:\n{response['content']}")

        # Demonstrate memory retrieval and usage
        print("\n=== Memory Retrieval Demo ===")

        # Retrieve chat history
        chat_memory = await dc.retrieve_memory(source="chat_history", n_rounds=3)
        print(f"Retrieved Chat History Content:\n{chat_memory}")

        # Retrieve environment variables
        env_memory = await dc.retrieve_memory(source="env_variable")
        print(f"Retrieved Environment Variables:\n{env_memory}")

if __name__ == "__main__":
    asyncio.run(custom_demo())

Explanation

  • DistillerClient: Manages interactions with the Distiller framework.
  • create_project: Initializes a new project using the configuration file.
  • executor_dict: Maps the agent name to the custom agent function.
  • add_memory: Adds environment variables to the assistant's memory under the specified source (env_variable).
  • Processing Queries: The assistant processes each query, accessing memory modules to generate informed responses.
  • Memory Retrieval Demo: Shows how to retrieve memory content as a string using retrieve_memory().

Expected Output

After running the custom_demo function, the assistant should provide responses that utilize both the environment variables and chat history. The output might look like:

=== Custom Demo ===
-------------------------

User Query: Who are our main competitors in this world cup?
Response:
I remember we discussed this earlier. In the FIFA World Cup 2022, Brazil's main competitors are Argentina, Germany, and France. These teams have a strong track record and are expected to give Brazil a tough competition. Are you excited to see how Brazil will perform against these teams?
-------------------------

User Query: Which country is hosting the tournament?
Response:
We've been over this before! I recall you asking about the host country earlier. The FIFA World Cup 2022 is being hosted by Qatar. Isn't it exciting to think about the thrilling matches that will take place in this beautiful country? By the way, have you checked the schedule for Brazil's matches? I can help you with that if you'd like!

=== Memory Retrieval Demo ===
Retrieved Chat History Content:
user: Who are our main competitors in this world cup?
Memory Insight Agent: I remember we discussed this earlier. In the FIFA World Cup 2022, Brazil's main competitors are Argentina, Germany, and France...

user: Which country is hosting the tournament?
Memory Insight Agent: We've been over this before! I recall you asking about the host country earlier. The FIFA World Cup 2022 is being hosted by Qatar...

Retrieved Environment Variables:
event_title: "FIFA World Cup"
event_year: "2022"
supporting_team: "Brazil"
main_competitors: "Argentina, Germany, France"
match_location: "Qatar"
fan_experience: "High excitement and engagement"

Advanced Memory Retrieval with Search Demo

You can further explore the capabilities of memory modules with advanced querying and memory retrieval:

async def search_demo():
    """
    Demonstrates advanced querying and memory retrieval capabilities of the assistant.
    """
    # Initialize a Distiller client
    distiller_client = DistillerClient()

    # Create/register a new Distiller project
    distiller_client.create_project(config_path="config.yaml", project="memory_tutorial")

    # Define custom agent mappings
    executor_dict = {
        "Memory Insight Agent": memory_insight_agent,
    }

    # Use the Distiller client
    async with distiller_client(
        project="memory_tutorial",
        uuid="test_user",
        executor_dict=executor_dict,
    ) as dc:

        # List of user queries to process
        queries = [
            "What were the results of the semi-finals of the tournament?",
            "How have our main competitors been performing since the tournament, particularly in recent developments in 2025?",
        ]

        print("\n\n=== Search Demo ===")
        for query in queries:
            responses = await dc.query(query=query)
            print("-------------------------")
            print(f"\nUser Query: {query}")
            async for response in responses:
                print(f"Response:\n{response['content']}")

        print("-------------------------")
        # Retrieve chat history
        retrieved_chat_history = await dc.retrieve_memory(
            source="chat_history", n_rounds=3
        )
        print(f"\n[INFO] Retrieved Chat History:\n{retrieved_chat_history}\n")

Explanation

  • Processing Advanced Queries: The assistant handles more complex queries, utilizing memory modules for informed responses.
  • retrieve_memory: Retrieves chat history as a formatted string. You can control the amount of history with n_rounds and max_context parameters. See the Retrieving Memory Content section for all available options and format details.

Expected Output

The assistant leverages memory modules to provide detailed responses and retrieves recent chat history:

=== Search Demo ===
-------------------------

User Query: What were the results of the semi-finals of the tournament?
Response:
I see you're eager to know the semi-finals results of the FIFA World Cup 2022! As you're supporting Brazil, I'm sure you're interested in knowing how they fared. Unfortunately, Brazil was eliminated in the quarter-finals, losing to Croatia in a penalty shootout.

However, I can still provide you with the results of the semi-finals. The two matches were:

1. Argentina vs. Croatia: Argentina won 3-0, with goals from Lionel Messi, Julián Álvarez, and Alexis Mac Allister.
2. France vs. Morocco: France won 2-0, with goals from Théo Hernandez and Randal Kolo Muani.

The stage is now set for the final match between Argentina and France. As a Brazil supporter, you might be interested in knowing that Argentina is one of Brazil's main competitors, and this match is sure to be an exciting one!
-------------------------

User Query: How have our main competitors been performing since the tournament, particularly in recent developments in 2025?
Response:
I will decompose your query into subtasks and handle them one by one.Search Agent, argentina football team recent developments 2025
Response:
Searching over Web Search
Response:
**Argentina National Football Team: Recent Developments in 2025**

Argentina's national football team has been making waves in recent developments, particularly in 2025. As the reigning world champions, having won the 2022 FIFA World Cup, they continue to solidify their position as a force to be reckoned with in the football world.

**Rankings and Titles**

As of April 2025, Argentina ranks 1st in the FIFA Men's World Ranking, a testament to their consistent performance and dominance in the sport. They have also won a record 23 official titles, including the 2022 FIFA World Cup, and hold the record for the most senior official titles won.

**Notable Players and Rivalries**

Lionel Messi, the team's captain, is the all-time most-capped player with 191 matches and the highest goalscorer with 112 goals. Argentina is known for its intense rivalries with Brazil, England, Germany, Netherlands, Uruguay, Chile, and France, among others.

**Recent Matches and Performances**

In a recent World Cup qualifier match against Brazil, Argentina thrashed their arch-rivals 4-1, with Enzo Fernández scoring the second goal. This win was a significant milestone for the team, showcasing their strength and determination.

**Coaching Staff and Sponsorships**

Inter Miami CF announced Javier Mascherano's coaching staff for the 2025 season, which includes assistant coaches Lucas Rodríguez Pagano and Leandro Stillitano, among others. The team has also partnered with XBO.com, a crypto exchange, as their official global sponsor, marking a significant milestone in their global expansion strategy.

**Upcoming Matches and Events**

Argentina is set to visit India in October 2025 to play an exhibition match, which is expected to be a thrilling encounter. The team will also participate in the 2026 FIFA World Cup, where they will face stiff competition from other top teams.

Overall, Argentina's national football team continues to be a dominant force in the sport, with a strong team, notable players, and a rich history of success.
Response:
Search Agent, france football team recent developments 2025
Response:
Searching over Web Search
Response:
France's national football team has been making headlines in recent developments, particularly in 2025. As one of the main competitors, France has been working hard to maintain their position as a top team in the football world.

**Recent Performance and Rankings**

As of April 2025, France ranks 2nd in the FIFA Men's World Ranking, just behind Argentina. They have been performing well in recent matches, with a few notable wins and draws. However, they did face a setback in the UEFA Euro 2024 semi-finals, where they lost to Spain.

**Notable Players and Transfers**

Olivier Giroud, France's all-time leading scorer, has been making waves with his recent transfer to LAFC. He has been in top form, scoring crucial goals for his new team. Other notable players like Ousmane Dembele and Kylian Mbappé have also been performing well, with Dembele being PSG's top scorer with 33 goals in the current season.

**Coaching Staff and Contract Extensions**

Didier Deschamps, France's head coach, has confirmed that he will leave his contract after the 2026 World Cup. This news has sparked speculation about who will take over as the new head coach. Meanwhile, the team has been focusing on their upcoming matches, with a few key players extending their contracts with their respective clubs.

**Upcoming Matches and Events**

France is set to participate in the 2026 FIFA World Cup, where they will face stiff competition from other top teams. They will also be playing in the UEFA Nations League, where they will face teams like Spain and Portugal.

Overall, France's national football team continues to be a force to be reckoned with in the football world, with a strong team, notable players, and a rich history of success.
-------------------------

[INFO] Retrieved Chat History:
user: What were the results of the semi-finals of the tournament?
Memory Insight Agent: I see you're eager to know the semi-finals results of the FIFA World Cup 2022! As you're supporting Brazil, I'm sure you're interested in knowing how they fared. Unfortunately, Brazil was eliminated in the quarter-finals, losing to Croatia in a penalty shootout.

However, I can still provide you with the results of the semi-finals. The two matches were:

1. Argentina vs. Croatia: Argentina won 3-0, with goals from Lionel Messi, Julián Álvarez, and Alexis Mac Allister.
2. France vs. Morocco: France won 2-0, with goals from Théo Hernandez and Randal Kolo Muani.

The stage is now set for the final match between Argentina and France. As a Brazil supporter, you might be interested in knowing that Argentina is one of Brazil's main competitors, and this match is sure to be an exciting one!
orchestrator: Argentina football team recent developments 2025
Search Agent: **Argentina National Football Team: Recent Developments in 2025**

Argentina's national football team has been making waves in recent developments, particularly in 2025. As the reigning world champions, having won the 2022 FIFA World Cup, they continue to solidify their position as a force to be reckoned with in the football world.

**Rankings and Titles**

As of April 2025, Argentina ranks 1st in the FIFA Men's World Ranking, a testament to their consistent performance and dominance in the sport. They have also won a record 23 official titles, including the 2022 FIFA World Cup, and hold the record for the most senior official titles won.

**Notable Players and Rivalries**

Lionel Messi, the team's captain, is the all-time most-capped player with 191 matches and the highest goalscorer with 112 goals. Argentina is known for its intense rivalries with Brazil, England, Germany, Netherlands, Uruguay, Chile, and France, among others.

**Recent Matches and Performances**

In a recent World Cup qualifier match against Brazil, Argentina thrashed their arch-rivals 4-1, with Enzo Fernández scoring the second goal. This win was a significant milestone for the team, showcasing their strength and determination.

**Coaching Staff and Sponsorships**

Inter Miami CF announced Javier Mascherano's coaching staff for the 2025 season, which includes assistant coaches Lucas Rodríguez Pagano and Leandro Stillitano, among others. The team has also partnered with XBO.com, a crypto exchange, as their official global sponsor, marking a significant milestone in their global expansion strategy.

**Upcoming Matches and Events**

Argentina is set to visit India in October 2025 to play an exhibition match, which is expected to be a thrilling encounter. The team will also participate in the 2026 FIFA World Cup, where they will face stiff competition from other top teams.

Overall, Argentina's national football team continues to be a dominant force in the sport, with a strong team, notable players, and a rich history of success.
orchestrator: France football team recent developments 2025
Search Agent: France's national football team has been making headlines in recent developments, particularly in 2025. As one of the main competitors, France has been working hard to maintain their position as a top team in the football world.

**Recent Performance and Rankings**

As of April 2025, France ranks 2nd in the FIFA Men's World Ranking, just behind Argentina. They have been performing well in recent matches, with a few notable wins and draws. However, they did face a setback in the UEFA Euro 2024 semi-finals, where they lost to Spain.

**Notable Players and Transfers**

Olivier Giroud, France's all-time leading scorer, has been making waves with his recent transfer to LAFC. He has been in top form, scoring crucial goals for his new team. Other notable players like Ousmane Dembele and Kylian Mbappé have also been performing well, with Dembele being PSG's top scorer with 33 goals in the current season.

**Coaching Staff and Contract Extensions**

Didier Deschamps, France's head coach, has confirmed that he will leave his contract after the 2026 World Cup. This news has sparked speculation about who will take over as the new head coach. Meanwhile, the team has been focusing on their upcoming matches, with a few key players extending their contracts with their respective clubs.

**Upcoming Matches and Events**

France is set to participate in the 2026 FIFA World Cup, where they will face stiff competition from other top teams. They will also be playing in the UEFA Nations League, where they will face teams like Spain and Portugal.

Overall, France's national football team continues to be a force to be reckoned with in the football world, with a strong team, notable players, and a rich history of success.

Overall, France's national football team continues to be a force to be reckoned with in the football world, with a strong team, notable players, and a rich history of success. ```