Twin Labs Introduces

Twin Labs Introduces

its web agent

its web agent

A

P

P

I

A

P

P

I

Build automations that can reason with the Twin Agent

Twin is a general purpose AI agent capable of browsing and interacting with any website or web application to accomplish a goal autonomously.

Scrape web pages

Reason over long context

Navigate lists

Understand images

Fill out forms

Use advanced search

Write in applications

{
startUrl: "http://google.com",
goal: "Return the list of the fund's investments",
outputType: "string"
}

Scrape web pages

Fill out forms

Reason over long context

Use advanced search

Navigate lists

Write in applications

Understand images

{
startUrl: "http://google.com",
goal: "Return the list of the fund's investments",
outputType: "string"
}

Try in playground

The API when there’s no API.

Twin can retrieve information or control applications when there is no API available.

Find and retrieve any information on the web seamlessly

Twin can retrieve any piece of information or data on the web - without breaking and with a simple prompt in natural language. Just give it a starting point and what you’re looking for, Twin will find and return the data in the requested format.

Get the latest post of the CEO of HuggingFace

zsh

twin-agent

twin-agent

twin-agent

twin-agent

twin-agent

twin-agent

twin-agent

zsh

twin-agent

twin-agent

twin-agent

twin-agent

twin-agent

twin-agent

twin-agent

Build automations on applications that don’t have APIs

Twin navigates and interact with any user interface (website or web application) like Humans do. It authenticates into the app, and then can search in the application, retrieve or write information into it.

Add the summary to Hubspot contact

zsh

twin-agent

zsh

twin-agent

Powered by Twin's action model and cloud

Twin Agent is first initialised with a task defined by a starting URL and a goal in natural language.

Then, tasks are executed in remote browsers sessions in Twin’s Cloud by the agent using the Twin Action Model to reason and navigate autonomously - until the completion of the task and returning the final output.

Twin V.01

Courtesy of

Twin Cloud

V30923082I

A pipeline with several custom models, trained to (i) understand web environments (ii) decide what action to take (iii) translate this decision into code executable by the remote browser (iv) and memorise the previous actions.

TWIN ACTION MODEL

A pipeline with several custom models, trained to (i) understand web environments (ii) decide what action to take (iii) translate this decision into code executable by the remote browser (iv) and memorise the previous actions.

REMOTE BROWSER SESSION

V.02

Twin V.01

Courtesy of

Twin Cloud

V30923082I

A pipeline with several custom models, trained to (i) understand web environments (ii) decide what action to take (iii) translate this decision into code executable by the remote browser (iv) and memorise the previous actions.

TWIN ACTION MODEL

A pipeline with several custom models, trained to (i) understand web environments (ii) decide what action to take (iii) translate this decision into code executable by the remote browser (iv) and memorise the previous actions.

REMOTE BROWSER SESSION

V.02

NATURAL LANGUAGE

NATURAL LANGUAGE

Request

Request

"retrieve the latest post of the CEO of huggingface"

"retrieve the latest post of the CEO of huggingface"

STRUCTURED OUTPUT

STRUCTURED OUTPUT

Response

Response

“IMO, the beauty of the founder-mode is not so much the specific achievements of the founders but the « leading by example » that it creates for other…

“IMO, the beauty of the founder-mode is not so much the specific achievements of the founders but the « leading by example » that it creates for other…

Zapier Integration

Supercharge your workflow with the Twin agent

Use Twin’s Zap to add Twin’s agent to your workflows. Use its capabilities on finding, retrieving information online and building automation on apps without APIs - seamlessly, in no-code.

Build custom AI workers with the Twin API

Build advanced automation with complex logic by composing multiple agents together - like creating batch or sequence of tasks, use the output of a task for starting another task, etc.

twin-workflow.py

import requests
import time

twin_key = ""
browse_endpoint = "https://api.twin.so/browse"
task_endpoint = "http://api.twin.so/task/"

name_of_competitors = ["Dyson", "Shark", "LG", "Samsung"]

def wait_for_tasks(task_ids):
outputs = []
latest_actions = {task_id: None for task_id in task_ids}
remaining_tasks = set(task_ids)

while remaining_tasks:
for task_id in list(remaining_tasks):
response = requests.get(url=task_endpoint + task_id + "?limit=1", headers={"x-api-key": twin_key})
data = response.json()

if data["status"] in {"COMPLETED", "FAILED"}:
outputs.append(data["output"])
remaining_tasks.remove(task_id)
elif data["steps"] and data["steps"][0]["action"] and latest_actions[task_id] != data["steps"][0]["action"]:
latest_actions[task_id] = data["steps"][0]["action"]
print(f"Task {task_id}: {latest_actions[task_id]}")

time.sleep(1)

return outputs

def launch_amazon_task():
amazon_task_ids = []

for competitor in name_of_competitors:
print(f"Getting reviews for {competitor}")
response = requests.post(
url=browse_endpoint,
headers={"x-api-key": twin_key},
json={
"goal": f"Find the latest reviews for {competitor}'s most popular vacuum cleaner - summarize the points made in the most positive and negative ones",
"startUrl": "https://www.amazon.com/",
},
)
amazon_task_ids.append(response.json()["taskId"])
return amazon_task_ids

amazon_task_ids = launch_amazon_task()
amazon_reviews = wait_for_tasks(amazon_task_ids)

for review, competitor in zip(amazon_reviews, name_of_competitors):
print(f"# Reviews for {competitor}")
print(review)
print("-"*100)
print("\n\n")

def launch_latest_announcements_task():
latest_announcements_task_ids = []

for competitor in name_of_competitors:
print(f"Getting latest announcements for {competitor}")
response = requests.post(
url=browse_endpoint,
headers={"x-api-key": twin_key},
json={
"goal": f"Find the latest product announcements of {competitor}, by searching for '{competitor} product announcements",
"startUrl": "https://news.google.com/",
},
)
latest_announcements_task_ids.append(response.json()["taskId"])
return latest_announcements_task_ids

latest_announcements_task_ids = launch_latest_announcements_task()
latest_announcements = wait_for_tasks(latest_announcements_task_ids)
for announcement in latest_announcements:
print(announcement)
print("\n\n")

import requests
import time

twin_key = ""
browse_endpoint = "https://api.twin.so/browse"
task_endpoint = "http://api.twin.so/task/"

name_of_competitors = ["Dyson", "Shark", "LG", "Samsung"]

def wait_for_tasks(task_ids):
outputs = []
latest_actions = {task_id: None for task_id in task_ids}
remaining_tasks = set(task_ids)

while remaining_tasks:
for task_id in list(remaining_tasks):
response = requests.get(url=task_endpoint + task_id + "?limit=1", headers={"x-api-key": twin_key})
data = response.json()

if data["status"] in {"COMPLETED", "FAILED"}:
outputs.append(data["output"])
remaining_tasks.remove(task_id)
elif data["steps"] and data["steps"][0]["action"] and latest_actions[task_id] != data["steps"][0]["action"]:
latest_actions[task_id] = data["steps"][0]["action"]
print(f"Task {task_id}: {latest_actions[task_id]}")

time.sleep(1)

return outputs

def launch_amazon_task():
amazon_task_ids = []

for competitor in name_of_competitors:
print(f"Getting reviews for {competitor}")
response = requests.post(
url=browse_endpoint,
headers={"x-api-key": twin_key},
json={
"goal": f"Find the latest reviews for {competitor}'s most popular vacuum cleaner - summarize the points made in the most positive and negative ones",
"startUrl": "https://www.amazon.com/",
},
)
amazon_task_ids.append(response.json()["taskId"])
return amazon_task_ids

amazon_task_ids = launch_amazon_task()
amazon_reviews = wait_for_tasks(amazon_task_ids)

for review, competitor in zip(amazon_reviews, name_of_competitors):
print(f"# Reviews for {competitor}")
print(review)
print("-"*100)
print("\n\n")

def launch_latest_announcements_task():
latest_announcements_task_ids = []

for competitor in name_of_competitors:
print(f"Getting latest announcements for {competitor}")
response = requests.post(
url=browse_endpoint,
headers={"x-api-key": twin_key},
json={
"goal": f"Find the latest product announcements of {competitor}, by searching for '{competitor} product announcements",
"startUrl": "https://news.google.com/",
},
)
latest_announcements_task_ids.append(response.json()["taskId"])
return latest_announcements_task_ids

latest_announcements_task_ids = launch_latest_announcements_task()
latest_announcements = wait_for_tasks(latest_announcements_task_ids)
for announcement in latest_announcements:
print(announcement)
print("\n\n")

Todo

Competitor analysis

Dyson

Shark

LG

Samsung

Todo

Competitor analysis

Dyson

Shark

LG

Samsung

Todo

Competitor analysis

Dyson

Shark

LG

Samsung

zsh

twin-agent

zsh

twin-agent

zsh

twin-agent

Get updates

Secure your spot for occasional development updates and early access. No spam, just the good stuff.

Book a call