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%
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