To solve the given optimization problem, we first need to translate the natural language description into a symbolic representation. Let's denote the number of small teddy bears as \(x_1\) and the number of large teddy bears as \(x_2\).

The symbolic representation of the variables is:
- \(x_1\): Number of small teddy bears
- \(x_2\): Number of large teddy bears

The objective function, which represents the total profit, can be written as \(50x_1 + 8x_2\), since the profit per small teddy bear is $50 and per large teddy bear is $8.

The constraints based on the available time for filling and stitching are:
1. Filling constraint: \(5x_1 + 10x_2 \leq 700\) (since each small teddy bear requires 5 minutes of filling and each large one requires 10 minutes, with a total of 700 minutes available per day).
2. Stitching constraint: \(25x_1 + 35x_2 \leq 900\) (since each small teddy bear requires 25 minutes of stitching and each large one requires 35 minutes, with a total of 900 minutes available per day).

Additionally, we have non-negativity constraints:
- \(x_1 \geq 0\)
- \(x_2 \geq 0\)

Since the problem asks for the number of teddy bears to maximize profits and implicitly suggests that fractional numbers of teddy bears are not possible, we also consider \(x_1\) and \(x_2\) as integers.

The symbolic representation in JSON format is:
```json
{
    'sym_variables': [('x1', 'Number of small teddy bears'), ('x2', 'Number of large teddy bears')],
    'objective_function': '50*x1 + 8*x2',
    'constraints': ['5*x1 + 10*x2 <= 700', '25*x1 + 35*x2 <= 900', 'x1 >= 0', 'x2 >= 0']
}
```

Now, let's write the Gurobi code in Python to solve this linear programming problem:
```python
from gurobipy import *

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

# Add variables
x1 = m.addVar(vtype=GRB.INTEGER, name="small_teddy_bears")
x2 = m.addVar(vtype=GRB.INTEGER, name="large_teddy_bears")

# Set the objective function
m.setObjective(50*x1 + 8*x2, GRB.MAXIMIZE)

# Add constraints
m.addConstr(5*x1 + 10*x2 <= 700, "filling_time")
m.addConstr(25*x1 + 35*x2 <= 900, "stitching_time")
m.addConstr(x1 >= 0, "non_neg_small")
m.addConstr(x2 >= 0, "non_neg_large")

# Optimize the model
m.optimize()

# Print the solution
if m.status == GRB.OPTIMAL:
    print(f"Optimal solution: {x1.varName} = {x1.x}, {x2.varName} = {x2.x}")
    print(f"Maximum profit: {m.objVal}")
else:
    print("No optimal solution found")
```