Content Management
Ein Headless-CMS mit Collections, Entries, Locales und Releases. Inhalte über das Content-Panel oder das SDK verwalten.
Proyecta verfügt über ein vollständiges Headless-CMS. Es ist schema-first: Du definierst Collections (strukturierte Inhaltstypen) und erstellst anschließend Entries, die den Feldern der jeweiligen Collection entsprechen. Entries können lokalisiert und in Releases gruppiert werden.
Das Content-Panel
Abschnitt betitelt „Das Content-Panel“Inhalte können über das SDK oder per Anweisung an die KI verwaltet werden. Die Content-API umfasst sechs Ressourcentypen:
| Tab / Ressource | Wofür es gedacht ist |
|---|---|
| Collections | Content-Schemata definieren und verwalten (z. B. „Blog Post”, „FAQ”, „Product Spec”) |
| Fields | Typisierte Felder innerhalb einer Collection (werden als Unterressource von Collections verwaltet) |
| Entries | Entries einer Collection durchsuchen, erstellen, bearbeiten, veröffentlichen und löschen |
| Locales | Sprach- und Regions-Locales für übersetzte Inhalte hinzufügen und verwalten |
| Releases | Entries gruppieren, um sie gemeinsam zu veröffentlichen (oder zu depublizieren); manuell über releases.publish() publizieren |
| Assets | Mediendateien (Bilder, Videos, PDFs) hochladen und verwalten, die in Entries referenziert werden können |
Klicke im Tab Collections auf eine Collection, um direkt zu deren Entries zu springen. Im Tab Entries kannst du einzelne Inhaltselemente erstellen, bearbeiten, veröffentlichen und löschen.
Alles lässt sich auch programmatisch über das SDK (proyecta.content) steuern.
Konzepte
Abschnitt betitelt „Konzepte“| Konzept | Was es ist |
|---|---|
| Collection | Ein Schema – die Struktur eines Inhaltstyps (z. B. „Blog Post”, „FAQ”, „Product Spec”) |
| Field | Ein typisiertes Feld in einer Collection (z. B. title: string, body: rich_text, coverImage: asset) |
| Entry | Eine einzelne Instanz einer Collection (ein Blog-Beitrag, ein FAQ-Eintrag) |
| Asset | Eine hochgeladene Mediendatei, die in Entries referenziert werden kann |
| Locale | Eine Sprache/Region, in die der Inhalt übersetzt wird |
| Release | Eine Gruppe von Entries, die gleichzeitig veröffentlicht (oder depubliziert) werden sollen |
Schnellstart
Abschnitt betitelt „Schnellstart“import Proyecta from '@proyecta-ai/sdk';
const proyecta = new Proyecta({ apiKey: process.env.PROYECTA_API_KEY });
// 1. Define a collectionconst blog = await proyecta.content.collections.create({ api_id: 'blogPost', name: 'Blog Post', // fields are added via collections.fields.create()});
// 2. Create an entryconst post = await proyecta.content.entries.create({ collection_id: blog.id, data: { title: 'Hello, world', body: 'My very first post.', },});
// 3. Publish itawait proyecta.content.entries.publish({ entryId: post.id });Collections
Abschnitt betitelt „Collections“// Browse collectionsfor await (const collection of proyecta.content.collections.list()) { console.log(collection.name);}
// Add or remove fields on a collectionawait proyecta.content.collections.fields.create(blog.id, { /* field definition */});await proyecta.content.collections.fields.delete(blog.id, fieldId);Entries
Abschnitt betitelt „Entries“Entries sind die eigentlichen Inhaltszeilen. Jede Entry gehört zu einer Collection und enthält Daten, die den Feldern dieser Collection entsprechen.
// Browse entries (pass the collection's api_id, not its numeric id)for await (const entry of proyecta.content.entries.list({ collection: 'blogPost' })) { console.log(entry);}
// Update an entryawait proyecta.content.entries.update(post.id, { data: { title: 'Updated title' } });
// Publish an entryawait proyecta.content.entries.publish({ entryId: post.id });
// Delete an entryawait proyecta.content.entries.delete(post.id);Asset-Uploads sind erstklassig unterstützt – nutze sie, um Bilder, Videos oder PDFs an deine Entries anzuhängen:
// Browse assetsfor await (const asset of proyecta.content.assets.list()) { console.log(asset);}
// Upload, update, or delete via assets.create / assets.update / assets.deleteFür chat-gesteuerte Datei-Uploads (per Drag-and-drop in den Builder) siehe Dateien & Medien.
Lokalisierung
Abschnitt betitelt „Lokalisierung“Inhalte können in mehrere Locales übersetzt werden. Jede Locale ist ein Datensatz, der über proyecta.content.locales verwaltet wird:
await proyecta.content.locales.create({ /* code, name, etc. */});
for await (const locale of proyecta.content.locales.list()) { console.log(locale);}Beim Abrufen von Entries kannst du die Übersetzung einer bestimmten Locale anfordern. Den umfassenden Überblick über Internationalisierung findest du unter Internationalisierung.
Releases
Abschnitt betitelt „Releases“Ein Release ist ein Bündel von Entries, die gleichzeitig veröffentlicht (oder depubliziert) werden. So kannst du einen koordinierten Content-Drop vorbereiten – etwa einen Marketing-Launch, eine neue Produktseite oder eine FAQ-Aktualisierung – und alles atomar umschalten lassen.
Hinweis: Automatisches zeitgesteuertes Veröffentlichen ist noch nicht implementiert. Releases mit einem
scheduled_at-Datum erhalten den Statusscheduled, müssen aber manuell überreleases.publish()publiziert werden. Das automatische Veröffentlichen zum angegebenen Zeitpunkt ist in Kürze verfügbar.
// Create a release (optionally with a target date)const release = await proyecta.content.releases.create({ name: 'Monday launch', scheduled_at: '2024-01-08T09:00:00Z',});
// Manually publish a release when readyawait proyecta.content.releases.publish({ releaseId: release.id });
// Browse releasesfor await (const r of proyecta.content.releases.list()) { console.log(r);}Um den Zeitplan eines Releases zu ändern, lösche ihn und erstelle ihn neu – es gibt keinen Update-Endpoint.
Häufige Anwendungsfälle (die KI erledigt die Umsetzung)
Abschnitt betitelt „Häufige Anwendungsfälle (die KI erledigt die Umsetzung)“"Build a blog using the Proyecta Content API. Collection 'Blog Post' with fields: title, slug, excerpt, body (rich text), coverImage (asset), author. Public route at /blog and /blog/[slug].""Create an FAQ collection in Proyecta Content. Build an admin page where I can add/edit FAQs and a public /faq page.""Set up a multi-language landing page using Proyecta Content with English and Spanish locales.""Create a release containing three blog posts and publish it manually when ready."
Wann Content vs. Datenbank verwenden
Abschnitt betitelt „Wann Content vs. Datenbank verwenden“| Anwendungsfall | Empfehlung |
|---|---|
| Redaktionelle Inhalte (Beiträge, FAQs, Marketing-Texte) – benötigt Veröffentlichungs-/Entwurfsstatus, Planung, Lokalisierung | Content-API |
| App-Daten (Nutzer, Bestellungen, Positionen) – benötigt Abfragegeschwindigkeit, Transaktionen, Echtzeit | Datenbank |
| Statische Assets im Code | Verzeichnis public/ in deinem Projekt |
| Von Nutzern hochgeladene Dateien | Dateien & Medien |
Demnächst verfügbar
Abschnitt betitelt „Demnächst verfügbar“- Rich-Text-Entry-Editor – vollständige WYSIWYG-Bearbeitung für
rich_text-Felder im Content-Panel - Live-Vorschau von Inhaltsänderungen in deiner App
- Content-Rollen – separate Editor-Berechtigungen und Entwickler-Berechtigungen