메뉴
HN
Hacker News 13일 전

Coasty (YC S26): 컴퓨터 제어 에이전트 API

IMP
8/10
핵심 요약

Coasty는 관리되는 가상 머신에서 자율적으로 작업을 수행하는 컴퓨터 제어 에이전트(Computer-use agent)를 위한 API를 제공합니다. 개발자는 단순한 목표 지정부터 시작해, 복잡한 워크플로우, 조건 분기, 사람의 승인 등을 필요로 하는 작업까지 쉽게 자동화할 수 있습니다. 특히 고급 자동화 기능부터 세밀한 제어를 위한 저수준 예측 도구까지 계층적으로 API를 설계하여 실무자가 유연하게 통합할 수 있도록 돕는 것이 핵심 가치입니다.

번역된 본문

제목: 출시: Coasty (YC S26) – 컴퓨터 제어 에이전트(Computer-use agents)를 위한 API 출처: hackernews

Coasty API 및 API 참조 문서 관리되는 머신에서 자율적인 작업을 실행하고, 이를 워크플로우(workflows)로 구성하며, 직접적인 제어가 필요할 때만 예측 기본 요소(prediction primitives)로 전환하세요.

llms.txt AI 어시스턴트와 함께 빌드하고 계신가요? Cursor, Claude Code, ChatGPT 또는 다른 LLM에 맞춰진 바로 사용 가능한 프롬프트를 생성하세요. AI로 생성하기.

소개 작업 실행(Task run)으로 시작해 보세요. Coasty에 목표와 머신을 제공하면, 에이전트가 완료될 때까지 작업을 수행합니다. 자동화에 여러 작업, 분기, 루프, 승인 또는 공유 출력이 필요한 경우 워크플로우를 사용하세요. 머신은 이러한 작업이 수행되는 관리되는 컴퓨터 환경을 제공합니다. 예측 엔드포인트는 제어 루프를 직접 소유해야 하는 팀을 위한 더 낮은 수준의 기본 요소입니다. 상태 저장 스크린샷 루프에는 세션(sessions)을, 상태 비저장 단계에는 예측(predict)을, 좌표에는 그라운딩(grounding)을, 구조화된 작업에는 구문 분석(parse)을 사용하세요. 모든 것은 https://coasty.ai/v1 로 향하는 일반 HTTPS 요청으로 이루어지므로, 작업에 맞는 가장 높은 수준의 인터페이스를 선택하고 더 세밀한 제어가 필요할 때만 하위 수준으로 이동하면 됩니다.

시작하기

  • 작업 실행 (Task runs): 하나의 목표를 검증된 완료 상태까지 자율적으로 구동해야 할 때 사용합니다.
  • 워크플로우 (Workflows): 여러 작업의 순차적 진행, 분기, 루프, 예산 설정 또는 사람의 승인이 필요할 때 사용합니다.
  • 머신 (Machines): 에이전트가 브라우저, 터미널 및 파일이 있는 관리되는 Linux 또는 Windows 컴퓨터가 필요할 때 사용합니다.
  • 기본 요소 (Primitives): 애플리케이션이 모든 스크린샷, 예측 및 작업에 대해 직접적인 제어를 필요로 할 때 사용합니다.

인증 API 키로 인증된 모든 요청에는 비밀 키가 포함되어야 합니다. 4개의 상태 확인 프로브는 공개되어 있으며, 웹훅 수신은 문서화된 Coasty-Signature HMAC 자격 증명을 대신 사용합니다. API 키 작업의 경우, 일반적으로 X-API-Key 헤더를 사용하지만 Authorization: Bearer 형식도 작동합니다. 빈 X-API-Key 값은 Bearer 헤더로 대체됩니다. 한 가지 형식을 선택하고 원시 키를 전송하세요. X-API-Key 내부에 'Bearer'라는 텍스트를 그대로 붙여넣지 마세요. 이는 첫날 가장 흔히 하는 실수이며 401 INVALID_API_KEY 오류를 반환합니다. 키는 API 키 페이지에서 생성 및 취소할 수 있습니다. 키를 암호처럼 취급하세요. 서버 측에 보관하고, 환경 변수에 저장하며, 절대로 버전 관리에 커밋하거나 클라이언트 측 코드에 포함하지 마세요.

  • sk-coasty-live- (라이브): 실제 모델을 실행하고 USD 지갑 잔액에서 비용이 차감됩니다.
  • sk-coasty-test- (테스트): 모의(Mock) 응답을 반환하며 절대 요금이 청구되지 않습니다. 로컬 개발 및 CI(지속적 통합) 환경에 이상적입니다. 통합을 연결하는 동안에는 테스트 키를 선호하세요. sk-coasty-test- 키는 요금을 청구하지 않으며 모의 가상 머신(VM)에 대해 실행되지만, 정확히 동일한 요청 및 응답 구조를 사용합니다(해당 X-Credits-Charged 및 usage.cost_cents는 항상 0임). 따라서 라이브 키로 전환하기 전에 안심하고 CI를 빌드하고 실행할 수 있습니다.

첫 번째 작업 실행하기 첫 번째 자율 작업에는 API 키와 머신이 필요합니다. API 키 페이지에서 테스트 키를 가져와서(요금이 청구되지 않음) 기존 머신을 사용하거나 새로 프로비저닝 하세요. 셸에 키를 설정합니다: export COASTY_API_KEY="sk-coasty-test-your_key_here"

POST /v1/runs 로 작업을 시작하세요. 예시 machine_id를 교체하고, task에 원하는 결과를 설명하고, 재시도 시 중복 실행을 방지하기 위해 멱등성 키(Idempotency-Key)를 전송하세요. 다음은 실행을 시작하고 종료 상태에 도달할 때까지 추적하는 완전한 예제입니다:

import os, time, requests
BASE = "https://coasty.ai/v1"
HEADERS = {"X-API-Key": os.environ["COASTY_API_KEY"]}
TERMINAL = {"succeeded", "failed", "cancelled", "timed_out"}

# 1. 실행을 시작합니다. 멱등성 키(Idempotency-Key)는 재시도 시 안전하게 만들어줍니다.
run = requests.post(
    f"{BASE}/runs",
    headers={**HEADERS, "Idempotency-Key": "order-4821"},
    json={
        "machine_id": "mch_test_0123456789abcdef",
        "task": "결제 페이지를 열고 최신 청구서를 PDF로 다운로드하세요.",
        "cua_version": "v5",  # v1/v3/v4/v5 중 하나 선택 가능. 생략하면 기본값인 v5 사용
        "max_steps": 40,
        "on_awaiting_human": "pause",
    },
    timeout=30,
).json()

run_id = run["id"]
print(run["status"])  # "queued"
webhook_secret = run.get("webhook_secret")  # 한 번만 표시되므로 지금 저장하세요.

# 2. 종료 상태가 될 때까지 폴링(Polling)합니다.
while True:
    run = requests.get(f"{BASE}/runs/{run_id}
원문 보기
원문 보기 (영어)
Coasty API API reference Run autonomous tasks on managed machines, compose them into workflows, and drop to prediction primitives only when you need direct control. llms.txt Building with an AI assistant? Generate a ready-made prompt tailored to Cursor, Claude Code, ChatGPT, or any LLM. Create with AI Introduction Start with a task run : give Coasty a goal and a machine, then let the agent drive to completion. Use workflows when an automation needs many tasks, branches, loops, approvals, or shared outputs. Machines provide the managed computer those tasks operate. The prediction endpoints are lower-level primitives for teams that need to own the control loop themselves. Use sessions for a stateful screenshot loop, predict for a stateless step, grounding for coordinates, and parse for structured actions. Everything is normal HTTPS to https://coasty.ai/v1 , so you can choose the highest-level surface that fits the job and drop down only when you need finer control. Start with Use it when Task runs One goal should be driven autonomously from start to verified completion. Workflows Many tasks need sequencing, branching, loops, budgets, or human approval. Machines The agent needs a managed Linux or Windows computer with browser, terminal, and files. Primitives Your application needs direct control over every screenshot, prediction, and action. Authentication Every API-key-authenticated request must include your secret key. The four health probes are public, and webhook ingress uses its documented Coasty-Signature HMAC credential instead. For API-key operations, the canonical form is the X-API-Key header, but Authorization: Bearer <key> works too: a blank X-API-Key falls through to the Bearer header. Pick one form and send the raw key. Do not paste the literal text Bearer inside X-API-Key ; that is the single most common first-day mistake and it returns 401 INVALID_API_KEY . Keys are created and revoked from the API keys page. Treat a key like a password: keep it server-side, store it in an environment variable, and never commit it or ship it in client-side code. Header Copy X-API-Key: sk-coasty-live-your_key_here Prefix Kind Behaviour sk-coasty-live- Live Runs the real model and draws down your USD wallet balance. sk-coasty-test- Test Returns mock responses and never bills. Ideal for local dev and CI. Prefer test keys while you wire up your integration. An sk-coasty-test- key never bills and runs against mock VMs, yet exercises the exact same request and response shapes (its X-Credits-Charged and usage.cost_cents are always 0 ), so you can build and run CI confidently before flipping to a live key. Run your first task Your first autonomous task needs an API key and a machine. Grab a test key from the API keys page (it never bills), then use an existing machine or provision one . Set the key in your shell: Shell Copy export COASTY_API_KEY="sk-coasty-test-your_key_here" Start the task with POST /v1/runs . Replace the example machine_id , describe the outcome in task , and send an Idempotency-Key so a retried create cannot start a duplicate run. The complete example starts the run and follows it to a terminal state: cURL Python Node Go Ruby PHP Copy import os, time, requests BASE = "https://coasty.ai/v1" HEADERS = {"X-API-Key": os.environ["COASTY_API_KEY"]} TERMINAL = {"succeeded", "failed", "cancelled", "timed_out"} # 1. Start a run. Idempotency-Key makes a retried create safe. run = requests.post( f"{BASE}/runs", headers={**HEADERS, "Idempotency-Key": "order-4821"}, json={ "machine_id": "mch_test_0123456789abcdef", "task": "Open the billing page and download the latest invoice as PDF", "cua_version": "v5", # any of v1/v3/v4/v5, all tiers; omit to use the v5 default "max_steps": 40, "on_awaiting_human": "pause", }, timeout=30, ).json() run_id = run["id"] print(run["status"]) # "queued" webhook_secret = run.get("webhook_secret") # shown once; store it now # 2. Poll until terminal. while True: run = requests.get(f"{BASE}/runs/{run_id}", headers=HEADERS, timeout=30).json() print(run["status"], run["steps_completed"], "steps") if run["status"] in TERMINAL: break time.sleep(2) print(run["result"]) # {"passed": ..., "status": ..., "summary": ...} The create response begins at queued . Coasty then drives the machine, records each step, and finishes as succeeded , failed , cancelled , or timed_out . Your application can poll, subscribe to the event stream, or receive signed webhooks; it does not need to execute each prediction itself. Next Go to Understand task fields, lifecycle, and results Task runs Follow progress without polling Streaming events Turn the task into repeatable multi-step automation Workflows Own every screenshot and action yourself Prediction primitives Task runs are the default starting point for autonomous work. Workflows build on them, machines host them, and prediction primitives remain available when your application needs direct control over the loop. Task runs A run hands the agent a task and a machine, then drives it to completion on our side. The agent loops autonomously, verifies its own work (pass or fail), can pause for a human when it hits a wall, bills $0.05 per completed step from your dollar API wallet ($0.08/step on the legacy v1 engine), and streams every event live. You start one call and watch, instead of running the predict loop yourself. Create a run with POST /v1/runs . The two required fields are machine_id and task . The response is an agent.run object with status of queued , plus a one-time webhook_secret you store to verify webhooks . Send an Idempotency-Key header to make a retried create safe. cURL Python Node Go Ruby PHP Copy import os, time, requests BASE = "https://coasty.ai/v1" HEADERS = {"X-API-Key": os.environ["COASTY_API_KEY"]} TERMINAL = {"succeeded", "failed", "cancelled", "timed_out"} # 1. Start a run. Idempotency-Key makes a retried create safe. run = requests.post( f"{BASE}/runs", headers={**HEADERS, "Idempotency-Key": "order-4821"}, json={ "machine_id": "mch_test_0123456789abcdef", "task": "Open the billing page and download the latest invoice as PDF", "cua_version": "v5", # any of v1/v3/v4/v5, all tiers; omit to use the v5 default "max_steps": 40, "on_awaiting_human": "pause", }, timeout=30, ).json() run_id = run["id"] print(run["status"]) # "queued" webhook_secret = run.get("webhook_secret") # shown once; store it now # 2. Poll until terminal. while True: run = requests.get(f"{BASE}/runs/{run_id}", headers=HEADERS, timeout=30).json() print(run["status"], run["steps_completed"], "steps") if run["status"] in TERMINAL: break time.sleep(2) print(run["result"]) # {"passed": ..., "status": ..., "summary": ...} Field Required Description machine_id Yes The machine the agent will drive. task Yes The natural-language goal to accomplish. cua_version No Model family. v5 by default; v1 / v3 / v4 / v5 on all tiers. instructions No Extra guidance appended to the base prompt. system_prompt No A preamble placed ahead of the base prompt. max_steps No Hard cap on agent steps (default 50). deadline_seconds No Wall-clock budget; the run becomes timed_out if breached. on_awaiting_human No What to do when a human is needed: pause (default), fail , or cancel . awaiting_human_timeout_seconds No How long to wait for a human before timing out. webhook_url No HTTPS endpoint for lifecycle callbacks (https only). metadata No Arbitrary JSON echoed back on the run object. Endpoint Purpose POST /v1/runs Start a run. Returns the run plus a one-time webhook_secret. GET /v1/runs List runs. Filter with ?status= and ?limit= . GET /v1/runs/ {id} Fetch a single run and its current status. GET /v1/runs/ {id} /events Server-Sent Events stream of the run (see Streaming events). POST /v1/runs/ {id} /cancel Cancel a run that has not reached a terminal state. POST /v1/runs/ {id} /resume Hand control back after a human takeover. JSON Copy { "id": "run_7a1b2c3d", "object": "agent.run", "status": "queued", "machine_id": "mch_test_0123456789abcdef",