Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@hyperbrowser/sdk",
"version": "0.92.7",
"version": "0.93.0",
"description": "Node SDK for Hyperbrowser API",
"author": "",
"repository": {
Expand Down
3 changes: 3 additions & 0 deletions src/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import { ComputerActionService } from "./services/computer-action";
import { GeminiComputerUseService } from "./services/agents/gemini-computer-use";
import { GrokComputerUseService } from "./services/agents/grok-computer-use";
import { MetaComputerUseService } from "./services/agents/meta-computer-use";
import { JevComputerUseService } from "./services/agents/jev-computer-use";
import { WebService } from "./services/web";
import { SandboxesService } from "./services/sandboxes";
import { VolumesService } from "./services/volumes";
Expand Down Expand Up @@ -71,6 +72,7 @@ export class HyperbrowserClient {
geminiComputerUse: GeminiComputerUseService;
grokComputerUse: GrokComputerUseService;
metaComputerUse: MetaComputerUseService;
jevComputerUse: JevComputerUseService;
};
public readonly team: TeamService;
public readonly computerAction: ComputerActionService;
Expand Down Expand Up @@ -108,6 +110,7 @@ export class HyperbrowserClient {
geminiComputerUse: new GeminiComputerUseService(apiKey, baseUrl, timeout),
grokComputerUse: new GrokComputerUseService(apiKey, baseUrl, timeout),
metaComputerUse: new MetaComputerUseService(apiKey, baseUrl, timeout),
jevComputerUse: new JevComputerUseService(apiKey, baseUrl, timeout),
};
}
}
114 changes: 114 additions & 0 deletions src/services/agents/jev-computer-use.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
import { HyperbrowserError } from "../../client";
import { BasicResponse } from "../../types";
import { POLLING_ATTEMPTS } from "../../types/constants";
import { sleep } from "../../utils";
import { BaseService } from "../base";
import {
JevComputerUseTaskResponse,
JevComputerUseTaskStatusResponse,
StartJevComputerUseTaskParams,
StartJevComputerUseTaskResponse,
} from "../../types/agents/jev-computer-use";

export class JevComputerUseService extends BaseService {
/**
* Start a new Jev Computer Use task job
* @param params The parameters for the task job
*/
async start(params: StartJevComputerUseTaskParams): Promise<StartJevComputerUseTaskResponse> {
try {
return await this.request<StartJevComputerUseTaskResponse>("/task/jev", {
method: "POST",
body: JSON.stringify(params),
});
} catch (error) {
if (error instanceof HyperbrowserError) {
throw error;
}
throw new HyperbrowserError("Failed to start Jev Computer Use task job", undefined);
}
}

/**
* Get the status of a Jev Computer Use task job
* @param id The ID of the task job to get
*/
async getStatus(id: string): Promise<JevComputerUseTaskStatusResponse> {
try {
return await this.request<JevComputerUseTaskStatusResponse>(`/task/jev/${id}/status`);
} catch (error) {
if (error instanceof HyperbrowserError) {
throw error;
}
throw new HyperbrowserError(
`Failed to get Jev Computer Use task job ${id} status`,
undefined
);
}
}

/**
* Get the result of a Jev Computer Use task job
* @param id The ID of the task job to get
*/
async get(id: string): Promise<JevComputerUseTaskResponse> {
try {
return await this.request<JevComputerUseTaskResponse>(`/task/jev/${id}`);
} catch (error) {
if (error instanceof HyperbrowserError) {
throw error;
}
throw new HyperbrowserError(`Failed to get Jev Computer Use task job ${id}`, undefined);
}
}

/**
* Stop a Jev Computer Use task job
* @param id The ID of the task job to stop
*/
async stop(id: string): Promise<BasicResponse> {
try {
return await this.request<BasicResponse>(`/task/jev/${id}/stop`, {
method: "PUT",
});
} catch (error) {
if (error instanceof HyperbrowserError) {
throw error;
}
throw new HyperbrowserError(`Failed to stop Jev Computer Use task job ${id}`, undefined);
}
}

/**
* Start a Jev Computer Use task job and wait for it to complete
* @param params The parameters for the task job
*/
async startAndWait(params: StartJevComputerUseTaskParams): Promise<JevComputerUseTaskResponse> {
const job = await this.start(params);
const jobId = job.jobId;
if (!jobId) {
throw new HyperbrowserError(
"Failed to start Jev Computer Use task job, could not get job ID"
);
}

let failures = 0;
while (true) {
try {
const { status } = await this.getStatus(jobId);
if (status === "completed" || status === "failed" || status === "stopped") {
return await this.get(jobId);
}
failures = 0;
} catch (error) {
failures++;
if (failures >= POLLING_ATTEMPTS) {
throw new HyperbrowserError(
`Failed to poll Jev Computer Use task job ${jobId} after ${POLLING_ATTEMPTS} attempts: ${error}`
);
}
}
await sleep(2000);
}
}
}
51 changes: 51 additions & 0 deletions src/types/agents/jev-computer-use.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
import { JevComputerUseLlm, JevComputerUseTaskStatus, JevTextLlm } from "../constants";
import { CreateSessionParams } from "../session";

export interface JevComputerUseApiKeys {
jev?: string;
google?: string;
}

export interface StartJevComputerUseTaskParams {
task: string;
llm?: JevComputerUseLlm;
textLlm?: JevTextLlm;
sessionId?: string;
maxFailures?: number;
maxSteps?: number;
keepBrowserOpen?: boolean;
sessionOptions?: CreateSessionParams;
useCustomApiKeys?: boolean;
apiKeys?: JevComputerUseApiKeys;
}

export interface StartJevComputerUseTaskResponse {
jobId: string;
liveUrl: string | null;
}

export interface JevComputerUseTaskStatusResponse {
status: JevComputerUseTaskStatus;
}

export type JevComputerUseStepResponse = Record<string, any>;

export interface JevComputerUseTaskData {
steps: JevComputerUseStepResponse[];
finalResult: string | null;
}

export interface JevComputerUseTaskMetadata {
inputTokens?: number | null;
outputTokens?: number | null;
numTaskStepsCompleted?: number | null;
}

export interface JevComputerUseTaskResponse {
jobId: string;
status: JevComputerUseTaskStatus;
metadata?: JevComputerUseTaskMetadata | null;
data?: JevComputerUseTaskData | null;
error?: string | null;
liveUrl: string | null;
}
8 changes: 8 additions & 0 deletions src/types/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ export type GeminiComputerUseTaskStatus =
| "stopped";
export type GrokComputerUseTaskStatus = "pending" | "running" | "completed" | "failed" | "stopped";
export type MetaComputerUseTaskStatus = "pending" | "running" | "completed" | "failed" | "stopped";
export type JevComputerUseTaskStatus = "pending" | "running" | "completed" | "failed" | "stopped";
export type ScrapePageStatus = "completed" | "failed" | "pending" | "running";
export type CrawlPageStatus = "completed" | "failed";
export type ScrapeWaitUntil = "load" | "domcontentloaded" | "networkidle";
Expand Down Expand Up @@ -53,6 +54,7 @@ export type BrowserUseLlm =
| "gemini-3.8-flash";

export type ClaudeComputerUseLlm =
| "claude-opus-5-5"
| "claude-fable-5-1"
| "claude-opus-5"
| "claude-opus-4-5"
Expand All @@ -71,6 +73,8 @@ export type ClaudeComputerUseReasoningEffort = "low" | "medium" | "high" | "xhig
export type CuaLlm =
| "computer-use-preview"
| "gpt-6-astra"
| "gpt-6-sol"
| "gpt-6-luna"
| "gpt-5.6-sol"
| "gpt-5.6-terra"
| "gpt-5.6-luna"
Expand Down Expand Up @@ -119,6 +123,10 @@ export type MetaComputerUseLlm = "muse-spark-1.1" | "muse-spark-1.2" | "muse-spa

export type MetaReasoningEffort = "minimal" | "low" | "medium" | "high" | "xhigh" | "max";

export type JevComputerUseLlm = "jev-1.13.0" | "jev-latest";

export type JevTextLlm = "gemini-3.5-flash-lite";

export type SessionRegion =
| "us"
| "us-central"
Expand Down
13 changes: 13 additions & 0 deletions src/types/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,16 @@ export {
MetaComputerUseApiKeys,
MetaComputerUseTaskMetadata,
} from "./agents/meta-computer-use";
export {
StartJevComputerUseTaskParams,
StartJevComputerUseTaskResponse,
JevComputerUseTaskStatusResponse,
JevComputerUseTaskResponse,
JevComputerUseTaskData,
JevComputerUseStepResponse,
JevComputerUseApiKeys,
JevComputerUseTaskMetadata,
} from "./agents/jev-computer-use";
export {
BasicResponse,
BrowserMemorySize,
Expand Down Expand Up @@ -261,6 +271,8 @@ export {
GrokReasoningEffort,
MetaComputerUseLlm,
MetaReasoningEffort,
JevComputerUseLlm,
JevTextLlm,
ScrapeScreenshotFormat,
ScrapeJobStatus,
CrawlJobStatus,
Expand All @@ -282,6 +294,7 @@ export {
GeminiComputerUseTaskStatus,
GrokComputerUseTaskStatus,
MetaComputerUseTaskStatus,
JevComputerUseTaskStatus,
SessionEventLogType,
SessionRegion,
BrowserUseVersion,
Expand Down
Loading