To solve this problem, we first need to define the decision variables and the objective function. Let's denote the number of packets of cat food as `x` and the number of cans of tuna as `y`. The objective is to minimize the total cost, which can be represented as `12x + 7y`.

The constraints are based on the nutritional requirements:

1. Carbohydrates: `5x + 7y >= 700`
2. Vitamins: `15x + 12y >= 1100`
3. Protein: `12x + 15y >= 900`

Since we cannot buy negative amounts of food, we also have non-negativity constraints:

`x >= 0` and `y >= 0`

Now, let's translate this into Gurobi code in Python:

```python
from gurobipy import *

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

# Define the decision variables
x = m.addVar(vtype=GRB.CONTINUOUS, name="cat_food_packets")
y = m.addVar(vtype=GRB.CONTINUOUS, name="tuna_cans")

# Define the objective function
m.setObjective(12*x + 7*y, GRB.MINIMIZE)

# Add constraints
m.addConstr(5*x + 7*y >= 700, "carbohydrates")
m.addConstr(15*x + 12*y >= 1100, "vitamins")
m.addConstr(12*x + 15*y >= 900, "protein")

# Optimize the model
m.optimize()

# Print the results
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Buy {x.x} packets of cat food and {y.x} cans of tuna.")
    print(f"Total cost: ${12*x.x + 7*y.x}")
else:
    print("No optimal solution found.")
```