Skip to main content

Anthropic Claude Integration

Protect your Claude applications from prompt injection and security threats.

Installation

npm install Koreshield-sdk @anthropic-ai/sdk

Basic Integration

import { Koreshield } from 'Koreshield-sdk';
import Anthropic from '@anthropic-ai/sdk';

const Koreshield = new Koreshield({
apiKey: process.env.Koreshield_API_KEY,
});

const anthropic = new Anthropic({
apiKey: process.env.ANTHROPIC_API_KEY,
});

async function secureClaude(userMessage: string) {
// Scan input
const scan = await Koreshield.scan({
content: userMessage,
userId: 'user-123',
});

if (scan.threat_detected) {
throw new Error(`Threat: ${scan.threat_type}`);
}

// Call Claude
const message = await anthropic.messages.create({
model: 'claude-3-5-sonnet-20241022',
max_tokens: 1024,
messages: [{ role: 'user', content: userMessage }],
});

return message.content[0].text;
}

Proxy Mode

const anthropic = new Anthropic({
baseURL: 'https://api.Koreshield.com/v1/proxy/anthropic',
apiKey: process.env.ANTHROPIC_API_KEY,
defaultHeaders: {
'X-Koreshield-API-Key': process.env.Koreshield_API_KEY,
},
});

// Automatic protection
const message = await anthropic.messages.create({
model: 'claude-3-5-sonnet-20241022',
max_tokens: 1024,
messages: [{ role: 'user', content: userMessage }],
});

Streaming

async function secureStream(userMessage: string) {
const scan = await Koreshield.scan({ content: userMessage });

if (scan.threat_detected) {
throw new Error('Threat detected');
}

const stream = await anthropic.messages.stream({
model: 'claude-3-5-sonnet-20241022',
max_tokens: 1024,
messages: [{ role: 'user', content: userMessage }],
});

for await (const event of stream) {
if (event.type === 'content_block_delta' && event.delta.type === 'text_delta') {
process.stdout.write(event.delta.text);
}
}
}

Tool Use (Function Calling)

const tools: Anthropic.Tool[] = [
{
name: 'search_database',
description: 'Search database for information',
input_schema: {
type: 'object',
properties: {
query: { type: 'string', description: 'Search query' },
},
required: ['query'],
},
},
];

async function secureToolUse(userMessage: string) {
// Scan message
const scan = await Koreshield.scan({ content: userMessage });

if (scan.threat_detected) {
throw new Error('Threat detected');
}

const message = await anthropic.messages.create({
model: 'claude-3-5-sonnet-20241022',
max_tokens: 1024,
messages: [{ role: 'user', content: userMessage }],
tools,
});

// Check for tool use
const toolUse = message.content.find(
block => block.type === 'tool_use'
) as Anthropic.ToolUseBlock | undefined;

if (toolUse) {
// Scan tool inputs
const inputScan = await Koreshield.scan({
content: JSON.stringify(toolUse.input),
});

if (inputScan.threat_detected) {
throw new Error('Malicious tool input detected');
}

// Execute tool
const result = await executeSearchDatabase(toolUse.input.query);

// Continue conversation with tool result
const followUp = await anthropic.messages.create({
model: 'claude-3-5-sonnet-20241022',
max_tokens: 1024,
messages: [
{ role: 'user', content: userMessage },
{ role: 'assistant', content: message.content },
{
role: 'user',
content: [
{
type: 'tool_result',
tool_use_id: toolUse.id,
content: JSON.stringify(result),
},
],
},
],
tools,
});

return followUp.content[0].text;
}

return message.content[0].text;
}

Vision (Image Analysis)

import fs from 'fs';

async function secureVision(imageUrl: string, query: string) {
// Scan text query
const scan = await Koreshield.scan({ content: query });

if (scan.threat_detected) {
throw new Error('Threat detected in query');
}

const message = await anthropic.messages.create({
model: 'claude-3-5-sonnet-20241022',
max_tokens: 1024,
messages: [
{
role: 'user',
content: [
{
type: 'image',
source: {
type: 'url',
url: imageUrl,
},
},
{
type: 'text',
text: query,
},
],
},
],
});

return message.content[0].text;
}

Multi-Turn Conversations

interface ConversationMessage {
role: 'user' | 'assistant';
content: string;
}

async function secureConversation(
history: ConversationMessage[],
newMessage: string
) {
// Scan new message
const scan = await Koreshield.scan({ content: newMessage });

if (scan.threat_detected) {
throw new Error('Threat detected');
}

// Build message history
const messages = [
...history.map(msg => ({
role: msg.role as 'user' | 'assistant',
content: msg.content,
})),
{ role: 'user' as const, content: newMessage },
];

const response = await anthropic.messages.create({
model: 'claude-3-5-sonnet-20241022',
max_tokens: 1024,
messages,
});

return response.content[0].text;
}

System Prompts

async function secureWithSystemPrompt(
systemPrompt: string,
userMessage: string
) {
// Scan user message
const scan = await Koreshield.scan({ content: userMessage });

if (scan.threat_detected) {
throw new Error('Threat detected');
}

const message = await anthropic.messages.create({
model: 'claude-3-5-sonnet-20241022',
max_tokens: 1024,
system: systemPrompt,
messages: [{ role: 'user', content: userMessage }],
});

return message.content[0].text;
}

Temperature & Top-P

async function secureWithParams(
userMessage: string,
temperature: number = 0.7
) {
const scan = await Koreshield.scan({ content: userMessage });

if (scan.threat_detected) {
throw new Error('Threat detected');
}

const message = await anthropic.messages.create({
model: 'claude-3-5-sonnet-20241022',
max_tokens: 1024,
temperature,
top_p: 0.9,
messages: [{ role: 'user', content: userMessage }],
});

return message.content[0].text;
}

Next.js API Route

// app/api/chat/route.ts
import { NextRequest, NextResponse } from 'next/server';
import { Koreshield } from 'Koreshield-sdk';
import Anthropic from '@anthropic-ai/sdk';

const Koreshield = new Koreshield({
apiKey: process.env.Koreshield_API_KEY!,
});

const anthropic = new Anthropic({
apiKey: process.env.ANTHROPIC_API_KEY!,
});

export async function POST(req: NextRequest) {
try {
const { message } = await req.json();

// Scan with Koreshield
const scan = await Koreshield.scan({
content: message,
userId: req.headers.get('x-user-id') || undefined,
});

if (scan.threat_detected) {
return NextResponse.json(
{ error: 'Security threat detected' },
{ status: 400 }
);
}

// Call Claude
const response = await anthropic.messages.create({
model: 'claude-3-5-sonnet-20241022',
max_tokens: 1024,
messages: [{ role: 'user', content: message }],
});

return NextResponse.json({
response: response.content[0].text,
});
} catch (error) {
return NextResponse.json(
{ error: error.message },
{ status: 500 }
);
}
}

React Component

'use client';

import { useState } from 'react';

export function SecureChatComponent() {
const [message, setMessage] = useState('');
const [response, setResponse] = useState('');
const [loading, setLoading] = useState(false);

async function handleSubmit(e: React.FormEvent) {
e.preventDefault();
setLoading(true);

try {
const res = await fetch('/api/chat', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ message }),
});

const data = await res.json();

if (!res.ok) {
throw new Error(data.error);
}

setResponse(data.response);
setMessage('');
} catch (error) {
alert(error.message);
} finally {
setLoading(false);
}
}

return (
<form onSubmit={handleSubmit}>
<textarea
value={message}
onChange={e => setMessage(e.target.value)}
placeholder="Ask Claude..."
/>
<button type="submit" disabled={loading}>
{loading ? 'Processing...' : 'Send'}
</button>
{response && <div>{response}</div>}
</form>
);
}

Error Handling

async function robustClaude(message: string) {
try {
const scan = await Koreshield.scan({
content: message,
timeout: 5000,
});

if (scan.threat_detected) {
return {
error: 'Security threat detected',
threat: scan.threat_type,
};
}

const response = await anthropic.messages.create({
model: 'claude-3-5-sonnet-20241022',
max_tokens: 1024,
messages: [{ role: 'user', content: message }],
});

return { response: response.content[0].text };
} catch (error) {
if (error.status === 429) {
return { error: 'Rate limit exceeded' };
} else if (error.status === 529) {
return { error: 'Service overloaded' };
}

throw error;
}
}