test(openai-shim): assert Gemini tool-use stream blocks in adapter test

Extend the responseAdapters geminiSseToAnthropic wrapper test to cover
tool_use content_block_start, input_json_delta, and content_block_stop.
Remove stale post-extraction imports from the openaiShim facade.
This commit is contained in:
jatmn
2026-08-06 19:48:20 -07:00
parent bab9597b72
commit 74ba4806cf
3 changed files with 20 additions and 38 deletions
-2
View File
@@ -17,8 +17,6 @@ import {
import {
createOpenAIShimClient,
hasMistralApiHost,
parseTextToolCalls,
parseXmlToolCalls,
} from './openaiShim.ts'
import * as realGithubModelsCredentials from '../../utils/githubModelsCredentials.js'
+1 -36
View File
@@ -42,7 +42,7 @@ import {
refreshCodexAccessTokenIfNeeded,
} from '../../utils/codexCredentials.js'
import { logForDebugging } from '../../utils/debug.js'
import { anthropicSsePassthrough as parseAnthropicSsePassthrough, createReaderCanceller, createStreamAbortError, getStreamIdleTimeoutMs, readWithIdleTimeout, StreamIdleTimeoutError, throwIfStreamAborted } from './openaiShim/streamControl.js'
import { createStreamAbortError, getStreamIdleTimeoutMs, readWithIdleTimeout, StreamIdleTimeoutError } from './openaiShim/streamControl.js'
export { getStreamIdleTimeoutMs } from './openaiShim/streamControl.js'
import { isBareMode, isEnvTruthy } from '../../utils/envUtils.js'
import {
@@ -68,10 +68,6 @@ import {
resolveRouteCredentialValue,
} from '../../integrations/routeMetadata.js'
import { getSessionId } from '../../bootstrap/state.js'
import {
createThinkTagFilter,
stripThinkTags,
} from './thinkTagSanitizer.js'
import {
codexStreamToAnthropic,
collectCodexCompletedResponse,
@@ -80,19 +76,12 @@ import {
convertToolsToResponsesTools,
performCodexRequest,
type AnthropicStreamEvent,
type AnthropicUsage,
type ShimCreateParams,
} from './codexShim.js'
import {
createRequestBodyPlanner,
hydrateOpenAIShimCompatibilityEnv as hydrateRequestPlanningEnv,
} from './openaiShim/requestPlanner.js'
import { buildAnthropicUsageFromRawUsage } from './cacheMetrics.js'
import {
convertOpenAIStreamUsage,
openaiStreamToAnthropic as convertOpenAIStream,
} from './openaiShim/streamConversion.js'
import { geminiSseToAnthropic as convertGeminiStream } from './openaiShim/geminiStreamConversion.js'
import {
anthropicSsePassthrough,
convertGeminiToAnthropicResponse,
@@ -100,8 +89,6 @@ import {
geminiSseToAnthropic,
makeMessageId,
openaiStreamToAnthropic as convertOpenAIResponseStream,
parseTextToolCalls,
parseXmlToolCalls,
} from './openaiShim/responseAdapters.js'
export { parseTextToolCalls, parseXmlToolCalls } from './openaiShim/responseAdapters.js'
import { compressToolHistory } from './compressToolHistory.js'
@@ -138,10 +125,6 @@ import {
markOpenAIRequestNonReplayable,
} from './openaiErrorClassification.js'
import { redactSecretValueForDisplay, type SecretValueSource } from '../../utils/providerProfile.js'
import {
normalizeToolArguments,
hasToolFieldMapping,
} from './toolArgumentNormalization.js'
import { logApiCallStart, logApiCallEnd } from '../../utils/requestLogging.js'
import {
createStreamState,
@@ -150,13 +133,6 @@ import {
} from '../../utils/streamingOptimizer.js'
import { stableStringifyJson } from '../../utils/stableStringify.js'
import {
findXmlToolCallOpener as findXmlToolCallOpenerModule,
isHy3Model as isHy3ModelModule,
parseXmlToolCalls as parseXmlToolCallsModule,
trailingXmlOpenerPrefixLen as trailingXmlOpenerPrefixLenModule,
} from './openaiShim/xmlToolCallParsing.js'
import {
convertNonStreamingResponseToAnthropicMessage as convertResponseToAnthropicMessage,
type NonStreamingOpenAIResponse,
} from './openaiShim/responseConversion.js'
import {
@@ -190,17 +166,6 @@ import {
convertMessages as convertAnthropicMessages,
convertSystemPrompt as convertSystemPromptImpl,
} from './openaiShim/messageConversion.js'
import {
JSON_REPAIR_SUFFIXES,
couldBeRawToolCallsRequestedPrefix,
extractBalancedJson,
parseRawToolCallsRequestedText,
parseTextToolCalls as parseTextToolCallsModule,
repairPossiblyTruncatedObjectJson,
stripRanges,
type ParsedRawToolCall,
type ParsedTextToolCall,
} from './openaiShim/rawToolCallParsing.js'
import {
convertTools as convertToolsModule,
normalizeSchemaForOpenAI as normalizeSchemaForOpenAIModule,
@@ -120,6 +120,25 @@ test('geminiSseToAnthropic wrapper emits content, usage, and terminal stop', asy
event.type === 'content_block_delta' &&
(event.delta as { text?: string })?.text === 'Inspecting.',
)).toBe(true)
const toolStartIndex = events.findIndex(event =>
event.type === 'content_block_start' &&
(event.content_block as { type?: string; name?: string })?.type === 'tool_use' &&
(event.content_block as { name?: string })?.name === 'Read',
)
expect(toolStartIndex).toBeGreaterThan(-1)
expect(events[toolStartIndex + 1]).toMatchObject({
type: 'content_block_delta',
delta: {
type: 'input_json_delta',
partial_json: '{"file_path":"a.ts"}',
},
})
expect(events[toolStartIndex + 2]).toEqual({
type: 'content_block_stop',
index: (events[toolStartIndex] as { index: number }).index,
})
expect(events.at(-2)).toMatchObject({
type: 'message_delta',
delta: { stop_reason: 'tool_use' },