diff --git a/src/__tests__/unit/checks/moderation-secret-keys.test.ts b/src/__tests__/unit/checks/moderation-secret-keys.test.ts index 96c575b..934caa1 100644 --- a/src/__tests__/unit/checks/moderation-secret-keys.test.ts +++ b/src/__tests__/unit/checks/moderation-secret-keys.test.ts @@ -65,7 +65,23 @@ describe('moderation guardrail', () => { const result = await moderationCheck({}, 'safe text', ModerationConfig.parse({})); expect(result.tripwireTriggered).toBe(false); - expect(result.info?.error).toBe('Moderation API call failed'); + expect(result.executionFailed).toBe(true); + expect(result.originalException).toBeDefined(); + expect(result.info?.error).toContain('network down'); + }); + + it('returns executionFailed for API key errors to support raiseGuardrailErrors', async () => { + const apiKeyError = new Error( + 'Incorrect API key provided: sk-invalid. You can find your API key at https://platform.openai.com/account/api-keys.' + ); + createMock.mockRejectedValue(apiKeyError); + + const result = await moderationCheck({}, 'test text', ModerationConfig.parse({})); + + expect(result.tripwireTriggered).toBe(false); + expect(result.executionFailed).toBe(true); + expect(result.originalException).toBe(apiKeyError); + expect(result.info?.error).toContain('Incorrect API key'); }); it('uses context client when available', async () => { diff --git a/src/checks/moderation.ts b/src/checks/moderation.ts index 00661ca..f413f98 100644 --- a/src/checks/moderation.ts +++ b/src/checks/moderation.ts @@ -89,6 +89,17 @@ function isNotFoundError(error: unknown): boolean { return !!(error && typeof error === 'object' && 'status' in error && error.status === 404); } +/** + * Ensure a value is an Error instance. + * Converts non-Error values to Error instances with a string representation. + * + * @param error The error value to convert + * @returns An Error instance + */ +function ensureError(error: unknown): Error { + return error instanceof Error ? error : new Error(String(error)); +} + /** * Call the OpenAI moderation API. * @@ -144,8 +155,9 @@ export const moderationCheck: CheckFn; const candidate = contextObj.guardrailLlm; - if (candidate && candidate instanceof OpenAI) { - client = candidate; + // Just use whatever is provided, let the try-catch handle validation + if (candidate) { + client = candidate as OpenAI; } } @@ -162,25 +174,32 @@ export const moderationCheck: CheckFn