Inceptron
Use Context212 search as the retrieval layer for models hosted on Inceptron.
Inceptron is a platform for hosting and serving optimized open models (Llama, Kimi, MiniMax, GLM, and others) with best-in-class price-performance, exposed through an OpenAI-compatible endpoint. The infrastructure is enterprise-ready (ISO 27001 and GDPR compliant). Pair these models with Context212 search to build RAG pipelines where the retrieval stays on Context212's infrastructure and the generation runs on Inceptron.
The flow is:
- Search Context212 for the passages most relevant to the user's question.
- Pack those passages into the model's context window.
- Call the Inceptron model to generate an answer grounded in the retrieved content.
Prerequisites
- A
C212_API_KEY, available in the Console → API Keys section. - An Inceptron API key, available from the Inceptron console. Store it as
INCEPTRON_API_KEY. - At least one workspace with indexed documents on Context212.
Installation
npm install openaiThe openai package is used here only for its client; Inceptron's endpoint is fully compatible with it.
Full example
import OpenAI from "openai";
const C212_API_KEY = process.env.C212_API_KEY!;
const INCEPTRON_API_KEY = process.env.INCEPTRON_API_KEY!;
const inceptron = new OpenAI({
baseURL: "https://api.inceptron.io/v1",
apiKey: INCEPTRON_API_KEY,
});
async function search(
query: string,
workspaceId?: number[],
maxResults = 5,
): Promise<Record<string, unknown>[]> {
const payload: Record<string, unknown> = { query, max_results: maxResults };
if (workspaceId) payload.workspace_id = workspaceId;
const response = await fetch("https://api.context212.com/api/v1/search", {
method: "POST",
headers: {
Authorization: `Bearer ${C212_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify(payload),
});
if (!response.ok) throw new Error(`Search failed: ${response.status}`);
return (await response.json()).results;
}
async function answer(
question: string,
workspaceId?: number[],
model = "nvidia/llama-3.3-70b-instruct-fp8",
): Promise<string> {
const results = await search(question, workspaceId);
const context = results
.filter((r: any) => r.content)
.map(
(r: any) =>
`[${r.source.filename}, p.${r.source.page_start}]\n${r.content}`,
)
.join("\n\n");
const completion = await inceptron.chat.completions.create({
model,
messages: [
{
role: "system",
content:
"You are a helpful assistant. Answer the user's question using only " +
"the provided context. If the context does not contain enough information, " +
"say so.\n\nContext:\n" +
context,
},
{ role: "user", content: question },
],
});
return completion.choices[0].message.content ?? "";
}
console.log(await answer("What is our data retention policy?"));Context212 search as a tool
Instead of always searching before calling the model, you can expose Context212 search as a tool and let the model decide when to call it. The model issues an context212_search tool call when it needs context; your code executes the search and feeds the results back; the model then produces a final answer.
import OpenAI from "openai";
const C212_API_KEY = process.env.C212_API_KEY!;
const INCEPTRON_API_KEY = process.env.INCEPTRON_API_KEY!;
const inceptron = new OpenAI({
baseURL: "https://api.inceptron.io/v1",
apiKey: INCEPTRON_API_KEY,
});
const SEARCH_TOOL = {
type: "function" as const,
function: {
name: "context212_search",
description:
"Search the company knowledge base for passages relevant to a query. " +
"Returns ranked excerpts with their source filename and page numbers.",
parameters: {
type: "object",
properties: {
query: {
type: "string",
description: "Natural-language search query.",
},
max_results: {
type: "integer",
description: "Number of passages to return (1–50, default 5).",
default: 5,
},
},
required: ["query"],
},
},
};
async function runSearch(query: string, maxResults = 5): Promise<string> {
const response = await fetch("https://api.context212.com/api/v1/search", {
method: "POST",
headers: {
Authorization: `Bearer ${C212_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ query, max_results: maxResults }),
});
if (!response.ok) throw new Error(`Search failed: ${response.status}`);
const results = (await response.json()).results;
const passages = results
.filter((r: any) => r.content)
.map(
(r: any) =>
`[${r.source.filename}, p.${r.source.page_start}]\n${r.content}`,
);
return passages.length ? passages.join("\n\n") : "No results found.";
}
async function answer(
question: string,
model = "nvidia/llama-3.3-70b-instruct-fp8",
): Promise<string> {
const messages: OpenAI.Chat.ChatCompletionMessageParam[] = [
{ role: "user", content: question },
];
while (true) {
const completion = await inceptron.chat.completions.create({
model,
tools: [SEARCH_TOOL],
messages,
});
const choice = completion.choices[0];
if (choice.finish_reason === "tool_calls") {
messages.push(choice.message);
for (const call of choice.message.tool_calls ?? []) {
const args = JSON.parse(call.function.arguments);
const result = await runSearch(args.query, args.max_results ?? 5);
messages.push({
role: "tool",
tool_call_id: call.id,
content: result,
});
}
} else {
return choice.message.content ?? "";
}
}
}
console.log(await answer("What is our data retention policy?"));The loop handles the case where the model issues multiple search calls in sequence before producing a final answer.
Scoping retrieval to a workspace
Pass workspace_id to limit search to a specific workspace. This is useful in multi-tenant products where each customer's data lives in a dedicated workspace.
await answer("Summarize the onboarding checklist", [42]);Choosing a model
Inceptron's catalog includes several hosted models. Pass the model name to the model parameter:
| Model | Notes |
|---|---|
nvidia/llama-3.3-70b-instruct-fp8 | Strong general-purpose model, good default choice |
zai-org/GLM-5.1-FP8 | Capable multilingual model |
MiniMaxAI/MiniMax-M2.5 | Long-context model |
moonshotai/Kimi-K2.6 | Reasoning model with strong agentic abilities |
moonshotai/Kimi-K2.6-Fast | Faster variant of Kimi K2.6 |
moonshotai/Kimi-K2.7-Code | Tuned for code generation |
You can list the models available to your key at any time:
console.log((await inceptron.models.list()).data.map((m) => m.id));See the Inceptron models catalog for the current list, context limits, and pay-as-you-go pricing.
A note on reasoning models
The Kimi models (moonshotai/Kimi-K2.6, moonshotai/Kimi-K2.6-Fast, moonshotai/Kimi-K2.7-Code) are reasoning models: they spend tokens thinking before producing an answer, and they return that thinking under a separate reasoning field. If you set max_tokens too low, the model can exhaust the budget while still reasoning, so the request finishes with finish_reason: "length" and message.content is null. Give reasoning models a generous token budget (a couple thousand tokens or more) to leave room for the final answer. The non-reasoning models in the table above are not affected.
Streaming responses
Inceptron's endpoint supports streaming. Enable it by passing stream: true and iterating over the response:
const stream = await inceptron.chat.completions.create({
model: "nvidia/llama-3.3-70b-instruct-fp8",
messages: [/* ... */],
stream: true,
});
for await (const chunk of stream) {
const delta = chunk.choices[0].delta.content;
if (delta) process.stdout.write(delta);
}