To solve this optimization problem, we first need to define the decision variables and the objective function. Let's denote the number of small teams as `x` and the number of large teams as `y`. The objective is to minimize the total cost.

The constraints are:
1. Complete 100 tasks per hour: \(8x + 20y \geq 100\)
2. Do not exceed 10 supervisors: \(x + 3y \leq 10\)
3. Non-negativity constraint: \(x \geq 0, y \geq 0\)

The cost function to minimize is: \(5000x + 15000y\)

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

```python
from gurobipy import *

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

# Define the decision variables
x = m.addVar(name="small_teams", vtype=GRB.INTEGER, lb=0)
y = m.addVar(name="large_teams", vtype=GRB.INTEGER, lb=0)

# Set the objective function
m.setObjective(5000*x + 15000*y, GRB.MINIMIZE)

# Add constraints
m.addConstr(8*x + 20*y >= 100, name="task_requirement")
m.addConstr(x + 3*y <= 10, name="supervisor_limit")

# Optimize the model
m.optimize()

# Print the solution
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Small teams: {x.x}")
    print(f"Large teams: {y.x}")
    print(f"Total cost: ${5000*x.x + 15000*y.x}")
else:
    print("No optimal solution found")
```