From a40672f390fd327ddad66ca2f90fc0114a0a9fe7 Mon Sep 17 00:00:00 2001 From: amos Date: Wed, 7 Jan 2026 12:33:33 +0200 Subject: [PATCH 1/7] [FIRE-987] feature: support new tool_use_quality_check & tuq_mode fields and deprecate tool_selection_quality_check & tsq_mode fields --- src/index.ts | 160 ++++++++++++++++++++++++++++++--------------- src/types.ts | 37 ++++++++--- test/types.spec.ts | 10 +-- 3 files changed, 141 insertions(+), 66 deletions(-) diff --git a/src/index.ts b/src/index.ts index 0da6770..dfb298a 100644 --- a/src/index.ts +++ b/src/index.ts @@ -4,13 +4,25 @@ import { ClaudeCanonicalEvaluationStrategy } from './frameworks/claude/claude-co import { GeminiAICanonicalEvaluationStrategy } from './frameworks/gemini/gemini-converter'; import { OpenAICanonicalEvaluationStrategy } from './frameworks/openai/openai-converter'; import { VercelAICanonicalEvaluationStrategy } from './frameworks/vercelai/vercelai-converter'; -import { EvaluationProxyAPIRequest, EvaluationProxyAPIRequestSchema, EvaluationRequestV2Schema, type EvaluationRequestV2, type EvaluationResponse, type Framework } from './types'; +import { + EvaluationProxyAPIRequest, + EvaluationProxyAPIRequestSchema, + EvaluationRequestV2Schema, + type EvaluationRequestV2, + type EvaluationResponse, + type Framework, +} from './types'; export type { - EvaluationProxyAPIRequest, EvaluationRequestV2, EvaluationResponse, Framework, LLMMessage, ModelMode, PolicyTarget + EvaluationProxyAPIRequest, + EvaluationRequestV2, + EvaluationResponse, + Framework, + LLMMessage, + ModelMode, + PolicyTarget, } from './types'; - /** * Represents the Qualifire SDK. */ @@ -61,7 +73,7 @@ export class Qualifire { * This function supports two modes: * 1. Request-Response mode: If `request`, `response` and `framework` are provided, they fully analyzed by the Qualifire API * 2. Fine-grained messages mode: If `messages`, `input` or `output` are provided, they are sent specifically to the Qualifire API - * + * * Supported frameworks are: openai, vercelai, gemini, claude * Note: Direct messages are deprecated, but still supported for backward compatibility. * @@ -91,11 +103,11 @@ export class Qualifire { * }, * ], * }; - * + * * const openAiResponse = await openaiClient.chat.completions.create( * openAiRequest * ); - * + * * const qualifireResponse = await qualifireClient.evaluate({ * framework: 'openai', * request: openaiRequest, // As given to openaiClient.chat.completions.create(), openaiClient.responses.create() @@ -106,9 +118,9 @@ export class Qualifire { * instructionsFollowingCheck: true, * piiCheck: true, * promptInjections: true, - * toolSelectionQualityCheck: false, + * toolUseQualityCheck: false, // Use this instead of deprecated toolSelectionQualityCheck * }); - * + * * // If you are using streaming mode. * const openAiRequestStream = { * stream: true, @@ -129,11 +141,11 @@ export class Qualifire { * }, * ], * }; - * + * * const openAiResponseStream = await openaiClient.chat.completions.create( * openAiRequestStream * ); - * + * * let ResponseChunks: any[] = []; * for await (const chunk of openAiResponseStream) { * ResponseChunks.push(chunk); @@ -146,7 +158,7 @@ export class Qualifire { * groundingCheck: true, * promptInjections: true, * }); - * + * * // Fine-grained messages mode * const response2 = await qualifire.evaluate({ * messages: [ @@ -157,7 +169,7 @@ export class Qualifire { * hallucinationsCheck: true, * }); * ``` - * + * * // A typical output for qualifire response would be: * Qualifire response: { * "status": "failed", @@ -178,34 +190,45 @@ export class Qualifire { * ] * } */ - evaluate = async (evaluationRequest: EvaluationProxyAPIRequest | EvaluationRequestV2): Promise => { + evaluate = async ( + evaluationRequest: EvaluationProxyAPIRequest | EvaluationRequestV2 + ): Promise => { // If messages are provided directly, use them as-is without conversion - const parseEvaluationProxyAPIRequest = EvaluationProxyAPIRequestSchema.safeParse(evaluationRequest) + const parseEvaluationProxyAPIRequest = + EvaluationProxyAPIRequestSchema.safeParse(evaluationRequest); if (parseEvaluationProxyAPIRequest.success) { - return this.evaluateWithBackwardCompatibility(parseEvaluationProxyAPIRequest.data as EvaluationProxyAPIRequest); + return this.evaluateWithBackwardCompatibility( + parseEvaluationProxyAPIRequest.data as EvaluationProxyAPIRequest + ); } - const parseEvaluationRequestResultV2 = EvaluationRequestV2Schema.safeParse(evaluationRequest) + const parseEvaluationRequestResultV2 = + EvaluationRequestV2Schema.safeParse(evaluationRequest); if (parseEvaluationRequestResultV2.success) { - return this.evaluateWithConverters(parseEvaluationRequestResultV2.data ); + return this.evaluateWithConverters(parseEvaluationRequestResultV2.data); } - - throw new Error(`Invalid evaluation request format: ${JSON.stringify(evaluationRequest)}`); + + throw new Error( + `Invalid evaluation request format: ${JSON.stringify(evaluationRequest)}` + ); }; /** * Evaluates using direct messages without conversion (overrides request/response if both are provided) */ - private evaluateWithBackwardCompatibility = async (evaluationProxyAPIRequest: EvaluationProxyAPIRequest): Promise => { + private evaluateWithBackwardCompatibility = async ( + evaluationProxyAPIRequest: EvaluationProxyAPIRequest + ): Promise => { // Compute contentModerationCheck from deprecated fields or use the new field - const contentModerationCheck = evaluationProxyAPIRequest.contentModerationCheck || - evaluationProxyAPIRequest.dangerous_content_check || - evaluationProxyAPIRequest.dangerousContentCheck || - evaluationProxyAPIRequest.harassment_check || - evaluationProxyAPIRequest.harassmentCheck || - evaluationProxyAPIRequest.hate_speech_check || - evaluationProxyAPIRequest.hateSpeechCheck || - evaluationProxyAPIRequest.sexual_content_check || + const contentModerationCheck = + evaluationProxyAPIRequest.contentModerationCheck || + evaluationProxyAPIRequest.dangerous_content_check || + evaluationProxyAPIRequest.dangerousContentCheck || + evaluationProxyAPIRequest.harassment_check || + evaluationProxyAPIRequest.harassmentCheck || + evaluationProxyAPIRequest.hate_speech_check || + evaluationProxyAPIRequest.hateSpeechCheck || + evaluationProxyAPIRequest.sexual_content_check || evaluationProxyAPIRequest.sexualContentCheck; const url = `${this.baseUrl}/api/evaluation/evaluate`; @@ -215,13 +238,30 @@ export class Qualifire { messages: evaluationProxyAPIRequest.messages, available_tools: evaluationProxyAPIRequest.available_tools, content_moderation_check: contentModerationCheck, - grounding_check: evaluationProxyAPIRequest.grounding_check || evaluationProxyAPIRequest.groundingCheck, - hallucinations_check: evaluationProxyAPIRequest.hallucinations_check || evaluationProxyAPIRequest.hallucinationsCheck, - instructions_following_check: evaluationProxyAPIRequest.instructions_following_check || evaluationProxyAPIRequest.instructionsFollowingCheck, - pii_check: evaluationProxyAPIRequest.pii_check || evaluationProxyAPIRequest.piiCheck, - prompt_injections: evaluationProxyAPIRequest.prompt_injections || evaluationProxyAPIRequest.promptInjections, - syntax_checks: evaluationProxyAPIRequest.syntax_checks || evaluationProxyAPIRequest.syntaxChecks, - tool_selection_quality_check: evaluationProxyAPIRequest.tool_selection_quality_check || evaluationProxyAPIRequest.toolSelectionQualityCheck, + grounding_check: + evaluationProxyAPIRequest.grounding_check || + evaluationProxyAPIRequest.groundingCheck, + hallucinations_check: + evaluationProxyAPIRequest.hallucinations_check || + evaluationProxyAPIRequest.hallucinationsCheck, + instructions_following_check: + evaluationProxyAPIRequest.instructions_following_check || + evaluationProxyAPIRequest.instructionsFollowingCheck, + pii_check: + evaluationProxyAPIRequest.pii_check || + evaluationProxyAPIRequest.piiCheck, + prompt_injections: + evaluationProxyAPIRequest.prompt_injections || + evaluationProxyAPIRequest.promptInjections, + syntax_checks: + evaluationProxyAPIRequest.syntax_checks || + evaluationProxyAPIRequest.syntaxChecks, + tool_selection_quality_check: + evaluationProxyAPIRequest.tool_selection_quality_check || + evaluationProxyAPIRequest.toolSelectionQualityCheck, + tool_use_quality_check: evaluationProxyAPIRequest.toolUseQualityCheck, + tsq_mode: evaluationProxyAPIRequest.tsqMode, + tuq_mode: evaluationProxyAPIRequest.tuqMode, assertions: evaluationProxyAPIRequest.assertions, }; @@ -247,32 +287,45 @@ export class Qualifire { /** * Evaluates using framework converters for request/response */ - private evaluateWithConverters = async (EvaluationRequestV2: EvaluationRequestV2): Promise => { + private evaluateWithConverters = async ( + EvaluationRequestV2: EvaluationRequestV2 + ): Promise => { // Compute contentModerationCheck from deprecated fields or use the new field - const contentModerationCheck = EvaluationRequestV2.contentModerationCheck || - EvaluationRequestV2.dangerousContentCheck || - EvaluationRequestV2.harassmentCheck || - EvaluationRequestV2.hateSpeechCheck || + const contentModerationCheck = + EvaluationRequestV2.contentModerationCheck || + EvaluationRequestV2.dangerousContentCheck || + EvaluationRequestV2.harassmentCheck || + EvaluationRequestV2.hateSpeechCheck || EvaluationRequestV2.sexualContentCheck; - const frameworkConverters: Record CanonicalEvaluationStrategy> = { - 'openai': () => new OpenAICanonicalEvaluationStrategy(), - 'vercelai': () => new VercelAICanonicalEvaluationStrategy(), - 'gemini': () => new GeminiAICanonicalEvaluationStrategy(), - 'claude': () => new ClaudeCanonicalEvaluationStrategy(), + const frameworkConverters: Record< + Framework, + () => CanonicalEvaluationStrategy + > = { + openai: () => new OpenAICanonicalEvaluationStrategy(), + vercelai: () => new VercelAICanonicalEvaluationStrategy(), + gemini: () => new GeminiAICanonicalEvaluationStrategy(), + claude: () => new ClaudeCanonicalEvaluationStrategy(), }; const supportedFrameworks = Object.keys(frameworkConverters); const converterFactory = frameworkConverters[EvaluationRequestV2.framework]; - + if (!converterFactory) { - throw new Error(`Unsupported framework: ${EvaluationRequestV2.framework}. Supported frameworks: ${supportedFrameworks.join(', ')}`); + throw new Error( + `Unsupported framework: ${ + EvaluationRequestV2.framework + }. Supported frameworks: ${supportedFrameworks.join(', ')}` + ); } const requestConverter = converterFactory(); - - const evaluationRequest = await requestConverter.convertToQualifireEvaluationRequest(EvaluationRequestV2.request, EvaluationRequestV2.response) + const evaluationRequest = + await requestConverter.convertToQualifireEvaluationRequest( + EvaluationRequestV2.request, + EvaluationRequestV2.response + ); const url = `${this.baseUrl}/api/evaluation/evaluate`; const body = { @@ -281,11 +334,16 @@ export class Qualifire { content_moderation_check: contentModerationCheck, grounding_check: EvaluationRequestV2.groundingCheck, hallucinations_check: EvaluationRequestV2.hallucinationsCheck, - instructions_following_check: EvaluationRequestV2.instructionsFollowingCheck, + instructions_following_check: + EvaluationRequestV2.instructionsFollowingCheck, pii_check: EvaluationRequestV2.piiCheck, prompt_injections: EvaluationRequestV2.promptInjections, syntax_checks: EvaluationRequestV2.syntaxChecks, - tool_selection_quality_check: EvaluationRequestV2.toolSelectionQualityCheck, + tool_selection_quality_check: + EvaluationRequestV2.toolSelectionQualityCheck, + tool_use_quality_check: EvaluationRequestV2.toolUseQualityCheck, + tsq_mode: EvaluationRequestV2.tsqMode, + tuq_mode: EvaluationRequestV2.tuqMode, assertions: EvaluationRequestV2.assertions, }; diff --git a/src/types.ts b/src/types.ts index 88f9093..a2f6451 100644 --- a/src/types.ts +++ b/src/types.ts @@ -2,15 +2,15 @@ import { z } from 'zod'; // Framework type based on supported frameworks const FrameworkEnum = ['openai', 'vercelai', 'gemini', 'claude'] as const; -export type Framework = typeof FrameworkEnum[number]; +export type Framework = (typeof FrameworkEnum)[number]; // Model mode enum const ModelModeEnum = ['speed', 'balanced', 'quality'] as const; -export type ModelMode = typeof ModelModeEnum[number]; +export type ModelMode = (typeof ModelModeEnum)[number]; // Policy target enum const PolicyTargetEnum = ['input', 'output', 'both'] as const; -export type PolicyTarget = typeof PolicyTargetEnum[number]; +export type PolicyTarget = (typeof PolicyTargetEnum)[number]; export const messageSchema = z.object({ role: z.string(), @@ -96,7 +96,9 @@ export const EvaluationRequestV2Schema = z.object({ sexualContentCheck: z.boolean().default(false).optional(), contentModerationCheck: z.boolean().default(false).optional(), syntaxChecks: z.record(z.string(), SyntaxCheckArgsSchema).optional(), + /** @deprecated Use toolUseQualityCheck instead */ toolSelectionQualityCheck: z.boolean().default(false).optional(), + toolUseQualityCheck: z.boolean().default(false).optional(), assertions: z.array(z.string()).optional(), /** @deprecated Automatically added from the request*/ available_tools: z.array(LLMToolDefinitionSchema).optional(), @@ -120,9 +122,13 @@ export const EvaluationRequestV2Schema = z.object({ sexual_content_check: z.boolean().default(false).optional(), /** @deprecated Use syntaxChecks instead */ syntax_checks: z.record(z.string(), SyntaxCheckArgsSchema).optional(), - /** @deprecated Use toolSelectionQualityCheck instead */ + /** @deprecated Use toolUseQualityCheck instead */ tool_selection_quality_check: z.boolean().default(false).optional(), - tsqMode: z.enum(ModelModeEnum).default('balanced').optional(), + /** @deprecated Use toolUseQualityCheck instead */ + tool_use_quality_check: z.boolean().default(false).optional(), + /** @deprecated Use tuqMode instead */ + tsqMode: z.enum(ModelModeEnum).optional(), + tuqMode: z.enum(ModelModeEnum).optional(), consistencyMode: z.enum(ModelModeEnum).default('balanced').optional(), assertionsMode: z.enum(ModelModeEnum).default('balanced').optional(), groundingMode: z.enum(ModelModeEnum).default('balanced').optional(), @@ -164,6 +170,8 @@ export const EvaluationProxyAPIRequestSchema = z syntax_checks: z.record(z.string(), SyntaxCheckArgsSchema).optional(), /** @deprecated Use toolSelectionQualityCheck instead */ tool_selection_quality_check: z.boolean().default(false), + /** @deprecated Use toolUseQualityCheck instead */ + tool_use_quality_check: z.boolean().default(false).optional(), assertions: z.array(z.string()).optional(), /** @deprecated Use contentModerationCheck instead */ dangerousContentCheck: z.boolean().default(false).optional(), @@ -180,8 +188,12 @@ export const EvaluationProxyAPIRequestSchema = z sexualContentCheck: z.boolean().default(false).optional(), contentModerationCheck: z.boolean().default(false).optional(), syntaxChecks: z.record(z.string(), SyntaxCheckArgsSchema).optional(), + /** @deprecated Use toolUseQualityCheck instead */ toolSelectionQualityCheck: z.boolean().default(false).optional(), - tsqMode: z.enum(ModelModeEnum).default('balanced').optional(), + toolUseQualityCheck: z.boolean().default(false).optional(), + /** @deprecated Use tuqMode instead */ + tsqMode: z.enum(ModelModeEnum).optional(), + tuqMode: z.enum(ModelModeEnum).optional(), consistencyMode: z.enum(ModelModeEnum).default('balanced').optional(), assertionsMode: z.enum(ModelModeEnum).default('balanced').optional(), groundingMode: z.enum(ModelModeEnum).default('balanced').optional(), @@ -206,8 +218,13 @@ export const EvaluationProxyAPIRequestSchema = z }); } - // Validation: tool_selection_quality_check requires messages and available_tools - if (data.tool_selection_quality_check) { + // Validation: tool_selection_quality_check or tool_use_quality_check or toolSelectionQualityCheck or toolUseQualityCheck requires messages and available_tools + if ( + data.tool_selection_quality_check || + data.tool_use_quality_check || + data.toolSelectionQualityCheck || + data.toolUseQualityCheck + ) { const hasAvailableTools = Array.isArray(data.available_tools) && data.available_tools.length > 0; @@ -215,7 +232,7 @@ export const EvaluationProxyAPIRequestSchema = z ctx.addIssue({ code: z.ZodIssueCode.custom, message: - 'messages must be provided when tool_selection_quality_check is true', + 'messages must be provided when tool quality check is enabled', path: ['messages'], }); } @@ -223,7 +240,7 @@ export const EvaluationProxyAPIRequestSchema = z ctx.addIssue({ code: z.ZodIssueCode.custom, message: - 'available_tools must be provided when tool_selection_quality_check is true', + 'available_tools must be provided when tool quality check is enabled', path: ['available_tools'], }); } diff --git a/test/types.spec.ts b/test/types.spec.ts index 1890e82..9baa9a1 100644 --- a/test/types.spec.ts +++ b/test/types.spec.ts @@ -68,7 +68,7 @@ describe('EvaluationRequestSchema', () => { prompt_injections: false, sexual_content_check: false, syntax_checks: undefined, - tool_selection_quality_check: false, + tool_use_quality_check: false, assertions: undefined, }; @@ -85,7 +85,7 @@ describe('EvaluationRequestSchema', () => { ); }); - describe('validate tool_selection_quality_check requirements', () => { + describe('validate tool_use_quality_check requirements', () => { const testCases = [ [true, null, null, true], [true, [], null, true], @@ -108,8 +108,8 @@ describe('EvaluationRequestSchema', () => { ] as const; test.each(testCases)( - 'tool_selection_quality_check: %p, messages: %p, available_tools: %p -> should fail: %p', - (tsq_check, messages, tools, shouldError) => { + 'tool_use_quality_check: %p, messages: %p, available_tools: %p -> should fail: %p', + (tuq_check, messages, tools, shouldError) => { const payload = { input: 'input', // included to bypass the input/output/messages check messages: messages ?? undefined, @@ -123,7 +123,7 @@ describe('EvaluationRequestSchema', () => { prompt_injections: false, sexual_content_check: false, instructions_following_check: false, - tool_selection_quality_check: tsq_check, + tool_use_quality_check: tuq_check, }; if (shouldError) { From 37d259c86d6b53e487fc8348b061f516782116dc Mon Sep 17 00:00:00 2001 From: amos-qualifire Date: Wed, 7 Jan 2026 15:37:26 +0200 Subject: [PATCH 2/7] Update src/types.ts Co-authored-by: yuval-qf --- src/types.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/types.ts b/src/types.ts index a2f6451..0facb8a 100644 --- a/src/types.ts +++ b/src/types.ts @@ -124,8 +124,6 @@ export const EvaluationRequestV2Schema = z.object({ syntax_checks: z.record(z.string(), SyntaxCheckArgsSchema).optional(), /** @deprecated Use toolUseQualityCheck instead */ tool_selection_quality_check: z.boolean().default(false).optional(), - /** @deprecated Use toolUseQualityCheck instead */ - tool_use_quality_check: z.boolean().default(false).optional(), /** @deprecated Use tuqMode instead */ tsqMode: z.enum(ModelModeEnum).optional(), tuqMode: z.enum(ModelModeEnum).optional(), From 6c29851c74f80eba2b306e97aeae538c98333093 Mon Sep 17 00:00:00 2001 From: amos-qualifire Date: Wed, 7 Jan 2026 15:37:33 +0200 Subject: [PATCH 3/7] Update src/types.ts Co-authored-by: yuval-qf --- src/types.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/types.ts b/src/types.ts index 0facb8a..5ea0ddf 100644 --- a/src/types.ts +++ b/src/types.ts @@ -168,8 +168,6 @@ export const EvaluationProxyAPIRequestSchema = z syntax_checks: z.record(z.string(), SyntaxCheckArgsSchema).optional(), /** @deprecated Use toolSelectionQualityCheck instead */ tool_selection_quality_check: z.boolean().default(false), - /** @deprecated Use toolUseQualityCheck instead */ - tool_use_quality_check: z.boolean().default(false).optional(), assertions: z.array(z.string()).optional(), /** @deprecated Use contentModerationCheck instead */ dangerousContentCheck: z.boolean().default(false).optional(), From 6df96a58d9516eb19cafbcc97938fa85a6a3c5c6 Mon Sep 17 00:00:00 2001 From: amos Date: Wed, 7 Jan 2026 16:33:14 +0200 Subject: [PATCH 4/7] feat: add support for tool_use_quality_check and tuq_mode fields - Added tool_use_quality_check field as snake_case alternative to toolUseQualityCheck - Updated validation logic to check all field variants - Modified index.ts to only send new field names to server with fallback support - Used nullish coalescing operator for tuq_mode fallback logic - Maintained backward compatibility with deprecated fields --- src/index.ts | 21 +++++++++++---------- src/types.ts | 2 ++ 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/index.ts b/src/index.ts index dfb298a..b9ff4c8 100644 --- a/src/index.ts +++ b/src/index.ts @@ -256,12 +256,13 @@ export class Qualifire { syntax_checks: evaluationProxyAPIRequest.syntax_checks || evaluationProxyAPIRequest.syntaxChecks, - tool_selection_quality_check: + tool_use_quality_check: + evaluationProxyAPIRequest.tool_use_quality_check || evaluationProxyAPIRequest.tool_selection_quality_check || - evaluationProxyAPIRequest.toolSelectionQualityCheck, - tool_use_quality_check: evaluationProxyAPIRequest.toolUseQualityCheck, - tsq_mode: evaluationProxyAPIRequest.tsqMode, - tuq_mode: evaluationProxyAPIRequest.tuqMode, + evaluationProxyAPIRequest.toolSelectionQualityCheck || + evaluationProxyAPIRequest.toolUseQualityCheck, + tuq_mode: + evaluationProxyAPIRequest.tuqMode ?? evaluationProxyAPIRequest.tsqMode, assertions: evaluationProxyAPIRequest.assertions, }; @@ -339,11 +340,11 @@ export class Qualifire { pii_check: EvaluationRequestV2.piiCheck, prompt_injections: EvaluationRequestV2.promptInjections, syntax_checks: EvaluationRequestV2.syntaxChecks, - tool_selection_quality_check: - EvaluationRequestV2.toolSelectionQualityCheck, - tool_use_quality_check: EvaluationRequestV2.toolUseQualityCheck, - tsq_mode: EvaluationRequestV2.tsqMode, - tuq_mode: EvaluationRequestV2.tuqMode, + tool_use_quality_check: + EvaluationRequestV2.tool_selection_quality_check || + EvaluationRequestV2.toolSelectionQualityCheck || + EvaluationRequestV2.toolUseQualityCheck, + tuq_mode: EvaluationRequestV2.tuqMode ?? EvaluationRequestV2.tsqMode, assertions: EvaluationRequestV2.assertions, }; diff --git a/src/types.ts b/src/types.ts index 5ea0ddf..0facb8a 100644 --- a/src/types.ts +++ b/src/types.ts @@ -168,6 +168,8 @@ export const EvaluationProxyAPIRequestSchema = z syntax_checks: z.record(z.string(), SyntaxCheckArgsSchema).optional(), /** @deprecated Use toolSelectionQualityCheck instead */ tool_selection_quality_check: z.boolean().default(false), + /** @deprecated Use toolUseQualityCheck instead */ + tool_use_quality_check: z.boolean().default(false).optional(), assertions: z.array(z.string()).optional(), /** @deprecated Use contentModerationCheck instead */ dangerousContentCheck: z.boolean().default(false).optional(), From 49f7d156f56bca40cda8c4ab3e6037376378fea3 Mon Sep 17 00:00:00 2001 From: amos Date: Wed, 7 Jan 2026 17:53:35 +0200 Subject: [PATCH 5/7] [FIRE-987] chore: fix pr changes --- src/index.ts | 9 ++++----- src/types.ts | 5 +---- test/types.spec.ts | 8 ++++---- 3 files changed, 9 insertions(+), 13 deletions(-) diff --git a/src/index.ts b/src/index.ts index b9ff4c8..373ee46 100644 --- a/src/index.ts +++ b/src/index.ts @@ -257,10 +257,9 @@ export class Qualifire { evaluationProxyAPIRequest.syntax_checks || evaluationProxyAPIRequest.syntaxChecks, tool_use_quality_check: - evaluationProxyAPIRequest.tool_use_quality_check || - evaluationProxyAPIRequest.tool_selection_quality_check || + evaluationProxyAPIRequest.toolUseQualityCheck || evaluationProxyAPIRequest.toolSelectionQualityCheck || - evaluationProxyAPIRequest.toolUseQualityCheck, + evaluationProxyAPIRequest.tool_selection_quality_check, tuq_mode: evaluationProxyAPIRequest.tuqMode ?? evaluationProxyAPIRequest.tsqMode, assertions: evaluationProxyAPIRequest.assertions, @@ -341,9 +340,9 @@ export class Qualifire { prompt_injections: EvaluationRequestV2.promptInjections, syntax_checks: EvaluationRequestV2.syntaxChecks, tool_use_quality_check: - EvaluationRequestV2.tool_selection_quality_check || + EvaluationRequestV2.toolUseQualityCheck || EvaluationRequestV2.toolSelectionQualityCheck || - EvaluationRequestV2.toolUseQualityCheck, + EvaluationRequestV2.tool_selection_quality_check, tuq_mode: EvaluationRequestV2.tuqMode ?? EvaluationRequestV2.tsqMode, assertions: EvaluationRequestV2.assertions, }; diff --git a/src/types.ts b/src/types.ts index 0facb8a..7f76245 100644 --- a/src/types.ts +++ b/src/types.ts @@ -168,8 +168,6 @@ export const EvaluationProxyAPIRequestSchema = z syntax_checks: z.record(z.string(), SyntaxCheckArgsSchema).optional(), /** @deprecated Use toolSelectionQualityCheck instead */ tool_selection_quality_check: z.boolean().default(false), - /** @deprecated Use toolUseQualityCheck instead */ - tool_use_quality_check: z.boolean().default(false).optional(), assertions: z.array(z.string()).optional(), /** @deprecated Use contentModerationCheck instead */ dangerousContentCheck: z.boolean().default(false).optional(), @@ -216,10 +214,9 @@ export const EvaluationProxyAPIRequestSchema = z }); } - // Validation: tool_selection_quality_check or tool_use_quality_check or toolSelectionQualityCheck or toolUseQualityCheck requires messages and available_tools + // Validation: tool_selection_quality_check or toolSelectionQualityCheck or toolUseQualityCheck requires messages and available_tools if ( data.tool_selection_quality_check || - data.tool_use_quality_check || data.toolSelectionQualityCheck || data.toolUseQualityCheck ) { diff --git a/test/types.spec.ts b/test/types.spec.ts index 9baa9a1..2bf9080 100644 --- a/test/types.spec.ts +++ b/test/types.spec.ts @@ -68,7 +68,7 @@ describe('EvaluationRequestSchema', () => { prompt_injections: false, sexual_content_check: false, syntax_checks: undefined, - tool_use_quality_check: false, + toolUseQualityCheck: false, assertions: undefined, }; @@ -85,7 +85,7 @@ describe('EvaluationRequestSchema', () => { ); }); - describe('validate tool_use_quality_check requirements', () => { + describe('validate toolUseQualityCheck requirements', () => { const testCases = [ [true, null, null, true], [true, [], null, true], @@ -108,7 +108,7 @@ describe('EvaluationRequestSchema', () => { ] as const; test.each(testCases)( - 'tool_use_quality_check: %p, messages: %p, available_tools: %p -> should fail: %p', + 'toolUseQualityCheck: %p, messages: %p, available_tools: %p -> should fail: %p', (tuq_check, messages, tools, shouldError) => { const payload = { input: 'input', // included to bypass the input/output/messages check @@ -123,7 +123,7 @@ describe('EvaluationRequestSchema', () => { prompt_injections: false, sexual_content_check: false, instructions_following_check: false, - tool_use_quality_check: tuq_check, + toolUseQualityCheck: tuq_check, }; if (shouldError) { From 218e0668df53391154556ee01c33e06af783f107 Mon Sep 17 00:00:00 2001 From: amos Date: Thu, 8 Jan 2026 10:59:33 +0200 Subject: [PATCH 6/7] [FIRE-987] chore: bump up package version --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index e173754..cc65107 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "qualifire", - "version": "1.3.0", + "version": "1.4.0", "description": "Qualifire client SDK", "main": "./lib/index.js", "files": [ @@ -123,4 +123,4 @@ "zod": "^4.0.0" }, "packageManager": "pnpm@10.14.0" -} +} \ No newline at end of file From c5286bac84bd3481ca18726477ae94d236d212a3 Mon Sep 17 00:00:00 2001 From: amos Date: Thu, 8 Jan 2026 11:12:41 +0200 Subject: [PATCH 7/7] [FIRE-987] chore: add an empty line by the end of package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index cc65107..6185086 100644 --- a/package.json +++ b/package.json @@ -123,4 +123,4 @@ "zod": "^4.0.0" }, "packageManager": "pnpm@10.14.0" -} \ No newline at end of file +}