postkitty-Dokumentation

Installieren, Anfrage formulieren und jedes Tool, Layout, Limit und jeden API-Endpunkt nachschlagen.

Start

postkitty ist ein Plugin für Hermes Agent. Installieren Sie es einmal, öffnen Sie einen neuen Chat und fragen Sie in einfachen Worten.

Installieren

Führen Sie diesen Befehl in einem Terminal aus. Das Plugin kommt aus dem offiziellen Hermes-Plugin-Katalog.

hermes plugins install postkitty

Antworten Sie mit Ja, wenn Hermes nach den Python-Abhängigkeiten und nach dem Aktivieren des Plugins fragt. Diese Variante überspringt beide Fragen:

hermes plugins install postkitty --yes-deps --enable

Öffnen Sie danach einen neuen Chat. Hermes lädt die Tools eines Plugins erst, wenn der nächste Chat beginnt.

Sie können die Installation auch Hermes überlassen. Senden Sie diese Nachricht:

Installiere für mich das Plugin postkitty: Führe im Terminal `hermes plugins install postkitty --yes-deps --enable` aus. Sag mir danach, dass ich einen neuen Chat öffnen soll, damit seine Tools geladen werden.

Was Sie brauchen

Sie brauchenWofürSo bekommen Sie es
Hermes Agent 0.22.7 oder neuer
Alles
Aktualisieren Sie Hermes, falls Ihre Version älter ist.
Fünf Python-Pakete: OpenCV, NumPy, Pillow, regex und ruamel.yaml
Fotos, Video und Zählen
Das Plugin installiert sie mit. Sie müssen nichts tun.
ffmpeg und ffprobe
Nur Video
Hermes bringt ein eigenes ffmpeg mit. Unter Windows und auf den meisten Linux-Systemen braucht Video sonst nichts. Unter macOS fehlt dieser Kopie ffprobe: Führen Sie einmal brew install ffmpeg aus.
Das YuNet-Modell zur Gesichtserkennung
Fotos und Video
postkitty lädt es einmal aus dem OpenCV Zoo herunter und gleicht die Prüfsumme ab.
Ein ffmpeg-Build mit libass
Nur Untertitel
Das ffmpeg, das Hermes mitbringt, enthält libass. Ob ein eigenes ffmpeg es enthält, zeigt die Zeile „Captions“ von /postkitty doctor.
Eine installierte Schriftart
Nur Untertitel
Ein Desktop hat reichlich davon. Auf einem Server ohne grafische Oberfläche oder in einem Container installieren Sie eine, unter Ubuntu zum Beispiel fonts-dejavu-core.

postkitty braucht keinen API-Schlüssel und kein Konto. Reiner Text kommt ohne die Medienwerkzeuge aus: Auch ohne ffmpeg schreibt und zählt postkitty Ihren Text.

Alles auf einmal prüfen Sie mit diesem Befehl in einem Hermes-Chat:

/postkitty doctor

Der Befehl meldet den Stand von Python, ffmpeg und ffprobe, Untertitel-Unterstützung, OpenCV, Pillow, Gesichtsmodell und Ausgabeordner. Zu jedem Problem nennt er in einer Zeile, wie Sie es beheben, und die letzte Zeile sagt, was jetzt funktioniert: Text, Fotos, Video, Untertitel.

Ihre erste Anfrage

Nennen Sie im neuen Chat die Plattformen und geben Sie Hermes Ihren Entwurf oder den vollständigen Pfad jeder Datei.

Mach mit postkitty aus diesem Beitrag Posts für X, LinkedIn und Instagram und korrigiere meine Formulierungen: [dein Entwurf oder der Pfad zu einem Foto oder Video]

Ein Job besteht aus einem Foto oder einem Video oder je einem von beiden, dazu der Text. Bei mehreren Fotos startet Hermes postkitty einmal pro Foto. Ein Karussell baut postkitty nicht.

Hermes antwortet mit dem Pfad eines Job-Ordners. Die Dateien, die jede Prüfung bestanden haben, liegen in ready/, ein Ordner pro Plattform. Öffnen Sie board.html: Dort steht jede Datei neben ihrem Text, ihrem Alt-Text und ihren Prüfergebnissen.

postkitty/<job>/
  ready/
    instagram/
    linkedin/
    x/
  board.html
  advice.md

Der Job-Ordner entsteht unter ./postkitty in dem Ordner, in dem Ihre Hermes-Sitzung arbeitet. Unter Einstellungen können Sie das ändern.

So fragen Sie

Sie schreiben Hermes in einfachen Worten, und Hermes ruft postkitty auf. Nennt eine Anfrage die Plattformen, die Dateien und das gewünschte Ergebnis, gelingt sie beim ersten Versuch. Jedes Paar unten zeigt eine vage und eine klare Anfrage.

Plattformen nennen

Ohne Angabe bedient postkitty jede Plattform, die zu Ihren Dateien passt. Mit Namen bleibt der Job klein.

Vage Mach das fertig für Social Media.

Klar

Mach [Pfad zum Video] mit postkitty fertig für TikTok, Instagram Reels und YouTube Shorts.

Sagen, wer im Bild bleiben muss

postkitty hält jedes Gesicht, das es findet, im Bild. Sagen Sie es dazu, wenn eine Person wichtiger ist oder wenn niemand abgeschnitten werden darf. postkitty zählt Personen von links.

Vage Schneide das Foto zu.

Klar

Schneide [Pfad zum Foto] mit postkitty für den Instagram-Feed zu. Behalte alle fünf Personen im Bild und stell die zweite Person von links in die Mitte.

Layout-Wörter nutzen

Vier Wörter legen fest, wie aus einem Querformat-Video ein Hochformat-Video wird: crop, split, speaker und Totale, also das Layout pad. Der Abschnitt Layouts zeigt jedes davon.

Vage Mach es hochkant.

Klar

In [Pfad zum Video] sprechen zwei Personen. Für Reels geteilter Bildschirm, für TikTok ein Schnitt auf die Person, die gerade spricht, für Shorts die ganze Totale.

Zeiten für Kürzen und Cover nennen

Nennen Sie Zeiten in Sekunden oder als Minuten und Sekunden. Ohne Angabe kürzt postkitty einen Clip nur, wenn die Plattform ein hartes Längenlimit hat, und wählt das Coverbild selbst.

Vage Mach es kürzer und such ein schönes Thumbnail aus.

Klar

Kürze das Reel auf die ersten 45 Sekunden und nimm das Bild bei 0:12 als Cover.

Ton und Sprache festlegen

Die Formulierungen kommen von dem Modell, das Ihr Hermes nutzt. Es behält Ihren Ton und Ihre Sprache bei, solange Sie nichts anderes sagen.

Vage Schreib was Gutes dazu.

Klar

Schreib den LinkedIn-Post in förmlichem Ton und den X-Post in lockerem, beide auf Englisch. Lass meine Fakten, wie sie sind.

Thread oder einzelnen Post wählen

Text über dem Limit kann auf X, Threads oder Bluesky zu einem nummerierten Thread werden. Sagen Sie, was Sie wollen.

Vage Poste das auf X.

Klar

Mach daraus mit postkitty einen Thread auf X und behalte meinen Ton. Die Bluesky-Version soll ein einzelner Post bleiben: [dein langer Beitrag]

Untertitel als Datei mitbringen

postkitty brennt Untertitel aus einer .srt- oder .vtt-Datei ein, höchstens zwei Zeilen gleichzeitig und im sicheren Bereich der Plattform für Untertitel. Ton transkribiert es nicht, bringen Sie die Datei also mit.

Vage Füg dem Video Untertitel hinzu.

Klar

Brenne die Untertitel aus [Pfad zur .srt-Datei] mit postkitty in die Clips für TikTok und Reels ein.

Änderungen verlangen

Nennen Sie die Plattform und was sich ändern soll. postkitty erstellt nur diesen Text oder diese Datei neu und prüft erneut.

Vage Gefällt mir nicht, mach es noch mal.

Klar

Mach den LinkedIn-Post kürzer und förmlicher, nimm andere Hashtags und stell im Instagram-Foto die Person links in den Fokus.

Eine Datei vor dem Upload prüfen

postkitty prüft auch eine fremde Datei gegen die Limits einer Plattform. Nennen Sie die Datei und die Plattform.

Vage Ist das Video okay?

Klar

Kann ich [Pfad zur Datei] so auf TikTok hochladen? Prüf das mit postkitty.

Tools

Hermes ruft fünf Tools auf, in dieser Reihenfolge: scan, write, make und für Änderungen redo. Das Tool check ist für Dateien da, die nicht von postkitty stammen. Sie rufen die Tools nie selbst auf. Dieser Abschnitt hilft Ihnen nachzuvollziehen, was Hermes getan hat, und auf dem Plugin aufzubauen.

postkitty_scan

Liest die Eingaben und plant den Job

Liest die Eingaben und plant den Job. Es legt den Job-Ordner an, findet Personen, Einstellungen und Szenen und plant für jedes Ziel den Bildausschnitt. Es rendert nichts und funktioniert auch mit reinem Text.

ArgumentTypBedeutung
inputs
string[]
Pfad eines Fotos oder eines Videos, oder je eines von beiden. Ein relativer Pfad beginnt in dem Ordner, in dem Ihre Sitzung arbeitet.
text
string
Ihr Entwurf, falls vorhanden.
platforms
string[]
Plattformnamen (instagram, tiktok, youtube, x, linkedin, threads, bluesky, facebook) oder Ziel-IDs. Ohne Angabe: jedes Ziel, das zu den Eingaben passt.
job
string
Eine vorhandene Job-ID, um diesen Job fortzusetzen.

Rückgabe. Die Job-ID, die Fakten zu jeder Eingabe (Art, Größe, Länge, Personen, Einstellungen), der Plan für jedes Ziel (Layout, Kürzung, Coverbild), die Limits jeder Plattform, die Zählung Ihres Textes und der Pfad eines Vorschaubilds.

postkitty_write

Zählt den Text jeder Plattform und schreibt die Textdateien

Zählt den Text jeder Plattform nach deren echter Regel und schreibt die Textdateien. Text über dem Limit teilt es auf X, Threads oder Bluesky in einen nummerierten Thread. Hermes ruft es mit einem überarbeiteten Entwurf erneut auf, bis jede Plattform ok meldet, und danach für jede spätere Textänderung.

ArgumentTypBedeutung
jobPflicht
string
Die Job-ID, die postkitty_scan zurückgegeben hat.
advice
object
Was Hermes über den Beitrag herausgearbeitet hat: topic, audience, tone, key_message, ein ranking der Plattformen mit je einer Begründung und tips.
drafts
object
Ein Entwurf pro Plattformname oder Ziel-ID. Eine Liste von Strings ist ein Thread.
alt_text
object
Alt-Text pro Ziel-ID, Name einer Eingabedatei oder Pfad einer fertigen Datei. Er beschreibt nur, was zu sehen ist.
split_threads
boolean
Teilt Text über dem Limit in einen Thread. Standard: true.

Rückgabe. Für jede Plattform: die Zählung, die Einheit, das Limit, ok, der Überhang und der Teil, der sichtbar bleibt, bevor der Feed den Text abschneidet. Es schreibt advice.md in den Job-Ordner und die Dateien post.txt, thread.txt und alt.txt nach ready/.

postkitty_make

Rendert, prüft, repariert und baut das Review-Board

Rendert jedes geplante Ziel, prüft jede Datei gegen die veröffentlichten Limits der Plattform, repariert, was durchfällt, und legt nur Dateien in ready/ ab, die alle Prüfungen bestanden haben. Es schreibt auch das Review-Board. Bei einem Job nur mit Text gibt es nichts zu rendern.

ArgumentTypBedeutung
jobPflicht
string
Die Job-ID, die postkitty_scan zurückgegeben hat.
targets
string[]
Nur diese Ziel-IDs oder Plattformen. Ohne Angabe: jedes geplante Ziel.
overrides
object
Pro Ziel-ID beliebige der Schlüssel layout, focus, trim, cover_at und captions, wie unter postkitty_redo beschrieben.

Rückgabe. Eine Tabelle mit einer Zeile pro Ziel. Eine Datei ist nur dann bereit zum Hochladen, wenn ihr Status ready oder repaired ist. Zeilen mit failed sagen, was falsch ist, Zeilen mit skipped nennen das fehlende Programm.

postkitty_redo

Ändert eine Foto- oder Video-Ausgabe

Rendert ein Foto- oder Video-Ziel neu, wenn Sie eine Änderung verlangen: ein anderes Layout, eine andere Person im Fokus, eine Kürzung, ein anderes Coverbild oder Untertitel. Es nutzt den vorhandenen Scan und ist deshalb schnell. Schlägt das erneute Rendern fehl, bleibt die frühere Datei, die alle Prüfungen bestanden hat, an ihrem Platz.

ArgumentTypBedeutung
jobPflicht
string
Die Job-ID, die postkitty_scan zurückgegeben hat.
targetPflicht
string
Das Ziel, das neu gerendert wird, zum Beispiel tiktok oder instagram_feed.
layout
crop | split | speaker | seam | pad | auto
Wie das Bild aufgebaut ist. Siehe Layouts.
focus
string
Wen oder was das Bild behält. Siehe Fokus.
trim
[number, number]
Start und Ende in Sekunden. Nur Video.
cover_at
number
Zeitpunkt des Coverbilds in Sekunden. Nur Video.
captions
string
Pfad einer .srt- oder .vtt-Datei, die ins Video eingebrannt wird. none entfernt zuvor gesetzte Untertitel. Nur Video.

Rückgabe. Dieselbe Tabelle wie bei postkitty_make, für dieses eine Ziel.

postkitty_check

Prüft eine Datei, die nicht von postkitty stammt

Prüft eine Datei, die nicht von postkitty stammt, gegen ein Ziel einer Plattform und rendert dabei nichts. Dateien aus make und redo sind bereits geprüft.

ArgumentTypBedeutung
path
string
Pfad der Datei, die geprüft wird.
target
string
Eine Ziel-ID wie x_image oder ein Plattformname, wenn die Plattform für diese Dateiart genau ein Ziel hat, zum Beispiel tiktok.
job
string
Eine Job-ID, um die fertigen Dateien dieses Jobs erneut zu prüfen.

Rückgabe. Bestanden oder durchgefallen, dazu jede fehlgeschlagene Prüfung mit dem verletzten Limit.

Der Befehl /postkitty

Geben Sie diese Befehle in einem Hermes-Chat ein. Die Antwort kommt sofort und ohne das Modell.

BefehlFunktion
/postkitty
Was postkitty tut, Beispielanfragen und jedes Ziel mit Größe und wichtigsten Limits.
/postkitty tiktok
Ziele und Limits einer Plattform. Jeder Plattformname funktioniert.
/postkitty doctor
Prüft Ihr Setup und nennt zu jedem Problem in einer Zeile, wie Sie es beheben.
/postkitty check <file> [target]
Prüft eine Datei gegen ein Ziel und gibt das Ergebnis aus. Ohne Ziel fragt der Befehl nach.

Dieselbe Engine läuft auch im Terminal, für Skripte und Cron-Jobs:

BefehlFunktion
hermes postkitty doctor
Die Setup-Prüfung.
hermes postkitty platforms [name]
Jedes Ziel mit seinen Limits oder die Ziele einer Plattform.
hermes postkitty check FILE [--target ID]
Prüft eine Datei gegen ein Ziel. Fällt die Datei durch, ist der Exit-Code 1.
hermes postkitty make [FILES] [options]
Erstellt und prüft alle Dateien für einen Beitrag und gibt die Statustabelle aus. Der Text wird gezählt und geteilt, wie er ist, und nicht umgeschrieben. Optionen: --text, --text-file, --platforms, --layout, --focus, --captions, --out. Der Exit-Code ist nur dann 0, wenn jede Datei bereit ist.

Einstellungen

Drei Einstellungen, alle optional. Sie ändern sie in den Plugin-Einstellungen von Hermes.

EinstellungBedeutungStandard
output_dirAusgabeordner
Wohin die Job-Ordner geschrieben werden.
./postkitty in dem Ordner, in dem Ihre Sitzung arbeitet
default_platformsStandardplattformen
Die Plattformen, die postkitty bedient, wenn Sie keine nennen.
Jede Plattform, die zur Eingabe passt
loudness_lufsZiellautheit (LUFS)
Die Lautheit, auf die der Ton von Videos normalisiert wird.
-14

Layouts

Ein Layout legt fest, wie ein breites Bild das Format bekommt, das eine Plattform vorgibt. postkitty wählt für jedes Ziel eines. Sie können jederzeit ein anderes verlangen.

crop

zuschneiden, der Person folgen

Schneidet das Bild auf das neue Format zu und hält das Motiv darin. Im Video folgt der Bildausschnitt der Person, wenn sie sich bewegt.

Eine Töpferin steht am linken Rand eines breiten Fotos. Der Mittelschnitt zeigt ein leeres Fenster. Der postkitty-Schnitt hält sie im Bild. Bild vergrößern

split

geteilter Bildschirm, übereinander setzen

Setzt zwei Personen in einem Hochformat-Bild übereinander, jede in ihre eigene Hälfte. Gut, wenn zwei Personen weit voneinander entfernt sitzen.

Zwei Podcast-Moderatoren sitzen in einer Totale weit voneinander entfernt. Der Mittelschnitt zeigt den leeren Tisch zwischen ihnen. postkitty setzt beide in einem Hochformat-Bild übereinander. Bild vergrößern

speaker

Schnitt auf die Person, die gerade spricht

Zeigt immer nur eine Person und schneidet auf die, die gerade spricht. Nur Video.

seam

Hintergrund zusammenschieben

Entfernt Hintergrund zwischen zwei Personen, damit beide ganz ins Bild passen. Nur Fotos.

pad

die ganze Totale, alles behalten

Behält das ganze Bild und füllt den Rest der Fläche mit einer unscharfen Kopie davon. Nichts wird abgeschnitten.

Fünf Personen auf einem breiten Teamfoto. Der Mittelschnitt schneidet die beiden am Rand ab. postkitty behält alle fünf und füllt das Bild oben und unten mit einem unscharfen Streifen. Bild vergrößern

Fokus

Der Fokus legt fest, um wen oder was postkitty das Bild baut. In einfachen Worten: „Stell die Frau links in die Mitte“. Ohne Vorgabe schneidet postkitty niemanden ab. Ein Fokus, den Sie setzen, gilt auch dann, wenn dadurch jemand aus dem Bild fällt, und das Ergebnis nennt diese Person.

WertBedeutung
auto
postkitty entscheidet anhand der gefundenen Gesichter. Das ist der Standard.
person:N
Eine Person, von links gezählt: person:1 ist die Person ganz links.
left
Der linke Teil des Bildes.
center
Die Mitte des Bildes.
right
Der rechte Teil des Bildes.
x:0.0-1.0
Ein Punkt auf der Breite: x:0.0 ist der linke Rand, x:1.0 der rechte.

Plattformen und Limits

Diese Tabellen entstehen aus platforms.yaml, der Datei, gegen die postkitty prüft. Jedes Limit verlinkt auf die Seite, von der es stammt.

Geprüft am

Textlimits

Jede Plattform zählt Text auf ihre eigene Weise, und postkitty zählt genauso.

PlattformLimitRegelQuelle
Instagram
2.200 Zeichen
Geprüft und repariert
Instagram
5 Hashtags
Geprüft und repariert
Instagram
20 Erwähnungen
Geprüft und repariert
TikTok
2.200 UTF-16-Einheiten
Geprüft und repariert
YouTube Shorts
100 Zeichen
Geprüft und repariert
X
280 gewichtete Zeichen
Geprüft und repariert
LinkedIn
3.000 Zeichen
Geprüft und repariert
Threads
500 Zeichen
Geprüft und repariert
Bluesky
300 Grapheme
Geprüft und repariert
Bluesky
3.000 Bytes
Geprüft und repariert
Facebook
63.206 Zeichen
Nur Empfehlung
  • X: postkitty nutzt eine Portierung der von X veröffentlichten twitter-text-Regeln. Ein Link zählt 23 Zeichen, und ein Dateiname wie README.md zählt als Link.
  • Threads zählt ein Emoji mit seinen UTF-8-Bytes.
  • Die 3.000 Bytes von Bluesky gelten für jeden Post eines Threads.
  • Die 100 Zeichen bei YouTube sind das Limit für den Titel des Shorts.

Größen und Dateilimits

Ein Ziel ist eine Art von Datei für eine Plattform. Öffnen Sie eine Plattform, um zu sehen, was postkitty für sie erstellt und welche Limits es prüft.

Instagram

Reel, Feed-Foto, Story

Reel instagram_reelVideo, 1080 × 1920 px

LimitWertRegelQuelle
Dateityp
MP4, MOV
Geprüft und repariert
Videocodec
H.264, HEVC
Geprüft und repariert
Audio-Abtastrate
48 kHz
Geprüft und repariert
Niedrigste Bildrate
23 fps
Geprüft und repariert
Höchste Bildrate
60 fps
Geprüft und repariert
Kürzeste Dauer
3 s
Geprüft und repariert
Längste Dauer
15 min
Geprüft und repariert
Größte Datei
300 MB
Geprüft und repariert
Höchste Videobitrate
25 Mbit/s
Geprüft und repariert
Höchste Audiobitrate
128 kbit/s
Geprüft und repariert
Freizuhaltender Rand
oben 14 %, unten 35 %, seitlich 6 %
Nur Empfehlung

Feed-Foto instagram_feedBild, 1080 × 1350 px

LimitWertRegelQuelle
Bildformat
JPEG
Geprüft und repariert
Größte Datei
8 MB
Geprüft und repariert
Seitenverhältnisse, von und bis
4:5, 1.91:1
Geprüft und repariert

Story instagram_storyBild oder Video, 1080 × 1920 px

LimitWertRegelQuelle
Längste Dauer
1 min
Nur Empfehlung
Freizuhaltender Rand
oben 14 %, unten 35 %, seitlich 6 %
Nur Empfehlung

TikTok

Video

Video tiktokVideo, 1080 × 1920 px

LimitWertRegelQuelle
Dateityp
MP4, WEBM, MOV
Geprüft und repariert
Videocodec
H.264, HEVC, VP8, VP9
Geprüft und repariert
Niedrigste Bildrate
23 fps
Geprüft und repariert
Höchste Bildrate
60 fps
Geprüft und repariert
Kürzeste Seite
360 px
Geprüft und repariert
Längste Seite
4.096 px
Geprüft und repariert
Längste Dauer
10 min
Geprüft und repariert
Größte Datei
4 GB
Geprüft und repariert
Freizuhaltender Rand
oben 12,5 %, unten 34,4 %, links 11,1 %, rechts 27,8 %
Nur Empfehlung

YouTube Shorts

Short

Short youtube_shortsVideo, 1080 × 1920 px

LimitWertRegelQuelle
Längste Dauer
3 min
Geprüft und repariert
Höchste Videobitrate
8 Mbit/s
Nur Empfehlung
Freizuhaltender Rand
oben 15 %, unten 35 %, links 4,4 %, rechts 17,8 %
Nur Empfehlung

X

Video, Bild

Video x_videoVideo, 1920 × 1080 px

LimitWertRegelQuelle
Längste Dauer
140 s
Geprüft und repariert
Größte Datei
512 MB
Geprüft und repariert

Bild x_imageBild, 1600 × 900 px

LimitWertRegelQuelle
Bildformat
JPEG, PNG, GIF, WEBP
Geprüft und repariert
Größte Datei
5 MB
Geprüft und repariert

LinkedIn

Video, Bild

Video linkedin_videoVideo, 1080 × 1350 px

LimitWertRegelQuelle
Kürzeste Dauer
3 s
Geprüft und repariert
Längste Dauer
15 min
Geprüft und repariert
Kleinste Datei
75 kB
Geprüft und repariert
Größte Datei
5 GB
Geprüft und repariert
Niedrigste Bildrate
10 fps
Geprüft und repariert
Höchste Bildrate
60 fps
Geprüft und repariert
Höchste Videobitrate
30 Mbit/s
Geprüft und repariert
Schmalstes Seitenverhältnis
1:2,4
Geprüft und repariert
Breitestes Seitenverhältnis
2,4:1
Geprüft und repariert

Bild linkedin_imageBild, 1080 × 1080 px

LimitWertRegelQuelle
Seitenverhältnisse
1:1, 1.91:1, 4:5
Nur Empfehlung

Threads

Video, Bild

Video threads_videoVideo, 1080 × 1920 px

LimitWertRegelQuelle
Dateityp
MP4, MOV
Geprüft und repariert
Videocodec
H.264, HEVC
Geprüft und repariert
Niedrigste Bildrate
23 fps
Geprüft und repariert
Höchste Bildrate
60 fps
Geprüft und repariert
Längste Dauer
5 min
Geprüft und repariert
Größte Datei
1 GB
Geprüft und repariert

Bild threads_imageBild, 1080 × 1350 px

LimitWertRegelQuelle
Bildformat
JPEG, PNG
Geprüft und repariert
Größte Datei
8 MB
Geprüft und repariert

Bluesky

Video, Bild

Video bluesky_videoVideo, 1080 × 1920 px

LimitWertRegelQuelle
Größte Datei
300 MB
Geprüft und repariert
Längste Dauer
10 min
Nur Empfehlung

Bild bluesky_imageBild, 1080 × 1350 px

LimitWertRegelQuelle
Größte Datei
2 MB
Geprüft und repariert

Facebook

Reel, Feed-Foto

Reel facebook_reelVideo, 1080 × 1920 px

LimitWertRegelQuelle
Seitenverhältnisse
9:16
Nur Empfehlung
Freizuhaltender Rand
oben 14 %, unten 35 %, seitlich 6 %
Nur Empfehlung

Feed-Foto facebook_feedBild, 1080 × 1350 px

LimitWertRegelQuelle
Seitenverhältnisse
4:5
Nur Empfehlung

API

Hinter der Website läuft dieselbe Engine als HTTP-API, und Sie können sie ebenfalls aufrufen. Ein Sprachmodell hat sie nicht: Sie zählt, prüft und teilt Text, erstellt und prüft Dateien und lässt Ihre Formulierungen unverändert. Einen Schlüssel brauchen Sie nicht.

https://postkitty.mertkayacs.com/api
MethodeEndpunktFunktion
GET
/v1/health
Ob der Dienst läuft, und seine Version.
GET
/v1/limits
Die eigenen Obergrenzen des Dienstes als Zahlen: Dateien pro Job, Dateigrößen, Videolänge, Textlänge und Aufrufe pro Stunde.
GET
/v1/platforms
Jedes Ziel mit Größe und Limits.
POST
/v1/text
Zählt einen Text für jede Plattform und teilt ihn in einen Thread, wo er über dem Limit liegt.
POST
/v1/check
Prüft eine hochgeladene Datei gegen ein Ziel.
POST
/v1/jobs
Startet einen Job aus hochgeladenen Fotos oder einem Video. Antwortet sofort mit der Job-ID.
GET
/v1/jobs/{id}
Der Status eines Jobs: queued, running, done oder failed, mit seinen Zielen und Dateien.
GET
/v1/jobs/{id}/files/{path}
Eine fertige Datei.
GET
/v1/jobs/{id}/download
Alle fertigen Dateien als ZIP-Datei.
DELETE
/v1/jobs/{id}
Löscht den Job und seine Dateien sofort.

Text zählen und teilen

Senden Sie JSON mit text. platforms ist optional, Standard sind alle acht. Setzen Sie split_threads auf false, dann erhalten Sie statt eines Threads den Überhang.

curl -s https://postkitty.mertkayacs.com/api/v1/text \
  -H "Content-Type: application/json" \
  -d '{"text": "We shipped postkitty 1.0 today.", "platforms": ["x", "bluesky"]}'
import requests

reply = requests.post(
    "https://postkitty.mertkayacs.com/api/v1/text",
    json={"text": "We shipped postkitty 1.0 today.", "platforms": ["x", "bluesky"]},
    timeout=30,
)
reply.raise_for_status()
for platform, result in reply.json()["platforms"].items():
    print(platform, result["count"], "of", result["limit"], "ok" if result["ok"] else "too long")
const reply = await fetch("https://postkitty.mertkayacs.com/api/v1/text", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({ text: "We shipped postkitty 1.0 today.", platforms: ["x", "bluesky"] }),
})
if (!reply.ok) throw new Error((await reply.json()).error.message)
const { platforms } = await reply.json()
for (const [platform, result] of Object.entries(platforms)) {
  console.log(platform, result.count, "of", result.limit, result.ok ? "ok" : "too long")
}

Die Antwort enthält einen Eintrag pro Plattform: count, limit, ok, den Überhang, den Teil, der im Feed sichtbar bleibt, und die Teile des Threads.

Eine Datei prüfen

Senden Sie die Datei als multipart/form-data mit einem target, zum Beispiel tiktok oder instagram_feed. Die Antwort sagt, ob die Datei besteht, und listet die fehlgeschlagenen Prüfungen auf.

curl -s https://postkitty.mertkayacs.com/api/v1/check \
  -F "[email protected]" \
  -F "target=tiktok"
import requests

with open("clip.mp4", "rb") as clip:
    reply = requests.post(
        "https://postkitty.mertkayacs.com/api/v1/check",
        files={"file": clip},
        data={"target": "tiktok"},
        timeout=120,
    )
reply.raise_for_status()
print(reply.json())
const form = new FormData()
form.append("file", fileInput.files[0])
form.append("target", "tiktok")

const reply = await fetch("https://postkitty.mertkayacs.com/api/v1/check", { method: "POST", body: form })
if (!reply.ok) throw new Error((await reply.json()).error.message)
console.log(await reply.json())

Dateien erstellen

Laden Sie ein Foto oder ein Video als files hoch. GET /v1/limits nennt, wie viele Dateien ein Job annimmt. text, platforms, layout und focus sind optional, und ein Job nur mit Text ist ebenfalls möglich. Der Aufruf kehrt sofort mit der Job-ID und den zugehörigen Links zurück. Fragen Sie den Job alle zwei Sekunden ab, bis sein status done oder failed ist, und laden Sie dann einzelne Dateien oder das ZIP herunter, das auch das Review-Board enthält.

# 1. Start a job. The reply carries its id.
curl -s https://postkitty.mertkayacs.com/api/v1/jobs \
  -F "[email protected]" \
  -F "text=Meet the team behind the launch." \
  -F "platforms=instagram,bluesky"

# 2. Ask every two seconds until status is done or failed.
curl -s https://postkitty.mertkayacs.com/api/v1/jobs/JOB_ID

# 3. Download the finished files as one zip.
curl -s -o postkitty.zip https://postkitty.mertkayacs.com/api/v1/jobs/JOB_ID/download

# 4. Delete the job now instead of waiting.
curl -s -X DELETE https://postkitty.mertkayacs.com/api/v1/jobs/JOB_ID
import time
import requests

API = "https://postkitty.mertkayacs.com/api"

with open("team.jpg", "rb") as photo:
    reply = requests.post(
        f"{API}/v1/jobs",
        files={"files": photo},
        data={"text": "Meet the team behind the launch.", "platforms": "instagram,bluesky"},
        timeout=120,
    )
reply.raise_for_status()
job = reply.json()

while job["status"] in ("queued", "running"):
    time.sleep(2)
    job = requests.get(API + job["links"]["status"], timeout=30).json()

if job["status"] == "done":
    archive = requests.get(API + job["links"]["download"], timeout=120)
    with open("postkitty.zip", "wb") as out:
        out.write(archive.content)
else:
    print(job["error"]["message"], job["error"]["hint"])

requests.delete(API + job["links"]["status"], timeout=30)
const API = "https://postkitty.mertkayacs.com/api"

const form = new FormData()
form.append("files", fileInput.files[0])
form.append("text", "Meet the team behind the launch.")
form.append("platforms", "instagram,bluesky")

let job = await (await fetch(API + "/v1/jobs", { method: "POST", body: form })).json()
if (job.error) throw new Error(job.error.message)

while (job.status === "queued" || job.status === "running") {
  await new Promise((resolve) => setTimeout(resolve, 2000))
  job = await (await fetch(API + job.links.status)).json()
}

if (job.status === "done") {
  for (const file of job.files) console.log(file.path, API + file.url)
  console.log("Everything as one zip:", API + job.links.download)
} else {
  console.error(job.error.message, job.error.hint)
}

Fehler

Jeder Fehler hat denselben Body. Die Meldung ist ein einfacher Satz, und der Hinweis sagt, was als Nächstes zu tun ist. Beide sind englisch. Wenn Sie übersetzen, unterscheiden Sie die Fehler deshalb anhand von code.

{
  "error": {
    "code": "...",
    "message": "one plain sentence",
    "hint": "what to do"
  }
}

Zwei Codes bitten Sie zu warten: rate_limited (HTTP 429) und queue_full (HTTP 503). Beide senden einen Retry-After-Header mit der Wartezeit in Sekunden.

Limits und Löschung

  • Nur Uploads. Die API ruft nie eine URL ab.
  • Fotos können JPEG, PNG, WebP oder GIF sein, Videos MP4, MOV, MKV oder WebM. Animierte Bilder werden abgelehnt. GET /v1/limits liefert jede Obergrenze als Zahl: Dateien pro Job, Dateigrößen, Videolänge und Textlänge.
  • Aufrufe sind pro Besucher und Stunde begrenzt.
  • Ihre Uploads werden gelöscht, sobald der Job fertig ist. Die fertigen Dateien werden 60 Minuten später gelöscht, zu dem Zeitpunkt in expires_at. DELETE entfernt sie sofort.
  • Die API postet, veröffentlicht und teilt nichts.

Architektur

Für alle, die den Code lesen oder ändern wollen.

  • plugin.yaml ist das Manifest: Name, Version, Tools, Abhängigkeiten und Einstellungen.
  • __init__.py registriert die Tools, den Skill und den Befehl /postkitty bei Hermes.
  • schemas.py enthält, was das Modell sieht: Tool-Namen, Beschreibungen und Parameter. tools.py enthält schlanke Handler, die Argumente validieren und die Engine aufrufen.
  • engine/ ist eine reine Python-Bibliothek ohne Hermes-Importe. engine/pipeline.py ist ihre öffentliche Schnittstelle: scan, write, make, redo und check, die je ein Dict annehmen und zurückgeben. Die HTTP-API ruft dieselben Funktionen auf.
  • In der Engine: detect/ findet Gesichter, photo/ und video/ planen und rendern, text/ zählt und teilt, verify/ prüft und repariert, board/ baut das Review-Board.
  • data/platforms.yaml enthält jede Größe und jedes Limit mit Quelle. Ändern Sie dort ein Limit, folgen die Prüfungen.
  • skills/postkitty/SKILL.md erklärt dem Modell, wie es die Tools benutzt.

Das Modell schreibt die Tipps und die Formulierungen. Alles andere ist deterministischer Code: Er erkennt Gesichter, wählt den Bildausschnitt, rendert, zählt, prüft und repariert. Ob eine Datei besteht, entscheiden allein die Tools.

Mehr im Repository: Entwicklerdoku auf GitHub, SKILL.md und platforms.yaml.

Fehlerbehebung

Die häufigsten Probleme, jeweils mit der Lösung. Beginnen Sie mit /postkitty doctor. Der Befehl findet die meisten Setup-Probleme und sagt, wie Sie sie beheben.

Hermes kennt postkitty nach der Installation nicht

Öffnen Sie einen neuen Chat. Hermes lädt die Tools eines Plugins beim Start eines Chats, deshalb fehlen sie in dem Chat, aus dem Sie installiert haben. Fehlen sie weiterhin, ist das Plugin nicht aktiviert: Führen Sie hermes plugins enable postkitty aus.

Video-Ziele werden übersprungen

ffmpeg oder ffprobe fehlt. Installieren Sie ffmpeg, prüfen Sie, dass ffmpeg und ffprobe in Ihrem Terminal laufen, und fragen Sie dann erneut. Unter macOS fehlt dem ffmpeg, das Hermes mitbringt, ffprobe; brew install ffmpeg ergänzt es. Text und Fotos funktionieren auch ohne die beiden.

Fotos oder Video melden, dass die Gesichtserkennung nicht verfügbar ist

postkitty lädt das Gesichtsmodell einmal herunter, bei der ersten Nutzung, und braucht dafür eine Netzwerkverbindung. Gehen Sie online und fragen Sie erneut. Text funktioniert ohne das Modell.

Untertitel werden abgelehnt, weil ffmpeg kein libass hat

Ihr ffmpeg-Build kann keine Untertitel zeichnen. Installieren Sie einen Build mit libass (mit Homebrew auf macOS ist das ffmpeg-full) oder lassen Sie die Untertitel weg. /postkitty doctor zeigt das in der Zeile „Captions“.

Untertitel werden abgelehnt, weil auf dem Rechner keine Schriftart installiert ist

ffmpeg zeichnet Untertitel mit den Schriftarten, die auf dem Rechner installiert sind. Ein Server ohne grafische Oberfläche oder ein Container hat oft keine. Installieren Sie eine (unter Ubuntu zum Beispiel mit sudo apt install fonts-dejavu-core) und fragen Sie erneut. Zählt die Meldung einzelne Zeichen auf, enthält keine installierte Schriftart diese Zeichen: Installieren Sie eine Schriftart für diese Schrift oder entfernen Sie die Zeichen aus der Untertiteldatei. Ein Emoji, das in keiner Schriftart vorkommt, wird weggelassen, und das Ergebnis nennt es. /postkitty doctor zeigt eine fehlende Schriftart in der Zeile „Captions“.

Ein Ziel zeigt failed

Die Zeile nennt das Limit, das die Datei verletzt hat, und sagt, dass die Reparatur den Verstoß nicht beheben konnte. Verlangen Sie für dieses Ziel ein anderes Layout. pad behält das ganze Bild und passt in den meisten Fällen. Die anderen Ziele behalten ihre Dateien, die bestanden haben.

Die falsche Person ist im Bild

Sagen Sie über die Position, wen Sie meinen: „die Person links“, „die zweite Person von links“. Siehe Fokus.

Ein Text liegt über dem Limit

Hermes kürzt ihn und zählt erneut. Auf X, Threads und Bluesky können Sie stattdessen einen Thread verlangen.

Ein animiertes GIF, WebP oder PNG wird abgelehnt

postkitty erstellt Standbilder und Video. Geben Sie ein Einzelbild als JPEG oder PNG an oder den Clip als Videodatei.

Sie haben eine Datei geändert, und das Ergebnis zeigt noch die alte

Verlangen Sie einen neuen Durchlauf mit der geänderten Datei. postkitty scannt sie dann erneut und startet einen neuen Job.