OpenRouter

OpenRouter와 Lingo.dev 컴파일러를 이용한 AI 번역

OpenRouter란 무엇인가요?

OpenRouter는 다양한 공급업체의 AI 모델에 통합 API를 통해 접근할 수 있게 해주는 플랫폼으로, 개발자가 쉽게 비교, 전환 및 요청 라우팅을 할 수 있게 합니다. 유연성, 투명성, 그리고 사용자가 어떤 모델을 사용하고 어떻게 요금이 청구되는지에 대한 더 많은 제어권을 제공하는 데 중점을 둡니다.

API 키 설정하기

OpenRouter는 Lingo.dev Compiler에서 오는 요청을 인증하기 위해 API 키가 필요합니다. 작업 흐름에 가장 적합한 설정 방법을 선택하세요:

옵션 1: 환경 변수 (터미널)

파일을 수정하지 않고 빠른 실험과 테스트에 적합합니다.

터미널 세션에서 직접 키를 설정하세요:

export OPENROUTER_API_KEY="your-api-key-here"

이 키는 터미널 창을 닫을 때까지만 사용 가능합니다.

옵션 2: 프로젝트 구성 (.env)

프로젝트별 구성과 각 프로젝트마다 다른 자격 증명을 사용할 수 있는 팀 환경에 적합합니다.

프로젝트 루트에 .env 파일을 생성하세요:

touch .env

파일에 다음 줄을 추가하세요:

OPENROUTER_API_KEY="your-api-key-here"

Lingo.dev Compiler는 다음 우선순위로 환경 파일을 확인합니다:

  1. .env.development (최우선순위)
  2. .env.local
  3. .env (최하위 우선순위)

우선순위가 높은 파일의 값이 우선순위가 낮은 파일의 값을 재정의합니다.

옵션 3: 전역 구성 (사용자 설정)

모든 프로젝트에서 동일한 API 키를 사용하려는 개별 개발자에게 적합합니다.

홈 디렉토리에 구성 파일을 생성하세요:

touch ~/.lingodotdevrc

파일에 다음 내용을 추가하세요:

[llm]
openrouterApiKey="your-api-key-here"

이 구성은 기기의 모든 터미널 세션과 프로젝트에서 유지됩니다.

구성 우선순위

여러 구성 방법이 사용될 때, Lingo.dev Compiler는 다음 순서로 API 키를 확인합니다:

  1. 환경 변수 (최우선순위)
  2. 프로젝트 .env 파일 (자체 우선순위 순서에 따라)
  3. 사용자 구성 파일 ~/.lingodotdevrc (최하위 우선순위)

발견된 첫 번째 유효한 API 키가 사용됩니다.

OpenRouter 사용하기

OpenRouter를 활성화하려면 컴파일러 옵션에서 models 속성을 설정하세요:

import react from "@vitejs/plugin-react";
import lingoCompiler from "lingo.dev/compiler";
import { type UserConfig } from "vite";

// https://vite.dev/config/
const viteConfig: UserConfig = {
  plugins: [react()],
};

const withLingo = lingoCompiler.vite({
  sourceRoot: "src",
  lingoDir: "lingo",
  sourceLocale: "en",
  targetLocales: ["es", "fr", "de", "ja"],
  rsc: false,
  useDirective: false,
  debug: false,
  models: {
    "*:*": "openrouter:anthropic/claude-3.5-sonnet",
  },
});

export default withLingo(viteConfig);

이 속성은 다음과 같은 객체를 받습니다:

  • 키는 소스 로케일과 대상 로케일의 쌍이며, *는 모든 로케일을 나타냅니다
  • 값은 모델 식별자입니다(예: openrouter:anthropic/claude-3.5-sonnet)

OpenRouter를 사용하여 다음과 같은 번역을 수행할 수 있습니다:

  • 모든 로케일 간 번역
  • 특정 소스 로케일에서 번역
  • 특정 대상 로케일로 번역
  • 특정 소스와 대상 로케일 간 번역

모든 로케일 번역하기

와일드카드 패턴 *:*을 사용하여 모든 번역 쌍에 동일한 OpenRouter 모델을 적용할 수 있습니다:

const withLingo = lingoCompiler.vite({
  sourceRoot: "src",
  lingoDir: "lingo",
  sourceLocale: "en",
  targetLocales: ["es", "fr", "de", "ja", "pt", "zh"],
  models: {
    // 모든 번역 쌍에 Claude 3.5 Sonnet 사용
    "*:*": "openrouter:anthropic/claude-3.5-sonnet",
  },
});

특정 소스 로케일에서 번역하기

특정 소스 로케일과 와일드카드 대상을 사용하여 해당 소스에서 모든 번역에 모델을 적용할 수 있습니다:

const withLingo = lingoCompiler.vite({
  sourceRoot: "src",
  lingoDir: "lingo",
  sourceLocale: "en",
  targetLocales: ["es", "fr", "de", "ja", "pt", "zh"],
  models: {
    // 영어에서 모든 번역에 Claude 3.5 Sonnet 사용
    "en:*": "openrouter:anthropic/claude-3.5-sonnet",
    // 스페인어에서 모든 언어로의 번역에 GPT-4 Turbo 사용
    "es:*": "openrouter:openai/gpt-4-turbo",
    // 다른 소스 언어에 대한 폴백
    "*:*": "openrouter:meta-llama/llama-3.1-70b",
  },
});

특정 대상 로케일로 번역하기

와일드카드 소스와 특정 대상 로케일을 사용하여 해당 대상에 대한 모든 번역에 모델을 적용하세요:

const withLingo = lingoCompiler.vite({
  sourceRoot: "src",
  lingoDir: "lingo",
  sourceLocale: "en",
  targetLocales: ["es", "fr", "de", "ja", "pt", "zh"],
  models: {
    // 일본어 번역에 특화된 모델 사용
    "*:ja": "openrouter:anthropic/claude-3-opus",
    // 중국어 번역에 Gemini Pro 사용
    "*:zh": "openrouter:google/gemini-pro-1.5",
    // 프랑스어 번역에 Mistral Large 사용
    "*:fr": "openrouter:mistralai/mistral-large",
    // 다른 대상 언어에 대한 기본값
    "*:*": "openrouter:openai/gpt-3.5-turbo",
  },
});

특정 로케일 간 번역하기

특정 언어 조합을 처리하는 모델에 대한 세밀한 제어를 위해 정확한 소스-대상 쌍을 정의하세요:

const withLingo = lingoCompiler.vite({
  sourceRoot: "src",
  lingoDir: "lingo",
  sourceLocale: "en",
  targetLocales: ["es", "fr", "de", "ja", "pt", "zh"],
  models: {
    // 최적의 모델을 가진 특정 쌍
    "en:es": "openrouter:openai/gpt-3.5-turbo", // 영어에서 스페인어로
    "en:ja": "openrouter:anthropic/claude-3.5-sonnet", // 영어에서 일본어로
    "en:zh": "openrouter:google/gemini-pro-1.5", // 영어에서 중국어로
    "en:fr": "openrouter:mistralai/mistral-large", // 영어에서 프랑스어로
    "es:en": "openrouter:meta-llama/llama-3.1-8b", // 스페인어에서 영어로
    "fr:en": "openrouter:cohere/command-r-plus", // 프랑스어에서 영어로
    "de:en": "openrouter:perplexity/llama-3.1-sonar-large", // 독일어에서 영어로

    // 지정되지 않은 쌍에 대한 대체 모델
    "*:*": "openrouter:openai/gpt-3.5-turbo",
  },
});