Ho sperimentato molto di recente con varie piattaforme che consentono di concatenare passaggi e ne condividerò uno che mi ha entusiasmato: Riconoscimento Ottico dei Caratteri per rilevare testo in un’immagine e aggiungerlo al post di Discourse!
Il mio argomento sandbox mostra come funziona: https://notes.maiki.interi.org/t/testing-ocr-calls/403
Ho fatto la prima cosa su Pipedream e spiegherò come l’ho fatto seguendo i passaggi. C’è una funzionalità beta per la condivisione dei flussi di lavoro su quel servizio e la seguente è condivisa su Pipedream - Connect APIs, AI, databases and more.
Sebbene questa sarebbe una guida approfondita all’uso di Pipedream con Discourse, rimarrò leggero sui dettagli, poiché ho già abbandonato quella piattaforma e ne condividerò di più in seguito. 
Passaggi
L’idea generale è: inviare l’URL dell’immagine all’API Google Cloud Vision, elaborare i risultati tramite ChatGPT, quindi aggiungere i risultati al post in Discourse.
Trigger

Questo fornisce un webhook per inviare dati. In Discourse ho creato un webhook con due impostazioni specifiche:

L’attivazione solo sugli eventi Post significa che il mio argomento iniziale non attiverà il processo; questo mi è utile in modo da poter pianificare l’uso degli argomenti come contenitori per l’applicazione di funzioni esterne (li chiamo “note funzionali”).
L’attivazione solo su quel tag significa che posso usare i tag per controllare quali webhook vengono prodotti per argomento; in generale avrei solo un tag “functions”, per mantenere semplice la logica del processo.
Il webhook invia un payload con molte informazioni e utilizzeremo gli ID dell’argomento e del post in seguito nel processo.
Fine basata su condizione
Questo è un passaggio per verificare se è incluso un motivo di modifica. In caso affermativo, interrompe il flusso di lavoro.
Nell’ultimo passaggio aggiorno il post e includo un Motivo di Modifica, e questo controllo mi assicura di non continuare ad aggiornare il post… 
Uno dei motivi per cui ho smesso di usare Pipedream è stato perché i miei controlli webhook consumavano crediti sul servizio. Non penso di dover pagare per elaborare condizionalmente un webhook, da qui il mio allontanamento…
Estrai l’URL dell’immagine
Ho deciso per questo test che ogni post avrebbe una singola immagine caricata. Questo passaggio controlla il valore “cooked” e utilizza la seguente espressione regolare per estrarre l’URL:
/https?:\/\/[^\s"]+/
Chiamata all’API Google Cloud Vision
Questo è un passaggio di codice personalizzato su Pipedream. I componenti predefiniti non facevano quello che volevo, e il servizio ha anche un assistente di codice che può scrivere codice da un prompt; poiché queste chiamate API sono semplici, è stato facile produrle con questo metodo.
Prende il valore del passaggio precedente ({{steps.extract_by_regular_expression.$return_value[0].match}}) ed ecco il codice:
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 per la modifica
Prende l’output dal passaggio precedente ({{steps.google_cloud.$return_value.responses[0].fullTextAnnotation.text}}) e lo passa come messaggio Utente. Per il messaggio di sistema ho:
Sei lettura dell’output di un’API di visione che ha rilevato testo in un’immagine. Rivedi il messaggio e correggilo per chiarezza. Restituisci solo il testo modificato senza commenti.
Aggiungi al post in Discourse
Un’altra sezione di codice personalizzato, poiché le azioni Discourse predefinite in Pipedream (Discourse actions in Pipedream) coprono solo un paio di scenari (crea un argomento o un post), e voglio aggiungere il testo al post.
Innanzitutto, ecco il codice:
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,
},
},
});
},
});
Quelle proprietĂ per il passaggio sono riempite in questo modo:
ID Post
Estrae l’ID del post dal payload originale: {{steps.trigger.event.body.post.id}}
Questo viene utilizzato per modificare direttamente quel post.
Testo
---
<blockquote>
{{steps.chat.$return_value.generated_message.content}}
</blockquote>
[details="Detected text"]
{{steps.google_cloud.$return_value.responses[0].textAnnotations[0].description}}
[/details]
In sostanza, voglio aggiungere una linea orizzontale sotto ogni immagine, con una blockquote del testo modificato e i dettagli per controllare l’output grezzo.
Poiché ogni post conterrà un’immagine, questo funziona molto facilmente. Mi chiedo come fare con più immagini contemporaneamente? 
Motivo Modifica
OCR Text Detection
Questo viene aggiunto come motivo di modifica per l’aggiornamento del post, il che impedirà un loop di aggiornamento del post a causa del passaggio all’inizio.

Trovo molto utile includere sempre un motivo di modifica, specialmente quando si ha a che fare con servizi esterni.
E questo è tutto! Come puoi vedere dal mio sandbox, funziona abbastanza bene!
Ho un viaggio in arrivo e ho intenzione di perfezionare la modifica di OpenAI per tradurre anche in inglese, se necessario, questa è un’opzione che avrei aggiunto al prompt di sistema per questo flusso di lavoro.