Public Endpoints
This guide describes the admin page Admin → Public Endpoints and the Public Address Override field of each Topic, GraphRAG Topic and Agent. Together they tell the platform where its containers can be reached from outside.
1. Do you even need it?
Only if other systems call a Topic, GraphRAG Topic or Agent directly. The web UI does not need it. In the web UI, chats, source downloads and pictures always go through this app. They work whether or not a public address is set.
You need a public address when, for example:
-
a script or another application chats with a Topic through its REST API,
-
an external system uses a Topic as a tool,
-
an external client should open the download links in an answer.
| Without a public address | With a public address | |
|---|---|---|
Web UI: chat, downloads, pictures |
Works |
Works |
Source links in answers from a Topic or GraphRAG Topic |
Only a path on the container, no complete link |
A complete link, for example |
API clients learn where to call a Topic or Agent |
No — they get no address |
Yes — the address comes with their login token |
The platform does not publish anything itself. Making a container reachable from outside is the job of the cluster or server admin: an Ingress, an API gateway or a reverse proxy, with TLS and rate limits as needed. The platform cannot find out the address you chose. Neither Docker nor Kubernetes knows such an address. So you enter it here, and the platform hands it to each container when it starts.
2. The three kinds of resources
The page has one field per kind. Each field holds a pattern: one address with placeholders, which the platform fills in for each Topic or Agent.
| Field | Used for | What the address is used for |
|---|---|---|
Topics |
RAG Topics |
Complete download and picture links in answers; the address API clients receive |
GraphRAG Topics |
GraphRAG Topics |
Complete download and picture links in answers; the address API clients receive |
Agents |
Agents |
The address API clients receive. The Agent passes on the links of the Topics it asks, so those links come from the Topics' addresses |
Leave a field empty if that kind is not reachable from outside.
3. Placeholders
| Placeholder | Filled with | Example value |
|---|---|---|
|
The ID of the Topic or Agent |
|
|
Its port on the server (RAG Service Port, GraphRAG Service Port or Service Port) |
|
|
Its short technical name: the name in lower case, every other character turned into |
|
Which one to use depends on how you publish the containers:
-
Kubernetes, or a gateway with one route per resource: use
{id}. The ID never changes. Example:api.example.com/topics/{id} -
A single Docker host: use
{port}. On one host, only the port tells the containers apart. Example:http://kf.example.com:{port}— orhttps://kf.example.com/p/{port}behind a proxy. On Kubernetes the port does not tell containers apart, so do not use{port}there. -
Readable addresses: use
{slug}, for example{slug}.topics.example.com. Keep in mind that the slug follows the name. If you rename a Topic or Agent, its address changes at its next start, and your proxy must follow.
You may combine placeholders or use none. A pattern without placeholders gives every resource of that kind the same address. On this page that is almost never what you want. In an override for a single resource it is normal (see section 5).
4. Set the patterns
Navigate to Admin → Public Endpoints.
|
Viewing this page requires the |
-
Under Address Patterns, fill in Topics, GraphRAG Topics and Agents as needed.
-
Check the line under each field:
-
With a pattern, it shows Example: and the address a sample resource would get (ID
3f2b8c1e-…, port8091, slugsupport-3f2b8c1e). -
With an empty field, it shows either Empty — this kind has no public address. Links work only inside this app. or, when the server setting from section 8 is set, Empty — uses the server setting … with its value.
-
-
Click Save. The message reads: "Saved. Each container gets its new address when it is next stopped and started from this app."
Rules for an address
Every field is checked while you type. An invalid field is marked red, and Save refuses with "A pattern is not valid. Fix the highlighted field, then save again."
| Rule | Message |
|---|---|
Only the placeholders |
|
Starts with |
|
Contains a host name |
|
No |
|
A well-formed address, for example without spaces |
|
A path is allowed, for example api.example.com/topics/{id}. A slash at the end is removed
for you, because the container adds its own path.
The section "What the Proxy Has to Do"
The page lists what your proxy, Ingress or gateway must do in front of each container:
-
Forward to port 8080 of the container, without the path prefix. The containers expect their requests at
/. If you publish underapi.example.com/topics/<id>, the proxy must remove/topics/<id>before it forwards. -
Pass the chat streams through without buffering (
/chatbot/stream,/graphrag/chat/stream,/agent/stream) and allow long waiting times. Otherwise answers arrive all at once at the end, or break off. -
Allow requests large enough for your biggest document uploads.
-
Handle the encryption (HTTPS). The containers only speak plain HTTP.
For an NGINX Ingress example, see Making Topics and Agents reachable from outside.
5. One resource with its own address
Sometimes one Topic or Agent is published differently from the pattern, for example under its own host name. Give it a Public Address Override. The override wins over the pattern.
| Resource | Where to find the field | Permission |
|---|---|---|
Topic |
Topic detail → Configuration tab → Edit → section Service Configuration, below RAG Service Port |
|
GraphRAG Topic |
GraphRAG wizard, step 1 Basic Information, section Topic, below the port. Also in edit mode |
|
Agent |
Agent detail → Configuration tab → Edit → section Service Port |
|
The Topic creation wizard and the New Agent dialog have no such field. Set the override after creation, on the Configuration tab. Through the management API you can also set it at creation (see section 7).
How the field works:
-
Empty means: use the pattern from Admin → Public Endpoints. This is the normal case.
-
The same placeholders and rules as on the admin page apply, and the same messages appear. An override may have at most 500 characters.
-
The line below the field shows the address the container will get at its next start: Public address: …, or "No public address — this container hands out no absolute links, and external clients are not told where to reach it." The line follows the port field while you type, so a
{port}pattern shows the new port at once.
An invalid or unusable override does not fall back to the pattern. The resource then has no
public address at all. This is on purpose: you set the override because the pattern is wrong for this
resource. The form refuses an invalid override, so this happens only when the override names a value
the resource does not have, for example {port} without a port.
In view mode, the Configuration tab shows the result as Public Address, or Not configured when there is none.
6. Which address wins, and when it takes effect
Order
For each Topic, GraphRAG Topic and Agent, the platform takes the first address that is set:
-
its own Public Address Override,
-
the pattern for its kind on Admin → Public Endpoints,
-
the server setting for its kind (see section 8),
-
nothing — the resource has no public address.
An invalid pattern from the page or from the server setting is skipped, and the next step applies. An invalid override is not skipped (see section 5).
When a change takes effect
A container learns its address when it is started from this app. So any change — a pattern, an
override, a port used by {port}, or a name used by {slug} — reaches a running container only
after you stop and start it in the web UI or through the management API.
-
An automatic restart does not count. If Docker restarts a container on its own, or Kubernetes restarts a pod, the container keeps the address it was started with.
-
When you change the override of a running resource, the panels offer the restart:
-
Topic: the Restart Required dialog with Save Only and Save & Restart.
-
Agent: the Restart Required dialog with Save Only and Save & Restart. If the Agent is not running, you see "Saved. Restart the agent to apply the changes."
-
GraphRAG Topic: after saving a running topic, the Restart Required dialog with Later and Restart Now.
-
-
A change on Admin → Public Endpoints offers no restart. Restart the affected resources yourself.
-
A restart interrupts running chats for a short time.
7. Where the address shows up
| Place | Field | Content |
|---|---|---|
Login token for API clients — |
|
The address, or |
Management REST API — reading a resource |
|
The address the container gets at its next start, or |
Management REST API — creating or changing a resource |
|
The override. |
Answers of a Topic or GraphRAG Topic |
the download link of each source |
The address plus the path of the file |
The token endpoint and publicAddress show the address as it is configured now. A container that
was started before a change still uses its old address until its next start from this app.
Changing publicAddressOverride through the management API on a running resource reports
restartRequired. Add ?restart=true to restart it in the same call.
8. Server settings (for administrators)
For a deployment that is set up by files (Helm, GitOps), each kind has a server-side fallback. It applies only when the field on Admin → Public Endpoints is empty.
| Kind | Property | Environment variable |
|---|---|---|
Topics |
|
|
GraphRAG Topics |
|
|
Agents |
|
|
The same placeholders and rules apply. An invalid value is ignored, and the app log names it. The admin page shows the value under an empty field.
The containers receive the result as the environment variable CYROCK_PUBLIC_BASE_URL. A resource
without a public address does not get this variable at all.
9. Troubleshooting
| Symptom | Likely cause and fix |
|---|---|
Download links in answers from an API client are only paths, not complete links |
The Topic has no public address, or it was started before the address was set. Set the pattern, then stop and start the Topic in the UI |
A new pattern does not reach a container |
The container was not stopped and started from this app. An automatic Docker or Kubernetes restart keeps the old address |
|
Same cause: both show the configured address, the container still runs with the address it was started with. Restart it from this app |
A resource shows Not configured, although it has an override |
The override names a value the resource does not have, for example |
All Topics got the same address |
The pattern has no placeholder. Add |
The address of a Topic or Agent changed after a rename |
The pattern uses |
The link opens, but the container answers 404 |
The proxy forwards the path prefix. Remove the prefix in the proxy — the containers expect requests at |
Chat answers through the proxy arrive all at once, or break off |
The proxy buffers the stream or its timeout is too short. Switch off buffering for the stream paths and allow long timeouts |
Large uploads through the proxy are refused |
The proxy’s request size limit is too small. Raise it |
The link works only on the machine of the Docker host |
The pattern uses |
An empty field on the page shows Empty — uses the server setting … |
The server setting from section 8 applies. Fill in the field to override it, or change the server setting |
Fields are read-only, Save is missing |
Your role lacks |