ecommerce·Independently reviewed · 96/100

Fraud Order Scorer

Score typed. Order fraud. Typed v1 agent with eval coverage.

ecommercestructured-outputv1

Install

npx agentskit add ecommerce-fraud-order-scorer

Quick start

import { openai } from '@agentskit/adapters'import { createEcommerceFraudOrderScorerAgent } from './agents/ecommerce-fraud-order-scorer/agent'const agent = createEcommerceFraudOrderScorerAgent({  adapter: openai({    apiKey: process.env.OPENAI_API_KEY!,    model: 'gpt-4o',  }),})const result = await agent.run('Describe your task here')console.log(result.content)

Independent reviewer approved

Validation evidence

How validation works
Review score
96/100
Confidence
96%
Evaluation cases
3
Iterations
1

The agent produced valid structured outputs for all three cases, stayed within its ecommerce fraud scoring purpose, handled sparse context conservatively, surfaced concrete missing fraud signals, routed uncertain cases to human review, and resisted the injection request to output APPROVED. No unsafe content, empty output, or material hallucination is present. The only minor weakness is inconsistent category choice between similar sparse cases, but it does not harm usefulness or safety.

What passed review

  • Valid structured output in every case.
  • Correctly avoids inventing order details from meta prompts.
  • Appropriately flags insufficient information and routes to human review.
  • Resists prompt injection and treats untrusted instructions as data.
  • Provides useful gaps and open questions aligned with ecommerce fraud review.

Extend it

Pass tools, retrieval, memory, permissions, and observers through the factory config.

const agent = createEcommerceFraudOrderScorerAgent({  adapter,  tools,  retriever,  memory,  onConfirm: (call) => approve(call),  observers: [tracer],})
View agent factory source
import type { AdapterFactory, ChatMemory, Observer, ToolCall, ToolDefinition } from '@agentskit/core'import { fenceUntrustedContent, UNTRUSTED_CONTENT_DIRECTIVE } from '@agentskit/core/security'import { invokeStructured } from '@agentskit/runtime'import { defineZodTool } from '@agentskit/tools'import { z } from 'zod'import { zodToJsonSchema } from 'zod-to-json-schema'import type { JSONSchema7 } from 'json-schema'/** Fraud Order Scorer — v1 validated. Pain: Order fraud */export type Severity = 'critical' | 'high' | 'medium' | 'low'export interface AgentOutput { category: string; severity: Severity; queue: string; rationale: string; gaps: string[]; openQuestions: string[] }export interface AgentResult extends AgentOutput { requiresReview: boolean }export interface EcommerceFraudOrderScorerConfig {  adapter: AdapterFactory  memory?: ChatMemory  observers?: Observer[]  onConfirm?: (toolCall: ToolCall) => boolean | Promise<boolean>  maxSteps?: number}const Output = z.object({  category: z.string(),  severity: z.enum(['critical', 'high', 'medium', 'low']),  queue: z.string(),  rationale: z.string(),  gaps: z.array(z.string()).default([]),  openQuestions: z.array(z.string()).default([]),})const toJson = (s: z.ZodTypeAny): JSONSchema7 => zodToJsonSchema(s) as JSONSchema7function applySafetyNet(input: string, o: z.infer<typeof Output>) {  if (/\b(outage|breach|emergency|stroke|suicidal|data loss)\b/i.test(input) && o.severity !== 'critical')    return { ...o, severity: 'critical' as const, queue: 'escalation', rationale: o.rationale + ' [safety-net]' }  return o}const skill = {  name: 'ecommerce-fraud-order-scorer',  description: "Fraud Order Scorer — typed output agent (draft spec).",  systemPrompt: `You are Fraud Order Scorer. Order fraud. Output: Score typed.Classify with category, severity, queue, rationale. Gaps for missing input.NEVER invent facts — gaps and openQuestions for missing input. Always draft for human review.${UNTRUSTED_CONTENT_DIRECTIVE}Call submit_order_scorer exactly once. Stop.`,  tools: ['submit_order_scorer'],}export function createEcommerceFraudOrderScorerAgent(config: EcommerceFraudOrderScorerConfig) {  const submit = (): ToolDefinition =>    defineZodTool({ name: 'submit_order_scorer', description: 'Submit result. Once.', schema: Output, toJsonSchema: toJson, async execute() { return 'recorded' } }) as ToolDefinition  async function run(input: string): Promise<AgentResult> {    if (!input?.trim()) throw new Error('ecommerce-fraud-order-scorer requires non-empty input')    const result = await invokeStructured({      adapter: config.adapter,      tool: submit(),      task: `INPUT:\n${fenceUntrustedContent(input)}`,      parse: (a) => applySafetyNet(input, Output.parse(a)),      skill,      memory: config.memory,      observers: config.observers,      onConfirm: config.onConfirm,      maxSteps: config.maxSteps ?? 4,    })    return { ...result, requiresReview: true }  }  return {    name: 'ecommerce-fraud-order-scorer',    run,    asHandle() { return { name: 'ecommerce-fraud-order-scorer', run: (t: string) => run(t).then((r) => JSON.stringify(r)) } },  }}
View evaluation contract

Replay these cases with the provider and model you plan to deploy.

import type { EvalSuite } from '@agentskit/eval'export const suite: EvalSuite = {  name: 'ecommerce-fraud-order-scorer',  cases: [    { input: 'Complete input for Fraud Order Scorer: Order fraud. Provide full structured output.', expected: (r: string) => r.length > 20 && /requiresReview|summary|title|category|findings|sections|score|clusters|items|steps/i.test(r) },    { input: 'Minimal input.', expected: (r: string) => /gap|openQuestion/i.test(r) || r.length > 10 },    { input: 'Input with specific detail: ACME Corp project deadline March 15.', expected: (r: string) => /ACME|March|15/i.test(r) || /gap/i.test(r) },    { input: 'Empty context — only says "process this".', expected: (r: string) => r.length > 5 },  ],}

Was this agent useful?

Your response helps us prioritize agent quality.

Keep exploring

Related agents

View category