Назад к урокам

Категории проблем

Нужна помощь?

Не нашли решение своей проблемы?

Документация

Устранение неполадок

Решения типичных проблем при работе с AI API и интеграциями. Найдите быстрые ответы на часто возникающие вопросы.

API проблемы

1

Безопасность

2

Производительность

1

Деплой

1

КритичноAPI

API ключ не работает

Симптомы

  • 401 Unauthorized
  • Authentication failed
  • Invalid API token

Возможные причины

  • Неверный API ключ
  • Истекший токен
  • Неправильная конфигурация переменных окружения
  • Ключ не активирован

Быстрое решение

Проверка API ключа

Подробные решения

Проверка API ключа

Тестирование подключения к API

// Проверьте ваш API ключ в Replicate
const replicate = new Replicate({
  auth: process.env.REPLICATE_API_TOKEN
})

// Тест подключения
try {
  const models = await replicate.models.list()
  console.log('API ключ работает:', models.results.length > 0)
} catch (error) {
  console.error('Ошибка API:', error.message)
}
Проверка переменных окружения

Убедитесь что переменные окружения загружены

// .env.local
REPLICATE_API_TOKEN=r8_***your_token_here***

// Проверка в коде
if (!process.env.REPLICATE_API_TOKEN) {
  throw new Error('REPLICATE_API_TOKEN не установлен')
}

console.log('API Token первые символы:',
  process.env.REPLICATE_API_TOKEN.substring(0, 5))
СреднеМодели

Модель не найдена или недоступна

Симптомы

  • Model not found
  • 404 error
  • Version not available

Возможные причины

  • Неверный ID модели
  • Устаревшая версия модели
  • Модель была удалена автором
  • Приватная модель без доступа

Быстрое решение

Проверка существования модели

Подробные решения

Проверка существования модели

Проверьте доступность модели перед использованием

// Получение информации о модели
const getModelInfo = async (owner, name) => {
  try {
    const model = await replicate.models.get(owner, name)
    console.log('Модель найдена:', model)
    console.log('Доступные версии:', model.latest_version)
    return model
  } catch (error) {
    console.error('Модель не найдена:', error.message)
    return null
  }
}

// Пример использования
await getModelInfo('stability-ai', 'sdxl')
Получение списка доступных моделей

Получите актуальный список доступных моделей

// Получение списка публичных моделей
const listAvailableModels = async () => {
  try {
    const models = await replicate.models.list()
    return models.results.map(model => ({
      id: `${model.owner}/${model.name}`,
      description: model.description,
      latest_version: model.latest_version?.id
    }))
  } catch (error) {
    console.error('Ошибка получения моделей:', error)
    return []
  }
}
КритичноWebhooks

Webhooks не работают

Симптомы

  • Webhook validation failed
  • No webhook notifications
  • Invalid signature

Возможные причины

  • Неверный webhook secret
  • Неправильная валидация подписи
  • Недоступный webhook URL
  • Неверный формат ответа

Быстрое решение

Отладка webhook валидации

Подробные решения

Отладка webhook валидации

Добавьте подробное логирование для отладки webhooks

// app/api/replicate/webhook/route.ts
import { validateWebhook } from 'replicate'

export async function POST(request) {
  const secret = process.env.REPLICATE_WEBHOOK_SIGNING_SECRET

  // Логирование для отладки
  console.log('Webhook secret exists:', !!secret)
  console.log('Request headers:', Object.fromEntries(request.headers.entries()))

  if (!secret) {
    console.warn('Webhook secret не настроен')
    const body = await request.json()
    console.log('Webhook body (без валидации):', body)
    return Response.json({ detail: 'Webhook получен без валидации' })
  }

  try {
    const isValid = await validateWebhook(request.clone(), secret)
    console.log('Webhook валидация:', isValid ? 'успешна' : 'провалена')

    if (!isValid) {
      return Response.json({ error: 'Invalid signature' }, { status: 401 })
    }

    const body = await request.json()
    console.log('Валидный webhook:', body)

    return Response.json({ success: true })
  } catch (error) {
    console.error('Ошибка валидации webhook:', error)
    return Response.json({ error: 'Validation error' }, { status: 500 })
  }
}
Тестирование webhook URL

Убедитесь что ваш webhook URL доступен извне

// Тест доступности webhook URL
const testWebhookUrl = async (url) => {
  try {
    const response = await fetch(url, {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'User-Agent': 'Replicate-Webhook/1.0'
      },
      body: JSON.stringify({
        test: true,
        timestamp: new Date().toISOString()
      })
    })

    console.log('Webhook URL статус:', response.status)
    console.log('Webhook URL доступен:', response.ok)
    return response.ok
  } catch (error) {
    console.error('Webhook URL недоступен:', error.message)
    return false
  }
}

// Проверка перед созданием предсказания
const webhookUrl = `${process.env.NEXTAUTH_URL}/api/replicate/webhook`
await testWebhookUrl(webhookUrl)
СреднеПроизводительность

Медленная работа или таймауты

Симптомы

  • Request timeout
  • Slow response times
  • Queue delays

Возможные причины

  • Высокая нагрузка на модель
  • Большие входные данные
  • Сетевые задержки
  • Неоптимальные настройки

Быстрое решение

Мониторинг производительности

Подробные решения

Мониторинг производительности

Отслеживайте время выполнения операций

// Добавление таймингов к запросам
const trackPerformance = async (operation, fn) => {
  const start = Date.now()
  try {
    const result = await fn()
    const duration = Date.now() - start
    console.log(`${operation} завершена за ${duration}мс`)
    return result
  } catch (error) {
    const duration = Date.now() - start
    console.error(`${operation} провалена за ${duration}мс:, error.message`)
    throw error
  }
}

// Использование
const prediction = await trackPerformance('Создание предсказания', () =>
  replicate.predictions.create({
    version: modelVersion,
    input: optimizedInput
  })
)
Оптимизация входных данных

Оптимизируйте входные данные для ускорения обработки

// Оптимизация изображений перед отправкой
const optimizeImageInput = (imageUrl, maxSize = 1024) => {
  // Для локальных изображений
  if (typeof window !== 'undefined') {
    return new Promise((resolve) => {
      const img = new Image()
      img.onload = () => {
        const canvas = document.createElement('canvas')
        const ctx = canvas.getContext('2d')

        // Масштабирование
        const scale = Math.min(maxSize / img.width, maxSize / img.height)
        canvas.width = img.width * scale
        canvas.height = img.height * scale

        ctx.drawImage(img, 0, 0, canvas.width, canvas.height)
        resolve(canvas.toDataURL('image/jpeg', 0.8))
      }
      img.src = imageUrl
    })
  }

  return imageUrl
}

// Пример использования
const optimizedImage = await optimizeImageInput(originalImage)
КритичноАутентификация

Проблемы с аутентификацией пользователей

Симптомы

  • Session expired
  • Login failed
  • User not authenticated

Возможные причины

  • Некорректная настройка NextAuth
  • Проблемы с базой данных сессий
  • Неверная конфигурация CORS
  • Истекшие сессии

Быстрое решение

Отладка NextAuth сессий

Подробные решения

Отладка NextAuth сессий

Включите подробное логирование NextAuth

// Добавление отладки в NextAuth
// pages/api/auth/[...nextauth].ts или app/api/auth/[...nextauth]/route.ts
export default NextAuth({
  debug: process.env.NODE_ENV === 'development',
  logger: {
    error(code, metadata) {
      console.error('NextAuth Error:', code, metadata)
    },
    warn(code) {
      console.warn('NextAuth Warning:', code)
    },
    debug(code, metadata) {
      console.log('NextAuth Debug:', code, metadata)
    }
  },
  callbacks: {
    async session({ session, token }) {
      console.log('Session callback:', { session, token })
      return session
    },
    async jwt({ token, user }) {
      console.log('JWT callback:', { token, user })
      return token
    }
  }
})
Проверка сессии на клиенте

Создайте хук для отладки аутентификации

// hooks/useAuthDebug.ts
import { useSession } from 'next-auth/react'
import { useEffect } from 'react'

export function useAuthDebug() {
  const { data: session, status } = useSession()

  useEffect(() => {
    console.log('Auth status:', status)
    console.log('Session data:', session)

    if (status === 'loading') {
      console.log('Загрузка сессии...')
    } else if (status === 'unauthenticated') {
      console.log('Пользователь не аутентифицирован')
    } else if (status === 'authenticated') {
      console.log('Пользователь аутентифицирован:', session?.user?.email)
    }
  }, [session, status])

  return { session, status }
}
СреднеДеплой

Проблемы с деплоем в продакшен

Симптомы

  • Build failures
  • Environment variables missing
  • CORS errors

Возможные причины

  • Неверные переменные окружения
  • Проблемы с CORS политикой
  • Различия между dev и prod
  • Неправильная конфигурация домена

Быстрое решение

Проверка переменных окружения

Подробные решения

Проверка переменных окружения

Проверяйте переменные окружения при сборке

// scripts/check-env.js
const requiredEnvVars = [
  'REPLICATE_API_TOKEN',
  'NEXTAUTH_SECRET',
  'NEXTAUTH_URL',
  'DATABASE_URL',
  'REPLICATE_WEBHOOK_SIGNING_SECRET'
]

const missingVars = requiredEnvVars.filter(
  varName => !process.env[varName]
)

if (missingVars.length > 0) {
  console.error('Отсутствуют переменные окружения:')
  missingVars.forEach(varName => {
    console.error(`- ${varName}`)
  })
  process.exit(1)
} else {
  console.log('Все переменные окружения настроены ✓')
}

// package.json
// "scripts": {
//   "build": "node scripts/check-env.js && next build"
// }
Настройка CORS для продакшена

Настройте CORS политику для продакшена

// middleware.ts
import { NextResponse } from 'next/server'
import type { NextRequest } from 'next/server'

export function middleware(request: NextRequest) {
  // Разрешенные домены для продакшена
  const allowedOrigins = [
    'https://your-domain.com',
    'https://www.your-domain.com'
  ]

  const origin = request.headers.get('origin')

  if (request.nextUrl.pathname.startsWith('/api/')) {
    const response = NextResponse.next()

    if (origin && allowedOrigins.includes(origin)) {
      response.headers.set('Access-Control-Allow-Origin', origin)
    }

    response.headers.set('Access-Control-Allow-Methods', 'GET,POST,PUT,DELETE,OPTIONS')
    response.headers.set('Access-Control-Allow-Headers', 'Content-Type,Authorization')

    if (request.method === 'OPTIONS') {
      return new Response(null, { status: 200, headers: response.headers })
    }

    return response
  }

  return NextResponse.next()
}