## Step 1: Define the symbolic variables
Let's define the symbolic variables for the problem:
- $x_1$ represents the number of chocolate protein shakes
- $x_2$ represents the number of vanilla meal replacement smoothies

## Step 2: Formulate the objective function
The objective is to minimize the cost. The cost of chocolate protein shakes is $8 per serving and the cost of vanilla meal replacement smoothies is $10 per serving. Therefore, the objective function can be represented as:
\[ \text{Minimize:} \quad 8x_1 + 10x_2 \]

## 3: Define the constraints
Based on the problem description, we have the following constraints:
- Protein requirement: at least 150 units of protein. Since chocolate protein shakes contain 35 units of protein and meal replacement smoothies contain 15 units of protein, we have:
\[ 35x_1 + 15x_2 \geq 150 \]
- Carbs requirement: at least 130 units of carbs. Since chocolate protein shakes contain 20 units of carbs and meal replacement smoothies contain 25 units of carbs, we have:
\[ 20x_1 + 25x_2 \geq 130 \]
- Fat limit: not more than 50 units of fat. Since chocolate protein shakes contain 3 units of fat and meal replacement smoothies contain 10 units of fat, we have:
\[ 3x_1 + 10x_2 \leq 50 \]
- Non-negativity constraints: $x_1 \geq 0$ and $x_2 \geq 0$, since the number of servings cannot be negative.

## 4: Symbolic Representation
The symbolic representation of the problem is:
```json
{
'sym_variables': [('x1', 'chocolate protein shakes'), ('x2', 'vanilla meal replacement smoothies')],
'objective_function': '8*x1 + 10*x2',
'constraints': [
    '35*x1 + 15*x2 >= 150',
    '20*x1 + 25*x2 >= 130',
    '3*x1 + 10*x2 <= 50',
    'x1 >= 0',
    'x2 >= 0'
]
}
```

## 5: Gurobi Code
Now, let's implement this problem using Gurobi in Python:
```python
import gurobi

def solve_optimization_problem():
    # Create a new model
    model = gurobi.Model()

    # Define the variables
    x1 = model.addVar(lb=0, name="chocolate_protein_shakes")
    x2 = model.addVar(lb=0, name="vanilla_meal_replacement_smoothies")

    # Define the objective function
    model.setObjective(8*x1 + 10*x2, gurobi.GRB.MINIMIZE)

    # Define the constraints
    model.addConstr(35*x1 + 15*x2 >= 150, name="protein_requirement")
    model.addConstr(20*x1 + 25*x2 >= 130, name="carbs_requirement")
    model.addConstr(3*x1 + 10*x2 <= 50, name="fat_limit")

    # Optimize the model
    model.optimize()

    # Print the status
    if model.status == gurobi.GRB.OPTIMAL:
        print("Optimal solution found.")
        print(f"Number of chocolate protein shakes: {x1.varValue}")
        print(f"Number of vanilla meal replacement smoothies: {x2.varValue}")
        print(f"Total cost: {model.objVal}")
    elif model.status == gurobi.GRB.INFEASIBLE:
        print("No feasible solution exists.")
    else:
        print("Optimization failed.")

solve_optimization_problem()
```