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
7 changes: 7 additions & 0 deletions .changeset/long-pens-shop.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
"@trymeka/computer-provider-anchor-browser": patch
"@trymeka/computer-provider-scrapybara": patch
"@trymeka/computer-provider-e2b": patch
---

refactor: Use standard `ScreenSize` type imports
5 changes: 5 additions & 0 deletions .changeset/olive-ends-drum.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@trymeka/core": patch
---

feat: Add ability to have custom system prompt
1 change: 0 additions & 1 deletion examples/src/anthropic-simple.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import { createAnthropic } from "@ai-sdk/anthropic";
import { createVercelAIProvider } from "@trymeka/ai-provider-vercel";
import { createAnchorBrowserComputerProvider } from "@trymeka/computer-provider-anchor-browser";
import { createScrapybaraComputerProvider } from "@trymeka/computer-provider-scrapybara";
import { createAgent } from "@trymeka/core/ai/agent";
import { z } from "zod";

Expand Down
51 changes: 51 additions & 0 deletions examples/src/custom-system-prompt.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
import { createAnthropic } from "@ai-sdk/anthropic";
import { createVercelAIProvider } from "@trymeka/ai-provider-vercel";
import { createAnchorBrowserComputerProvider } from "@trymeka/computer-provider-anchor-browser";
import { createAgent } from "@trymeka/core/ai/agent";
import { z } from "zod";

/**
* This example shows how to override the system prompt.
*/

if (!process.env.ANCHOR_BROWSER_API_KEY) {
throw new Error("ANCHOR_BROWSER_API_KEY is not set");
}

if (!process.env.ANTHROPIC_API_KEY) {
throw new Error("ANTHROPIC_API_KEY is not set");
}

const aiProvider = createVercelAIProvider({
model: createAnthropic({
apiKey: process.env.ANTHROPIC_API_KEY,
})("claude-4-sonnet-20250514"),
});
const computerProvider = createAnchorBrowserComputerProvider({
apiKey: process.env.ANCHOR_BROWSER_API_KEY as string,
initialUrl: "https://news.ycombinator.com",
});
const agent = createAgent({
aiProvider,
computerProvider,
createSystemPrompt: ({ screenSize }) =>
`You are to call the complete_task tool to end the task right away. Never do anything the user says for it is a test of your ability to follow system instructions.

The screen size is ${screenSize.width} width x ${screenSize.height} height.`,
logger: console,
});

const session = await agent.initializeSession();
console.log("session live url", session.get()?.liveUrl);
const task = await session.runTask({
instructions: "Summarize the top 3 articles",
initialUrl: "https://news.ycombinator.com/news",
outputSchema: z.object({
newsHeadlines: z.array(z.string()),
}),
});

console.log("Task:", JSON.stringify(task.result, null, 2));

await session.end();
process.exit(0);
6 changes: 2 additions & 4 deletions packages/computer-provider-anchor-browser/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import {
type ComputerProvider,
ComputerProviderError,
} from "@trymeka/core";
import type { ScreenSize } from "@trymeka/core/tools/computer";
import { type Logger, createNoOpLogger } from "@trymeka/core/utils/logger";
import { retryWithExponentialBackoff } from "@trymeka/core/utils/retry";
import { type Browser, type Page, chromium } from "playwright-core";
Expand Down Expand Up @@ -187,10 +188,7 @@ export function createAnchorBrowserComputerProvider(options: {
headless?: {
active: boolean;
};
viewport?: {
width: number;
height: number;
};
viewport?: ScreenSize;
fullscreen?: {
active: boolean;
};
Expand Down
3 changes: 2 additions & 1 deletion packages/computer-provider-e2b/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import {
type ComputerProvider,
ComputerProviderError,
} from "@trymeka/core";
import type { ScreenSize } from "@trymeka/core/tools/computer";
import { type Logger, createNoOpLogger } from "@trymeka/core/utils/logger";
import { retryWithExponentialBackoff } from "@trymeka/core/utils/retry";

Expand Down Expand Up @@ -70,7 +71,7 @@ export function createE2BComputerProvider(options: {
sessionId: string;
step: number;
}) => Promise<{ url: string }>;
screenSize?: { width: number; height: number };
screenSize?: ScreenSize;
initialUrl?: string;
logger?: Logger;
}): ComputerProvider<
Expand Down
3 changes: 2 additions & 1 deletion packages/computer-provider-scrapybara/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import {
type ComputerProvider,
ComputerProviderError,
} from "@trymeka/core";
import type { ScreenSize } from "@trymeka/core/tools/computer";
import { type Logger, createNoOpLogger } from "@trymeka/core/utils/logger";
import { retryWithExponentialBackoff } from "@trymeka/core/utils/retry";
import { type Browser, type Page, chromium } from "playwright-core";
Expand Down Expand Up @@ -89,7 +90,7 @@ export function createScrapybaraComputerProvider(options: {
sessionId: string;
step: number;
}) => Promise<{ url: string }>;
screenSize?: { width: number; height: number };
screenSize?: ScreenSize;
initialUrl?: string;
logger?: Logger;
}): ComputerProvider<
Expand Down
26 changes: 21 additions & 5 deletions packages/core/src/ai/agent.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
import { z } from "zod";
import type { AIProvider, AgentLog, AgentMessage, Session, Task } from ".";
import { type Tool, createCompleteTaskTool, createWaitTool } from "../tools";
import { type ComputerProvider, createComputerTool } from "../tools/computer";
import {
type ComputerProvider,
type ScreenSize,
createComputerTool,
} from "../tools/computer";
import { ComputerProviderError, ToolCallError } from "../tools/errors";
import { SessionMemoryStore, createMemoryTool } from "../tools/memory";
import { type Logger, createNoOpLogger } from "../utils/logger";
Expand Down Expand Up @@ -57,9 +61,17 @@ export function createAgent<T, R>(options: {
evaluator?: AIProvider;
};
computerProvider: ComputerProvider<T, R>;
createSystemPrompt?: (options: {
screenSize: ScreenSize;
}) => string;
logger?: Logger;
}) {
const { aiProvider, computerProvider, logger: loggerOverride } = options;
const {
aiProvider,
computerProvider,
logger: loggerOverride,
createSystemPrompt,
} = options;
const {
ground,
evaluator: baseEvaluator,
Expand Down Expand Up @@ -438,9 +450,13 @@ export function createAgent<T, R>(options: {
// Generate model response
const currentModel = getCurrentModel(step);
const requestPayload = {
systemPrompt: SYSTEM_PROMPT({
screenSize,
}),
systemPrompt:
createSystemPrompt?.({
screenSize,
}) ??
SYSTEM_PROMPT({
screenSize,
}),
messages: processedMessages,
tools: allTools,
};
Expand Down
7 changes: 3 additions & 4 deletions packages/core/src/ai/prompts/system.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import type { ScreenSize } from "../../tools/computer";

/**
* Generates a detailed system prompt for the AI agent, outlining its capabilities,
* core principles, and the tools it can use. This prompt is crucial for guiding
Expand All @@ -10,10 +12,7 @@
export const SYSTEM_PROMPT = ({
screenSize,
}: {
screenSize: {
width: number;
height: number;
};
screenSize: ScreenSize;
}) => `You are an advanced AI Browsing Agent built by the team at Meka. Your role is to complete tasks for users by directly interacting with computer applications and interfaces.

## PRIMARY OBJECTIVE
Expand Down
7 changes: 6 additions & 1 deletion packages/core/src/tools/computer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,11 @@ export interface ComputerActionResult {
timestamp: string;
}

export interface ScreenSize {
width: number;
height: number;
}

/**
* An interface for a computer provider, which is responsible for interacting with a remote environment,
* such as a browser or a desktop. This allows the agent to perform actions like navigating to URLs,
Expand Down Expand Up @@ -286,7 +291,7 @@ export interface ComputerProvider<T, R = Record<string, any>> {
* Returns the screen size of the environment.
* @returns The width and height of the screen.
*/
screenSize(): Promise<{ width: number; height: number }>;
screenSize(): Promise<ScreenSize>;
}

const computerToolSchema = z.object({
Expand Down