What's the difference between gr.Interface and gr.Blocks?
user
`gr.Interface` and `gr.Blocks` serve different purposes:

## gr.Interface
- **Simple, automatic UI generation**
- Best for single-function apps
- Minimal code required

```python
import gradio as gr

def greet(name):
    return f"Hello {name}!"

# Automatic layout
demo = gr.Interface(
    fn=greet,
    inputs="textbox",
    outputs="textbox",
    title="Simple Greeter"
)
demo.launch()
```

## gr.Blocks  
- **Full control over layout and interactions**
- Multiple functions and complex workflows
- Custom layouts with rows, columns, tabs

```python
import gradio as gr

with gr.Blocks() as demo:
    gr.Markdown("# Custom Layout")
    
    with gr.Row():
        with gr.Column(scale=2):
            name = gr.Textbox(label="Name")
            age = gr.Number(label="Age")
        
        with gr.Column(scale=1):
            btn = gr.Button("Process")
            output = gr.Textbox(label="Result")
    
    def process(name, age):
        return f"{name} is {age} years old"
    
    btn.click(process, inputs=[name, age], outputs=output)

demo.launch()
```

**Use gr.Interface for simple apps, gr.Blocks for complex layouts and interactions.**
assistant