To solve this optimization problem, we need to maximize the profit from selling fruit gummy bears and sour gummy bears given the time and quantity constraints. 

Let's denote:
- \(x\) as the number of packets of fruit gummy bears made,
- \(y\) as the number of packets of sour gummy bears made.

The objective function (profit) can be represented as \(1x + 1.25y\), since each packet of fruit gummy bears gives a profit of $1 and each packet of sour gummy bears gives a profit of $1.25.

We have two main constraints:
1. Time constraint: Each packet of fruit gummy bears takes 10 minutes, and each packet of sour gummy bears takes 15 minutes. The total available time is 2000 minutes. This can be represented as \(10x + 15y \leq 2000\).
2. Quantity constraints:
   - For fruit gummy bears: \(x \leq 120\),
   - For sour gummy bears: \(y \leq 70\).

Also, \(x\) and \(y\) must be non-negative since we cannot make a negative number of packets.

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

```python
from gurobipy import *

# Create a new model
m = Model("Gummy_Bears_Profit")

# Define variables
x = m.addVar(vtype=GRB.INTEGER, name="fruit_gummy_bears", lb=0)
y = m.addVar(vtype=GRB.INTEGER, name="sour_gummy_bears", lb=0)

# Set the objective function: Maximize profit
m.setObjective(1*x + 1.25*y, GRB.MAXIMIZE)

# Add constraints
m.addConstr(10*x + 15*y <= 2000, "time_constraint")
m.addConstr(x <= 120, "fruit_quantity_constraint")
m.addConstr(y <= 70, "sour_quantity_constraint")

# Optimize the model
m.optimize()

# Print results
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Number of fruit gummy bears packets: {x.x}")
    print(f"Number of sour gummy bears packets: {y.x}")
    print(f"Maximum profit: ${m.objVal:.2f}")
else:
    print("No optimal solution found")
```