> ## Documentation Index
> Fetch the complete documentation index at: https://kumo.ai/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Schedule Kumo Native App & Batch Predictions

> This guide walks through setting up Snowflake Tasks and Procedures to automatically: Run a Snowflake Notebook at the schedule time Start the Kumo App and kick off Batch Prediction Job. Once BP job is finished, Stop the Kumo App at the end of the day. our new file.

## **0. Grant yourself read access to Kumo tables** 

Because Kumo may create **new** tables or **update** existing ones during prediction runs, grant yourself (or a reader role) access to existing and **future** tables in the destination schema.

> Replace placeholders:
>
> * `TARGET_DB / TARGET_SCHEMA` → where your BP writes prediction/output tables
> * `MY_ROLE` → the role you use to read those outputs (can be `ACCOUNTADMIN`, or any role)

```sql theme={null}
-- you must have these to "see" the objects
GRANT USAGE ON DATABASE TARGET_DB TO ROLE MY_ROLE;
GRANT USAGE ON SCHEMA  TARGET_DB.TARGET_SCHEMA TO ROLE MY_ROLE;

-- read existing tables (one-time for what already exists)
GRANT SELECT ON ALL TABLES IN SCHEMA TARGET_DB.TARGET_SCHEMA TO ROLE MY_ROLE;

-- read all future tables (so you don't have to grant every run)
GRANT SELECT ON FUTURE TABLES IN SCHEMA TARGET_DB.TARGET_SCHEMA TO ROLE MY_ROLE;
```

## **1. Define Procedures**

Create two small procedures you can call from the notebook to safely **start** and **stop** the Kumo app.

> Replace:
>
> * `MY_DB.MY_SCHEMA` → where to store these procedures (e.g., `KUMO.AUTOMATION`)
> * `MY_APP` → your installed app name (e.g., `KUMO_SPCS_RELEASE_INTERNAL`)
> * `MY_USER_SCHEMA` → schema used when installing the app

```sql theme={null}
-- Idempotent START_APP
CREATE OR REPLACE PROCEDURE MY_DB.MY_SCHEMA.START_APP()
RETURNS STRING
LANGUAGE JAVASCRIPT
EXECUTE AS CALLER
AS
$$
function run(sql){ snowflake.execute({sqlText: sql}); }
try {
  // If this resolves, the app is already running
  run("CALL IDENTIFIER('MY_APP.PROCEDURES.GET_END_POINT')('MY_USER_SCHEMA')");
  return 'App already running; no action taken.';
} catch (e) {
  // Not running -> start it
  run("CALL IDENTIFIER('MY_APP.PROCEDURES.START_APP')('MY_USER_SCHEMA')");
  return 'App start initiated.';
}
$$;

-- Idempotent STOP_APP
CREATE OR REPLACE PROCEDURE MY_DB.MY_SCHEMA.STOP_APP()
RETURNS STRING
LANGUAGE JAVASCRIPT
EXECUTE AS CALLER
AS
$$
function run(sql){ snowflake.execute({sqlText: sql}); }
try {
  // Try to stop; if already stopped, the call may error — we swallow it
  run("CALL IDENTIFIER('MY_APP.PROCEDURES.SHUTDOWN_APP')('MY_USER_SCHEMA')");
  return 'App stop initiated.';
} catch (e) {
  return 'App already stopped or stop not needed; no action taken.';
}
$$;
```

## **2. Use these in your Kumo BP SDK snippet**

If you haven’t set up the SDK yet, follow the setup guide [here](/fine-tuning/installation)

> **Rules:**
>
> * Call **START\_APP() first** (very first command).
> * Run your BP pipeline with **non\_blocking = False** so the notebook waits for completion.
> * Call **STOP\_APP() last** (very last command), so the app shuts down after the job.

### **Example notebook flow**

**SQL cell — start app (first line):**

```sql theme={null}
CALL MY_DB.MY_SCHEMA.START_APP();
```

**Python cell — Kumo BP SDK (make sure non\_blocking=False):**

```python theme={null}
import kumoai

# Gather artifacts
pquery = kumoai.PredictiveQuery.load_from_training_job("trainingjob-...")
graph = pquery.graph

# Create a prediction table from the predictive query:
prediction_table = pquery.generate_prediction_table()

# Generate predictions:
trainer = kumoai.Trainer.load("trainingjob-...")
prediction_job = trainer.predict(
    graph,
    prediction_table,
    non_blocking = False  # <<< Make sure this is False so the notebook waits
)
```

**SQL cell — stop app (last line):**

```sql theme={null}
CALL MY_DB.MY_SCHEMA.STOP_APP();
```

## **3) Schedule the Containerized Notebook**

1. Open your containerized notebook in Snowflake.
2. Click **Schedule**.
3. Set your CRON/time zone and save

**CRON examples**

* **Every 3 hours (top of hour):**\
  `USING CRON 0 */3 * * * America/Chicago`
* **Daily at 7:00 AM:**\
  `USING CRON 0 7 * * * America/Chicago`
* **Daily at 8:00 PM:**\
  `USING CRON 0 20 * * * America/Chicago`
