Alejandro Rioja.
AI Agents

مجموعة الأدوات التي أستخدمها لتشغيل أكثر من 30 وكيلاً إنتاجياً (بدون Python)

Alejandro Rioja
Alejandro Rioja
5 د قراءة
TL;DR

أشغّل أكثر من 30 وكيل ذكاء اصطناعي إنتاجي باستخدام TypeScript وCloudflare Workers/Queues/KV ونماذج Claude — بدون Python وبدون إطار وكلاء. المجموعة بسيطة عن قصد: تتولى Workers الجدولة وقوائم الانتظار، ويخزّن KV الحالة، ويقود Anthropic SDK استدعاءات النموذج مباشرةً. القيد الأهم ليس طبقة الذكاء الاصطناعي — بل البنية التحتية من حولها.

نشرة بريدية مجانية

كل أربعاء. أكثر من 28,400 مشترك. بدون حشو.

جدول المحتويات

محدّث مايو 2026.

خلاصة: أشغّل أكثر من 30 وكيل ذكاء اصطناعي إنتاجي باستخدام TypeScript وCloudflare Workers/Queues/KV ونماذج Claude — بدون Python وبدون إطار وكلاء. المجموعة بسيطة عن قصد: تتولى Workers الجدولة وقوائم الانتظار، ويخزّن KV الحالة، ويقود Anthropic SDK استدعاءات النموذج مباشرةً. القيد الأهم ليس طبقة الذكاء الاصطناعي — بل البنية التحتية من حولها.

[قراءة المشغّل] أدير شركتين: علامة تجارية استشارية في مجال الذكاء الاصطناعي، وPickleland — منشأة للبيكلبول في بفلوغرفيل بتكساس. بين الاثنتين، لديّ أكثر من 30 وكيل يعمل في الإنتاج اليوم. هذه هي المجموعة الفعلية، وليست مجرد عرض تجريبي.

لماذا بدون Python

الجواب الصريح: أكتب TypeScript كل يوم لعملي على الموقع والمنتجات. إضافة لغة ثانية للوكلاء يعني وقتَين للتشغيل، وشجرتَي تبعيات، وخطّتَي نشر. التكلفة الإنتاجية ليست نظرية — دفعتها في مشاريع سابقة وقررت ألا أكررها.

السبب الثاني هو Cloudflare. تشغّل Workers لغة TypeScript بشكل أصلي على الحافة، مع Queues وKV وDurable Objects وCron Triggers مدمجة. كل البنية التحتية للوكلاء التي أحتاجها — الجدولة والحالة ومعالجة المهام غير المتزامنة — على بُعد أمر wrangler deploy واحد. لا يوجد ما يعادل ذلك بلغة Python بنفس مستوى التشغيل البسيط.

السبب الثالث أن معظم حجج “Python أفضل للذكاء الاصطناعي” هي في الحقيقة “Python تمتلك مكتبات ML أكثر”. أنا لا أدرّب نماذج. أنا أستدعي APIs. Anthropic SDK هو TypeScript من الدرجة الأولى. LangChain وأشباهه هي تعقيد لا أريده. حين تشحن وكلاء ولا تبحث فيهم، البساطة تنتصر.

البنية التحتية الأساسية: ثلاث أوليات من Cloudflare

كل وكيل أشغّله يلمس واحداً على الأقل من هذه الثلاثة:

Cloudflare Workers — طبقة الحوسبة. Worker هو وقت تشغيل الوكيل: يستقبل مُشغِّلاً (cron أو رسالة Queue أو HTTP)، ينفّذ استدعاءات النموذج، ويكتب المخرجات في مكان ما. البدء البارد أقل من 5ms. حد التنفيذ 30 ثانية من وقت المعالج على الخطة المجانية، و15 دقيقة على الخطة المدفوعة. كل ما أبنيه تقريباً يناسب 30 ثانية؛ وما لا يناسب يستخدم Queues للتوزيع.

Cloudflare Queues — معالجة المهام غير المتزامنة. حين قد تستغرق مهمة وقتاً أطول من طلب، أو حين أحتاج إلى التوزيع (توليد 12 ترجمة بالتوازي)، أدفع رسائل إلى Queue وأدع المستهلكين المرتبطين يعالجونها باستقلالية. لا استطلاع، لا حيل setTimeout.

Cloudflare KV — حالة خفيفة الوزن. تاريخ تشغيل الوكلاء، وآخر الطوابع الزمنية المعالجة، واستجابات API المخزّنة مؤقتاً. KV يتسق في نهاية المطاف، وهو مناسب للوكلاء — لا أُجري معاملات. يمنحني مخزن مفتاح-قيمة بسيطاً يمكنني قراءته/كتابته من أي Worker دون تشغيل قاعدة بيانات.

طبقة النموذج: Anthropic SDK، نموذجان

أستخدم نموذجَي Claude اثنين فقط:

Anthropic SDK بـ TypeScript مباشر. إليك النمط الذي أستخدمه لكل استدعاء نموذج:

typescript
import Anthropic from "@anthropic-ai/sdk";

const client = new Anthropic({ apiKey: env.ANTHROPIC_API_KEY });

async function runAgent(prompt: string, systemPrompt: string): Promise<string> {
  const message = await client.messages.create({
    model: "claude-sonnet-4-6",
    max_tokens: 2048,
    system: systemPrompt,
    messages: [{ role: "user", content: prompt }],
  });

  const block = message.content[0];
  if (block.type !== "text") throw new Error("Unexpected content type");
  return block.text;
}

هذه هي واجهة النموذج بأكملها. لا تجريدات فوقها. حين أحتاج استخدام الأدوات، أضيف مصفوفة tools. حين أحتاج البث، أستبدل messages.create بـ messages.stream. لا إطار عمل يدير هذا نيابةً عني — ولا أريد ذلك.

وكيل حقيقي: خط أنابيب المحتوى

أكثر الوكلاء تعقيداً الذي أشغّله هو خط أنابيب المحتوى. يولّد منشورات المدونة، ويترجمها إلى 12 لغة، ويُصيّر SVGs لبطاقات OG، ويصيغ ترقيات LinkedIn — كلها كمسودات، مقيّدة بمراجعتي قبل أن يُنشر أي شيء.

نقطة دخول Worker تبدو هكذا:

typescript
// src/workers/content-pipeline.ts
export default {
  async fetch(request: Request, env: Env): Promise<Response> {
    const { topic, slug } = await request.json<{ topic: string; slug: string }>();

    // الخطوة 1: توليد المنشور بالإنجليزية
    const enPost = await generatePost(topic, env);
    await env.CONTENT_KV.put(`draft:${slug}:en`, enPost);

    // الخطوة 2: توزيع الترجمات عبر Queue
    const locales = ["ar", "de", "es", "fr", "hi", "it", "ja", "ko", "nl", "pt", "ru", "zh"];
    for (const locale of locales) {
      await env.TRANSLATION_QUEUE.send({ slug, locale, content: enPost });
    }

    return Response.json({ status: "queued", slug });
  },
};

وكيل حقيقي: مروّج الأحداث

تُنظّم Pickleland أحداث بيكلبول. بنيت وكيلاً يفحص منصة الحجز لأحداث الأيام الأربعة القادمة، ويصيغ منشورات مجموعات Facebook لكل حدث، ويعرضها للمراجعة قبل أن يخرج أي شيء.

النمط الأساسي للموجّه:

typescript
const systemPrompt = `You are a community manager for a pickleball facility.
Write Facebook group posts for upcoming events.
Rules:
- Max 150 words per post
- Lead with what's fun about the event, not the price
- Include the booking URL exactly as provided
- Do not use exclamation marks more than once per post
- Tone: friendly, local, not corporate`;

القيد الأهم هنا ليس النموذج — بل سير العمل. يعمل الوكيل على مشغّل cron الساعة 8 صباحاً يومياً. تهبط المنشورات المسودة في قائمة مراجعة. أوافق أو أعدّل، ثم يُطلق Worker النشر المنفصل. لا حدث يُنشر دون أن يراه إنسان أولاً.

كيف أدير أكثر من 30 وكيلاً دون أن أفقد عقلي

لوحة تحكم Cloudflare هي لوحة التحكم الخاصة بي. كل Worker يُظهر لي عدد الاستدعاءات، ومعدل الأخطاء، ووقت المعالج. كل Queue تُظهر إنتاجية الرسائل والإخفاقات. KV يُظهر استخدام التخزين.

علاوةً على ذلك:

الانضباط ليس تقنياً. هو تحديد ما يُسمح للوكيل بفعله باستقلالية مقابل ما يحتاج موافقتي. مسودات المحتوى: مستقلة. أي شيء يلمس عميلاً: مراجعة بشرية. أي شيء يُرسل مالاً: ليس وظيفة وكيل.

ما كنت سأغيّره لو بدأت اليوم

شيء واحد: كنت سأضع مخرجات منظّمة (وضع JSON) من اليوم الأول بدلاً من إضافتها بعد الشحن. تحليل مخرجات Claude النصية الحرة هو ضريبة. حين تعرّف مخطط Zod وتمرره كشكل الاستجابة المتوقع، تحصل على بيانات مكتوبة مكتبةً ولا تحتاج Workers المتّجهة التخمين.

typescript
import { z } from "zod";

const EventPostSchema = z.object({
  headline: z.string().max(80),
  body: z.string().max(600),
  bookingUrl: z.string().url(),
  suggestedPostTime: z.enum(["morning", "afternoon", "evening"]),
});

خلاصة المشغّل

مجموعة الوكلاء التي تعمل في الإنتاج هي تلك التي يمكنك تصحيح أخطائها الساعة 10 مساءً حين يحدث خطأ ما. بالنسبة لي، هي TypeScript + Cloudflare + Anthropic SDK — ليس لأنها الأكثر بريقاً، بل لأن كل طبقة قابلة للمراقبة والنشر والاستبدال بشكل مستقل. أطر العمل هي رهانات على التجريدات. أفضّل امتلاك السباكة.

تابع القراءة

احصل على دليل الذكاء الاصطناعي في صندوق بريدك

كل أربعاء. أكثر من 28,400 مشترك. بدون حشو.

↵ لعرض كل النتائج esc esc للإغلاق