6.0 KiB
Installation Model Catalog
ThothII has one operator-authored model source: modelCatalog in
deploy/<installation-id>/thothii-installation.yaml. It declares models used by interactive Pi
sessions, metadata generation, and the internal embedding service. Workspace descriptors never
declare providers, model allowlists, defaults, embeddings, dimensions, or vector-store settings.
Do not edit deploy/pi/models.json, deploy/pi/settings.json, files under generated/, or
provider/model environment defaults. Those former sources are retired.
Minimal catalog
schemaVersion: 2
modelCatalog:
defaults:
session: zai/glm-5.3
metadataGeneration: zai/glm-5.3
embedding:
id: ollama/qwen3-embedding:0.6b
dimensions: 1024
providers:
zai:
endpoint:
baseUrl: https://api.z.ai/api/coding/paas/v4
authentication:
mode: secret_env
apiKeyEnv: ZAI_API_KEY
session:
mode: openai_compatible
metadataGeneration:
litellmProvider: openai
models:
glm-5.3:
label: GLM 5.3
session:
reasoning: true
contextWindow: 200000
maxTokens: 131072
metadataGeneration: {}
Provider and model entries are maps. The keys form the canonical identity
<provider-key>/<model-key>; label is only display text. A model is eligible for a use only when
it contains that use block:
sessionmakes it selectable for interactive sessions;metadataGenerationmakes it selectable for description generation;embeddingis a single installation-level model rather than a selectable list.
defaults.session is required. defaults.metadataGeneration is required exactly when at least
one metadata-generation model exists. A session manifest pins its canonical identity, so removing a
model never silently changes an existing session: resume fails with model_unavailable.
Session adapters
Use pi_builtin for a model whose technical definition ships with Pi:
deepseek:
authentication:
mode: pi_auth
session:
mode: pi_builtin
models:
deepseek-v4-pro:
session: {}
Use openai_compatible for an explicit compatible endpoint. Each eligible session model must then
declare the technical limits Pi needs. upstreamModel is optional and is used only when the
endpoint expects a model name different from the catalog key.
Provider integrations remain declarative. Do not register providers from
harness/.pi/extensions/; those extensions implement the workflow and human gates only.
Authentication
Every provider chooses one explicit mode:
secret_envnames an approved key in the protected ThothII secret bundle throughapiKeyEnv;pi_authuses Pi's protected authentication projection and is valid only for session-onlypi_builtinproviders;noneis valid only with an explicit keyless endpoint.
Secret values never belong in installation YAML, generated files, logs, CLI arguments, or browser requests. The YAML contains only an environment-variable name or an authentication mode. Pi's protected credential file remains selected by the installation authentication configuration.
Generated runtime projections
Before Compose starts, tht validates the installation and atomically writes deterministic files
under deploy/<installation-id>/generated/:
generated/
├── catalog.json
├── pi/
│ ├── models.json
│ └── settings.json
└── compose.model-catalog.yaml
The normalized catalog is consumed by the backend. The Pi files and Compose override are boundary adapters. They are not configuration sources and are excluded from backup. Restore regenerates them from the installation descriptor.
Run all lifecycle commands from the project root and select the descriptor explicitly when more than one installation exists:
INSTALLATION=/absolute/path/deploy/example/thothii-installation.yaml
tht --installation "$INSTALLATION" start
tht --installation "$INSTALLATION" doctor
After editing modelCatalog or provider credentials, reload the current Pi image. Restart validates
the YAML and regenerates projections before recreating core:
tht --installation "$INSTALLATION" pi restart --yes --drain
tht --installation "$INSTALLATION" pi doctor
tht --installation "$INSTALLATION" pi test
tht pi update changes the Pi version; it is not the configuration command. There is no
tht pi configure and no separate apply command.
Migrating a legacy installation
The migrator reads the former installation metadataGeneration block and the two former Pi JSON
files, but never modifies them. Supply the facts that cannot be inferred safely and write a separate
candidate:
tht --installation /absolute/path/legacy-installation.yaml installation migrate \
--output /absolute/path/thothii-installation.v2.yaml \
--session-default zai/glm-5.3 \
--embedding-id ollama/qwen3-embedding:0.6b \
--embedding-dimensions 1024
Review the candidate, move the legacy source files out of the installation only after approval, then select the v2 descriptor. Ambiguous aliases, endpoint conflicts, or missing authentication facts produce field-level errors; the migrator does not guess.
Troubleshooting
| Symptom | Meaning | Action |
|---|---|---|
migration_required |
A retired model source or installation schema is still present | Run the installation migrator and review its candidate |
| Unknown session or metadata default | The canonical ID is missing the corresponding use block | Correct the provider/model key or add the intended use block |
| Generated projection drift | Runtime files differ from the descriptor-derived bytes | Run tht start or tht pi restart --yes --drain |
model_unavailable on resume |
The session's pinned model is no longer session-eligible | Restore that catalog entry or keep the session unavailable; do not remap it |
| Provider smoke failure | Credentials, endpoint, or provider availability is invalid | Correct the protected credential or catalog endpoint, restart, then run tht pi test |