andibase

Construction Site Visit Agent

Agent-ready recipe for reviewing field-visit inputs and preparing an installation-ready material list in andibase

Open Markdown

This recipe tells an agent exactly how to build a construction site-visit workflow in andibase.

The workflow is designed for teams that need to review a project quote, field-visit photos and videos, client conversations, and site notes before confirming how an installation should be executed and which materials are required.

Goal

Create five things in one workspace:

  1. A construction-project data definition.
  2. A site-visit-input data definition.
  3. An installation-plan data definition.
  4. A material-list-item data definition.
  5. One agent that validates project readiness and creates the installation material list.

Expected outcome

After following this recipe, the workspace should have:

  • a construction-project definition for quote context, scope, and client-facing project details
  • a site-visit-input definition for quote extracts, photo notes, video transcripts, and client conversation summaries
  • an installation-plan definition for the validated installation approach
  • a material-list-item definition for the proposed bill of materials
  • a construction-site-visit-agent agent

Use the API documented in:

Current runtime constraints

The current workspace agent runtime is strong at structured data workflows, but it does not guarantee direct browsing of arbitrary folders or native processing of raw photos, raw videos, or audio recordings unless those capabilities exist in the execution environment.

That means this recipe should:

  • store project quote details in structured data
  • ingest photos, videos, and client conversations as structured site-visit input rows, transcripts, or extracted notes
  • generate an installation plan from those structured inputs
  • create a high-confidence material list and clearly flag uncertainties instead of pretending every assumption is confirmed

If a future ingestion tool can extract text, frames, measurements, or transcripts from media files automatically, it can populate the same site-visit-input rows and the agent can use them without changing the workflow.

Agent instructions

When an agent executes this recipe, it should follow these rules:

  1. Create the construction-project definition first.
  2. Create the site-visit-input definition second.
  3. Create the installation-plan definition third.
  4. Create the material-list-item definition fourth.
  5. In the current API, data definition handles are generated from name. Use name: "Construction Project", name: "Site Visit Input", name: "Installation Plan", and name: "Material List Item" so the created handles normalize to construction-project, site-visit-input, installation-plan, and material-list-item.
  6. If your execution environment can resolve the created definition ids, you may use relationship fields. If it cannot, use text foreign keys such as projectRecordId and planRecordId, because the public HTTP API still expects dataDefinitionId for relationship fields.
  7. Create the construction site-visit agent with instructions focused on scope validation, discrepancy detection, installation planning, and material-list creation.
  8. Use the current agent tools. Do not claim that a photo, video, or conversation was fully processed unless the relevant evidence was actually available as structured input, extracted text, or transcript data.
  9. If key evidence is missing or ambiguous, keep the installation plan in a blocked or review-needed state and record the unresolved questions.
  10. Ask the user only when a missing choice materially changes installation feasibility, such as installation surface, access restrictions, electrical requirements, structural constraints, or quote scope.

Step 1: Create the data model

Create four data definitions: construction-project, site-visit-input, installation-plan, and material-list-item.

1. Construction Project definition

Use name: "Construction Project". The current API derives the handle from the name, so this will create the construction-project handle.

Recommended fields:

{
  "name": "Construction Project",
  "description": "Tracks the quoted project scope, client context, and installation readiness.",
  "fields": {
    "projectName": {
      "name": "Project name",
      "type": "text"
    },
    "clientName": {
      "name": "Client name",
      "type": "text"
    },
    "quoteNumber": {
      "name": "Quote number",
      "type": "text"
    },
    "quoteVersion": {
      "name": "Quote version",
      "type": "text"
    },
    "siteAddress": {
      "name": "Site address",
      "type": "text"
    },
    "projectType": {
      "name": "Project type",
      "type": "select",
      "options": [
        { "value": "interior-fitout", "label": "Interior fit-out", "color": "blue" },
        { "value": "electrical", "label": "Electrical", "color": "amber" },
        { "value": "hvac", "label": "HVAC", "color": "cyan" },
        { "value": "networking", "label": "Networking", "color": "violet" },
        { "value": "security", "label": "Security", "color": "red" },
        { "value": "other", "label": "Other", "color": "zinc" }
      ]
    },
    "status": {
      "name": "Status",
      "type": "select",
      "options": [
        { "value": "intake", "label": "Intake", "color": "sky" },
        { "value": "reviewing-site-visit", "label": "Reviewing site visit", "color": "blue" },
        { "value": "needs-clarification", "label": "Needs clarification", "color": "amber" },
        { "value": "ready-for-materials", "label": "Ready for materials", "color": "green" },
        { "value": "blocked", "label": "Blocked", "color": "red" },
        { "value": "approved", "label": "Approved", "color": "emerald" }
      ]
    },
    "scopeSummary": {
      "name": "Scope summary",
      "type": "text",
      "variant": "long-text"
    },
    "clientConversationSummary": {
      "name": "Client conversation summary",
      "type": "text",
      "variant": "long-text"
    },
    "quotedSystems": {
      "name": "Quoted systems",
      "type": "json"
    },
    "budgetEstimate": {
      "name": "Budget estimate",
      "type": "number"
    },
    "targetInstallDate": {
      "name": "Target install date",
      "type": "date"
    },
    "assumptions": {
      "name": "Assumptions",
      "type": "json"
    },
    "openQuestions": {
      "name": "Open questions",
      "type": "json"
    }
  }
}

Recommended defaults for agent-created project rows:

  • status: intake
  • quotedSystems: []
  • assumptions: []
  • openQuestions: []

2. Site Visit Input definition

Use name: "Site Visit Input". The current API derives the handle from the name, so this will create the site-visit-input handle.

Recommended fields:

{
  "name": "Site Visit Input",
  "description": "Tracks structured evidence from quotes, photos, videos, measurements, and client conversations.",
  "fields": {
    "projectRecordId": {
      "name": "Project record id",
      "description": "Store the linked construction-project row id when the client only has public HTTP API access.",
      "type": "text"
    },
    "inputType": {
      "name": "Input type",
      "type": "select",
      "options": [
        { "value": "quote", "label": "Quote", "color": "blue" },
        { "value": "photo", "label": "Photo", "color": "green" },
        { "value": "video", "label": "Video", "color": "violet" },
        { "value": "conversation", "label": "Conversation", "color": "amber" },
        { "value": "measurement", "label": "Measurement", "color": "cyan" },
        { "value": "other", "label": "Other", "color": "zinc" }
      ]
    },
    "sourceName": {
      "name": "Source name",
      "type": "text"
    },
    "capturedBy": {
      "name": "Captured by",
      "type": "text"
    },
    "capturedAt": {
      "name": "Captured at",
      "type": "timestamp"
    },
    "processingStatus": {
      "name": "Processing status",
      "type": "select",
      "options": [
        { "value": "pending-review", "label": "Pending review", "color": "amber" },
        { "value": "reviewed", "label": "Reviewed", "color": "green" },
        { "value": "needs-transcript", "label": "Needs transcript", "color": "violet" },
        { "value": "needs-clarification", "label": "Needs clarification", "color": "red" }
      ]
    },
    "extractedText": {
      "name": "Extracted text",
      "type": "text",
      "variant": "long-text"
    },
    "observedDetails": {
      "name": "Observed details",
      "type": "text",
      "variant": "long-text"
    },
    "locationNote": {
      "name": "Location note",
      "type": "text"
    },
    "dimensions": {
      "name": "Dimensions",
      "type": "json"
    },
    "issuesFound": {
      "name": "Issues found",
      "type": "json"
    },
    "pendingReason": {
      "name": "Pending reason",
      "type": "text",
      "variant": "long-text"
    }
  }
}

Recommended defaults for ingested input rows:

  • processingStatus: pending-review
  • dimensions: {}
  • issuesFound: []

3. Installation Plan definition

Use name: "Installation Plan". The current API derives the handle from the name, so this will create the installation-plan handle.

Recommended fields:

{
  "name": "Installation Plan",
  "description": "Tracks the validated installation approach and readiness status for a construction project.",
  "fields": {
    "projectRecordId": {
      "name": "Project record id",
      "description": "Store the linked construction-project row id when the client only has public HTTP API access.",
      "type": "text"
    },
    "planTitle": {
      "name": "Plan title",
      "type": "text"
    },
    "readinessStatus": {
      "name": "Readiness status",
      "type": "select",
      "options": [
        { "value": "draft", "label": "Draft", "color": "zinc" },
        { "value": "review-needed", "label": "Review needed", "color": "amber" },
        { "value": "blocked", "label": "Blocked", "color": "red" },
        { "value": "ready-for-materials", "label": "Ready for materials", "color": "green" },
        { "value": "approved-for-installation", "label": "Approved for installation", "color": "emerald" }
      ]
    },
    "installationSummary": {
      "name": "Installation summary",
      "type": "text",
      "variant": "long-text"
    },
    "sitePreparation": {
      "name": "Site preparation",
      "type": "text",
      "variant": "long-text"
    },
    "accessRequirements": {
      "name": "Access requirements",
      "type": "text",
      "variant": "long-text"
    },
    "constraints": {
      "name": "Constraints",
      "type": "json"
    },
    "riskNotes": {
      "name": "Risk notes",
      "type": "json"
    },
    "unresolvedQuestions": {
      "name": "Unresolved questions",
      "type": "json"
    },
    "verificationChecklist": {
      "name": "Verification checklist",
      "type": "json"
    },
    "lastReviewedAt": {
      "name": "Last reviewed at",
      "type": "timestamp"
    }
  }
}

Recommended defaults for agent-created plan rows:

  • readinessStatus: draft
  • constraints: []
  • riskNotes: []
  • unresolvedQuestions: []
  • verificationChecklist: []

4. Material List Item definition

Use name: "Material List Item". The current API derives the handle from the name, so this will create the material-list-item handle.

Recommended fields:

{
  "name": "Material List Item",
  "description": "Tracks proposed materials required to execute the validated installation plan.",
  "fields": {
    "planRecordId": {
      "name": "Plan record id",
      "description": "Store the linked installation-plan row id when the client only has public HTTP API access.",
      "type": "text"
    },
    "projectRecordId": {
      "name": "Project record id",
      "description": "Store the linked construction-project row id when the client only has public HTTP API access.",
      "type": "text"
    },
    "itemName": {
      "name": "Item name",
      "type": "text"
    },
    "category": {
      "name": "Category",
      "type": "select",
      "options": [
        { "value": "hardware", "label": "Hardware", "color": "blue" },
        { "value": "cabling", "label": "Cabling", "color": "violet" },
        { "value": "mounting", "label": "Mounting", "color": "amber" },
        { "value": "electrical", "label": "Electrical", "color": "red" },
        { "value": "safety", "label": "Safety", "color": "green" },
        { "value": "other", "label": "Other", "color": "zinc" }
      ]
    },
    "quantity": {
      "name": "Quantity",
      "type": "number"
    },
    "unit": {
      "name": "Unit",
      "type": "text"
    },
    "specification": {
      "name": "Specification",
      "type": "text",
      "variant": "long-text"
    },
    "purpose": {
      "name": "Purpose",
      "type": "text",
      "variant": "long-text"
    },
    "confidence": {
      "name": "Confidence",
      "type": "select",
      "options": [
        { "value": "confirmed", "label": "Confirmed", "color": "green" },
        { "value": "assumed", "label": "Assumed", "color": "amber" },
        { "value": "to-verify", "label": "To verify", "color": "red" }
      ]
    },
    "sourceReason": {
      "name": "Source reason",
      "type": "text",
      "variant": "long-text"
    },
    "itemStatus": {
      "name": "Item status",
      "type": "select",
      "options": [
        { "value": "proposed", "label": "Proposed", "color": "blue" },
        { "value": "approved", "label": "Approved", "color": "green" },
        { "value": "blocked", "label": "Blocked", "color": "red" }
      ]
    }
  }
}

Recommended defaults for agent-created material rows:

  • quantity: 1
  • confidence: assumed
  • itemStatus: proposed

If your client already has the created definition ids, you can replace the text foreign keys with relationship fields:

{
  "projectId": {
    "name": "Project",
    "type": "relationship",
    "dataDefinitionId": "<construction-project-definition-id>"
  },
  "planId": {
    "name": "Plan",
    "type": "relationship",
    "dataDefinitionId": "<installation-plan-definition-id>"
  }
}

Step 2: Create the construction site-visit agent

Create one workspace agent with handle construction-site-visit-agent.

Recommended behavior:

  • review the project quote, field-visit inputs, and client conversation summaries together
  • detect mismatches between quoted scope and site reality
  • identify missing measurements, access issues, or dependencies before material planning
  • create or update one installation plan per project
  • generate material-list items only when the available evidence supports them
  • mark uncertain materials as assumed or to-verify instead of pretending the list is perfect
  • keep the project or plan in a clarification state when critical evidence is missing

Recommended agent payload:

{
  "name": "Construction Site Visit Agent",
  "handle": "construction-site-visit-agent",
  "description": "Reviews project quotes and field-visit evidence to validate installation scope and build the material list.",
  "model": "openai/gpt-5.4",
  "capabilities": {
    "webAccess": false,
    "browserAccess": false,
    "objectsAccess": true
  },
  "instructions": "You manage a construction site-visit workflow. Use the construction-project, site-visit-input, installation-plan, and material-list-item data definitions as the source of truth. Be action-oriented: make reasonable assumptions, complete the work when the intended outcome is clear, and avoid asking for confirmation on every small step. Review the quote context, site-visit evidence, and client conversation notes together before deciding how installation should be executed. Detect scope gaps, contradictions, missing measurements, access constraints, and any client expectation that is not yet reflected in the quote or plan. Create or update the installation-plan row with a clear readinessStatus, installationSummary, constraints, and unresolvedQuestions. Create material-list-item rows only when the available inputs support them. If an item is inferred rather than confirmed, mark confidence as assumed or to-verify and explain the sourceReason. Do not pretend that raw photos, raw videos, or audio were processed unless the relevant extracted notes or transcripts are already available in site-visit-input. If critical evidence is missing, keep the plan in review-needed or blocked status instead of faking certainty."
}

Create the agent with POST /api/v1/agents.

Use this operating flow:

  1. Load the quote and core client details into construction-project.
  2. Ingest each photo, video, measurement, and client conversation summary into site-visit-input.
  3. Ask the agent to review all project and input rows together.
  4. The agent creates or updates the installation-plan and flags any contradictions or missing evidence.
  5. The agent generates material-list-item rows from the validated plan, using confidence markers for any assumption that still needs confirmation.
  6. If the plan is blocked or still unclear, the agent records unresolved questions before the team commits to the final material list.

An agent should consider the recipe complete only if all of the following are true:

  1. construction-project exists and includes the required fields.
  2. site-visit-input exists and can represent quote details, photo notes, video transcripts, and client conversation summaries.
  3. installation-plan exists and includes either the projectId relationship or the projectRecordId fallback used by the current public HTTP API flow.
  4. material-list-item exists and includes either the planId relationship or the planRecordId fallback used by the current public HTTP API flow.
  5. construction-site-visit-agent exists.
  6. At least one sample project can be created with related site-visit inputs.
  7. At least one installation plan can be created with a meaningful readinessStatus, installationSummary, and unresolvedQuestions.
  8. At least one material item can be created with confidence and sourceReason.
  9. The recipe makes it explicit that missing media extraction or missing transcripts must be marked as pending rather than silently ignored.

Minimal delivery summary

When the agent finishes, it should report:

  • the created data definition handles
  • the created agent handle
  • whether site-visit evidence was fully structured or still has pending extraction work
  • any assumptions made about installation method, access, measurements, or material quantities

On this page