最近、ステップを連鎖できるさまざまなプラットフォームを試しましたが、その中で興奮したものを共有します。光学文字認識(OCR)で画像内のテキストを検出し、それをDiscourseの投稿に追加します!
私のサンドボックスのトピックで動作方法を示しています: https://notes.maiki.interi.org/t/testing-ocr-calls/403
最初のものはPipedreamで行い、ステップをたどりながらその方法を説明します。そのサービスにはワークフローを共有するベータ機能があり、以下は Pipedream - Connect APIs, AI, databases and more で共有されています。
これはPipedreamとDiscourseを使用した詳細なガイドになりますが、私はすでにそのプラットフォームから移行しており、後でもっと共有する予定なので、詳細は控えめにします。
ステップ
大まかな流れは次のとおりです。画像URLをGoogle Cloud Vision APIに送信し、結果をChatGPTに通し、結果をDiscourseの投稿に追加します。
トリガー

これはデータ送信用のWebhookを提供します。Discourseでは、2つの特定のНастройкиでWebhookを作成しました。

Post Eventsでのみ発火させることで、最初のトピックがプロセスをトリガーしないようにします。これは、トピックを外部関数(私が「機能的なメモ」と呼ぶもの)を適用するためのホルダーとして計画的に使用できるため、私にとって便利です。
そのタグでのみ発火させることで、タグを使用してトピックごとに生成されるWebhookを制御できます。一般的には、プロセスのロジックを単純に保つために、「functions」タグを1つだけ使用します。
Webhookは多くの情報を含むペイロードを送信します。プロセスの後半でトピックと投稿のIDを使用します。
条件に基づく終了
これは、編集理由が含まれているかどうかを確認するステップです。含まれている場合は、ワークフローを停止します。
最後のステップで編集理由を含めて投稿を更新し、このチェックにより投稿の更新を繰り返さないようにします… 
Pipedreamの使用をやめた理由の1つは、Webhookチェックがサービスクレジットを消費していたことです。条件付きでWebhookを処理するために支払う必要があるとは思わないので、移行しました…
画像URLの抽出
このテストでは、各投稿に1つの画像がアップロードされるようにしました。このステップは「cooked」値を確認し、次の正規表現を使用してURLを取得します。
/https?:\/\/[^\s"]+/
Google Cloud Vision API呼び出し
これはPipedreamのカスタムコードステップです。既製のコンポーネントでは私が望むものが得られず、サービスにはプロンプトからコードを記述できるコードアシスタントもあります。これらのAPI呼び出しは簡単なので、この方法で簡単に生成できました。
前のステップの値({{steps.extract_by_regular_expression.$return_value[0].match}})を取得し、これはコードです。
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による編集
前のステップ({{steps.google_cloud.$return_value.responses[0].fullTextAnnotation.text}})からの出力を取得し、ユーザーメッセージとして渡します。システムメッセージには次のように記述しています。
画像内のテキストを検出したvision APIの出力を読んでいます。メッセージを確認し、明確にするために校正してください。コメントなしで、編集されたテキストのみを返してください。
Discourseの投稿に追加
これもカスタムコードセクションです。Pipedreamの既製のDiscourseアクションは数個のシナリオ(トピックまたは投稿の作成)しかカバーしておらず、テキストを投稿に追加したいからです。
まず、コードは次のとおりです。
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,
},
},
});
},
});
このステップのプロパティは次のように入力されます。
Post ID
元のペイロードから投稿IDを取得します: {{steps.trigger.event.body.post.id}}
これは、その投稿を直接編集するために使用されます。
Text
---
<blockquote>
{{steps.chat.$return_value.generated_message.content}}
</blockquote>
[details="Detected text"]
{{steps.google_cloud.$return_value.responses[0].textAnnotations[0].description}}
[/details]
基本的に、各画像の後に水平線、編集されたテキストの引用ブロック、および生の出力を確認するための詳細を追加したいと考えています。
各投稿には1つの画像が含まれるため、これは非常に簡単に機能します。複数の画像を一度に処理する方法はどうでしょうか? 
Edit Reason
OCR Text Detection
これは投稿更新の編集理由として追加され、冒頭のステップによる投稿更新ループを防ぎます。

外部サービスを扱う際には、常に編集理由を含めることが非常に役立つと感じています。
これで完了です!私のサンドボックスからわかるように、かなりうまく機能しています!
旅行が近づいており、OpenAIの編集を、必要に応じて英語に翻訳するように微調整する予定です。これは、このワークフローのシステムプロンプトに追加するオプションの1つです。