Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ ocx start # proxy + dashboard on localhost:10100
</table>

<p align="center">
<a href="README.md">English</a> · <a href="readme/README.ko.md">한국어</a> · <a href="readme/README.zh-CN.md">简体中文</a> · <a href="readme/README.zh-TW.md">繁體中文</a> · <a href="readme/README.ru.md">Русский</a> · <a href="readme/README.ja.md">日本語</a> · <a href="readme/README.tr.md">Türkçe</a> · 📖 <a href="https://opencodex.me/"><b>Full documentation →</b></a>
<a href="README.md">English</a> · <a href="readme/README.fr.md">Français</a> · <a href="readme/README.ko.md">한국어</a> · <a href="readme/README.zh-CN.md">简体中文</a> · <a href="readme/README.zh-TW.md">繁體中文</a> · <a href="readme/README.ru.md">Русский</a> · <a href="readme/README.ja.md">日本語</a> · <a href="readme/README.tr.md">Türkçe</a> · 📖 <a href="https://opencodex.me/"><b>Full documentation →</b></a>
</p>

opencodex is a lightweight local proxy that translates Codex's Responses API into whatever your
Expand Down
103 changes: 52 additions & 51 deletions docs-site/astro.config.mjs

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions docs-site/src/components/FrontierBoards.astro
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import data from "../data/frontier-benchmarks.json";
import { FRONTIER_STRINGS } from "../data/frontier-i18n";

interface Props {
locale?: "en" | "ko" | "zh-cn" | "zh-tw" | "ru" | "ja" | "tr";
locale?: "en" | "fr" | "ko" | "zh-cn" | "zh-tw" | "ru" | "ja" | "tr";
/** Comma-separated board ids to render; omit for all boards. */
boards?: string;
/** Show the page-level subtitle (overview pages only). */
Expand All @@ -26,7 +26,7 @@ const fill = (key: string, vars: Record<string, string>): string =>
Object.entries(vars).reduce((acc, [k, v]) => acc.replace(`{${k}}`, v), t(key));

// The PR i18n has no column-header key for "score" — keep a tiny local map.
const SCORE_HEADER: Record<string, string> = { en: "Score", ko: "점수", "zh-cn": "得分", "zh-tw": "得分", ru: "Балл", ja: "スコア", tr: "Puan" };
const SCORE_HEADER: Record<string, string> = { en: "Score", fr: "Score", ko: "점수", "zh-cn": "得分", "zh-tw": "得分", ru: "Балл", ja: "スコア", tr: "Puan" };
/** Dataset tags are kebab-case; i18n keys are camelCase (cheap-subagent → cheapSubagent). */
const tagKey = (tag: string): string => tag.replace(/-([a-z])/g, (_, c) => c.toUpperCase());

Expand Down
41 changes: 38 additions & 3 deletions docs-site/src/components/Header.astro
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,47 @@ const prefix = locale ? `${base}${locale}/` : base;
type NavLink = { label: string; href: string };
type NavGroup = { label: string; links: NavLink[] };

const t = (en: string, ko: string, zh: string, ru: string, ja: string, zhTW: string, tr: string) =>
locale === 'ko' ? ko : locale === 'zh-cn' ? zh : locale === 'zh-tw' ? zhTW : locale === 'ru' ? ru : locale === 'ja' ? ja : locale === 'tr' ? tr : en;
const fr = {
'Auto': 'Automatique',
'Light': 'Clair',
'Dark': 'Sombre',
'Theme': 'Thème',
'Click to use the next theme': 'Cliquez pour passer au thème suivant',
'Getting Started': 'Démarrage',
'Installation': 'Installation',
'Quickstart': 'Démarrage rapide',
'How It Works': 'Fonctionnement',
'Agent Quickstart': 'Démarrage rapide pour les agents',
'Guides': 'Guides',
'Providers': 'Fournisseurs',
'Model Routing': 'Routage des modèles',
'Combos': 'Combinaisons',
'Codex Integration': 'Intégration de Codex',
'Codex App Model Picker': 'Sélecteur de modèles de Codex App',
'Sidecars: Search & Vision': 'Services auxiliaires : recherche et vision',
'Image Bridge': 'Pont d’images',
'Video Bridge': 'Pont vidéo',
'Web Dashboard': 'Tableau de bord web',
'Sub-agent Surface': 'Interface des sous-agents',
'Reference': 'Référence',
'Configuration': 'Configuration',
'Adapters': 'Adaptateurs',
'Architecture': 'Architecture',
'Proxy API Formats': 'Formats de l’API proxy',
'Management API': 'API de gestion',
'Contributing': 'Contribuer',
'Main': 'Navigation principale',
'Select language': 'Choisir la langue',
'Menu': 'Menu',
} as const;

type LanguageOption = { code: 'root' | 'ko' | 'zh-cn' | 'zh-tw' | 'ru' | 'ja' | 'tr'; label: string };
const t = <K extends keyof typeof fr>(en: K, ko: string, zh: string, ru: string, ja: string, zhTW: string, tr: string): string =>
locale === 'fr' ? fr[en] : locale === 'ko' ? ko : locale === 'zh-cn' ? zh : locale === 'zh-tw' ? zhTW : locale === 'ru' ? ru : locale === 'ja' ? ja : locale === 'tr' ? tr : en;

type LanguageOption = { code: 'root' | 'fr' | 'ko' | 'zh-cn' | 'zh-tw' | 'ru' | 'ja' | 'tr'; label: string };
const languages: LanguageOption[] = [
{ code: 'root', label: 'English' },
{ code: 'fr', label: 'Français' },
{ code: 'ko', label: '한국어' },
{ code: 'zh-cn', label: '简体中文' },
{ code: 'zh-tw', label: '繁體中文' },
Expand Down
74 changes: 70 additions & 4 deletions docs-site/src/components/Landing.astro
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
---
// Landing page shared by the three locales. Liquid Editorial composition:
// Landing page shared by the localized home pages. Liquid Editorial composition:
// type-led centered hero, provider pill chips as content, product-as-stage
// media band, quickstart terminal, bento feature slab, docs link row.
// Styling lives in src/styles/custom.css under the `.lp` namespace.
Expand All @@ -20,15 +20,81 @@ import heroFieldDark from '../assets/hero-route-dark.png';
import SiteJsonLd from './SiteJsonLd.astro';

interface Props {
locale?: 'ko' | 'zh-cn' | 'zh-tw' | 'ru' | 'ja' | 'tr';
locale?: 'fr' | 'ko' | 'zh-cn' | 'zh-tw' | 'ru' | 'ja' | 'tr';
}
const { locale } = Astro.props;

const base = import.meta.env.BASE_URL.replace(/\/?$/, '/');
const prefix = locale ? `${base}${locale}/` : base;

const t = (en: string, ko: string, zh: string, ru: string, ja: string, zhTW: string, tr: string) =>
locale === 'ko' ? ko : locale === 'zh-cn' ? zh : locale === 'zh-tw' ? zhTW : locale === 'ru' ? ru : locale === 'ja' ? ja : locale === 'tr' ? tr : en;
const fr = {
'Install': 'Installer',
'Start the proxy': 'Démarrer le proxy',
'Inject a provider into Codex': 'Ajouter un fournisseur à Codex',
'Codex now routes through ocx': 'Codex passe maintenant par ocx',
'Getting Started': 'Démarrage',
'Installation': 'Installation',
'Quickstart': 'Démarrage rapide',
'How It Works': 'Fonctionnement',
'Agent Quickstart': 'Démarrage rapide pour les agents',
'Guides': 'Guides',
'Providers': 'Fournisseurs',
'Model Routing': 'Routage des modèles',
'Combos': 'Combinaisons',
'Codex Integration': 'Intégration de Codex',
'Codex App Model Picker': 'Sélecteur de modèles de Codex App',
'Sidecars: Search & Vision': 'Services auxiliaires : recherche et vision',
'Image Bridge': 'Pont d’images',
'Video Bridge': 'Pont vidéo',
'Web Dashboard': 'Tableau de bord web',
'Sub-agent Surface': 'Interface des sous-agents',
'Reference': 'Référence',
'Configuration': 'Configuration',
'Adapters': 'Adaptateurs',
'Architecture': 'Architecture',
'Proxy API Formats': 'Formats de l’API proxy',
'Management API': 'API de gestion',
'Project': 'Projet',
'Contributing': 'Contribuer',
'Run ': 'Exécutez ',
' on any LLM.': ' sur n’importe quel LLM.',
'opencodex is a local proxy that serves Codex and Claude Code from one port — translating each wire format to any provider, with streaming, tool calls, reasoning, and images in both directions. Zero client patches.': 'opencodex est un proxy local qui fournit Codex et Claude Code sur un même port. Il traduit chaque format de protocole vers n’importe quel fournisseur, dans les deux sens, avec la diffusion en continu, les appels d’outils, le raisonnement et les images. Aucune modification des clients.',
'Get Started': 'Commencer',
'Supported providers': 'Fournisseurs pris en charge',
'40+ providers': 'Plus de 40 fournisseurs',
'The opencodex dashboard — live proxy status, routed providers, and available models': 'Le tableau de bord opencodex : état du proxy en direct, fournisseurs routés et modèles disponibles',
'Install. Start. Codex, rerouted.': 'Installez. Démarrez. Codex est redirigé.',
'Install.': 'Installez.',
'Start.': 'Démarrez.',
'Codex, rerouted.': 'Codex est redirigé.',
'Full quickstart': 'Démarrage rapide complet',
'Watch Codex run on a routed model.': 'Regardez Codex exécuter une tâche sur un modèle routé.',
'Codex App running a task on a routed non-OpenAI model': 'Codex App exécutant une tâche sur un modèle routé autre qu’OpenAI',
'One task, streamed end to end through opencodex.': 'Une tâche diffusée de bout en bout par opencodex.',
'One proxy, the whole surface.': 'Un seul proxy pour toute la plateforme.',
'Any provider': 'N’importe quel fournisseur',
'Five adapters cover Anthropic Messages, Google Gemini, Azure, the OpenAI Responses passthrough, and every OpenAI-compatible Chat Completions endpoint — 40+ built-in providers.': 'Cinq adaptateurs couvrent Anthropic Messages, Google Gemini, Azure, le transfert direct des Responses d’OpenAI et tous les points de terminaison Chat Completions compatibles avec OpenAI, soit plus de 40 fournisseurs intégrés.',
'OAuth or API key': 'OAuth ou clé API',
'Log in with your xAI, Anthropic, or Kimi account — auto-refreshed — forward your ChatGPT login, or paste a key.': 'Connectez votre compte xAI, Anthropic ou Kimi avec actualisation automatique, transférez votre connexion ChatGPT ou collez une clé.',
'ChatGPT account pool': 'Groupe de comptes ChatGPT',
'Existing threads keep their account; new sessions auto-route to the lowest-usage healthy one after quota refresh.': 'Les fils existants conservent leur compte ; après actualisation des quotas, les nouvelles sessions sont automatiquement dirigées vers le compte opérationnel le moins utilisé.',
'Native in the model picker': 'Intégré au sélecteur de modèles',
'Routed models show up in Codex App with reasoning effort levels, next to the native ones.': 'Les modèles routés apparaissent dans Codex App avec leurs niveaux d’effort de raisonnement, aux côtés des modèles natifs.',
'Codex App model picker with reasoning effort levels': 'Sélecteur de modèles de Codex App avec niveaux d’effort de raisonnement',
'Sub-agents': 'Sous-agents',
'Pin up to five routed or native models for Codex spawn_agent, and switch the v1 / base / v2 surface globally.': 'Épinglez jusqu’à cinq modèles routés ou natifs pour spawn_agent dans Codex et changez globalement d’interface v1, base ou v2.',
'ocx claude launches Claude Code against the same port — every routed model in the /model picker, auto-context up to 1M, roster sub-agents, and your claude.ai login stays active.': 'ocx claude lance Claude Code sur le même port : tous les modèles routés figurent dans le sélecteur /model, le contexte automatique atteint 1 M, la liste de sous-agents est disponible et votre connexion claude.ai reste active.',
'Claude Code running a routed model through opencodex — gpt-5.6-luna-medium active in the status bar': 'Claude Code exécutant un modèle routé par opencodex, avec gpt-5.6-luna-medium actif dans la barre d’état',
'Search & vision sidecars': 'Services auxiliaires de recherche et de vision',
'Give non-OpenAI models real web search and image understanding through a gpt-5.4-mini sidecar.': 'Ajoutez aux modèles autres qu’OpenAI une véritable recherche web et la compréhension des images grâce à un service auxiliaire gpt-5.4-mini.',
'ocx init writes a provider into your Codex config and shares one model catalog with Codex CLI, TUI, App, and SDK. ocx stop restores native Codex cleanly.': 'ocx init ajoute un fournisseur à votre configuration Codex et partage un catalogue de modèles unique entre Codex CLI, TUI, App et SDK. ocx stop restaure proprement Codex dans son état natif.',
'Documentation map': 'Plan de la documentation',
'Explore the docs': 'Explorer la documentation',
'opencodex is an independent community project, not affiliated with or endorsed by OpenAI, Anthropic, or any other provider. Some providers may restrict accounts that route traffic through third-party proxies — review each provider’s Terms of Service before connecting.': 'opencodex est un projet communautaire indépendant, sans affiliation avec OpenAI, Anthropic ou tout autre fournisseur, et sans approbation de leur part. Certains fournisseurs peuvent restreindre les comptes qui acheminent leur trafic par des proxys tiers ; consultez les conditions d’utilisation de chaque fournisseur avant de vous connecter.',
} as const;

const t = <K extends keyof typeof fr>(en: K, ko: string, zh: string, ru: string, ja: string, zhTW: string, tr: string): string =>
locale === 'fr' ? fr[en] : locale === 'ko' ? ko : locale === 'zh-cn' ? zh : locale === 'zh-tw' ? zhTW : locale === 'ru' ? ru : locale === 'ja' ? ja : locale === 'tr' ? tr : en;

const icons: Record<string, string> = {
// Lucide outline paths (24x24, stroke)
Expand Down
5 changes: 3 additions & 2 deletions docs-site/src/components/SiteJsonLd.astro
Original file line number Diff line number Diff line change
Expand Up @@ -11,18 +11,19 @@
const SITE_URL = 'https://opencodex.me';

interface Props {
locale?: 'ko' | 'zh-cn' | 'zh-tw' | 'ru' | 'ja' | 'tr';
locale?: 'fr' | 'ko' | 'zh-cn' | 'zh-tw' | 'ru' | 'ja' | 'tr';
}
const { locale } = Astro.props;

// Locale path segment (root/English has none) mapped to its BCP-47 tag.
const langs = { ko: 'ko', 'zh-cn': 'zh-CN', 'zh-tw': 'zh-TW', ru: 'ru', ja: 'ja', tr: 'tr' } as const;
const langs = { fr: 'fr', ko: 'ko', 'zh-cn': 'zh-CN', 'zh-tw': 'zh-TW', ru: 'ru', ja: 'ja', tr: 'tr' } as const;

const homeUrl = locale ? `${SITE_URL}/${locale}/` : `${SITE_URL}/`;
const inLanguage = locale ? langs[locale] : 'en';

const descriptions = {
en: 'Universal provider proxy for OpenAI Codex & Claude Code — use any LLM with Codex CLI, App, SDK, and Claude Code.',
fr: 'Proxy universel de fournisseurs pour OpenAI Codex et Claude Code — utilisez n’importe quel LLM avec Codex CLI, App, SDK et Claude Code.',
ko: 'OpenAI Codex & Claude Code를 위한 범용 프로바이더 프록시 — Codex CLI, App, SDK와 Claude Code에서 어떤 LLM이든 사용하세요.',
'zh-CN': '面向 OpenAI Codex 与 Claude Code 的通用 provider 代理 —— 在 Codex CLI、App、SDK 和 Claude Code 中使用任意 LLM。',
'zh-TW': '適用於 OpenAI Codex 與 Claude Code 的通用 provider 代理 —— 在 Codex CLI、App、SDK 和 Claude Code 中使用任意 LLM。',
Expand Down
5 changes: 3 additions & 2 deletions docs-site/src/content/docs/contributing.md
Original file line number Diff line number Diff line change
Expand Up @@ -191,8 +191,9 @@ preset it cannot stand behind. Promote the row to the registry once the evidence
## Adding an adapter

Implement `ProviderAdapter` (see [Adapters](/reference/adapters/)) in `src/adapters/`,
register its name in `src/server/adapter-resolve.ts`, and bridge its output to internal
`AdapterEvent`s. Reuse `image.ts` for image handling and follow `openai-chat.ts` for ordinary
register its factory in `src/adapters/registry.ts`, and bridge its output to internal
`AdapterEvent`s. `src/server/adapter-resolve.ts` selects the effective protocol before delegating
to the registry. Reuse `image.ts` for image handling and follow `openai-chat.ts` for ordinary
streaming/tool calls; use `fetchResponse` only when the adapter owns transport retries, or `runTurn`
for a genuinely bidirectional transport such as Cursor. Add focused tests under `tests/` and export
the factory from `src/index.ts` when it belongs to the public package API.
Expand Down
8 changes: 8 additions & 0 deletions docs-site/src/content/docs/fr/benchmarks/coding.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
title: Bancs d’essai de programmation
description: Instantanés de bancs d’essai pour agents de programmation — DeepSWE, AA Coding Agent, FrontierCode, FrontierSWE, Program Bench et SWE Marathon.
---

import FrontierBoards from "../../../../components/FrontierBoards.astro";

<FrontierBoards locale="fr" boards="deepswe,aa-coding-agent,frontiercode,frontierswe,program-bench,swe-marathon" />
8 changes: 8 additions & 0 deletions docs-site/src/content/docs/fr/benchmarks/frontend.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
title: Banc d’essai frontend
description: Instantané d’un banc d’essai de programmation frontend — Frontend Code Arena.
---

import FrontierBoards from "../../../../components/FrontierBoards.astro";

<FrontierBoards locale="fr" boards="frontend-code-arena" />
17 changes: 17 additions & 0 deletions docs-site/src/content/docs/fr/benchmarks/index.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
---
title: Bancs d’essai
description: "Instantanés de bancs d’essai publics pour agents de programmation : capacités et coût par tâche, avec la provenance de chaque tableau."
---

Il s’agit d’**instantanés statiques** de classements publics, actualisés manuellement, et non de mesures
OpenCodex en direct. Chaque tableau indique sa source, sa date de capture et sa note de licence.
Les classements par score et par dollar n’apparaissent que dans les tableaux où chaque ligne comporte un
coût par tâche mesuré à la source.

Les tableaux sont regroupés par domaine de tâches :

- [Programmation](./coding/) — DeepSWE, AA Coding Agent, FrontierCode, FrontierSWE, Program Bench, SWE Marathon
- [Frontend](./frontend/) — Frontend Code Arena
- [Terminal](./terminal/) — Terminal Bench 2.1
- [Sécurité](./security/) — Cybench
- [Intelligence](./intelligence/) — AA Intelligence Index
8 changes: 8 additions & 0 deletions docs-site/src/content/docs/fr/benchmarks/intelligence.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
title: Banc d’essai d’intelligence
description: Instantané d’un indice d’intelligence générale — AA Intelligence Index.
---

import FrontierBoards from "../../../../components/FrontierBoards.astro";

<FrontierBoards locale="fr" boards="aa-intelligence-index" />
8 changes: 8 additions & 0 deletions docs-site/src/content/docs/fr/benchmarks/security.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
title: Banc d’essai de sécurité
description: Instantané d’un banc d’essai de tâches de sécurité — Cybench.
---

import FrontierBoards from "../../../../components/FrontierBoards.astro";

<FrontierBoards locale="fr" boards="cybench" />
8 changes: 8 additions & 0 deletions docs-site/src/content/docs/fr/benchmarks/terminal.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
title: Banc d’essai du terminal
description: Instantané d’un banc d’essai d’utilisation du terminal — Terminal Bench 2.1.
---

import FrontierBoards from "../../../../components/FrontierBoards.astro";

<FrontierBoards locale="fr" boards="terminal-bench-2.1" />
Loading
Loading