Skip to content

Latest commit

 

History

History
152 lines (112 loc) · 4.72 KB

File metadata and controls

152 lines (112 loc) · 4.72 KB

Codewith SDK

Embed the Codewith agent in your workflows and apps.

The TypeScript SDK wraps the codewith CLI from @hasna/codewith. It spawns the CLI and exchanges JSONL events over stdin/stdout.

@hasna/codewith-sdk is published on npm and is Codewith's currently supported SDK for integrations.

Installation

npm install @hasna/codewith-sdk

Requires Node.js 18+.

Quickstart

import { Codewith } from "@hasna/codewith-sdk";

const codewith = new Codewith();
const thread = codewith.startThread();
const turn = await thread.run("Diagnose the test failure and propose a fix");

console.log(turn.finalResponse);
console.log(turn.items);

Call run() repeatedly on the same Thread instance to continue that conversation.

const nextTurn = await thread.run("Implement the fix");

Streaming responses

run() buffers events until the turn finishes. To react to intermediate progress—tool calls, streaming responses, and file change notifications—use runStreamed() instead, which returns an async generator of structured events.

const { events } = await thread.runStreamed("Diagnose the test failure and propose a fix");

for await (const event of events) {
  switch (event.type) {
    case "item.completed":
      console.log("item", event.item);
      break;
    case "turn.completed":
      console.log("usage", event.usage);
      break;
  }
}

Structured output

The Codewith agent can produce a JSON response that conforms to a specified schema. The schema can be provided for each turn as a plain JSON object.

const schema = {
  type: "object",
  properties: {
    summary: { type: "string" },
    status: { type: "string", enum: ["ok", "action_required"] },
  },
  required: ["summary", "status"],
  additionalProperties: false,
} as const;

const turn = await thread.run("Summarize repository status", { outputSchema: schema });
console.log(turn.finalResponse);

You can also create a JSON schema from a Zod schema using the zod-to-json-schema package and setting the target to "openAi".

const schema = z.object({
  summary: z.string(),
  status: z.enum(["ok", "action_required"]),
});

const turn = await thread.run("Summarize repository status", {
  outputSchema: zodToJsonSchema(schema, { target: "openAi" }),
});
console.log(turn.finalResponse);

Attaching images

Provide structured input entries when you need to include images alongside text. Text entries are concatenated into the final prompt while image entries are passed to the Codewith CLI via --image.

const turn = await thread.run([
  { type: "text", text: "Describe these screenshots" },
  { type: "local_image", path: "./ui.png" },
  { type: "local_image", path: "./diagram.jpg" },
]);

Resuming an existing thread

Threads are persisted in ~/.codewith/sessions. If you lose the in-memory Thread object, reconstruct it with resumeThread() and keep going.

const savedThreadId = process.env.CODEX_THREAD_ID!;
const thread = codewith.resumeThread(savedThreadId);
await thread.run("Implement the fix");

Working directory controls

Codewith runs in the current working directory by default. To avoid unrecoverable errors, Codewith requires the working directory to be a Git repository. You can skip the Git repository check by passing the skipGitRepoCheck option when creating a thread.

const thread = codewith.startThread({
  workingDirectory: "/path/to/project",
  skipGitRepoCheck: true,
});

Controlling the Codewith CLI environment

By default, the Codewith CLI inherits the Node.js process environment. Provide the optional env parameter when instantiating the Codewith client to fully control which variables the Codewith CLI receives—useful for sandboxed hosts like Electron apps.

const codewith = new Codewith({
  env: {
    PATH: "/usr/local/bin",
  },
});

The SDK still injects its required variables (such as CODEX_API_KEY) on top of the environment you provide. If you set baseUrl, the SDK passes it as a --config openai_base_url=... override.

Passing --config overrides

Use the config option to provide additional Codewith CLI configuration overrides. The SDK accepts a JSON object, flattens it into dotted paths, and serializes values as TOML literals before passing them as repeated --config key=value flags.

const codewith = new Codewith({
  config: {
    show_raw_agent_reasoning: true,
    sandbox_workspace_write: { network_access: true },
  },
});

Thread options still take precedence for overlapping settings because they are emitted after these global overrides.