different-ai

ai-sdk

@different-ai/ai-sdk
different-ai
152
21 forks
Updated 1/6/2026
View on GitHub

Use AI SDK 6 with OpenAI models - gpt-5.2 for complex tasks, gpt-5-mini for fast actions

Installation

$skills install @different-ai/ai-sdk
Claude Code
Cursor
Copilot
Codex
Antigravity

Details

Path.opencode/skill/ai-sdk/skill.md
Branchmain
Scoped Name@different-ai/ai-sdk

Usage

After installing, this skill will be available to your AI coding assistant.

Verify installation:

skills list

Skill Instructions


name: ai-sdk description: Use AI SDK 6 with OpenAI models - gpt-5.2 for complex tasks, gpt-5-mini for fast actions license: MIT compatibility: opencode metadata: audience: developers workflow: ai-integration

What I Do

  • Provide correct patterns for AI SDK 6 with OpenAI
  • Ensure consistent model usage across the codebase
  • Handle text generation, structured output, and tool calling

Model Selection

ModelUse CaseExamples
gpt-5.2Complex reasoning, multi-step tasksEmail agents, document analysis, KYB assistance
gpt-5-miniFast actions, simple extractionInvoice field extraction, quick classifications

Default to gpt-5.2 unless speed is critical and the task is simple.

Setup Pattern

Always create the OpenAI provider inline - no abstraction layer needed:

import { createOpenAI } from '@ai-sdk/openai';

const openai = createOpenAI({ apiKey: process.env.OPENAI_API_KEY || '' });

Core Patterns

1. Text Generation

import { generateText } from 'ai';
import { createOpenAI } from '@ai-sdk/openai';

const openai = createOpenAI({ apiKey: process.env.OPENAI_API_KEY || '' });

const result = await generateText({
  model: openai('gpt-5.2'),
  system: 'You are a helpful assistant.',
  messages: [{ role: 'user', content: 'Hello!' }],
});

console.log(result.text);

2. Structured Output (generateObject)

For extracting structured data with type safety:

import { generateObject } from 'ai';
import { createOpenAI } from '@ai-sdk/openai';
import { z } from 'zod';

const openai = createOpenAI({ apiKey: process.env.OPENAI_API_KEY || '' });

const schema = z.object({
  name: z.string(),
  email: z.string().email(),
  amount: z.number(),
});

const result = await generateObject({
  model: openai('gpt-5-mini'), // Use mini for simple extraction
  schema,
  messages: [
    { role: 'user', content: 'Extract: John Doe, john@example.com, $500' },
  ],
});

console.log(result.object); // Typed as { name: string, email: string, amount: number }

3. Tool Calling with Agentic Loops

For multi-step AI agents:

import { generateText, tool, stepCountIs } from 'ai';
import { createOpenAI } from '@ai-sdk/openai';
import { z } from 'zod';

const openai = createOpenAI({ apiKey: process.env.OPENAI_API_KEY || '' });

const result = await generateText({
  model: openai('gpt-5.2'), // Use full model for complex tool orchestration
  system: 'You are an assistant that can look up information.',
  messages: [{ role: 'user', content: 'What is the weather in Tokyo?' }],
  tools: {
    getWeather: tool({
      description: 'Get weather for a city',
      inputSchema: z.object({
        city: z.string().describe('City name'),
      }),
      execute: async ({ city }) => {
        // Your implementation
        return { temperature: 22, condition: 'sunny' };
      },
    }),
  },
  stopWhen: stepCountIs(5), // Allow up to 5 tool call steps
});

// Access tool calls made
const toolCalls = result.steps.flatMap(
  (step) => step.toolCalls?.map((tc) => tc.toolName) || [],
);

4. Streaming (for UI)

import { streamText } from 'ai';
import { createOpenAI } from '@ai-sdk/openai';

const openai = createOpenAI({ apiKey: process.env.OPENAI_API_KEY || '' });

const result = await streamText({
  model: openai('gpt-5.2'),
  messages: [{ role: 'user', content: 'Write a poem' }],
});

for await (const chunk of result.textStream) {
  process.stdout.write(chunk);
}

Schema Tips for AI SDK 6

When using generateObject, schemas must be carefully structured:

// GOOD: Use nullable() for optional fields in AI extraction
const schema = z.object({
  required: z.string(),
  optional: z.string().nullable(), // AI can return null
});

// GOOD: Describe fields for better extraction
const schema = z.object({
  amount: z.number().describe('Invoice amount as a positive number'),
  currency: z.string().describe('Currency code: USD, EUR, GBP'),
});

// BAD: Don't use optional() - use nullable() instead
const schema = z.object({
  field: z.string().optional(), // May cause issues with some models
});

Lazy Loading

For edge runtimes or to reduce bundle size, use dynamic imports:

// Lazily import to avoid bundling in edge runtimes if unused
const { createOpenAI } = await import('@ai-sdk/openai');
const { generateObject } = await import('ai');

const openai = createOpenAI({ apiKey: process.env.OPENAI_API_KEY || '' });

Error Handling

try {
  const result = await generateObject({
    model: openai('gpt-5-mini'),
    schema,
    messages,
  });
  return result.object;
} catch (error) {
  if (error instanceof Error) {
    console.error('[AI] Generation failed:', error.message);
  }
  // Optionally retry with simpler schema or different model
  throw error;
}

Existing Usage in Codebase

FileModelPurpose
src/app/api/ai-email/route.tsgpt-5.2Email agent with tools
src/server/routers/invoice-router.tsgpt-5-miniInvoice field extraction
src/app/api/kyb-assistant/route.tsgpt-5.2KYB form assistance
src/app/api/generate-shareholder-registry/route.tsgpt-5.2Document generation
src/server/routers/funding-source-router.tsgpt-5-miniQuick extraction

When to Use This Skill

  • Adding new AI-powered features
  • Implementing structured data extraction
  • Building AI agents with tool calling
  • Migrating from older AI SDK versions
  • Choosing between gpt-5.2 and gpt-5-mini