refactor(attempt-tests): share wrapped stream helper
This commit is contained in:
parent
9c047c5423
commit
1843248c69
@ -17,6 +17,11 @@ import {
|
||||
wrapStreamFnTrimToolCallNames,
|
||||
} from "./attempt.js";
|
||||
|
||||
type FakeWrappedStream = {
|
||||
result: () => Promise<unknown>;
|
||||
[Symbol.asyncIterator]: () => AsyncIterator<unknown>;
|
||||
};
|
||||
|
||||
function createOllamaProviderConfig(injectNumCtxForOpenAICompat: boolean): OpenClawConfig {
|
||||
return {
|
||||
models: {
|
||||
@ -32,6 +37,34 @@ function createOllamaProviderConfig(injectNumCtxForOpenAICompat: boolean): OpenC
|
||||
};
|
||||
}
|
||||
|
||||
function createFakeStream(params: {
|
||||
events: unknown[];
|
||||
resultMessage: unknown;
|
||||
}): FakeWrappedStream {
|
||||
return {
|
||||
async result() {
|
||||
return params.resultMessage;
|
||||
},
|
||||
[Symbol.asyncIterator]() {
|
||||
return (async function* () {
|
||||
for (const event of params.events) {
|
||||
yield event;
|
||||
}
|
||||
})();
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
async function invokeWrappedTestStream(
|
||||
wrap: (
|
||||
baseFn: (...args: never[]) => unknown,
|
||||
) => (...args: never[]) => FakeWrappedStream | Promise<FakeWrappedStream>,
|
||||
baseFn: (...args: never[]) => unknown,
|
||||
): Promise<FakeWrappedStream> {
|
||||
const wrappedFn = wrap(baseFn);
|
||||
return await Promise.resolve(wrappedFn({} as never, {} as never, {} as never));
|
||||
}
|
||||
|
||||
describe("resolvePromptBuildHookResult", () => {
|
||||
function createLegacyOnlyHookRunner() {
|
||||
return {
|
||||
@ -190,30 +223,14 @@ describe("resolveAttemptFsWorkspaceOnly", () => {
|
||||
});
|
||||
});
|
||||
describe("wrapStreamFnTrimToolCallNames", () => {
|
||||
function createFakeStream(params: { events: unknown[]; resultMessage: unknown }): {
|
||||
result: () => Promise<unknown>;
|
||||
[Symbol.asyncIterator]: () => AsyncIterator<unknown>;
|
||||
} {
|
||||
return {
|
||||
async result() {
|
||||
return params.resultMessage;
|
||||
},
|
||||
[Symbol.asyncIterator]() {
|
||||
return (async function* () {
|
||||
for (const event of params.events) {
|
||||
yield event;
|
||||
}
|
||||
})();
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
async function invokeWrappedStream(
|
||||
baseFn: (...args: never[]) => unknown,
|
||||
allowedToolNames?: Set<string>,
|
||||
) {
|
||||
const wrappedFn = wrapStreamFnTrimToolCallNames(baseFn as never, allowedToolNames);
|
||||
return await wrappedFn({} as never, {} as never, {} as never);
|
||||
return await invokeWrappedTestStream(
|
||||
(innerBaseFn) => wrapStreamFnTrimToolCallNames(innerBaseFn as never, allowedToolNames),
|
||||
baseFn,
|
||||
);
|
||||
}
|
||||
|
||||
function createEventStream(params: {
|
||||
@ -725,27 +742,11 @@ describe("wrapStreamFnTrimToolCallNames", () => {
|
||||
});
|
||||
|
||||
describe("wrapStreamFnRepairMalformedToolCallArguments", () => {
|
||||
function createFakeStream(params: { events: unknown[]; resultMessage: unknown }): {
|
||||
result: () => Promise<unknown>;
|
||||
[Symbol.asyncIterator]: () => AsyncIterator<unknown>;
|
||||
} {
|
||||
return {
|
||||
async result() {
|
||||
return params.resultMessage;
|
||||
},
|
||||
[Symbol.asyncIterator]() {
|
||||
return (async function* () {
|
||||
for (const event of params.events) {
|
||||
yield event;
|
||||
}
|
||||
})();
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
async function invokeWrappedStream(baseFn: (...args: never[]) => unknown) {
|
||||
const wrappedFn = wrapStreamFnRepairMalformedToolCallArguments(baseFn as never);
|
||||
return await wrappedFn({} as never, {} as never, {} as never);
|
||||
return await invokeWrappedTestStream(
|
||||
(innerBaseFn) => wrapStreamFnRepairMalformedToolCallArguments(innerBaseFn as never),
|
||||
baseFn,
|
||||
);
|
||||
}
|
||||
|
||||
it("repairs anthropic-compatible tool arguments when trailing junk follows valid JSON", async () => {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user