---
title: "Configuring Cloud LLMs: Providers, Endpoints, and Summaries"
description: Follow ChatCrystal provider registrations to configure remote generation and check native APIs, gateways, persisted settings, credentials, and test boundaries.
image: "https://zengliangyi.com/og/blog/en/cloud-llm-configuration.png"
---

Switching from a local model to a remote service takes more than changing provider. Old endpoints, models, or saved keys can remain. Returning one sentence does not establish that a real conversation produces a useful note.

This article follows the [ChatCrystal provider registry](https://github.com/ZengLiangYi/ChatCrystal/blob/764276814e5c5a33ecbfeae63754f74b9261a3a8/server/src/services/providers.ts) at [`7642768`](https://github.com/ZengLiangYi/ChatCrystal/tree/764276814e5c5a33ecbfeae63754f74b9261a3a8). It gives no measured cross-model ranking or fixed cost per note. Check model availability, prices, and account limits when using the service.

## Identify the application’s call path

The current registry contains `ollama`, `openai`, `orcarouter`, `anthropic`, `google`, `azure`, and `custom`. Remote generation paths differ:

- OpenAI uses its SDK factory with endpoint, key, and model. Do not assume every generation request uses Chat Completions.

- Anthropic and Google use native factories. These versioned generation paths receive keys and models; they do not use the application’s `baseURL` field to override endpoints.

- Azure uses the Azure factory. Match endpoint and model identifiers to the SDK and actual deployment; a resource homepage is not a universal complete API prefix.

- Custom uses the OpenAI factory’s default model call path. A gateway supporting only Chat Completions has not thereby established compatibility with that path or structured output.

- OrcaRouter uses a fixed gateway endpoint in the registry; this version does not override it through configured `baseURL`.

These describe the application, not every vendor product. Anthropic and OrcaRouter entries have no embedding factory. Choose another supported configuration for retrieval; see [separate model responsibilities](/en/blog/llm-and-embedding-separation).

## Check endpoint and model together when switching

For example, choose the native OpenAI service with these nonsecret settings on the default local connection:



```bash
crystal   config   set   llm.provider   openai  
  crystal   config   set   llm.baseURL   https://api.openai.com/v1
```



Then supply a model ID available to the current account and a server-side key. The model command has this shape; replace the angle-bracket placeholder:



```text
crystal config set llm.model <available-model-id>
```



The [official OpenAI API reference](https://developers.openai.com/api/reference/overview) describes authentication and server credentials; see the [official quickstart](https://developers.openai.com/api/docs/quickstart) for requests. Keep keys out of public articles, browser code, and repositories. If a desktop or frontend settings interface is available, configure it there. See the [getting-started guide](/en/blog/chatcrystal-getting-started) for npm CLI and interface artifact differences.

For Anthropic or Google, likewise update `llm.provider`, `llm.model`, and `llm.apiKey` using actual service identifiers. For Azure and Custom, additionally verify endpoint and SDK protocol. A generic model-name table cannot guarantee account access.

## Inspect the configuration actually loaded

The [configuration implementation](https://github.com/ZengLiangYi/ChatCrystal/blob/764276814e5c5a33ecbfeae63754f74b9261a3a8/server/src/config.ts) takes environment defaults, then overlays saved model settings. Setting `LLM_PROVIDER`, `LLM_MODEL`, `LLM_API_KEY`, and `LLM_BASE_URL` for startup does not override an existing `config.json`.



```bash
crystal   config   get  
  crystal   config   test
```



Inspect actual provider, model, endpoint, and whether a key is set. A displayed address unused by a native factory does not establish that requests go there; interpret it alongside the registry. Hiding credentials behind a “set” indicator does not make configuration storage encrypted.

## Separate short tests from application acceptance

Connection tests request short generation and a vector separately. Read both results. HTTP success or a successful command exit does not replace `connected` status. Diagnose authorization, endpoints, model access, and timeouts from actual errors.

Then select a real conversation outside the demo data. Inspect input length, title, summary, conclusions, and applicability conditions. A model returning short text can still fail on long input or the required structure. Summaries, relation discovery, and embeddings also incur separate usage; note totals alone cannot determine cost.

## Explain switching effects and data flow

Changing only generation configuration usually does not require reimporting history, but existing notes are not automatically rewritten. Summarizing a conversation with an existing note can return its original ID. Active tasks can trigger a configuration confirmation prompt; read it before appending `--confirm`.

Remote generation receives material prepared for that task. Local embeddings do not keep summary and relation-discovery data on the machine. Check actual paths with the [data-boundary guide](/en/blog/local-first-ai-data-boundaries), then use [debugging-solution recovery](/en/blog/recover-debugging-notes) to establish that the note is useful.

Share:

##  Related Posts

[##  Comparing LLM Summaries: Fixed Inputs and Verifiable Evidence

Evaluate local vs cloud LLM summarization on identical transcripts, field review, and failure logs, separating model quality from app pipelines.          曾亮懿       October 4, 2026      3 min read

#ChatCrystal

#LLM

#Evaluation](/en/blog/llm-summary-evaluation)    [##  AI Conversation Formats: JSONL Events vs SQLite Snapshots

Compare 5 AI adapter formats: separate JSONL events from SQLite keys, and inspect indexed, orphan, and unknown-version chat transcripts in memory stores.          曾亮懿       October 7, 2026      4 min read

#ChatCrystal

#Node.js

#SQLite](/en/blog/ai-conversation-format-divergence)    [##  How Claude Code, Cursor, Copilot, and Trae Store Chats on Disk

Compare Claude Code, Cursor, Copilot, and Trae storage paths. Distinguish raw copies from exports, and verify migration retention with test manifests.          曾亮懿       October 7, 2026      4 min read

#ChatCrystal

#Node.js

#SQLite](/en/blog/ai-conversation-management-options)

##  From writing to code

Explore ChatCrystal, developer tools and daily learning notes on my GitHub. Questions about the implementation are welcome.

[Visit my GitHub](https://github.com/ZengLiangYi)

```json
{
  "@context": "https://schema.org",
  "@type": "WebSite",
  "name": "ZengLiangYi Blog",
  "alternateName": [
    "Zeng Liangyi",
    "ZengLiangYi",
    "zengliangyi.com"
  ],
  "url": "https://zengliangyi.com",
  "description": "曾亮懿的个人网站。记录 AI Native 探索、开发者工具与全栈产品实践。"
}
{
  "@context": "https://schema.org",
  "@type": "BlogPosting",
  "headline": "Configuring Cloud LLMs: Providers, Endpoints, and Summaries",
  "description": "Follow ChatCrystal provider registrations to configure remote generation and check native APIs, gateways, persisted settings, credentials, and test boundaries.",
  "url": "https://zengliangyi.com/en/blog/cloud-llm-configuration/",
  "image": "https://zengliangyi.com/images/blog/cloud-llm-configuration.svg",
  "datePublished": "2026-10-03T00:00:00.000Z",
  "dateModified": "2026-10-23T00:00:00.000Z",
  "author": {
    "@type": "Person",
    "name": "曾亮懿",
    "url": "https://zengliangyi.com/en/about"
  },
  "publisher": {
    "@type": "Organization",
    "name": "ZengLiangYi Blog",
    "logo": {
      "@type": "ImageObject",
      "url": "https://zengliangyi.com/favicon-96x96.png"
    }
  },
  "mainEntityOfPage": {
    "@type": "WebPage",
    "@id": "https://zengliangyi.com/en/blog/cloud-llm-configuration/"
  }
}
{
  "@context": "https://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement": [
    {
      "@type": "ListItem",
      "position": 1,
      "name": "Home",
      "item": "https://zengliangyi.com/en"
    },
    {
      "@type": "ListItem",
      "position": 2,
      "name": "Blog",
      "item": "https://zengliangyi.com/en/blog"
    },
    {
      "@type": "ListItem",
      "position": 3,
      "name": "Configuring Cloud LLMs: Providers, Endpoints, and Summaries",
      "item": "https://zengliangyi.com/en/blog/cloud-llm-configuration/"
    }
  ]
}
```
