refactor(ai): trim private Responses exports (#105720)

This commit is contained in:
Vincent Koc
2026-07-13 07:46:35 +08:00
committed by GitHub
parent 13212f1a4d
commit b7a7f3fa71
4 changed files with 18 additions and 28 deletions
@@ -12,14 +12,15 @@ import {
applyCommonResponsesParams,
createResponsesAssistantOutput,
convertResponsesMessages,
type OpenAIResponsesStreamEvent,
processResponsesStream,
resolveResponsesReasoningEffort,
runResponsesStreamLifecycle,
} from "./openai-responses-shared.js";
import { convertResponsesTools } from "./openai-responses-tools.js";
import { convertResponsesToolPayload } from "./openai-responses-tools.js";
type ResponsesFunctionTool = Extract<OpenAIResponsesTool, { type: "function" }>;
type OpenAIResponsesStreamEvent =
Parameters<typeof processResponsesStream>[0] extends AsyncIterable<infer Event> ? Event : never;
async function* streamResponsesEvents(
events: readonly OpenAIResponsesStreamEvent[],
@@ -117,7 +118,7 @@ async function* responseEvents(events: Array<Record<string, unknown>>) {
}
}
describe("convertResponsesTools", () => {
describe("convertResponsesToolPayload", () => {
beforeEach(() => {
// Mimic the OpenClaw host strict-tool policy: native OpenAI routes force
// strict=true, proxy-like routes leave the flag unset.
@@ -144,7 +145,7 @@ describe("convertResponsesTools", () => {
},
] satisfies Tool[];
const converted = convertResponsesTools(tools, { model: nativeOpenAIModel });
const converted = convertResponsesToolPayload(tools, { model: nativeOpenAIModel }).tools;
expect(converted).toEqual([
{
@@ -163,7 +164,7 @@ describe("convertResponsesTools", () => {
});
it("downgrades incompatible native Responses schemas to strict false", () => {
const converted = convertResponsesTools(
const converted = convertResponsesToolPayload(
[
{
name: "read_file",
@@ -177,7 +178,7 @@ describe("convertResponsesTools", () => {
},
],
{ model: nativeOpenAIModel },
);
).tools;
const tool = expectResponsesFunctionTool(converted[0]);
expect(tool.strict).toBe(false);
@@ -190,7 +191,7 @@ describe("convertResponsesTools", () => {
});
it("omits strict on proxy-like Responses routes but keeps schema normalization", () => {
const converted = convertResponsesTools(
const converted = convertResponsesToolPayload(
[
{
name: "lookup_weather",
@@ -199,7 +200,7 @@ describe("convertResponsesTools", () => {
},
],
{ model: proxyOpenAIModel },
);
).tools;
const tool = expectResponsesFunctionTool(converted[0]);
expect(tool).not.toHaveProperty("strict");
@@ -222,12 +223,14 @@ describe("convertResponsesTools", () => {
} satisfies Tool;
expect(
convertResponsesTools([zeta, alpha]).map((tool) => expectResponsesFunctionTool(tool).name),
convertResponsesToolPayload([zeta, alpha]).tools.map(
(tool) => expectResponsesFunctionTool(tool).name,
),
).toEqual(["alpha", "zeta"]);
});
it("skips unreadable schemas and preserves healthy native strict tools", () => {
const converted = convertResponsesTools(
const converted = convertResponsesToolPayload(
[
{
name: "broken",
@@ -246,7 +249,7 @@ describe("convertResponsesTools", () => {
},
],
{ model: nativeOpenAIModel },
);
).tools;
expect(converted).toEqual([
{
@@ -57,7 +57,7 @@ import {
isResponsesTextContentPartType,
resolveResponsesMessageSnapshotCollapse,
} from "./openai-responses-stream-compat.js";
import { convertResponsesToolPayload, convertResponsesTools } from "./openai-responses-tools.js";
import { convertResponsesToolPayload } from "./openai-responses-tools.js";
import { describeToolResultMediaPlaceholder, extractToolResultText } from "./tool-result-text.js";
import { transformMessages } from "./transform-messages.js";
@@ -124,7 +124,7 @@ type AzureResponsesOutputItemDoneEvent = Omit<ResponsesOutputItemDoneEvent, "ite
item: ResponsesStreamOutputMessage;
};
export type OpenAIResponsesStreamEvent =
type OpenAIResponsesStreamEvent =
| ResponseStreamEvent
| AzureResponsesContentPartAddedEvent
| AzureResponsesOutputItemDoneEvent
@@ -210,8 +210,7 @@ interface ConvertResponsesMessagesOptions {
includeSystemPrompt?: boolean;
replayResponsesItemIds?: boolean;
}
export { convertResponsesToolPayload, convertResponsesTools };
export type { ConvertResponsesToolsOptions } from "./openai-responses-tools.js";
export { convertResponsesToolPayload };
type ResponsesRequestOptions = {
signal?: AbortSignal;
@@ -11,7 +11,7 @@ import {
} from "./openai-tool-schema.js";
/** Options for converting internal tool schemas to OpenAI Responses function tools. */
export interface ConvertResponsesToolsOptions {
interface ConvertResponsesToolsOptions {
strict?: boolean | null;
model?: Model;
supportsStrictMode?: boolean;
@@ -36,14 +36,6 @@ const LOG_SUBSYSTEM = "llm/openai-responses";
const MAX_STRICT_TOOL_DOWNGRADE_DIAGNOSTIC_KEYS = 64;
const loggedStrictToolDowngradeDiagnosticKeys = new Set<string>();
/** Converts tools to deterministic OpenAI Responses function tool definitions. */
export function convertResponsesTools(
tools: Tool[],
options?: ConvertResponsesToolsOptions,
): OpenAITool[] {
return convertResponsesToolPayload(tools, options).tools;
}
/** Converts and returns the projection used to reconcile tool choices. */
export function convertResponsesToolPayload(
tools: Tool[],
-4
View File
@@ -1885,10 +1885,6 @@ export const KNIP_UNUSED_EXPORT_BASELINE = [
"packages/ai/src/providers/google-shared.ts: mapToolChoice",
"packages/ai/src/providers/google-shared.ts: requiresToolCallId",
"packages/ai/src/providers/google-shared.ts: retainThoughtSignature",
"packages/ai/src/providers/openai-responses-shared.ts: convertResponsesTools",
"packages/ai/src/providers/openai-responses-shared.ts: ConvertResponsesToolsOptions",
"packages/ai/src/providers/openai-responses-shared.ts: OpenAIResponsesStreamEvent",
"packages/ai/src/providers/openai-responses-tools.ts: ConvertResponsesToolsOptions",
"packages/gateway-client/src/timeouts.ts: clampConnectChallengeTimeoutMs",
"packages/gateway-client/src/timeouts.ts: DEFAULT_PREAUTH_HANDSHAKE_TIMEOUT_MS",
"packages/gateway-client/src/timeouts.ts: getConnectChallengeTimeoutMsFromEnv",