Back to catalog

ai-integration

Monorepo for n8n workflow automation with Claude Code integration - 7 skills + 14+ code modules + Python agent

  • Category: discovered
  • Tags: github, community
  • Version: 1.0.0
  • Author: walid
  • Downloads: 0
  • Updated: 2025-11-22

Download the latest version (v1.0.0) from this page.

SKILL.md

---
name: ai-integration
description: Use when integrating LLMs (OpenAI, Qwen, Claude), extracting structured data from text, building prompts, parsing AI responses, handling JSON output, or implementing multi-step AI workflows
---

# 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:

```javascript
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**:
```javascript
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**:
```javascript
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

```javascript
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
```javascript
// 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
  })
};
```

```javascript
// 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
  })
};
```

```javascript
// 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

1. **Low Temperature**: Use 0.1-0.3 for structured output
2. **Explicit Instructions**: "Return ONLY JSON, no markdown"
3. **Schema in Prompt**: Show exact structure expected
4. **Multi-Strategy Parsing**: Try multiple extraction methods
5. **Validate Always**: Check schema before using data
6. **Error Handling**: Retry on parse failures with adjusted prompt
7. **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
```javascript
// Add to prompt:
"CRITICAL: Return raw JSON only. No markdown formatting. No code blocks."
```

### Inconsistent field names
```javascript
// Add normalization:
var normalized = {
  title: data.title || data.Title || data.heading || '',
  // ... other fields
};
```

### Rate limiting
```javascript
// 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 solution
- `README.md` - Detailed patterns and examples
- Prompt templates and schemas