> ## Documentation Index
> Fetch the complete documentation index at: https://docs.elding.app/llms.txt
> Use this file to discover all available pages before exploring further.

# configure()

> La clé API n'entre jamais dans la mémoire de ton application — ni en dev, ni en production.

`configure()` est la seule fonction dont tu as besoin pour tes clés API HTTP. Elle retourne un objet prêt à passer au constructeur de n'importe quel SDK provider. La clé n'est **jamais dans ton process** — en dev elle reste dans le proxy local, en prod elle est injectée par le proxy cloud Elding côté serveur.

```js theme={null}
import OpenAI from "openai";
import { configure } from "@elding/sdk";

const openai = new OpenAI(
  await configure("OPENAI_API_KEY", "https://api.openai.com")
);
```

La même ligne marche en développement et en production. Pas de `if (process.env.NODE_ENV)`. Rien à changer entre les environnements.

***

## Comment ça marche

`configure()` retourne `{ apiKey, baseURL, defaultHeaders }`. Le contenu de ces champs dépend de l'environnement.

<CardGroup cols={3}>
  <Card title="Développement" icon="laptop">
    Nécessite `elding proxy` lancé. `apiKey` est un placeholder (`{{OPENAI_API_KEY}}`). Les requêtes passent par le proxy local en `127.0.0.1`, qui injecte la vraie clé. La clé ne touche jamais ton process.
  </Card>

  <Card title="Production" icon="cloud">
    Nécessite `ELDING_REFRESH_TOKEN` et `ELDING_SET_ID`. `apiKey` est le deploy token. Les requêtes passent par `elding.app/api/proxy`, qui injecte la vraie clé côté serveur. La clé ne touche jamais ton process.
  </Card>

  <Card title="Fallback" icon="server">
    Pas de proxy actif, pas de deploy token. Le SDK récupère la clé brute du vault et la retourne en `apiKey`. La clé entre en mémoire. Déconseillé en production.
  </Card>
</CardGroup>

Dans les deux premiers modes, la clé est **injectée au niveau du proxy** — ton code, tes logs et ton agent IA ne la voient jamais.

***

## Paramètres

| Paramètre    | Type            | Requis | Description                                                     |
| ------------ | --------------- | ------ | --------------------------------------------------------------- |
| `secretName` | `string`        | Oui    | Nom de la clé dans le vault (`A-Z`, `0-9`, `_`).                |
| `target`     | `string`        | Oui    | URL HTTPS de base du provider (ex. `"https://api.openai.com"`). |
| `options`    | `ClientOptions` | Non    | Override `refreshToken`, `setId` ou `cacheTtlMs`.               |

***

## Valeur retournée

`configure()` retourne toujours `Promise<{ apiKey, baseURL, defaultHeaders }>`.

| Champ            | En développement                 | En production                                    |
| ---------------- | -------------------------------- | ------------------------------------------------ |
| `apiKey`         | placeholder `{{OPENAI_API_KEY}}` | deploy token                                     |
| `baseURL`        | `http://127.0.0.1:{port}/`       | `https://elding.app/api/proxy/api.openai.com`    |
| `defaultHeaders` | headers de routage proxy         | `x-elding-token`, `x-elding-key`, `x-elding-set` |

Spread directement dans le constructeur du provider — il prend exactement ce dont il a besoin.

***

## Exemples par provider

### OpenAI

```js theme={null}
import OpenAI from "openai";
import { configure } from "@elding/sdk";

const openai = new OpenAI(
  await configure("OPENAI_API_KEY", "https://api.openai.com")
);

const response = await openai.chat.completions.create({
  model: "gpt-4o",
  messages: [{ role: "user", content: "Bonjour" }],
});
```

### Anthropic

```js theme={null}
import Anthropic from "@anthropic-ai/sdk";
import { configure } from "@elding/sdk";

const anthropic = new Anthropic(
  await configure("ANTHROPIC_API_KEY", "https://api.anthropic.com")
);
```

### Mistral / Together AI / toute API compatible OpenAI

```js theme={null}
import OpenAI from "openai";
import { configure } from "@elding/sdk";

const mistral = new OpenAI(
  await configure("MISTRAL_API_KEY", "https://api.mistral.ai")
);
```

### `fetch` personnalisé

Destructure le résultat et passe les trois champs :

```js theme={null}
import { configure } from "@elding/sdk";

const { apiKey, baseURL, defaultHeaders } = await configure(
  "RESEND_API_KEY",
  "https://api.resend.com"
);

const res = await fetch(`${baseURL}/emails`, {
  method: "POST",
  headers: {
    ...defaultHeaders,
    Authorization: `Bearer ${apiKey}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ from: "...", to: "...", subject: "...", html: "..." }),
});
```

<Warning>
  Spread toujours `defaultHeaders` avant tes propres headers. Ils contiennent les tokens de routage proxy — sans eux, la requête n'atteindra pas le bon provider en développement.
</Warning>

***

## Configuration production

Ajoute deux variables d'environnement sur ta plateforme de déploiement (Vercel, Railway, Fly.io, etc.) :

```bash theme={null}
ELDING_REFRESH_TOKEN=eld_rt_...   # dashboard → Tokens API → Nouveau deploy token
ELDING_SET_ID=...                 # dashboard → ton set → copier l'ID
```

Aucun changement de code nécessaire. `configure()` les lit automatiquement.

<Note>
  Le deploy token est scopé à un seul set et verrouillé sur le host du provider. S'il fuite, un attaquant peut seulement appeler ce seul endpoint API — il ne voit jamais la vraie clé. Tu peux le révoquer instantanément depuis le dashboard.
</Note>

***

## Modèle de sécurité

| Quoi                   | Où ça vit                                                              |
| ---------------------- | ---------------------------------------------------------------------- |
| Clé API (ex. `sk-...`) | Vault Elding uniquement, chiffrée AES-256-GCM                          |
| Accès dev              | Proxy local en `127.0.0.1` — jamais exposé sur le réseau               |
| Accès prod             | Proxy cloud — clé injectée côté serveur, jamais retournée à l'appelant |
| Deploy token           | Scopé à un set, verrouillé sur un host, révocable instantanément       |

`configure()` est la seule fonction dont tu as besoin. La clé n'est jamais une string dans ton code.
