Skip to main content

Portal operations

Finance and operations teams spend hours inside supplier portals, insurance systems and carrier websites. Those systems rarely offer an API, so somebody signs in every morning, opens the same pages and copies the numbers into a sheet.

A computer use agent performs that routine, and a text agent turns the result into structured data your systems can load.

Vendor portalno APImanual todayComputer agentsigns in, navigatesreads the tablesText agentnormalizes toJSON rowsERPor databaseone flow, scheduled every morning

Collect and structure in one flow

The computer agent reads the portal, then a text agent converts the free text into rows. Keep credentials in environment variables and let the agent use the values, never hard coded strings.

import asyncio, os
from intelli.flow import Agent, Task, Flow, TextTaskInput

portal_agent = Agent(
agent_type="computer",
provider="anthropic",
mission="read the supplier portal",
model_params={
"key": os.getenv("ANTHROPIC_API_KEY"),
"model": "claude-sonnet-5",
"start_url": "https://supplier.example.com/invoices",
"max_iterations": 30,
},
)

collect = Task(
TextTaskInput(
"Open the invoices page for this month and report every invoice with its "
"number, date, amount and payment status."
),
portal_agent,
log=True,
)

structure = Task(
TextTaskInput(
"Convert the invoice list into JSON. Use the keys number, date, amount and status. "
"Answer with JSON only."
),
Agent(
agent_type="text",
provider="openai",
mission="normalize extracted data",
model_params={"key": os.getenv("OPENAI_API_KEY"), "model": "gpt-5.5"},
),
log=True,
)

flow = Flow(
tasks={"collect": collect, "structure": structure},
map_paths={"collect": ["structure"], "structure": []},
log=True,
)

results = asyncio.run(flow.start())
print(results["structure"]["output"])

Guard the actions

Reading a portal is safe, but the same session can also submit forms. Block anything that writes, and review the rest before you widen the permissions.

WRITE_ACTIONS = ["submit", "approve", "delete", "pay"]

def read_only(action):
text = str(action.get("text", "")).lower()
return not any(word in text for word in WRITE_ACTIONS)

Pass read_only as on_action when you build the agent directly, or through model_params inside the flow.

For OpenAI computer use, the provider can also return safety checks on sensitive pages. Intelli stops instead of approving them, and returns them in result["pending_safety_checks"] so a person can decide.

Add a schedule

The flow is plain Python, so any scheduler runs it. A daily run gives the finance team the invoice list before the morning review, and the output lands in the same shape every day, which makes it easy to load into an ERP or a database.

Why it helps

  • The portals that have no API stop being manual work.
  • The output is structured, so it can be reconciled automatically.
  • The rules stay explicit, because every action passes through your guard.