SPB Git

spb/khaelor Public

KHAELOR — a terminal-native autonomous engineering agent powered by Anthropic.

TypeScript 82.9% HTML 14.9% CSS 1.1% JavaScript 0.7%
5.2 KB · 171 lines typescript
Raw Blame History
1/**2 * KHAELOR3 * File: tests/anthropic/fixtures.ts4 * Description: Recorded/mock Anthropic SSE event sequences for network-free Model Runtime tests.5 *6 * Author: Simon-Pierre Boucher7 * Contact: contact@spboucher.ai8 */910import type { RawMessageStreamEvent } from "@anthropic-ai/sdk/resources/messages";1112export const REQUEST_ID = "msg_01TESTFIXTURE0000000000";1314/** Turn a recorded array into the async iterable the SDK stream would provide. */15export async function* asRawStream(16  events: RawMessageStreamEvent[],17): AsyncGenerator<RawMessageStreamEvent, void, undefined> {18  for (const event of events) {19    yield event;20  }21}2223export function messageStart(overrides?: {24  id?: string;25  input_tokens?: number;26  output_tokens?: number;27  cache_read_input_tokens?: number | null;28  cache_creation_input_tokens?: number | null;29}): RawMessageStreamEvent {30  return {31    type: "message_start",32    message: {33      id: overrides?.id ?? REQUEST_ID,34      type: "message",35      role: "assistant",36      model: "claude-sonnet-5",37      content: [],38      stop_reason: null,39      stop_sequence: null,40      usage: {41        input_tokens: overrides?.input_tokens ?? 120,42        output_tokens: overrides?.output_tokens ?? 1,43        cache_creation_input_tokens: overrides?.cache_creation_input_tokens ?? 0,44        cache_read_input_tokens: overrides?.cache_read_input_tokens ?? 0,45        cache_creation: null,46        server_tool_use: null,47        service_tier: "standard",48      },49    },50  } as unknown as RawMessageStreamEvent;51}5253export function textBlockStart(index: number): RawMessageStreamEvent {54  return {55    type: "content_block_start",56    index,57    content_block: { type: "text", text: "", citations: null },58  } as unknown as RawMessageStreamEvent;59}6061export function textDelta(index: number, text: string): RawMessageStreamEvent {62  return {63    type: "content_block_delta",64    index,65    delta: { type: "text_delta", text },66  } as RawMessageStreamEvent;67}6869export function thinkingBlockStart(index: number): RawMessageStreamEvent {70  return {71    type: "content_block_start",72    index,73    content_block: { type: "thinking", thinking: "", signature: "" },74  } as RawMessageStreamEvent;75}7677export function thinkingDelta(index: number, thinking: string): RawMessageStreamEvent {78  return {79    type: "content_block_delta",80    index,81    delta: { type: "thinking_delta", thinking },82  } as RawMessageStreamEvent;83}8485export function signatureDelta(index: number, signature: string): RawMessageStreamEvent {86  return {87    type: "content_block_delta",88    index,89    delta: { type: "signature_delta", signature },90  } as RawMessageStreamEvent;91}9293export function toolUseBlockStart(index: number, id: string, name: string): RawMessageStreamEvent {94  return {95    type: "content_block_start",96    index,97    content_block: { type: "tool_use", id, name, input: {} },98  } as RawMessageStreamEvent;99}100101export function inputJsonDelta(index: number, partialJson: string): RawMessageStreamEvent {102  return {103    type: "content_block_delta",104    index,105    delta: { type: "input_json_delta", partial_json: partialJson },106  } as RawMessageStreamEvent;107}108109export function blockStop(index: number): RawMessageStreamEvent {110  return { type: "content_block_stop", index } as RawMessageStreamEvent;111}112113export function messageDelta(overrides?: {114  stop_reason?: "end_turn" | "tool_use" | "max_tokens" | "refusal" | "stop_sequence";115  output_tokens?: number;116  input_tokens?: number | null;117  cache_read_input_tokens?: number | null;118  cache_creation_input_tokens?: number | null;119}): RawMessageStreamEvent {120  return {121    type: "message_delta",122    delta: { stop_reason: overrides?.stop_reason ?? "end_turn", stop_sequence: null },123    usage: {124      output_tokens: overrides?.output_tokens ?? 12,125      input_tokens: overrides?.input_tokens ?? null,126      cache_creation_input_tokens: overrides?.cache_creation_input_tokens ?? null,127      cache_read_input_tokens: overrides?.cache_read_input_tokens ?? null,128      server_tool_use: null,129    },130  } as unknown as RawMessageStreamEvent;131}132133export function messageStop(): RawMessageStreamEvent {134  return { type: "message_stop" } as RawMessageStreamEvent;135}136137/** A complete plain-text stream: "Hello" + " world". */138export function simpleTextStream(): RawMessageStreamEvent[] {139  return [140    messageStart(),141    textBlockStart(0),142    textDelta(0, "Hello"),143    textDelta(0, " world"),144    blockStop(0),145    messageDelta({ stop_reason: "end_turn", output_tokens: 8 }),146    messageStop(),147  ];148}149150/** Thinking block, then text, then a tool call whose input spans three JSON chunks. */151export function toolCallStream(): RawMessageStreamEvent[] {152  return [153    messageStart({ input_tokens: 300, cache_read_input_tokens: 200 }),154    thinkingBlockStart(0),155    thinkingDelta(0, "Consider the"),156    thinkingDelta(0, " weather."),157    signatureDelta(0, "sig-abc"),158    blockStop(0),159    textBlockStart(1),160    textDelta(1, "Checking the weather."),161    blockStop(1),162    toolUseBlockStart(2, "toolu_01AAA", "get_weather"),163    inputJsonDelta(2, '{"city":'),164    inputJsonDelta(2, ' "Par'),165    inputJsonDelta(2, 'is"}'),166    blockStop(2),167    messageDelta({ stop_reason: "tool_use", output_tokens: 47 }),168    messageStop(),169  ];170}171