To solve the optimization problem described, we first need to convert the natural language description into a symbolic representation. This involves defining variables, an objective function, and constraints based on the given information.

Let's denote:
- \(x_1\) as the number of apple pies made,
- \(x_2\) as the number of blueberry pies made.

The objective is to maximize profit. Given that the profit per apple pie is $5 and per blueberry pie is $6, the objective function can be represented as:
\[ \text{Maximize: } 5x_1 + 6x_2 \]

Constraints are based on the time available and the maximum number of pies that can be made due to fruit availability:
1. Time constraint: It takes 30 minutes to make one apple pie and 40 minutes to make a blueberry pie, with only 4500 minutes available per week.
\[ 30x_1 + 40x_2 \leq 4500 \]
2. Fruit availability constraints:
- For apple pies: \( x_1 \leq 70 \)
- For blueberry pies: \( x_2 \leq 60 \)

Non-negativity constraints (since the number of pies cannot be negative):
- \( x_1 \geq 0 \)
- \( x_2 \geq 0 \)

And integer constraints, as you can't make a fraction of a pie:
- \( x_1 \in \mathbb{Z} \)
- \( x_2 \in \mathbb{Z} \)

Thus, the symbolic representation in JSON format is:
```json
{
    'sym_variables': [('x1', 'number of apple pies'), ('x2', 'number of blueberry pies')],
    'objective_function': '5*x1 + 6*x2',
    'constraints': [
        '30*x1 + 40*x2 <= 4500',
        'x1 <= 70',
        'x2 <= 60',
        'x1 >= 0',
        'x2 >= 0'
    ]
}
```

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

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

# Define variables
x1 = m.addVar(vtype=GRB.INTEGER, name="apple_pies")
x2 = m.addVar(vtype=GRB.INTEGER, name="blueberry_pies")

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

# Add constraints
m.addConstr(30*x1 + 40*x2 <= 4500, "time_constraint")
m.addConstr(x1 <= 70, "apple_pie_limit")
m.addConstr(x2 <= 60, "blueberry_pie_limit")
m.addConstr(x1 >= 0, "non_negative_apple")
m.addConstr(x2 >= 0, "non_negative_blueberry")

# Optimize the model
m.optimize()

# Print solution
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Number of apple pies: {x1.x}")
    print(f"Number of blueberry pies: {x2.x}")
    print(f"Maximum profit: ${5*x1.x + 6*x2.x}")
else:
    print("No optimal solution found")
```