Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.sutro.sh/llms.txt

Use this file to discover all available pages before exploring further.

Use run_function() for one request and batch_run_function() for many rows. Call the Function by name and pass the input fields it expects. Sutro uses the Function’s published setup automatically.
Use the Function name only. Do not include a namespace, owner, or revision. The authenticated API key determines which customer namespace is searched, and the currently published revision is resolved automatically.
Only text Functions are supported today. Image, PDF, and other multimodal Functions are not yet runnable through run_function() or batch_run_function().

Running a Function

run_function(
    name: str,
    input_data: dict | BaseModel,
    langsmith_metadata: Optional[Dict[str, Any]] = None,
    langsmith_tags: Optional[List[str]] = None,
)

Parameters

  • name — Function name to execute.
  • input_data — Input object matching the Function inputs. Can be a plain dictionary or a Pydantic model.
  • langsmith_metadata — Optional trace metadata when LangSmith tracing is enabled.
  • langsmith_tags — Optional trace tags when LangSmith tracing is enabled.

Return shape

Most Functions return one of two payload shapes. For the full response reference, see Running a Function. Classification-style Functions return one primary answer:
{
  "response": "qualified",
  "confidence": 0.91,
  "predictions": [
    { "label": "qualified", "confidence": 0.91 },
    { "label": "not_qualified", "confidence": 0.09 }
  ],
  "rationale": "The lead matches the qualification rubric.",
  "usage": {
    "input_tokens": 173,
    "output_tokens": 42,
    "system_prompt": "Return one lead qualification label."
  }
}
Structured extraction Functions return an object:
{
  "output": {
    "company": "Acme Labs",
    "segment": "B2B analytics",
    "region": "APAC"
  },
  "rationale": "The requested fields are present in the input.",
  "confidence": 0.82,
  "usage": {
    "input_tokens": 244,
    "output_tokens": 66,
    "system_prompt": "Extract the requested lead fields."
  }
}
There is no run_id in this response.

Examples

Replace lead-qualifier with your published Function name and add the correct input data (structured to adhere to the Function’s input schema). Using a dictionary:
import sutro as so

result = so.run_function(
    name="lead-qualifier",
    input_data={
        "query": "Find cybersecurity leaders evaluating AI vendors.",
        "region": "APAC",
    },
)

print(result)
Using a Pydantic model:
import sutro as so
from pydantic import BaseModel

class LeadInput(BaseModel):
    query: str
    region: str | None = None

result = so.run_function(
    name="lead-qualifier",
    input_data=LeadInput(
        query="Find cybersecurity leaders evaluating AI vendors.",
        region="APAC",
    ),
)

print(result)

Running a Function in Batch

batch_run_function(
    name: str,
    data: List[dict] | pd.DataFrame | pl.DataFrame | str,
    job_priority: int | None = 0,
    output_column: str = "inference_result",
    dry_run: bool = False,
    stay_attached: bool = False,
    job_name: Optional[str] = None,
    description: Optional[str] = None,
    langsmith_metadata: Optional[Dict[str, Any]] = None,
    langsmith_tags: Optional[List[str]] = None,
)
batch_run_function() submits many rows to the same Function.

Parameters

  • name — Function name to execute.
  • data — One of:
    • List[dict]
    • pandas.DataFrame
    • polars.DataFrame
    • local .csv or .parquet file path
    • pre-signed download URL pointing to a .csv or .parquet file
  • job_priority — Batch priority level. Defaults to 0.
  • output_column — Output column name for downstream results.
  • dry_run — If True, submit a cost-estimate job instead of full inference. The SDK maps this to the Batch API’s cost_estimate request field.
  • stay_attached — If True, stay attached to the job and stream progress.
  • job_name — Optional job name.
  • description — Optional job description.
  • langsmith_metadata — Optional trace metadata when LangSmith tracing is enabled.
  • langsmith_tags — Optional trace tags when LangSmith tracing is enabled.
When data is a local CSV or Parquet path, the SDK reads the file locally and submits rows whose column names must match the Function inputs.
Dataset IDs are not supported by batch_run_function(). Use a list of dictionaries, a DataFrame, or a local CSV/Parquet file path.

Examples

Using a list of dictionaries:
import sutro as so

job_id = so.batch_run_function(
    name="lead-qualifier",
    data=[
        {
            "query": "Find cybersecurity leaders evaluating AI vendors.",
            "region": "APAC",
        },
        {
            "query": "Find sales operations leaders replacing manual enrichment.",
            "region": "EMEA",
        },
    ],
)

print(job_id)
Using a Polars DataFrame:
import polars as pl
import sutro as so

df = pl.DataFrame(
    {
        "query": [
            "Find cybersecurity leaders evaluating AI vendors.",
            "Find sales operations leaders replacing manual enrichment.",
        ],
        "region": ["APAC", "EMEA"],
    }
)

job_id = so.batch_run_function(
    name="lead-qualifier",
    data=df,
)

print(job_id)
Using a local file path:
import sutro as so

job_id = so.batch_run_function(
    name="lead-qualifier",
    data="./lead_inputs.csv",
)

print(job_id)

Working with batch results

Batch jobs run asynchronously. Use await_job_completion() to wait for completion and retrieve results:
import sutro as so

job_id = so.batch_run_function(
    name="lead-qualifier",
    data=[
        {
            "query": "Find cybersecurity leaders evaluating AI vendors.",
            "region": "APAC",
        }
    ],
)

results_df = so.await_job_completion(job_id)
print(results_df)
By default, get_job_results() and await_job_completion() unpack JSON outputs when possible. For a Function that returns label and rationale, the result DataFrame may contain columns such as:
shape: (1, 3)
┌───────────┬─────────────────────────────────────────────┬──────────────────┐
│ label     ┆ rationale                                   ┆ confidence_score │
│ ---       ┆ ---                                         ┆ ---              │
│ str       ┆ str                                         ┆ f64              │
╞═══════════╪═════════════════════════════════════════════╪══════════════════╡
│ qualified ┆ The lead matches the qualification rubric.  ┆ 1.0              │
└───────────┴─────────────────────────────────────────────┴──────────────────┘
To inspect the raw JSON string instead, disable JSON unpacking:
import json
import sutro as so

raw_results_df = so.get_job_results(job_id, unpack_json=False)

first_result = json.loads(raw_results_df["inference_result"][0])
content = first_result.get("content", first_result)

print(content)
print(first_result.get("reasoning_content"))
print(raw_results_df["confidence_score"][0])
For lower-volume or synchronous workloads, use run_function().