### Install and start MLflow server Source: https://mlflow.org/docs/latest/genai/eval-monitor/scorers/llm-judge/custom-judges/create-custom-judge Install MLflow and start the server to use the UI Judge Builder. Run these commands in a terminal. ```bash pip install mlflow mlflow server ``` -------------------------------- ### Install MLflow GenAI extra and start server (uv) Source: https://mlflow.org/docs/latest/genai/tracing/token-usage-cost Install the MLflow GenAI extra and start the tracking server using uv. Required for cost tracking with MLflow version 3.10.0 or later. ```bash uv add 'mlflow[genai]>=3.10.0' uv run mlflow server ``` -------------------------------- ### Install dependencies for Agno tracing example Source: https://mlflow.org/docs/latest/genai/tracing/integrations/listing/agno Install the required packages: mlflow>=3.3, agno, anthropic, and yfinance. ```bash pip install 'mlflow>=3.3' agno anthropic yfinance ``` -------------------------------- ### Run the interactive setup command for MLflow tracing Source: https://mlflow.org/docs/latest/genai/tracing/integrations/listing/qwen_code Run `mlflow-qwen-code setup` to start an interactive flow that configures the tracing hook. The output shows the prompts and resulting configuration files. Use `--non-interactive` or `-y` to skip the interactive flow and use defaults. ```text ~/my-project $ mlflow-qwen-code setup Configure MLflow tracing for Qwen Code ? Where should MLflow tracing be installed? ● Project ./.qwen/ (default) ○ User ~/.qwen/ ↑/↓ to move, enter to select ✓ Registered Stop hook in /path/to/project/.qwen/settings.json MLflow tracking URI [http://localhost:5000] http://localhost:5000 MLflow experiment ID [0] 1 ✓ Wrote tracing config to /path/to/project/.qwen/mlflow-tracing.json Next steps 1. Start the MLflow tracking server in a separate terminal: mlflow server --port 5000 2. Launch qwen — traces appear at http://localhost:5000 after each turn. ``` -------------------------------- ### Install MLflow GenAI extra and start server (pip) Source: https://mlflow.org/docs/latest/genai/tracing/token-usage-cost Install the MLflow GenAI extra and start the tracking server using pip. Required for cost tracking with MLflow version 3.10.0 or later. ```bash pip install 'mlflow[genai]>=3.10.0' mlflow server ``` -------------------------------- ### Install OpenAI SDK Source: https://mlflow.org/docs/latest/genai/eval-monitor/quickstart Install the OpenAI Python package, required for the code examples in this guide. MLflow's evaluation framework works with any LLM provider, but these examples use the OpenAI SDK. ```bash pip install openai ``` -------------------------------- ### Install MLflow with pip Source: https://mlflow.org/docs/latest/genai/eval-monitor/scorers/custom/tutorial Install MLflow and required packages before running the examples. Run this in a bash shell. ```bash pip install --upgrade mlflow ``` -------------------------------- ### Install MLflow and Start the Server Source: https://mlflow.org/docs/latest/genai/governance/ai-gateway/quickstart Installs MLflow with the genai extra and starts the tracking server on port 5000. The AI Gateway is built into the MLflow Tracking Server and will be ready at http://localhost:5000. Requires a SQL-based backend store and the FastAPI tracking server; the default SQLite and FastAPI configuration is sufficient. ```bash pip install 'mlflow[genai]' mlflow server --port 5000 ``` -------------------------------- ### Install MLflow and LangChain OpenAI Source: https://mlflow.org/docs/latest/genai/version-tracking/quickstart Install MLflow 3.0 or higher and the LangChain OpenAI integration package. Required before using the quickstart's LLM and AI agent features. ```bash pip install --upgrade mlflow pip install langchain-openai ``` -------------------------------- ### Start MLflow Server with uv Source: https://mlflow.org/docs/latest/genai/eval-monitor/quickstart Start a local MLflow Tracking Server using the uvx command, which requires installing the uv package manager first. This is one of three methods to start the server. ```shell uvx mlflow server ``` -------------------------------- ### Install the MLflow Qwen Code tracing plugin Source: https://mlflow.org/docs/latest/genai/tracing/integrations/listing/qwen_code Install the @mlflow/qwen-code npm package globally to enable MLflow tracing for Qwen Code. Alternatively, use npx to run the setup command without global installation. ```bash npm install -g @mlflow/qwen-code ``` -------------------------------- ### Basic AG2 tracing example with autolog Source: https://mlflow.org/docs/latest/genai/tracing/integrations/listing/ag2 Basic example that imports os and typing utilities before enabling AG2 autologging. Use this as a starting point for instrumenting AG2 agent execution with MLflow tracing. ```python import os from typing import Annotated, Literal ``` -------------------------------- ### Install Omnigent and MLflow Source: https://mlflow.org/docs/latest/genai/tracing/integrations/listing/omnigent Install the required packages using uv. This is the first step in setting up tracing. ```bash uv pip install omnigent mlflow ``` -------------------------------- ### Quickstart: Log OpenAI traces to a remote MLflow server Source: https://mlflow.org/docs/latest/genai/tracing/lightweight-sdk Sets the tracking URI and experiment for the Production Tracing SDK, then imports openai for tracing LLM applications. Use this when logging traces to an experiment on a remote MLflow server. ```python import mlflow import openai # Set the tracking URI to your MLflow server mlflow.set_tracking_uri("http://your-mlflow-server:5000") mlflow.set_experiment("genai-production-monitoring") ``` -------------------------------- ### Manual Installation of n8n-nodes-mlflow Source: https://mlflow.org/docs/latest/genai/tracing/integrations/listing/n8n Install the community node manually within your n8n directory and start the service. ```bash cd ~/.n8n npm install n8n-nodes-mlflow n8n start ``` -------------------------------- ### Setting Up Working Environment and FAISS Database Source: https://mlflow.org/docs/latest/genai/flavors/langchain/notebooks/langchain-retriever Sets up a temporary directory, defines paths for documents and a FAISS index, fetches documents from the given URLs, and creates a FAISS database with default chunk settings. ```python temporary_directory = tempfile.mkdtemp() doc_path = os.path.join(temporary_directory, "docs.txt") persist_dir = os.path.join(temporary_directory, "faiss_index") url_listings = [ "https://www.archives.gov/milestone-documents/act-establishing-yellowstone-national-park#transcript", "https://www.archives.gov/milestone-documents/sherman-anti-trust-act#transcript", ] fetch_and_save_documents(url_listings, doc_path) vector_db = create_faiss_database(doc_path, persist_dir) ``` -------------------------------- ### Set Up OTLP Exporter for MLflow Traces Source: https://mlflow.org/docs/latest/genai/tracing/opentelemetry/export Install the OTLP exporter package and configure the environment variables to export MLflow traces to an OpenTelemetry Collector. Set OTEL_EXPORTER_OTLP_TRACES_ENDPOINT before starting any trace, and optionally set OTEL_SERVICE_NAME to group traces. The Python example creates a span and exports it to the collector. ```bash pip install opentelemetry-exporter-otlp ``` ```python import mlflow import os # Set the endpoint of the OpenTelemetry Collector os.environ["OTEL_EXPORTER_OTLP_TRACES_ENDPOINT"] = "http://localhost:4317/v1/traces" # Optionally, set the service name to group traces os.environ["OTEL_SERVICE_NAME"] = "your-service-name" # Trace will be exported to the OTel collector with mlflow.start_span(name="foo") as span: span.set_inputs({"a": 1}) span.set_outputs({"b": 2}) ``` -------------------------------- ### Create Index and Run Query, Chat, and Retriever Examples Source: https://mlflow.org/docs/latest/genai/flavors/llama-index/notebooks/llama_index_quickstart Creates a VectorStoreIndex from an example document and demonstrates three types of inference: a query engine, a chat engine with a system message, and a retriever. Each result is printed to the console. ```python print("------------- Example Document used to Enrich LLM Context -------------") llama_index_example_document = Document.example() print(llama_index_example_document) index = VectorStoreIndex.from_documents([llama_index_example_document]) print(" ------------- Example Query Engine -------------") query_response = index.as_query_engine().query("What is llama_index?") print(query_response) print(" ------------- Example Chat Engine -------------") chat_response = index.as_chat_engine().chat( "What is llama_index?", chat_history=[ChatMessage(role="system", content="You are an expert on RAG!")], ) print(chat_response) print(" ------------- Example Retriever -------------") retriever_response = index.as_retriever().retrieve("What is llama_index?") print(retriever_response) ``` -------------------------------- ### Update MLflow and install OpenAI Source: https://mlflow.org/docs/latest/genai/eval-monitor/scorers/custom/code-examples Install the latest MLflow and OpenAI packages using pip. Required for the example app that uses the OpenAI client. ```bash pip install --upgrade mlflow openai ``` -------------------------------- ### Setup and Generate Traces with Initial Judge Source: https://mlflow.org/docs/latest/genai/eval-monitor/scorers/llm-judge/alignment Creates an experiment and an initial judge named 'product_quality' using make_judge, then generates 15 traces and runs the judge on them to produce initial assessments. The judge uses field-based evaluation with inputs and outputs extracted from the trace spans. Requires at least 10 traces for alignment. ```python from mlflow.genai.judges import make_judge from mlflow.genai.judges.optimizers import MemAlignOptimizer from mlflow.entities import AssessmentSource, AssessmentSourceType from typing import Literal import mlflow # Create experiment and initial judge experiment_id = mlflow.create_experiment("product-quality-alignment") mlflow.set_experiment(experiment_id=experiment_id) initial_judge = make_judge( name="product_quality", instructions=( "Evaluate if the product description in {{ outputs }} " "is accurate and helpful for the query in {{ inputs }}. " "Rate as: excellent, good, fair, or poor" ), feedback_value_type=Literal["excellent", "good", "fair", "poor"], model="anthropic:/claude-opus-4-1-20250805", ) # Generate traces from your application (minimum 10 required) traces = [] for i in range(15): # Generate 15 traces (more than minimum of 10) with mlflow.start_span(f"product_description_{i}") as span: # Your application logic query = f"Product query {i}" description = f"Product description for query {i}" span.set_inputs({"query": query}) span.set_outputs({"description": description}) traces.append(span.trace_id) # Run the judge on these traces to get initial assessments for trace_id in traces: trace = mlflow.get_trace(trace_id) # Extract inputs and outputs from the trace for field-based evaluation inputs = trace.data.spans[0].inputs # Get inputs from trace outputs = trace.data.spans[0].outputs # Get outputs from trace # Judge evaluates using field-based approach (inputs/outputs) judge_result = initial_judge(inputs=inputs, outputs=outputs) # Judge's assessment is automatically logged when called ``` -------------------------------- ### Start MLflow Server with Docker Compose Source: https://mlflow.org/docs/latest/genai/eval-monitor/quickstart Start a local MLflow server with PostgreSQL and MinIO using the provided Docker Compose file. Includes cloning the MLflow repo, setting up the docker-compose directory, and copying the environment file. ```shell git clone --depth 1 --filter=blob:none --sparse https://github.com/mlflow/mlflow.git cd mlflow git sparse-checkout set docker-compose cd docker-compose cp .env.dev.example .env docker compose up -d ``` -------------------------------- ### Start MLflow Server with pip Source: https://mlflow.org/docs/latest/genai/eval-monitor/quickstart Install the mlflow Python package via pip and start a local MLflow server. Requires Python 3.10+. ```shell pip install --upgrade mlflow mlflow server ``` -------------------------------- ### Complete example: optimize Pydantic AI customer support agent Source: https://mlflow.org/docs/latest/genai/prompt-registry/optimize-prompts/pydantic-ai-optimization This example shows the full workflow: register initial prompts, define a prediction function using Pydantic AI, prepare training data, optimize with GepaPromptOptimizer and Correctness scorer, and use the optimized prompts. The agent automatically uses the optimized prompts via @latest. ```python import mlflow from mlflow.genai.scorers import Correctness from mlflow.genai.optimize.optimizers import GepaPromptOptimizer from pydantic_ai import Agent # If you're inside notebooks, please uncomment the following lines. # import nest_asyncio # nest_asyncio.apply() # Step 1: Register your initial prompts system_prompt = mlflow.genai.register_prompt( name="customer-support-system", template="You are a helpful customer support agent for an e-commerce platform. " "Assist customers with their questions about orders, returns, and products.", ) user_prompt = mlflow.genai.register_prompt( name="customer-support-query", template="Customer inquiry: {{query}}", ) # Step 2: Create a prediction function that uses Pydantic AI @mlflow.trace def predict_fn(query): # Load prompts from registry system_prompt = mlflow.genai.load_prompt("prompts:/customer-support-system@latest") user_prompt = mlflow.genai.load_prompt("prompts:/customer-support-query@latest") # Initialize agent with system prompt agent = Agent( model="openai:gpt-5-mini", system_prompt=system_prompt.template, ) # Format user message and run agent formatted_query = user_prompt.format(query=query) result = agent.run_sync(formatted_query) return result.output # Step 3: Prepare training data dataset = [ { "inputs": {"query": "Where is my order #12345?"}, "expectations": { "expected_response": "I'd be happy to help you track your order #12345. " "Please check your email for a tracking link, or I can look it up for you if you provide your email address." }, }, { "inputs": {"query": "How do I return a defective product?"}, "expectations": { "expected_response": "I'm sorry to hear your product is defective. You can initiate a return " "through your account's order history within 30 days of purchase. We'll send you a prepaid shipping label." }, }, { "inputs": {"query": "Do you have this item in blue?"}, "expectations": { "expected_response": "I'd be happy to check product availability for you. " "Could you please provide the product name or SKU so I can verify if it's available in blue?" }, }, # more data... ] # Step 4: Optimize the prompts result = mlflow.genai.optimize_prompts( predict_fn=predict_fn, train_data=dataset, prompt_uris=[system_prompt.uri, user_prompt.uri], optimizer=GepaPromptOptimizer(reflection_model="openai:/gpt-5"), scorers=[Correctness(model="openai:/gpt-5")], ) # Step 5: Use the optimized prompts optimized_system_prompt = result.optimized_prompts[0] optimized_user_prompt = result.optimized_prompts[1] print(f"Optimized system prompt URI: {optimized_system_prompt.uri}") print(f"Optimized system template: {optimized_system_prompt.template}") print(f"Optimized user prompt URI: {optimized_user_prompt.uri}") print(f"Optimized user template: {optimized_user_prompt.template}") # Since your agent already uses @latest, it will automatically use the optimized prompts predict_fn("Can I get a refund for order #67890?") ``` -------------------------------- ### Start AgentServer in start_server.py Source: https://mlflow.org/docs/latest/genai/serving/agent-server Create a start_server.py file that imports the agent module to register functions, creates an AgentServer for the 'ResponsesAgent' agent, and optionally sets up MLflow git-based version tracking. The main function runs the server with an import string for multi-worker support. ```python # Need to import the agent to register the functions with the server import agent # noqa: F401 from mlflow.genai.agent_server import ( AgentServer, setup_mlflow_git_based_version_tracking, ) agent_server = AgentServer("ResponsesAgent") app = agent_server.app # Optionally, set up MLflow git-based version tracking # to correspond your agent's traces to a specific git commit setup_mlflow_git_based_version_tracking() def main(): # To support multiple workers, pass the app as an import string agent_server.run(app_import_string="start_server:app") if __name__ == "__main__": main() ``` -------------------------------- ### Install the MLflow Codex Tracing Plugin Source: https://mlflow.org/docs/latest/genai/tracing/integrations/listing/codex Installs the @mlflow/codex npm package globally so MLflow can automatically trace Codex CLI conversations. Requires MLflow tracking server, Codex CLI, and Node.js 18+. Alternatively, invoke the bin through npx (e.g., npx @mlflow/codex setup) instead of installing globally. ```bash npm install -g @mlflow/codex ``` -------------------------------- ### Start Open WebUI with open-webui serve Source: https://mlflow.org/docs/latest/genai/tracing/integrations/listing/open-webui Run this command to start the Open WebUI server, which will host the chat interface that the MLflow pipeline intercepts. ```bash open-webui serve ``` -------------------------------- ### Install Python dependencies for LangChain tracing (shell) Source: https://mlflow.org/docs/latest/genai/tracing/integrations/listing/langchain Confirmed working versions for the Python example: openai, langchain, langchain-openai, mlflow, and tiktoken. ```shell pip install openai==3.3.1 langchain==1.3.17 langchain-openai==1.6.0 mlflow==3.15.1 tiktoken==0.14.0 ``` -------------------------------- ### Start MLflow server with local budget tracker Source: https://mlflow.org/docs/latest/genai/governance/ai-gateway/budget-alerts-limits Command to start the MLflow server using the local budget tracker strategy. No extra environment variables are required. ```bash # No extra environment variables required mlflow server --host 0.0.0.0 --port 5000 ``` -------------------------------- ### Define per-row guidelines for document extraction with ExpectationsGuidelines Source: https://mlflow.org/docs/latest/genai/eval-monitor/scorers/llm-judge/guidelines Starts a per-row guidelines example for a document extraction app, importing ExpectationsGuidelines and defining a dataset with document-type specific inputs. The snippet is truncated in the source, showing only the beginning of the document_extraction_data list with an invoice example. ```python from mlflow.genai.scorers import ExpectationsGuidelines import mlflow # Dataset with document-type specific guidelines document_extraction_data = [ { "inputs": { "document_type": "invoice", "document_text": "Invoice #INV-2024-001\nBill To: Acme Corp\nAmount: $1,234.56\nDue Date: 2024-03-15", }, ``` -------------------------------- ### Run MLflow demo locally with uvx mlflow demo Source: https://mlflow.org/docs/latest/genai/demo Launches a local MLflow server pre-loaded with the same sample data as the live demo, providing full read-write access for experimentation and customization. ```bash uvx mlflow demo ``` -------------------------------- ### Start MLflow Tracking Server with SQLite backend Source: https://mlflow.org/docs/latest/genai/tracing/integrations/listing/google-adk Start the MLflow Tracking Server with a SQL-based backend store. This example uses SQLite; for other SQL databases (PostgreSQL, MySQL, MSSQL) change the store URI. OpenTelemetry ingestion is not supported with file-based backend stores. ```bash mlflow server --backend-store-uri sqlite:///mlflow.db --port 5000 ``` -------------------------------- ### Set MLFLOW_GATEWAY_BUDGET_REFRESH_INTERVAL and start server Source: https://mlflow.org/docs/latest/genai/governance/ai-gateway/budget-alerts-limits Use this bash example to override the default 600-second budget policy refresh interval. Set the environment variable to a lower value to pick up policy changes faster or a higher value to reduce database load, then start the MLflow server. ```bash export MLFLOW_GATEWAY_BUDGET_REFRESH_INTERVAL=30 mlflow server --host 0.0.0.0 --port 5000 ``` -------------------------------- ### Conversation Simulation Quick Start Source: https://mlflow.org/docs/latest/genai/eval-monitor/running-evaluation/conversation-simulation Complete example that simulates conversations and evaluates them using MLflow GenAI. Sets up test cases with goals, personas, and simulation guidelines, then creates a ConversationSimulator. ```python import os import mlflow from mlflow.genai.simulators import ConversationSimulator from mlflow.genai.scorers import ConversationCompleteness, Safety from openai import OpenAI os.environ["OPENAI_API_KEY"] = "your-api-key-here" # Replace with your API key client = OpenAI() # 1. Define test cases with goals (required) and optional persona/context test_cases = [ { "goal": "Learn how to track experiments in MLflow", }, { "goal": "Debug a model deployment issue", "persona": "You are a frustrated data scientist who has been stuck on this issue for hours", }, { ``` -------------------------------- ### TripCrew class with Crew setup Source: https://mlflow.org/docs/latest/genai/tracing/integrations/listing/crewai Defines the TripCrew class that initializes origin, cities, date range, and interests, then runs a Crew with two agents and two tasks. The crew uses verbose output, memory, and knowledge features. This snippet is part of a larger trip planning example that includes task definitions and agent setup. ```python class TripCrew: def __init__(self, origin, cities, date_range, interests): self.cities = cities self.origin = origin self.interests = interests self.date_range = date_range def run(self): agents = TripAgents() tasks = TripTasks() city_selector_agent = agents.city_selection_agent() local_expert_agent = agents.local_expert() identify_task = tasks.identify_task( city_selector_agent, self.origin, self.cities, self.interests, self.date_range, ) gather_task = tasks.gather_task( local_expert_agent, self.origin, self.interests, self.date_range ) crew = Crew( agents=[city_selector_agent, local_expert_agent], tasks=[identify_task, gather_task], verbose=True, memory=True, knowledge={...}, # knowledge config here (if any) or omitted for now; see docs for details on enabling knowledge for your model. For more info, see https://docs.crewai.com/concepts/knowledge#knowledge-parameters. For more info, see https://docs.crewai.com/concepts/knowledge#knowledge-parameters. For more info, see https://docs.crewai.com/concepts/knowledge#knowledge-parameters. For more info, see https://docs.crewai.com/concepts/knowledge#knowledge-parameters. For more info, see https://docs.crewai.com/concepts/knowledge#knowledge-parameters. For more info, see https://docs.crewai.com/concepts/knowledge#knowledge-parameters. For more info, see https://docs.crewai.com/concepts/knowledge#knowledge-parameters. For more info, see https://docs.crewai.com/concepts/knowledge#knowledge-parameters. For more info, see https://docs.crewai.com/concepts/knowledge#knowledge-parameters. For more info, see https://docs.crewai.com/concepts/knowledge#knowledge-parameters. For more info, see https://docs.crewai.com/concepts/knowledge#knowledge-parameters. For more info, see https://docs.crewai.com/concepts/knowledge#parameters. For more info, see https://docs.crewai.com/concepts/knowledge#parameters. For more info, see https://docs.crewai.com/concepts/knowledge#parameters. For more info, see https://docs.crewai.com/concepts/knowledge#parameters. For more info, see https://docs.crewai.com/concepts/knowledge#parameters. For more info, see https://docs.crewai.com/concepts/knowledge#parameters. For more info, see https://docs.crewai.com/concepts/knowledge#parameters. For more info, see https://docs.crewai.com/concepts/knowledge#parameters. For more info, see https://docs.crewai.com/concepts/knowledge#parameters. For more info, see https://docs.crewai.com/concepts/knowledge#parameters. For more info, see https://docs.crewai.com/concepts/knowledge#parameters. For more info, see https://docs.crewai.com/concepts/knowledge#parameters. For more info, see https://docs.crewai.com/concepts/knowledge#parameters. For more info, see https://docs.crewai.com/concepts/knowledge#parameters. For more info, see https://docs.crewai.com/concepts/knowledge#parameters. For more info, see https://docs.crewai.com/concepts/knowledge#parameters. For more info, see https://docs.crewai.com/concepts/knowledge#parameters. For more info, see https://docs.crewai.com/content/crewai/docs/build/crewai/agents/01-overview-agent.md. For more info, see https://docs.crewai.com/content/crewai/docs/build/crewai/agents/01-overview-agent.md. For more info, see https://docs.crewai.com/content/crewai/docs/build/crewai/agents/01-overview-agent.md. For more info, see https://docs.crewai.com/content/crewai/docs/build/crewai/agents/01-overview-agent.md. For more info, see https://docs.crewai.com/content/crewai/docs/build/crewai/agents/01-overview-agent.md. For more info, see https://docs.crewai.com/content/crewai/docs/build/crewai/agents/01-overview-agent.md. For more info, see https://docs.crewai.com/content/crewai/docs/build/crewai/agents/01-overview-agent.md. For more info, see https://docs.crewai.com/content/crewai/docs/build/crewai/agents/01-overview-agent.md. For more info, see https://docs.crewai.com/content/crewai/docs/build/crewai/agents/01-overview-agent.md. For more info, see https://docs.crewai.com/content/crewai/docs/build/crewai/agents/01-overview-agent.md. For more info, see https://docs.crewai.com/content/crewai/docs/build/crewai/agents/01-overview-agent.md. For more info, see https://docs.crewai.com/content/crewai/docs/build/crewai/agents/01-overview-agent.md. For more info, see https://docs.crewai.com/content/crewai/docs/build/crewai/agents/01-overview-agent.md. For more info, see https://docs.crewai.com/content/crewai/docs/build/crewai/agents/01-overview-agent.md. For more info, see https://docs.crewai.com/content/crewai/docs/build/crewai/agents/01-overview-agent.md. For more info, see https://docs.crewai.com/content/crewai/docs/build/crewai/agents/01-overview-agent.md. For more info, see https://docs.crewai.com/content/crewai/docs/build/crewai/agents/01-overview-agent.md. For more info, see https://docs.crewai.com/content/crewai/docs/build/crewai/agents/01-overview-agent.md. For more info, see https://docs.crewai.com/content/crewai/docs/build/crewai/agents/01-overview-agent.md. For more info, see https://docs.crewai.com/content/crewai/docs/build/crewai/agents/01-overview-agent.md. For more info, see https://docs.crewai.com/content/crew ```