Connect Aurora Solar to AI Agents: Scale Solar Ops and Engineering
Learn how to connect Aurora Solar to AI agents using Truto. Build autonomous workflows that handle asynchronous project creation, AI roof generation, and proposals.
You want to connect Aurora Solar to an AI agent so your internal systems can independently read project parameters, trigger AI roof generation, adjust system pricing, and compile customer proposals based on historical context. Here is exactly how to do it using Truto's /tools endpoint and SDK, bypassing the need to manually code dozens of endpoints or maintain complex API wrappers for asynchronous jobs.
Giving a Large Language Model (LLM) read and write access to your solar operations instance is an engineering headache. You either spend weeks building, hosting, and maintaining a custom connector that understands the difference between synchronous resources and background jobs, or you use a managed infrastructure layer that handles the boilerplate for you. If your team uses ChatGPT, check out our guide on connecting Aurora Solar to ChatGPT, or if you are building on Anthropic's models, read our guide on connecting Aurora Solar to Claude. For developers building custom autonomous workflows, you need a programmatic way to fetch these tools and bind them to your agent framework.
This guide breaks down exactly how to fetch AI-ready tools for Aurora Solar, bind them natively to an LLM using LangChain (or any framework like LangGraph, CrewAI, or Vercel AI SDK), and execute complex engineering operations workflows. For a deeper look at the architecture behind this approach, refer to our research on architecting AI agents and the SaaS integration bottleneck.
The Engineering Reality of Custom Aurora Solar Connectors
Building AI agents is easy. Connecting them to external SaaS APIs is hard. Giving an LLM access to external data sounds simple in a prototype. You write a Node.js function that makes a fetch request and wrap it in an @tool decorator. In production, this approach collapses entirely, especially with an ecosystem as complex as Aurora Solar.
If you decide to integrate Aurora Solar yourself, you own the entire API lifecycle. Aurora Solar's API introduces several highly specific integration challenges that break standard LLM assumptions.
The Asynchronous Polling Trap
Standard REST APIs execute a request and return the result. Aurora Solar deals with complex engineering processes - like running OCR on a utility bill or executing machine learning models to generate 3D roof structures. These processes do not resolve in milliseconds.
When an agent wants to generate an AI roof for a design, it cannot simply call a tool and wait for the response. It must call an endpoint like create_a_aurora_solar_ai_roof_run, which immediately returns an HTTP 202 Accepted and a job_id. Naive LLMs will assume the job is complete and attempt to proceed to the next step, resulting in guaranteed hallucination. To fix this, your agent must be explicitly configured to take that job_id, wait, and repeatedly call a secondary tool like list_all_aurora_solar_ai_roof_status until it returns a succeeded state. Building this deterministic loop logic directly into custom integration code is fragile and error-prone.
Ephemeral Pre-Signed URLs
Agents frequently need to extract information from or deliver documents to users. In Aurora Solar, when you request a proposal PDF or a legacy agreement document, the API does not hand you the raw binary data. Instead, it generates a pre-signed download URL.
These URLs are intentionally ephemeral - some expire in 24 hours, others in 12 hours, and agreement download links can expire in just 15 minutes. If an LLM stores this URL in long-term memory or a vector database and attempts to retrieve it during a subsequent session, the link will be dead. Your integration layer must be smart enough to recognize when an agent is asking for an asset, re-trigger the generation of a fresh URL, and return the new link to the context window immediately before action is taken.
Deep Resource Hierarchies
Aurora Solar enforces a strict, deep data hierarchy. Almost nothing exists globally. A utility_bill belongs to a project. A design belongs to a project. A project belongs to a tenant.
When prompting an LLM to "find the latest design pricing," the LLM must intrinsically understand that it cannot just search globally for designs. It needs to know the tenant_id, query the projects within that tenant, find the correct project_id, query the designs for that project, extract the design_id, and finally fetch the pricing. Hardcoding these required parameter chains into isolated REST wrappers results in brittle agent execution.
Fetching Tools Programmatically via Truto
Truto eliminates these integration bottlenecks by functioning as an abstraction layer. Every endpoint in the Aurora Solar API is mapped as a Resource with defined Methods. Truto handles the underlying authentication and parameter structuring, exposing these methods as Proxy APIs.
For AI agents, Truto translates these Proxy APIs into standardized tool schemas via the /integrated-account/<id>/tools endpoint. This means your application dynamically pulls a list of available Aurora Solar functions, complete with JSON Schema descriptions of required inputs, which you can bind directly to your LLM.
Aurora Solar Hero Tools for AI Agents
Instead of exposing hundreds of endpoints and overwhelming the model's context window, you should selectively filter the tools your agent receives based on the task at hand. Here are the highest-leverage tools for automating Aurora Solar workflows.
1. create_a_aurora_solar_tenant_project
This tool is the foundation of the sales-to-engineering pipeline. It allows an agent to create a net-new project record using either a raw property address string or specific latitude and longitude coordinates.
Contextual usage notes: The agent must be explicitly provided the tenant_id. If using latitude and longitude, ensure the agent formats them correctly in the payload. It returns the newly created project_id, which is required for all downstream operations.
"The customer John Doe at 123 Solar Way, Austin TX just signed a preliminary interest form. Create a new project in our primary tenant using that property address and return the project ID for our records."
2. create_a_aurora_solar_ai_roof_run
Triggers an asynchronous machine learning job to generate a 3D roof model for a specific design.
Contextual usage notes: This tool does not return the roof data. It returns an ai_roof_job object containing a job_id. Your agent must be instructed to capture this ID and not proceed to subsequent sizing steps until the job is confirmed complete.
"We need a preliminary structure for project ID 88392. Initiate an AI roof generation run for its default design and give me the tracking job ID."
3. list_all_aurora_solar_ai_roof_status
This is the required counterpart to the roof generation tool. It checks the execution state of a specific AI roof job.
Contextual usage notes: The agent should call this tool using the job_id obtained previously. You must instruct the LLM to yield or loop if the status is in-progress rather than hallucinating the roof geometry.
"Check the status of AI roof job ID 5592. If it is finished, let me know so we can move on to placing solar arrays."
4. update_a_aurora_solar_design_pricing_by_id
Allows the agent to modify the financial parameters of a design, updating the system price, price per watt, and adding required custom adders or incentives.
Contextual usage notes: Essential for dynamic quoting workflows. If an agent is negotiating with a customer or applying promotional logic based on external inputs, it calls this tool to adjust the underlying design math before generating a final proposal.
"The customer negotiated a $500 discount on design ID 1120. Update the pricing configuration for this design to apply a flat system discount of $500."
5. create_a_aurora_solar_proposal_pdf_generation_run
Starts the process of rendering the final customer-facing PDF document based on the current state of the design and its pricing.
Contextual usage notes: Like the AI roof tool, this is an asynchronous operation. It returns a proposal_pdf_generation_job. The agent must know to wait for the PDF renderer to finish.
"The design is complete and pricing is locked. Generate the final proposal PDF for design ID 1120 and store the job ID so we can fetch the download link."
6. list_all_aurora_solar_proposal_pdf_generation_status
Polls the PDF generation service. When successful, it returns a freshly generated, short-lived URL pointing to the final document.
Contextual usage notes: The URL returned here is ephemeral. The agent must immediately pass this URL to the user or to a downstream delivery system (like an email tool) before the link expires.
"Check on the proposal PDF generation job ID 992. If it's done, give me the final download URL so I can email it to the customer."
7. create_a_aurora_solar_order_decline
Allows the agent to programmatically disqualify and close an order based on predefined logic, specifying a disqualification reason.
Contextual usage notes: Useful for triage agents that analyze incoming orders. If an address is outside service territory or a site survey request fails, the agent can use this tool to automatically clean up the CRM pipeline.
"The site survey for order ID 445 came back indicating severe structural damage. Decline this order in the system with the reason 'Roof condition disqualification'."
To view the complete schema details and all available endpoints, see the Aurora Solar integration page.
Workflows in Action
When these tools are bound to an agentic framework, they enable autonomous, multi-step engineering operations. Here is how specific personas utilize these capabilities in production.
Scenario 1: The Automated Quoting Engine
Sales teams lose deals when they have to wait 24 hours for a design engineer to build a basic proposal. An AI agent can compress this timeline to minutes.
"A new lead just came in for 456 Sunshine Blvd. Create a new project, initiate the AI roof model, check that it succeeds, and then give me the project ID so I can review it."
- create_a_aurora_solar_tenant_project: The agent creates the container for the lead and extracts the new
project_id. - create_a_aurora_solar_tenant_design: The agent creates an empty design associated with that project.
- create_a_aurora_solar_ai_roof_run: The agent commands Aurora Solar's machine learning service to map the roof using the address coordinates, receiving a
job_id. - list_all_aurora_solar_ai_roof_status: The agent enters a loop, polling the status until it returns
succeeded.
The user instantly receives a project with a complete 3D roof model, bypassing manual modeling entirely and jumping straight to placing panels.
Scenario 2: Dynamic Discounting and Proposal Generation
A sales rep is on the phone with a customer who is on the fence. The rep needs to instantly revise the financial proposal with a specific incentive and get a new contract document immediately.
"Apply the 'Spring Promo' $1000 discount to design ID 9982, regenerate the proposal PDF, and give me the link as soon as it's ready."
- update_a_aurora_solar_design_pricing_by_id: The agent alters the financial model, injecting the requested discount value.
- create_a_aurora_solar_proposal_pdf_generation_run: The agent asks Aurora Solar to build a new PDF reflecting the updated math.
- list_all_aurora_solar_proposal_pdf_generation_status: The agent polls the renderer.
The sales rep is handed a fresh, accurate PDF download link within seconds, allowing them to close the deal on the call without putting the customer on hold.
Building Multi-Step Workflows
Binding Truto's dynamically generated tools to a framework like LangChain.js or Vercel AI SDK allows you to orchestrate the complex API interactions described above. The framework handles the ReAct (Reasoning and Acting) loop, interpreting the JSON schemas and deciding which tool to call next.
Managing API Rate Limits
When writing autonomous loops that interact with third-party SaaS, rate limits are the most common cause of catastrophic failure. Aurora Solar enforces rate limits. When your agent hits this limit, the upstream API returns an HTTP 429 error.
It is critical to understand that Truto does not retry, throttle, or apply backoff on rate limit errors. Truto passes that 429 error directly back to your application. What Truto does do is normalize the varied upstream rate limit information into standardized HTTP headers per the IETF specification (ratelimit-limit, ratelimit-remaining, ratelimit-reset).
Your application logic must catch the tool execution failure, read the ratelimit-reset header, pause the agent execution, and retry the tool call. Do not assume the integration layer absorbs these errors.
Framework-Agnostic Implementation
Here is how you initialize the tools using the Truto LangChain SDK and bind them to an agent. This pattern ensures the LLM understands exactly what parameters are required for asynchronous polling.
import { ChatOpenAI } from "@langchain/openai";
import { AgentExecutor, createToolCallingAgent } from "langchain/agents";
import { ChatPromptTemplate } from "@langchain/core/prompts";
import { TrutoToolManager } from "@trutohq/truto-langchainjs-toolset";
// 1. Initialize the tool manager with your Truto credentials and account ID
const toolManager = new TrutoToolManager({
trutoToken: process.env.TRUTO_TOKEN,
});
async function runAuroraWorkflow() {
// 2. Fetch the standardized Aurora Solar tools from Truto's /tools endpoint
const auroraTools = await toolManager.getTools(
"your-aurora-solar-integrated-account-id"
);
// 3. Initialize your LLM
const llm = new ChatOpenAI({
modelName: "gpt-4-turbo",
temperature: 0,
});
// 4. Bind the fetched tools to the LLM context
const prompt = ChatPromptTemplate.fromMessages([
[
"system",
"You are a highly capable solar engineering assistant. You interact with Aurora Solar. " +
"CRITICAL INSTRUCTION: If you run an asynchronous job (like AI Roof or Proposal Generation), " +
"you MUST capture the job_id and repeatedly call the associated status tool until the status " +
"is 'succeeded' before proceeding."
],
["human", "{input}"],
["placeholder", "{agent_scratchpad}"],
]);
const agent = createToolCallingAgent({
llm,
tools: auroraTools,
prompt,
});
const executor = new AgentExecutor({
agent,
tools: auroraTools,
tools,
maxIterations: 10, // Prevent infinite polling loops
});
// 5. Execute the multi-step reasoning workflow
const result = await executor.invoke({
input: "Create an AI roof for design ID 5541. Wait for it to finish, then tell me it is done."
});
console.log(result.output);
}Architectural Flow: Order to AI Roof
To visualize how the agent manages the asynchronous handoffs using Truto's standardized schemas, consider the following interaction model.
sequenceDiagram
participant User as User
participant Agent as AI Agent (LangChain)
participant Truto as Truto Unified API
participant Aurora as Aurora Solar
User->>Agent: "Generate roof for project 123"
Agent->>Truto: Tool Call: create_a_aurora_solar_ai_roof_run
Truto->>Aurora: POST /tenants/:id/projects/123/ai_roof_jobs
Aurora-->>Truto: 202 Accepted (job_id: 994)
Truto-->>Agent: Result (job_id: 994)
Note over Agent: Agent parses job_id and<br>recognizes need to poll
Agent->>Truto: Tool Call: list_all_aurora_solar_ai_roof_status (job_id: 994)
Truto->>Aurora: GET /tenants/:id/.../ai_roof_jobs/994
Aurora-->>Truto: 200 OK (status: "in-progress")
Truto-->>Agent: Result (status: "in-progress")
Note over Agent: Agent yields and waits
Agent->>Truto: Tool Call: list_all_aurora_solar_ai_roof_status (job_id: 994)
Truto->>Aurora: GET /tenants/:id/.../ai_roof_jobs/994
Aurora-->>Truto: 200 OK (status: "succeeded")
Truto-->>Agent: Result (status: "succeeded")
Agent-->>User: "Roof generation is complete."Scaling Solar Ops Without the Integration Debt
Building an AI agent that can reliably operate within Aurora Solar transforms how a solar business scales. It moves quoting and site engineering from a manual bottleneck into an instant, programmatic workflow. However, forcing your engineering team to construct and maintain the API scaffolding required to support agentic reasoning negates the efficiency gains.
By leveraging Truto's /tools endpoint, you offload the complex burden of pagination normalization, authentication refreshes, and schema definition. Your developers can focus entirely on the core business logic of the agent framework, relying on standardized IETF headers to handle rate limit architectures efficiently.
FAQ
- How do AI agents handle Aurora Solar's asynchronous API jobs?
- Aurora Solar relies heavily on asynchronous endpoints. AI agents must use a two-tool pattern: one tool to initiate the job (which returns a job_id) and a second tool to poll the status endpoint until it returns a success state.
- Can I use Truto to connect Aurora Solar to any LLM framework?
- Yes. Truto's /tools endpoint exposes Aurora Solar APIs as standardized JSON schemas, which can be bound natively to frameworks like LangChain, LangGraph, CrewAI, or the Vercel AI SDK.
- How does Truto handle Aurora Solar API rate limits?
- Truto passes HTTP 429 rate limit errors directly to the caller and normalizes the upstream limit data into standardized headers (ratelimit-limit, ratelimit-remaining, ratelimit-reset) per the IETF spec. Your agent framework is responsible for implementing retry and backoff logic.