FR ▾
Obtenir une clé API

URL de l'API Kimi Code : Configuration de l'URL de base pour les clients OpenAI

L'URL de l'API Kimi Code dont vous avez besoin pour ce service est https://api.kimicode.cc/v1. Définissez-la comme URL de base dans n'importe quel client OpenAI, ajoutez votre clé, et utilisez l'ID de modèle uncensored.

Mis à jour

Un câble reliant un terminal client à un serveur API, représentant une configuration d'URL de base

L'URL et la signification de chaque partie

Si vous cherchez l'URL de l'API Kimi Code, vous recherchez peut-être l'adresse du service de Kimi. Pour cela, consultez la documentation du fournisseur, car je ne peux pas en garantir la fiabilité. Ce site héberge une autre chose : une API compatible OpenAI devant un seul modèle à poids ouverts, gérée par un fournisseur indépendant. Son adresse est :

https://api.kimicode.cc/v1

Cette chaîne est l'URL de base. C'est la partie partagée par toutes les requêtes. Le SDK ajoute le reste. Lorsque vous appelez chat.completions.create, la bibliothèque OpenAI envoie un POST à https://api.kimicode.cc/v1/chat/completions. La liste des modèles se trouve à https://api.kimicode.cc/v1/models et nécessite un GET.

Ce sont les seules méthodes servies par cette API : POST /v1/chat/completions et GET /v1/models. Si vous espériez des endpoints pour les images, l'audio ou les embeddings, ils n'existent pas ici. Il s'agit d'une API textuelle.

Trois paramètres sont importants, et rien d'autre n'a besoin de changer dans votre code OpenAI existant : l'URL de base, la clé API et l'ID de modèle uncensored.

Pourquoi l'URL de base est le seul commutateur

Les clients de style OpenAI sont conçus autour d'une idée : le format de la requête est fixe et l'hôte est un paramètre. La bibliothèque possède un hôte par défaut qui pointe vers le fournisseur original. Lorsque vous le remplacez par une autre URL de base, le même corps de requête est envoyé ailleurs. Rien dans vos prompts, vos tableaux de messages ou l'analyse des réponses ne doit changer.

C'est pourquoi la migration depuis un autre fournisseur compatible OpenAI nécessite généralement trois modifications : l'URL de base, la clé et le nom du modèle. Les champs de la réponse, tels que choices, message, finish_reason et usage, ont les mêmes noms, donc le code qui les lit continue de fonctionner.

Cela explique également les erreurs étranges que les utilisateurs rencontrent. Si un outil demande une « URL du serveur » et que vous ne collez que l'hôte, le chemin est manquant. Si un outil demande un « point de terminaison complet » et que vous collez l'URL de base, la requête aboutit au mauvais endroit. Lorsque l'écran des paramètres est peu clair, essayez d'abord l'URL de base et lisez le code de statut retourné. Le guide de démarrage dans la documentation parcourt la même migration avec un exemple supplémentaire.

Variables d'environnement pour les outils que vous ne pouvez pas modifier

De nombreux outils en ligne de commande et frameworks créent un client OpenAI sans vous laisser toucher au constructeur. Ils lisent généralement les variables d'environnement standard, donc les définir suffit :

export OPENAI_BASE_URL="https://api.kimicode.cc/v1"
export OPENAI_API_KEY="YOUR_KEY"

Certains outils plus anciens recherchent OPENAI_API_BASE à la place, donc si l'un ignore le premier nom, essayez le second. Après les avoir définis, lancez l'outil dans la même session de shell, car les variables définies dans une autre fenêtre de terminal ne sont pas partagées.

L'outil aura toujours besoin d'un nom de modèle. S'il code en dur un modèle hébergé, cherchez une option ou une ligne de configuration pour le définir, et utilisez uncensored. S'il ne peut pas être modifié, l'outil ne convient pas, et un petit script comme ceux ci-dessus est une meilleure approche.

Obtenez d'abord une clé

Les requêtes sont authentifiées avec un en-tête de la forme Authorization: Bearer YOUR_KEY. Chaque SDK officiel construit cet en-tête pour vous à partir de l'argument api_key. Vous pouvez créer la clé après vous être connecté avec Google ou avec un e-mail et un mot de passe.

Les nouveaux comptes peuvent réclamer $0,50 de crédit d'essai en un clic sur la page de la clé API. Aucune carte n'est nécessaire et cela dure 7 jours. Cela suffit pour exécuter chaque exemple ci-dessous plusieurs fois. Les clés d'essai permettent 2 requêtes simultanées et 60 requêtes par minute, exécutez donc les exemples un par un.

Stockez la clé dans une variable d'environnement plutôt que dans des fichiers source. Une clé publiée dans un dépôt public sera trouvée et utilisée par quelqu'un d'autre en quelques heures, et le crédit qu'elle contient vous appartient.

Première requête avec curl

Curl est le moyen le plus rapide de prouver que l'URL fonctionne, car il élimine toutes les bibliothèques de l'équation. Si cet appel réussit, tout problème que vous rencontrerez plus tard provient de la configuration de votre client.

export KIMICODE_KEY="YOUR_KEY"

curl https://api.kimicode.cc/v1/models   -H "Authorization: Bearer $KIMICODE_KEY"

curl https://api.kimicode.cc/v1/chat/completions   -H "Authorization: Bearer $KIMICODE_KEY"   -H "Content-Type: application/json"   -d '{
    "model": "uncensored",
    "messages": [
      {"role": "user", "content": "Say hello in five words."}
    ]
  }'

Le premier appel renvoie la liste des modèles, qui doit inclure uncensored. Le second renvoie un objet standard de complétion de chat. Consultez les en-têtes de réponse avec curl -i et vous verrez X-Request-Id, X-Balance-USD, X-RateLimit-Limit-Requests et X-RateLimit-Limit-Concurrency. Conservez l'ID de requête si vous contactez un jour le support au sujet d'un appel spécifique.

Python avec le SDK OpenAI

Installez la bibliothèque avec pip install openai, puis modifiez deux arguments sur le constructeur du client.

import os
from openai import OpenAI

client = OpenAI(
    base_url="https://api.kimicode.cc/v1",
    api_key=os.environ["KIMICODE_KEY"],
)

resp = client.chat.completions.create(
    model="uncensored",
    messages=[
        {"role": "system", "content": "You are a concise assistant."},
        {"role": "user", "content": "Explain what a base URL is in two sentences."},
    ],
    temperature=0.7,
)
print(resp.choices[0].message.content)
print(resp.usage)

Des paramètres tels que temperature, top_p, stop, seed et les pénalités de fréquence et de présence sont transmis au modèle. La valeur max_tokens est facultative. Sans elle, la complétion peut utiliser tout ce qui reste de la fenêtre de 100 000 tokens, qui est le prompt et la complétion combinés.

Le SDK lit également deux variables d'environnement si vous ne passez pas d'arguments : OPENAI_BASE_URL et OPENAI_API_KEY. Cela est utile pour les outils que vous ne pouvez pas modifier. Définissez les deux, lancez l'outil, et il interagira avec cette API.

Node, streaming et mode JSON

La configuration Node fait écho à Python. Installez avec npm install openai.

import OpenAI from "openai";

const client = new OpenAI({
  baseURL: "https://api.kimicode.cc/v1",
  apiKey: process.env.KIMICODE_KEY,
});

// Streaming over SSE
const stream = await client.chat.completions.create({
  model: "uncensored",
  stream: true,
  messages: [{ role: "user", content: "Write a four-line poem about routers." }],
});
for await (const chunk of stream) {
  process.stdout.write(chunk.choices[0]?.delta?.content ?? "");
}

// JSON mode
const json = await client.chat.completions.create({
  model: "uncensored",
  response_format: { type: "json_object" },
  messages: [
    { role: "system", content: "Reply with a JSON object only." },
    { role: "user", content: "Give me keys name and port for a local dev server." },
  ],
});
console.log(JSON.parse(json.choices[0].message.content));

Le streaming utilise les événements envoyés par le serveur et l'utilisation est rapportée à la fin du flux. Une requête en streaming occupe son slot de concurrence jusqu'à la fin du flux, donc un client qui ouvre un flux et ne le lit jamais bloquera un slot. En mode JSON, indiquez toujours au modèle dans le prompt de répondre en JSON. L'option contraint le format de sortie, mais une instruction claire vous donne de meilleurs noms de champs.

Appel de fonctions

Les outils utilisent la structure OpenAI habituelle : une liste tools, un tool_choice optionnel, et les résultats des outils renvoyés sous forme de messages avec role: "tool". En streaming, les tool_calls arrivent par morceaux répartis dans les blocs.

import json, os
from openai import OpenAI

client = OpenAI(base_url="https://api.kimicode.cc/v1", api_key=os.environ["KIMICODE_KEY"])

tools = [{
    "type": "function",
    "function": {
        "name": "get_port",
        "description": "Look up the port of a named local service",
        "parameters": {
            "type": "object",
            "properties": {"service": {"type": "string"}},
            "required": ["service"],
        },
    },
}]

messages = [{"role": "user", "content": "Which port does the api service use?"}]
first = client.chat.completions.create(model="uncensored", messages=messages, tools=tools)
call = first.choices[0].message.tool_calls[0]

messages.append(first.choices[0].message)
messages.append({
    "role": "tool",
    "tool_call_id": call.id,
    "content": json.dumps({"service": "api", "port": 8080}),
})
final = client.chat.completions.create(model="uncensored", messages=messages, tools=tools)
print(final.choices[0].message.content)

Traitez les arguments du modèle comme des entrées non fiables. Validez-les avant d'exécuter quoi que ce soit. Le modèle peut sauter un appel d'outil ou l'appeler avec un champ incorrect, comme n'importe quel modèle peut le faire, donc gardez un chemin de repli dans votre boucle.

Quand l'URL échoue

La plupart des échecs entrent dans une courte liste.

  • 404 Not Found. Le chemin est incorrect. Causes courantes : l'URL de base a été définie sur https://api.kimicode.cc sans /v1, ou sur https://api.kimicode.cc/v1/chat/completions de sorte que l'application cliente ajoute le chemin deux fois. Utilisez exactement l'URL de base ci-dessus.
  • 401 Non autorisé. La clé est manquante, contient un espace ou une nouvelle ligne parasite, ou l'en-tête n'est pas un jeton Bearer. Affichez la longueur de la variable pour vérifier.
  • 429 avec le code rate_limited. Vous avez dépassé le plafond par minute : 300 requêtes pour une clé complète, 60 pour une clé d'essai.
  • 429 avec le code concurrency. Trop de requêtes à la fois : 8 pour une clé complète, 2 pour une clé d'essai.
  • 429 avec un en-tête Retry-After: 5. Surcharge temporaire. Attendez cinq secondes et réessayez.
  • Requête trop volumineuse. La limite du corps est de 8 Mo, et le prompt plus la complétion doivent tenir dans 100 000 tokens.

Une boucle de nouvelle tentative qui respecte Retry-After et recule pour les deux autres codes gère presque tout cela. Le coût par appel est faible ; la page de tarification indique les tarifs par token, et le démarrage rapide de la documentation montre les étapes de migration depuis un autre fournisseur de style OpenAI.

Nouvelles tentatives et habitudes en production

Une fois le premier appel réussi, ajoutez un wrapper de nouvelle tentative avant de mettre en production. Respectez l'en-tête Retry-After lorsqu'il est présent et reculez avec un délai aléatoire court sinon.

import os, time, random
from openai import OpenAI, RateLimitError

client = OpenAI(base_url="https://api.kimicode.cc/v1", api_key=os.environ["KIMICODE_KEY"])

def ask(messages, tries=5):
    for attempt in range(tries):
        try:
            return client.chat.completions.create(model="uncensored", messages=messages)
        except RateLimitError as err:
            retry_after = 5
            if getattr(err, "response", None) is not None:
                retry_after = int(err.response.headers.get("retry-after", 5))
            time.sleep(retry_after + random.random())
    raise RuntimeError("still rate limited after retries")

Limitez votre propre concurrence pour correspondre à votre clé : un pool de threads de 8 pour une clé complète, 2 pour une clé d'essai. Cela évite l'erreur concurrency dès le départ, et vous maintient en dessous de la limite de 300 requêtes par minute, lorsque chaque appel prend plus de quelques secondes.

Enfin, rappelez-vous que vous payez par token. Journalisez l'objet usage pour chaque appel, et surveillez l'en-tête X-Balance-USD. À $0,15 par 1 M de tokens d'entrée et $0,50 par 1 M de tokens de sortie, un tour de chat typique coûte une fraction de centime, mais les boucles et les longs historiques s'additionnent, et le log vous indique où.

Questions et réponses

Quelle est l'URL de base pour cette API ?

https://api.kimicode.cc/v1. Définissez-la comme URL de base dans n'importe quel client compatible OpenAI et laissez la bibliothèque gérer le chemin qui suit.

Quel ID de modèle dois-je envoyer ?

Envoyez uncensored comme valeur de modèle. Vous pouvez le confirmer en appelant GET /v1/models avec votre clé.

Puis-je utiliser l'endpoint officiel Kimi avec ma clé obtenue ici ?

Non. Il s'agit d'un service distinct disposant de ses propres clés et d'un seul modèle à poids ouverts, et non de l'API officielle d'aucun fournisseur. Les clés ne sont pas transférables dans un sens ou dans l'autre.

Pourquoi obtiens-je une erreur 404 sur les complétions de chat ?

L'URL de base manque probablement de /v1 ou inclut déjà /chat/completions. Utilisez https://api.kimicode.cc/v1 et rien de plus.

Votre clé est à une étape de formulaire

Créez un compte, copiez la clé, modifiez l'URL de base. C'est toute la configuration.

Obtenir une clé API