To solve the optimization problem described, we first need to translate the natural language description into a mathematical formulation that can be represented in Gurobi code. The goal is to minimize the cost of producing milk tea with red bean and pudding toppings while adhering to the constraints related to sugar content, butter content, and the maximum number of red bean toppings.

Let's denote:
- \(R\) as the number of red bean toppings,
- \(P\) as the number of pudding toppings.

The objective function to minimize is the total cost, which can be represented as:
\[ \text{Minimize} \quad 1.5R + 2P \]

Given constraints are:
1. Each red bean topping contains 1.5 grams of sugar, and each pudding topping contains 3 grams of sugar. The milk tea must have at least 7 grams of sugar.
\[ 1.5R + 3P \geq 7 \]
2. Each red bean topping contains 2.5 grams of butter, and each pudding topping contains 1.2 grams of butter. The milk tea must have at least 10 grams of butter.
\[ 2.5R + 1.2P \geq 10 \]
3. For health reasons, the milk tea will have at most 3 red bean toppings.
\[ R \leq 3 \]
4. \(R\) and \(P\) must be non-negative integers since they represent the number of toppings.

Now, let's implement this problem in Gurobi using Python:

```python
from gurobipy import *

# Create a model
m = Model("Milk_Tea_Optimization")

# Define variables
R = m.addVar(vtype=GRB.INTEGER, name="Red_Bean_Toppings", lb=0)
P = m.addVar(vtype=GRB.INTEGER, name="Pudding_Toppings", lb=0)

# Set objective function
m.setObjective(1.5*R + 2*P, GRB.MINIMIZE)

# Add constraints
m.addConstr(1.5*R + 3*P >= 7, "Sugar_Constraint")
m.addConstr(2.5*R + 1.2*P >= 10, "Butter_Constraint")
m.addConstr(R <= 3, "Red_Bean_Limit")

# Optimize model
m.optimize()

# Print solution
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Red Bean Toppings: {R.x}")
    print(f"Pudding Toppings: {P.x}")
    print(f"Total Cost: ${1.5*R.x + 2*P.x:.2f}")
else:
    print("No optimal solution found.")
```