To solve the given optimization problem, we first need to translate the natural language description into a symbolic representation. This involves defining the variables, the objective function, and the constraints using algebraic terms.

Given:
- Variables: `x0` for milligrams of vitamin B3, `x1` for grams of fiber.
- Objective Function: Maximize `2*x0 + 8*x1`.
- Constraints:
  1. Immune support index from vitamin B3 is 4: `4*x0`.
  2. Kidney support index for vitamin B3 is 5: `5*x0`.
  3. Immune support index from fiber is 4: `4*x1`.
  4. Kidney support index for fiber is 1: `1*x1`.
  5. Total combined immune support index ≥ 8: `4*x0 + 4*x1 ≥ 8`.
  6. Total combined kidney support index ≥ 4: `5*x0 + 1*x1 ≥ 4`.
  7. Constraint on vitamin B3 and fiber: `4*x0 - 6*x1 ≥ 0`.
  8. Total immune support index ≤ 17: `4*x0 + 4*x1 ≤ 17`.
  9. (Repeated) Total immune support index ≤ 17.
  10. Total kidney support index ≤ 11: `5*x0 + 1*x1 ≤ 11`.
  11. (Repeated) Total kidney support index ≤ 11.
  12. Vitamin B3 must be a whole number: `x0` is an integer.

Symbolic Representation:
```json
{
  'sym_variables': [('x0', 'milligrams of vitamin B3'), ('x1', 'grams of fiber')],
  'objective_function': '2*x0 + 8*x1',
  'constraints': [
    '4*x0 + 4*x1 >= 8',
    '5*x0 + 1*x1 >= 4',
    '4*x0 - 6*x1 >= 0',
    '4*x0 + 4*x1 <= 17',
    '5*x0 + 1*x1 <= 11'
  ]
}
```

Now, let's implement this problem in Gurobi Python:

```python
from gurobipy import *

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

# Define the variables
x0 = m.addVar(vtype=GRB.INTEGER, name="milligrams_of_vitamin_B3")
x1 = m.addVar(vtype=GRB.CONTINUOUS, name="grams_of_fiber")

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

# Add constraints
m.addConstr(4*x0 + 4*x1 >= 8, "Immune_Support_Min")
m.addConstr(5*x0 + 1*x1 >= 4, "Kidney_Support_Min")
m.addConstr(4*x0 - 6*x1 >= 0, "Vitamin_Fiber_Constraint")
m.addConstr(4*x0 + 4*x1 <= 17, "Immune_Support_Max")
m.addConstr(5*x0 + 1*x1 <= 11, "Kidney_Support_Max")

# Optimize the model
m.optimize()

# Print the results
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Milligrams of Vitamin B3: {x0.x}")
    print(f"Grams of Fiber: {x1.x}")
    print(f"Objective Function Value: {m.objVal}")
else:
    print("No optimal solution found.")
```