Spaces:
Sleeping
Sleeping
| """SLM Function Calling - Gradio App for HuggingFace Spaces.""" | |
| import os | |
| import gradio as gr | |
| from inferencer import Inferencer | |
| # Configuration | |
| REPO_ID = os.environ.get("HF_MODEL_REPO", "suyash94/gpt2-fc-adapter") | |
| LOCAL_DIR = os.environ.get("LOCAL_CHECKPOINT_DIR", None) | |
| BASE_MODEL = os.environ.get("BASE_MODEL", "gpt2") | |
| # Initialize inferencer (loads model on startup) | |
| print("=" * 60) | |
| print("SLM Function Calling - Car Control Demo") | |
| print("=" * 60) | |
| if LOCAL_DIR: | |
| print(f"Loading from local: {LOCAL_DIR}") | |
| inferencer = Inferencer(local_dir=LOCAL_DIR, base_model=BASE_MODEL) | |
| else: | |
| print(f"Loading from HuggingFace Hub: {REPO_ID}") | |
| inferencer = Inferencer(repo_id=REPO_ID, base_model=BASE_MODEL) | |
| print("Model ready!") | |
| def predict_function_call(command: str) -> tuple[str, dict]: | |
| """Predict function call from user command. | |
| :param command: User's natural language command | |
| :return: Tuple of (raw response, parsed function call dict) | |
| """ | |
| if not command or not command.strip(): | |
| return "", {"info": "Please enter a command"} | |
| result = inferencer.predict(command.strip()) | |
| raw_response = result["response"] | |
| parsed = result["parsed"] | |
| return raw_response, parsed | |
| # Example commands covering all 18 functions | |
| EXAMPLE_COMMANDS = [ | |
| # Climate Control | |
| ["Set the temperature to 22 degrees for the driver"], | |
| ["Turn up the heat"], | |
| ["Set the fan to high"], | |
| # Comfort | |
| ["Move my seat forward"], | |
| ["Close all the windows"], | |
| # Wipers & Defroster | |
| ["Set wipers to medium"], | |
| ["Speed up the wipers"], | |
| ["Turn on the defroster for 15 minutes"], | |
| # Engine & Doors | |
| ["Start the engine"], | |
| ["Lock all the doors"], | |
| # Entertainment | |
| ["Play some jazz music at volume 7"], | |
| # Navigation | |
| ["Navigate to Central Park, New York"], | |
| # Lighting | |
| ["Turn on the headlights"], | |
| ["Set ambient lighting to blue at intensity 8"], | |
| # Driving | |
| ["Set cruise control to 80"], | |
| ["Activate sport mode"], | |
| # Maintenance | |
| ["Check the battery health with history"], | |
| ] | |
| # Main description (left column) | |
| LEFT_DESCRIPTION = """ | |
| # SLM Function Calling | |
| A **small language model (GPT-2, 124M params)** fine-tuned to convert natural language commands into structured function calls for car control. | |
| ## What This Model Does | |
| Given a command like *"Set the temperature to 22 degrees"*, outputs: | |
| ```json | |
| {"fn_name": "set_temperature", "properties": {"temperature": 22}} | |
| ``` | |
| ## Available Functions (18 Total) | |
| | Category | Functions | | |
| |----------|-----------| | |
| | **Climate** | `set_temperature`, `adjust_temperature`, `set_fan_speed`, `adjust_fan_speed` | | |
| | **Comfort** | `adjust_seat`, `control_window` | | |
| | **Wipers** | `set_wiper_speed`, `adjust_wiper_speed`, `activate_defroster` | | |
| | **Engine** | `start_engine`, `lock_doors` | | |
| | **Media** | `play_music` | | |
| | **Nav** | `set_navigation_destination` | | |
| | **Lights** | `toggle_headlights`, `control_ambient_lighting` | | |
| | **Driving** | `set_cruise_control`, `toggle_sport_mode` | | |
| | **Maintenance** | `check_battery_health` | | |
| ## Example Commands | |
| - *"Set the temperature to 25 degrees"* | |
| - *"Turn up the heat"* / *"Make it cooler"* | |
| - *"Move my seat forward"* | |
| - *"Open all windows"* | |
| - *"Turn on the wipers"* | |
| - *"Start the car remotely"* | |
| - *"Lock the doors"* | |
| - *"Play jazz at volume 7"* | |
| - *"Navigate to Central Park"* | |
| - *"Turn on headlights"* | |
| - *"Set ambient lighting to blue"* | |
| - *"Set cruise control to 80"* | |
| - *"Activate sport mode"* | |
| - *"Check battery health"* | |
| """ | |
| FUNCTION_REFERENCE = """ | |
| ## Function Reference | |
| ### Climate Control | |
| | Function | Description | Required Parameters | Optional Parameters | | |
| |----------|-------------|---------------------|---------------------| | |
| | `set_temperature` | Set temperature in a zone | `temperature` (1-80) | `area` (driver/front-passenger/rear-right/rear-left), `unit` (Celsius/Fahrenheit) | | |
| | `adjust_temperature` | Increase/decrease temperature | `action` (increase/decrease) | `area` | | |
| | `set_fan_speed` | Set fan to specific level | `speed` (LOW/MEDIUM/HIGH) | `area` | | |
| | `adjust_fan_speed` | Increase/decrease fan speed | `speed` (increase/decrease) | `area` | | |
| ### Comfort | |
| | Function | Description | Required Parameters | Optional Parameters | | |
| |----------|-------------|---------------------|---------------------| | |
| | `adjust_seat` | Adjust seat position | `position` (forward/backward/up/down/tilt-forward/tilt-backward) | `seat_type` (driver/front-passenger/rear_right/rear_left) | | |
| | `control_window` | Open/close windows | `window_position` (open/close) | `window_location` (driver/front-passenger/rear_right/rear_left) | | |
| ### Wipers & Defroster | |
| | Function | Description | Required Parameters | Optional Parameters | | |
| |----------|-------------|---------------------|---------------------| | |
| | `set_wiper_speed` | Set wiper speed | `speed` (LOW/MEDIUM/HIGH) | - | | |
| | `adjust_wiper_speed` | Increase/decrease wipers | `speed` (INCREASE/DECREASE) | - | | |
| | `activate_defroster` | Activate window defroster | - | `defroster_zone` (front/rear/all), `duration_minutes` (1-30) | | |
| ### Engine & Security | |
| | Function | Description | Required Parameters | Optional Parameters | | |
| |----------|-------------|---------------------|---------------------| | |
| | `start_engine` | Start the car's engine | - | `method` (remote/keyless/keyed) | | |
| | `lock_doors` | Lock/unlock car doors | `lock_state` (lock/unlock) | - | | |
| ### Entertainment | |
| | Function | Description | Required Parameters | Optional Parameters | | |
| |----------|-------------|---------------------|---------------------| | |
| | `play_music` | Control music player | - | `track` (song name), `volume` (1-10) | | |
| ### Navigation | |
| | Function | Description | Required Parameters | Optional Parameters | | |
| |----------|-------------|---------------------|---------------------| | |
| | `set_navigation_destination` | Set GPS destination | `destination` (address/location) | - | | |
| ### Lighting | |
| | Function | Description | Required Parameters | Optional Parameters | | |
| |----------|-------------|---------------------|---------------------| | |
| | `toggle_headlights` | Turn headlights on/off | `light_state` (on/off) | - | | |
| | `control_ambient_lighting` | Set interior lighting | `color` (warm/red/blue/dark/white) | `intensity` (1-10) | | |
| ### Driving | |
| | Function | Description | Required Parameters | Optional Parameters | | |
| |----------|-------------|---------------------|---------------------| | |
| | `set_cruise_control` | Set cruise control speed | `speed` (10-150 km/h) | - | | |
| | `toggle_sport_mode` | Activate/deactivate sport mode | `action` (activate/deactivate) | - | | |
| ### Maintenance | |
| | Function | Description | Required Parameters | Optional Parameters | | |
| |----------|-------------|---------------------|---------------------| | |
| | `check_battery_health` | Check battery status | - | `include_history` (true/false) | | |
| """ | |
| # Build Gradio interface | |
| with gr.Blocks( | |
| title="SLM Function Calling - Car Control", | |
| ) as demo: | |
| with gr.Row(): | |
| # Left column: Description | |
| with gr.Column(scale=1): | |
| gr.Markdown(LEFT_DESCRIPTION) | |
| # Right column: Demo | |
| with gr.Column(scale=1): | |
| gr.Markdown("## Try It Out") | |
| command_input = gr.Textbox( | |
| label="Your Command", | |
| placeholder="e.g., Set the temperature to 22 degrees", | |
| lines=2, | |
| ) | |
| predict_btn = gr.Button("Predict Function Call", variant="primary") | |
| raw_output = gr.Textbox( | |
| label="Raw Model Output", | |
| lines=3, | |
| interactive=False, | |
| ) | |
| parsed_output = gr.JSON( | |
| label="Parsed Function Call", | |
| ) | |
| gr.Examples( | |
| examples=EXAMPLE_COMMANDS, | |
| inputs=[command_input], | |
| label="Example Commands", | |
| ) | |
| # Event handlers | |
| predict_btn.click( | |
| fn=predict_function_call, | |
| inputs=[command_input], | |
| outputs=[raw_output, parsed_output], | |
| ) | |
| command_input.submit( | |
| fn=predict_function_call, | |
| inputs=[command_input], | |
| outputs=[raw_output, parsed_output], | |
| ) | |
| # Function reference accordion | |
| gr.Markdown("---") | |
| with gr.Accordion("Function Reference (All 18 Functions)", open=False): | |
| gr.Markdown(FUNCTION_REFERENCE) | |
| gr.Markdown( | |
| """ | |
| --- | |
| **Source Code:** [GitHub Repository](https://github.com/suyash94/slm-function-calling) | |
| **Limitations:** | |
| - Only trained on car control domain commands | |
| - May produce incorrect outputs for ambiguous or out-of-domain queries | |
| - Best results with clear, specific commands | |
| """ | |
| ) | |
| if __name__ == "__main__": | |
| # share=True creates a public URL (works for 72 hours) | |
| demo.launch(share=True) | |