Skip to content

Node.js Integration

Add content moderation to any Node.js application.

Installation

bash
npm install @nextauralabs/vettly-sdk

Quick Start

js
const { ModerationClient } = require('@nextauralabs/vettly-sdk')

const vettly = new ModerationClient({
  apiKey: process.env.VETTLY_API_KEY
})

async function moderateMessage(content) {
  const result = await vettly.check({
    content,
    contentType: 'text'
  })

  if (result.action === 'block') {
    console.log('Blocked:', result.categories)
    return false
  }

  return true
}

// Usage
const isAllowed = await moderateMessage('Hello world!')

ES Modules

js
import { ModerationClient } from '@nextauralabs/vettly-sdk'

const vettly = new ModerationClient({
  apiKey: process.env.VETTLY_API_KEY
})

const result = await vettly.check({
  content: 'Check this message',
  contentType: 'text'
})

TypeScript

ts
import { ModerationClient, ModerationResult } from '@nextauralabs/vettly-sdk'

const vettly = new ModerationClient({
  apiKey: process.env.VETTLY_API_KEY!
})

async function moderate(content: string): Promise<ModerationResult> {
  return vettly.check({
    content,
    contentType: 'text'
  })
}

HTTP Server Example

js
const http = require('http')
const { ModerationClient } = require('@nextauralabs/vettly-sdk')

const vettly = new ModerationClient({
  apiKey: process.env.VETTLY_API_KEY
})

const server = http.createServer(async (req, res) => {
  if (req.method === 'POST' && req.url === '/api/comments') {
    let body = ''
    req.on('data', chunk => body += chunk)
    req.on('end', async () => {
      const { content } = JSON.parse(body)

      const result = await vettly.check({
        content,
        contentType: 'text'
      })

      if (result.action === 'block') {
        res.writeHead(403, { 'Content-Type': 'application/json' })
        res.end(JSON.stringify({ error: 'Content blocked' }))
        return
      }

      res.writeHead(200, { 'Content-Type': 'application/json' })
      res.end(JSON.stringify({ success: true }))
    })
  }
})

server.listen(3000)

Image Moderation

js
const fs = require('fs')
const { ModerationClient } = require('@nextauralabs/vettly-sdk')

const vettly = new ModerationClient({
  apiKey: process.env.VETTLY_API_KEY
})

async function moderateImage(filePath) {
  const imageBuffer = fs.readFileSync(filePath)
  const base64 = imageBuffer.toString('base64')

  const result = await vettly.check({
    content: base64,
    contentType: 'image'
  })

  return result
}

// Usage
const result = await moderateImage('./uploads/image.jpg')
if (result.action === 'block') {
  console.log('Image blocked')
}

Video Moderation

js
const fs = require('fs')
const { ModerationClient } = require('@nextauralabs/vettly-sdk')

const vettly = new ModerationClient({
  apiKey: process.env.VETTLY_API_KEY
})

async function moderateVideo(filePath) {
  const videoBuffer = fs.readFileSync(filePath)
  const base64 = videoBuffer.toString('base64')

  const result = await vettly.check({
    content: base64,
    contentType: 'video'
  })

  return result
}

Batch Processing

js
async function moderateBatch(messages) {
  const results = await Promise.all(
    messages.map(content =>
      vettly.check({ content, contentType: 'text' })
    )
  )

  return results.map((result, i) => ({
    content: messages[i],
    action: result.action,
    blocked: result.action === 'block'
  }))
}

// Usage
const messages = ['message 1', 'message 2', 'message 3']
const results = await moderateBatch(messages)
console.log(results)

Custom Policies

js
const result = await vettly.check({
  content: 'Message to check',
  contentType: 'text',
  policyId: 'strict' // Your custom policy
})

Error Handling

js
const { ModerationClient, VettlyError } = require('@nextauralabs/vettly-sdk')

try {
  const result = await vettly.check({
    content: 'Hello',
    contentType: 'text'
  })
} catch (error) {
  if (error instanceof VettlyError) {
    console.error('Vettly error:', error.message)
    // Handle gracefully
  } else {
    throw error
  }
}

Response Structure

js
const result = await vettly.check({
  content: 'Hello world',
  contentType: 'text'
})

console.log(result.action)      // 'allow' | 'block' | 'flag' | 'warn'
console.log(result.decisionId)  // 'dec_abc123...'
console.log(result.categories)  // Array of category scores

// Categories structure
result.categories.forEach(cat => {
  console.log(cat.category)   // 'hate', 'harassment', etc.
  console.log(cat.score)      // 0.0 to 1.0
  console.log(cat.triggered)  // true/false
})

CLI Tool

For testing and batch processing:

bash
# Check a single message
npx vettly check "Hello world"

# Check from file
npx vettly check --file messages.txt

# With custom policy
npx vettly check "Message" --policy strict

Environment Variables

bash
export VETTLY_API_KEY=vettly_your_api_key_here

Next Steps