موفرو الوقت الفعلي

يدعم ADK-Rust واجهتَي خلفية للوقت الفعلي من خلال واجهة RealtimeModel نفسها، لذا يمكن للتطبيق توفير كليهما والتبديل بينهما لكل جلسة. تغطي هذه الصفحة النماذج والأصوات ونقاط النهاية والمصادقة وكيفية الاختيار.

الوقت الفعلي لـ OpenAI (GA)

use adk_realtime::openai::OpenAIRealtimeModel;
use adk_realtime::model::BoxedModel;
use std::sync::Arc;

let model: BoxedModel = Arc::new(OpenAIRealtimeModel::new(
    std::env::var("OPENAI_API_KEY")?,
    "gpt-realtime-2.1",
));
النموذجالاستخدام
gpt-realtime-2.1نموذج تحويل الكلام إلى كلام المستخدم حاليًا في الإنتاج والخيار الافتراضي.
gpt-realtime-translateمترجم للترجمة مخصص (نقطة نهاية مختلفة؛ راجع مثال الترجمة المباشرة).
  • النقل: WebSocket (ميزة openai) أو WebRTC (openai-webrtc، ويتطلب cmake).
  • الصوت: PCM16 بتردد 24 kHz للإدخال والإخراج.
  • الأصوات: marin (صوت GA طبيعي)، وalloy، وغيرها؛ يتم ضبطها باستخدام RealtimeConfig::with_voice("marin").
  • المصادقة: OPENAI_API_KEY. يوجد المفتاح على خادمك (وليس في المتصفح مطلقًا).

Gemini Live

use adk_realtime::gemini::{GeminiLiveBackend, GeminiRealtimeModel};

let model: BoxedModel = Arc::new(GeminiRealtimeModel::new(
    GeminiLiveBackend::studio(std::env::var("GEMINI_API_KEY")?),
    "models/gemini-3.1-flash-live-preview",
));
النموذجالاستخدام
models/gemini-3.1-flash-live-previewنموذج حي بنصف التتابع. يستدعي الأدوات بموثوقية ويقبل إطارات الفيديو. الخيار الافتراضي.
models/gemini-live-2.5-flash-native-audioنموذج صوت أصلي — الصوت الأكثر طبيعية، والنموذج الذي يدعم الحوار العاطفي. استدعاء الأدوات أضعف.
models/gemini-3.5-live-translate-previewنموذج للترجمة مخصص (راجع مثال الترجمة).
  • النقل: WebSocket (ميزة gemini، AI Studio) أو Vertex AI Live (vertex-live، OAuth2 / ADC — راجع الوكلاء الآنيين).
  • الصوت: PCM16 بتردد 16 kHz للإدخال، وPCM16 بتردد 24 kHz للإخراج.
  • الأصوات: Kore وغيرها؛ with_voice("Kore").
  • المصادقة: GEMINI_API_KEY (أو GOOGLE_API_KEY).

تختلف أسماء النماذج حسب نقطة النهاية. يستخدم AI Studio (مفتاح API) أسماءً مثل models/gemini-3.1-flash-live-preview؛ بينما تستخدم Vertex/Agent Platform أسماءً مختلفة. يستهدف GeminiLiveBackend::studio(...) الخاص بـ crate واجهة AI Studio عبر نقطة النهاية v1alpha (وهي أيضًا ما يتطلبه الحوار العاطفي).

اختيار نموذج

  • الصوت العام + الأدواتgpt-realtime-2.1 أو gemini-3.1-flash-live-preview. يستدعي كلاهما الأدوات بشكل موثوق. يُعد Gemini الخيار الأنسب لـ الفيديو المستمر.
  • الصوت الأكثر طبيعية / الوعي بالعاطفة → Gemini native-audio (gemini-live-2.5-flash-native-audio) مع الحوار العاطفي — مع انخفاض موثوقية استدعاء الأدوات إلى حد ما.
  • الاستدلال المكثفgpt-realtime-2.1.
  • الترجمة → نماذج الترجمة المخصصة (بروتوكولاتها الخاصة).

اختيار موفّر لكل جلسة

تقرأ التطبيقات عادةً الموفّر من طلب وتبني النموذج المطابق. تختلف معدلات الصوت، لذا اعرضها أيضًا:

#[derive(Clone, Copy)]
enum Provider { OpenAI, Gemini }

impl Provider {
    fn audio_rates(self) -> (u32, u32) {   // (input, output)
        match self {
            Provider::OpenAI => (24_000, 24_000),
            Provider::Gemini => (16_000, 24_000),
        }
    }
}

fn build_model(p: Provider) -> anyhow::Result<(BoxedModel, &'static str)> {
    Ok(match p {
        Provider::OpenAI => (
            Arc::new(OpenAIRealtimeModel::new(std::env::var("OPENAI_API_KEY")?, "gpt-realtime-2.1")),
            "marin",
        ),
        Provider::Gemini => (
            Arc::new(GeminiRealtimeModel::new(
                GeminiLiveBackend::studio(std::env::var("GEMINI_API_KEY")?),
                "models/gemini-3.1-flash-live-preview",
            )),
            "Kore",
        ),
    })
}

تتيح الأمثلة استبدال كل هذه القيم باستخدام متغيرات البيئة (OPENAI_REALTIME_MODEL، GEMINI_REALTIME_MODEL)، بحيث يمكنك تثبيت نموذج دون إعادة الترجمة.

مصفوفة القدرات

OpenAI gpt-realtime-2.1Gemini 3.1-flash-liveGemini native-audio
الصوت (إدخال/إخراج صوتي)
النصوص الحية
الأدوات من جانب الخادم✅ (موثوقة)✅ (موثوقة)⚠️ (أضعف)
إطارات الفيديو✅ (عناصر الصور)✅ (مستمرة)✅ (مستمرة)
الحوار العاطفي

التالي: الأدوات →

التشخيص وخصوصية الحمولة

تحمل إطارات الوقت الفعلي النصوص المفرغة، ووسيطات الأدوات، ونتائج الأدوات، والمعرّفات. وعندما يفشل حدث تم التعرّف عليه في إلغاء تسلسله — بسبب انجراف مخطط المزوّد — يعرض التحذير ملخصًا آمنًا للحقول ويحجب الإطار:

الحقلالمحتوى
event_typeنوع حدث المزوّد الذي فشل
errorخطأ إلغاء التسلسل
payload.bytesحجم الإطار بالبايتات
payload.digestملخص قصير لمطابقة تكرارات الانحراف نفسه
payload.raw<redacted> ما لم يُضمَّن تسجيل الحمولة أثناء الترجمة البرمجية

ملاحظة: يجمع الملخص أسطر السجل ضمن عملية تشغيل واحدة. وهو ليس ملخصًا تشفيريًا، ولا يكون ثابتًا بين العمليات.

لتشخيص الانحراف مع توفر الإطار، قم بترجمة adk-realtime باستخدام ميزة record-payloads، التي تسجل أول 300 بايت:

[dependencies]
adk-realtime = { version = "2.1.0", features = ["openai", "record-payloads"] }

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

موفرو الوقت الفعلي - وثائق ADK-Rust | ADK-Rust