ai-integration
AI Integration Patterns
When to use: Any LLM integration, structured data extraction, prompt engineering, or AI-powered content analysis.
Overview
Battle-tested patterns for integrating AI models with reliable structured output parsing, multi-provider support, and comprehensive error handling.
Supported Providers
- ✅ OpenAI (GPT-4, GPT-3.5)
- ✅ Qwen (通义千问)
- ✅ Anthropic Claude
- ✅ Custom API endpoints
Key Capabilities
1. Structured Output Parsing
Problem: AI models return text, but you need JSON.
Solution: Multi-strategy parsing with automatic fallback:
function parseStructuredOutput(text) {
// Strategy 1: Direct JSON parse
try {
var parsed = JSON.parse(text);
if (parsed && typeof parsed === 'object') {
return parsed;
}
} catch (e) {}
// Strategy 2: Extract from markdown code block
var codeBlockMatch = text.match(/```(?:json)?\s*\n([\s\S]*?)\n```/);
if (codeBlockMatch) {
try {
return JSON.parse(codeBlockMatch[1]);
} catch (e) {}
}
// Strategy 3: Find JSON-like content
var jsonMatch = text.match(/\{[\s\S]*\}/);
if (jsonMatch) {
try {
return JSON.parse(jsonMatch[0]);
} catch (e) {}
}
throw new Error('Failed to parse structured output');
}
2. Prompt Template Building
Effective prompt structure:
function buildStructuredPrompt(content, schema) {
var prompt = 'Analyze the following content and extract information.\n\n';
prompt += 'Content:\n' + content + '\n\n';
prompt += 'Return ONLY a JSON object with this exact structure:\n';
prompt += JSON.stringify(schema, null, 2) + '\n\n';
prompt += 'Rules:\n';
prompt += '1. Return valid JSON only, no markdown\n';
prompt += '2. Follow the schema exactly\n';
prompt += '3. Use null for missing data\n';
return prompt;
}
3. Multi-Provider Request Handler
ES5 compatible HTTP request:
var https = require('https');
function callAI(provider, prompt, apiKey) {
var options = {
hostname: provider === 'openai' ? 'api.openai.com' : 'dashscope.aliyuncs.com',
path: provider === 'openai' ? '/v1/chat/completions' : '/api/v1/services/aigc/text-generation/generation',
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + apiKey
}
};
var body = provider === 'openai'
? JSON.stringify({
model: 'gpt-4',
messages: [{role: 'user', content: prompt}],
temperature: 0.1
})
: JSON.stringify({
model: 'qwen-max',
input: {prompt: prompt},
parameters: {temperature: 0.1}
});
return new Promise(function(resolve, reject) {
var req = https.request(options, function(res) {
var data = '';
res.on('data', function(chunk) { data += chunk; });
res.on('end', function() {
if (res.statusCode !== 200) {
reject(new Error('API error: ' + res.statusCode));
} else {
resolve(JSON.parse(data));
}
});
});
req.on('error', reject);
req.write(body);
req.end();
});
}
4. Schema Validation
function validateSchema(data, schema) {
var errors = [];
for (var key in schema) {
if (!data.hasOwnProperty(key)) {
errors.push('Missing field: ' + key);
} else if (typeof data[key] !== typeof schema[key]) {
errors.push('Type mismatch for ' + key);
}
}
if (errors.length > 0) {
throw new Error('Schema validation failed: ' + errors.join(', '));
}
return true;
}
Complete Workflow Pattern
Input Text
↓
[Build Prompt]
- Add schema requirements
- Add formatting rules
- Add examples (few-shot)
↓
[Call AI API]
- Select provider (OpenAI/Qwen/Claude)
- Handle rate limits
- Retry on errors
↓
[Parse Response]
- Try direct JSON parse
- Extract from code blocks
- Find JSON patterns
↓
[Validate Schema]
- Check required fields
- Verify data types
- Handle missing data
↓
Structured Output
n8n Implementation
Basic Structure
// Code node 1: Build Prompt
var schema = {
title: '',
summary: '',
tags: [],
category: ''
};
var prompt = buildStructuredPrompt($input.item.json.content, schema);
return {
json: Object.assign({}, $input.item.json, {
prompt: prompt,
schema: schema
})
};
// Code node 2: Call AI
var apiKey = process.env.OPENAI_API_KEY;
var response = await callAI('openai', $input.item.json.prompt, apiKey);
return {
json: Object.assign({}, $input.item.json, {
aiResponse: response
})
};
// Code node 3: Parse & Validate
var text = $input.item.json.aiResponse.choices[0].message.content;
var parsed = parseStructuredOutput(text);
validateSchema(parsed, $input.item.json.schema);
return {
json: Object.assign({}, $input.item.json, parsed)
};
Best Practices
- Low Temperature: Use 0.1-0.3 for structured output
- Explicit Instructions: "Return ONLY JSON, no markdown"
- Schema in Prompt: Show exact structure expected
- Multi-Strategy Parsing: Try multiple extraction methods
- Validate Always: Check schema before using data
- Error Handling: Retry on parse failures with adjusted prompt
- Few-Shot Examples: Include 1-2 examples for complex schemas
Common Patterns
Pattern 1: Content Analysis
Text → AI Analysis → Structured Data (title, summary, tags)
Pattern 2: Batch Processing
Multiple Items → Aggregate → Single AI Call → Split Results
Pattern 3: Multi-Step Analysis
Extract → Classify → Enrich → Validate → Store
Troubleshooting
AI returns markdown instead of JSON
// Add to prompt:
"CRITICAL: Return raw JSON only. No markdown formatting. No code blocks."
Inconsistent field names
// Add normalization:
var normalized = {
title: data.title || data.Title || data.heading || '',
// ... other fields
};
Rate limiting
// Add delay between requests
await new Promise(function(resolve) {
setTimeout(resolve, 1000); // 1 second
});
Integration with Other Skills
- video-processing: Analyze video transcripts
- notion-operations: Save structured analysis to Notion
- error-handling: Retry AI calls on failures
- debugging: Validate AI output quality
Full Code and Documentation
Complete implementations:
/mnt/d/work/n8n_agent/n8n-skills/ai-integration/
Files:
structured-output-handler.js- Complete parsing solutionREADME.md- Detailed patterns and examples- Prompt templates and schemas
More from aixier/n8n-automation-hub
n8n-skills-catalog
Use to find the right n8n skill for a task, browse available skills, discover workflow patterns, or get an overview of all n8n automation capabilities
10oauth-automation
Use when OAuth tokens expire frequently, need automatic token refresh, YouTube/Google API integration, or when workflows fail due to expired credentials
2n8n-best-practices
Use when encountering n8n workflow issues, Code node errors, HTTP requests failing, data flow problems, environment variables not working, JSON parsing errors, or need n8n development patterns and debugging strategies
2video-processing
Use when processing YouTube videos, extracting subtitles, parsing VTT files, analyzing video content, generating timestamps, or creating video summaries
1anti-scraping
Use when need to bypass Cloudflare protection, scrape websites with anti-bot measures, render JavaScript pages, or simulate real browser behavior for web scraping
1notion-operations
Use when working with Notion databases, creating/updating pages, querying data, syncing between systems, or building knowledge management workflows
1