Ich habe kürzlich viel experimentiert mit verschiedenen Plattformen, die das Verketten von Schritten ermöglichen, und ich teile eine, die mich begeistert hat: Optical Character Recognition (OCR) zur Erkennung von Text in einem Bild und das Anhängen an den Discourse-Post!
Mein Sandbox-Thema zeigt, wie es funktioniert: https://notes.maiki.interi.org/t/testing-ocr-calls/403
Ich habe das erste auf Pipedream gemacht und werde erklären, wie ich es gemacht habe, indem ich die Schritte nachvollziehe. Es gibt eine Beta-Funktion zum Teilen von Workflows auf diesem Dienst, und das Folgende wird unter Pipedream - Connect APIs, AI, databases and more geteilt.
Obwohl dies eine ausführliche Anleitung zur Verwendung von Pipedream mit Discourse wäre, halte ich mich mit den Details zurück, da ich diese Plattform bereits verlassen habe und später mehr darüber berichten werde. 
Schritte
Die grobe Gliederung ist: Bild-URL an die Google Cloud Vision API senden, die Ergebnisse durch ChatGPT laufen lassen und dann die Ergebnisse an den Post in Discourse anhängen.
Trigger

Dies stellt einen Webhook zur Verfügung, an den Daten gesendet werden können. In Discourse habe ich einen Webhook mit zwei spezifischen Einstellungen erstellt:

Nur das Auslösen bei Post-Ereignissen bedeutet, dass mein anfängliches Thema den Prozess nicht auslöst; das ist für mich nützlich, damit ich Themen als Halter für die Anwendung externer Funktionen (ich nenne sie “funktionale Notizen”) verwenden kann.
Nur das Auslösen bei diesem Tag bedeutet, dass ich Tags verwenden kann, um zu steuern, welche Webhooks pro Thema erzeugt werden; im Allgemeinen hätte ich nur einen “functions”-Tag, um die Prozesslogik einfach zu halten.
Der Webhook sendet eine Payload mit vielen Informationen, und wir werden die Topic- und Post-IDs später im Prozess verwenden.
Ende basierend auf Bedingung
Dies ist ein Schritt, um zu prĂĽfen, ob ein Bearbeitungsgrund angegeben ist. Wenn ja, stoppt er den Workflow.
Im letzten Schritt aktualisiere ich den Beitrag und füge einen Bearbeitungsgrund hinzu, und diese Prüfung stellt sicher, dass ich den Beitrag nicht immer wieder aktualisiere… 
Einer der Gründe, warum ich Pipedream nicht mehr verwende, war, dass meine Webhook-Prüfungen Credits auf dem Dienst verbrauchten. Ich glaube nicht, dass ich dafür bezahlen sollte, einen Webhook bedingt zu verarbeiten, daher mache ich weiter…
Bild-URL extrahieren
Ich habe beschlossen, dass jeder Beitrag für diesen Test ein einzelnes Bild hochgeladen bekommt. Dieser Schritt prüft den “cooked”-Wert und verwendet den folgenden regulären Ausdruck, um die URL zu extrahieren:
/https?:\/\/[^\s\"]+/
Google Cloud Vision API-Aufruf
Dies ist ein benutzerdefinierter Code-Schritt auf Pipedream. Die vorgefertigten Komponenten taten nicht, was ich wollte, und der Dienst hat auch einen Code-Assistenten, der Code aus einer Eingabeaufforderung schreiben kann; da diese API-Aufrufe unkompliziert sind, war es einfach, sie auf diese Weise zu erstellen.
Er nimmt den Wert des vorherigen Schritts ({{steps.extract_by_regular_expression.$return_value[0].match}}) und das ist der Code:
import { axios } from "@pipedream/platform";
export default defineComponent({
props: {
imageUrl: {
type: "string",
label: "Image URL",
description: "URL of the image to be processed by Google Vision API",
},
apiKey: {
type: "string",
label: "API Key",
description: "Your Google Cloud API Key",
secret: true,
},
},
async run() {
const url = `https://vision.googleapis.com/v1/images:annotate?key=${this.apiKey}`;
const body = {
requests: [
{
image: {
source: {
imageUri: this.imageUrl,
},
},
features: [
{
type: "TEXT_DETECTION",
},
],
},
],
};
const config = {
method: "POST",
url,
data: body,
};
const response = await axios(this, config);
return response;
},
});
ChatGPT zur Bearbeitung
Nimmt die Ausgabe des vorherigen Schritts ({{steps.google_cloud.$return_value.responses[0].fullTextAnnotation.text}}) und ĂĽbergibt sie als Benutzernachricht. FĂĽr die Systemnachricht habe ich:
Sie lesen die Ausgabe einer Vision-API, die Text in einem Bild erkannt hat. ĂśberprĂĽfen Sie die Nachricht und bearbeiten Sie sie zur besseren Lesbarkeit. Geben Sie nur den bearbeiteten Text ohne Kommentare zurĂĽck.
An den Post in Discourse anhängen
Ein weiterer benutzerdefinierter Code-Abschnitt, da die vorgefertigten Discourse-Aktionen in Pipedream nur ein paar Szenarien abdecken (einen Beitrag oder ein Thema erstellen) und ich den Text an den Beitrag anhängen möchte.
Hier ist zuerst der Code:
import { axios } from "@pipedream/platform";
export default defineComponent({
props: {
discourse: {
type: "app",
app: "discourse",
},
postId: {
type: "string",
label: "Post ID",
description: "The ID of the post to append text to",
},
text: {
type: "string",
label: "Text",
description: "The text to append to the post",
},
editReason: {
type: "string",
label: "Edit Reason",
description: "The reason for editing the post",
optional: true,
},
},
async run({ steps, $ }) {
const url = `https://${this.discourse.$auth.domain}/posts/${this.postId}.json`;
const response = await axios($, {
method: "GET",
url: url,
headers: {
"Api-Username": `${this.discourse.$auth.api_username}`,
"Api-Key": `${this.discourse.$auth.api_key}`,
},
});
const updatedText = `${response.raw} ${this.text}`;
return await axios($, {
method: "PUT",
url: url,
headers: {
"Api-Username": `${this.discourse.$auth.api_username}`,
"Api-Key": `${this.discourse.$auth.api_key}`,
},
data: {
post: {
raw: updatedText,
edit_reason: this.editReason,
},
},
});
},
});
Diese Eigenschaften fĂĽr den Schritt werden wie folgt ausgefĂĽllt:
Post ID
Holt die Post-ID aus der ursprĂĽnglichen Payload: {{steps.trigger.event.body.post.id}}
Dies wird verwendet, um diesen Beitrag direkt zu bearbeiten.
Text
---
<blockquote>
{{steps.chat.$return_value.generated_message.content}}
</blockquote>
[details="Detected text"]
{{steps.google_cloud.$return_value.responses[0].textAnnotations[0].description}}
[/details]
Grundsätzlich möchte ich eine horizontale Linie unter jedem Bild hinzufügen, mit einem Blockquote des bearbeiteten Textes und den Details, um die Rohausgabe zu überprüfen.
Da jeder Beitrag ein Bild enthalten wird, funktioniert dies sehr einfach. Ich frage mich, wie man das mit mehreren Bildern gleichzeitig macht? 
Bearbeitungsgrund
OCR Text Detection
Dies wird als Bearbeitungsgrund fĂĽr die Beitragsaktualisierung hinzugefĂĽgt, was eine Endlosschleife bei der Beitragsaktualisierung aufgrund des Schritts am Anfang verhindert.

Ich finde es super hilfreich, immer einen Bearbeitungsgrund anzugeben, besonders wenn man mit externen Diensten arbeitet.
Und das ist alles! Wie Sie in meinem Sandbox-Thema sehen können, funktioniert es ziemlich gut!
Ich habe eine bevorstehende Reise und plane, die OpenAI-Bearbeitung zu verfeinern, um bei Bedarf auch ins Englische zu übersetzen. Das ist eine Option, die ich der Systemaufforderung für diesen Workflow hinzugefügt hätte.