नेविगेशन पर जाएँ

डायनामिक वेरिएबल्स

अपने एजेंट के व्यवहार को वैयक्तिकृत करने के लिए रनटाइम वैल्यू पास करें।

डायनामिक वेरिएबल्स आपको अपने एजेंट के संदेशों, सिस्टम प्रॉम्प्ट और टूल्स में रनटाइम वैल्यू शामिल करने देते हैं। इससे आप कई एजेंट बनाए बिना, हर बातचीत को यूज़र के हिसाब से डेटा के साथ वैयक्तिकृत कर सकते हैं।

ओवरव्यू

डायनामिक वेरिएबल्स को आपके एजेंट के कई हिस्सों में इंटीग्रेट किया जा सकता है:

  • व्यवहार और संदर्भ को कस्टमाइज़ करने के लिए सिस्टम प्रॉम्प्ट्स
  • अभिवादन को वैयक्तिकृत करने के लिए पहले संदेश
  • यूज़र-विशिष्ट डेटा पास करने के लिए टूल पैरामीटर और हेडर्स

डायनामिक वेरिएबल्स इन स्थितियों में उपयोगी होते हैं:

  • यूज़र नामों के साथ अभिवादन को वैयक्तिकृत करना
  • जवाबों में अकाउंट की जानकारी शामिल करना
  • टूल कॉल्स को डेटा पास करना
  • सब्सक्रिप्शन टियर के आधार पर व्यवहार को कस्टमाइज़ करना
  • बातचीत ID या कॉल अवधि जैसी सिस्टम जानकारी एक्सेस करना

डायनामिक वेरिएबल्स तीन तरह की वैल्यू सपोर्ट करते हैं:

स्ट्रिंग
टेक्स्ट वैल्यू
नंबर
संख्यात्मक वैल्यू
बूलियन
सही/गलत वैल्यू

सिस्टम डायनामिक वेरिएबल्स

आपके एजेंट के पास हर बातचीत में बिना रनटाइम कॉन्फ़िगरेशन के बिल्ट-इन system__* वेरिएबल्स का एक्सेस होता है। इन वेरिएबल्स के आगे आरक्षित system__ नेमस्पेस लगा होता है और बातचीत आगे बढ़ने के साथ ये अपने-आप अपडेट होते हैं। कस्टम डायनामिक वेरिएबल्स system__ प्रीफ़िक्स का इस्तेमाल नहीं कर सकते या सिस्टम वेरिएबल्स को ओवरराइड नहीं कर सकते।

† से चिह्नित वेरिएबल्स टर्न के बीच बदलते हैं। इन्हें प्रॉम्प्ट टेक्स्ट में रखने से प्रॉम्प्ट कैशिंग रुक सकती है; विकल्पों के लिए सर्वोत्तम तरीके देखें।

एजेंट और बातचीत की पहचान

वेरिएबलटाइपविवरणउदाहरण
system__agent_idstringबातचीत शुरू करने वाले एजेंट का यूनिक आइडेंटिफ़ायर। बातचीत के दौरान कभी नहीं बदलता।"agent_8401kp8bt0jdf14rzzcv5veq94yg"
system__current_agent_idstringफ़िलहाल सक्रिय एजेंट का यूनिक आइडेंटिफ़ायर। बातचीत दूसरे एजेंट को ट्रांसफ़र होने पर अपडेट होता है।"agent_8401kp8bt0jdf14rzzcv5veq94yg"
system__conversation_idstringElevenLabs का यूनिक बातचीत आइडेंटिफ़ायर।"conv_1801kp8qtb2begztn7zyf446v4jk"
system__user_idstring | nullट्रैकिंग और एनालिटिक्स के लिए क्लाइंट द्वारा दिया गया यूज़र ID। इसे ऑथेंटिकेशन के लिए भरोसेमंद नहीं मानना चाहिए।"G6yhJW8MktQdhUquvXD1iKpPHql2"
system__initiator_idstring | nullबातचीत शुरू करने के लिए इस्तेमाल की गई ऑथेंटिकेशन विधि से संबंधित आइडेंटिफ़ायर।"user_1801kp8qtb2begztn7zyf446v4jk"
system__channelstringवह चैनल स्रोत जिससे बातचीत शुरू की गई थी।"slack_integration"
system__is_text_onlybooleanबातचीत टेक्स्ट-ओनली (चैट) मोड में चलने पर true; वॉइस कॉल के लिए false।true
system__environmentstringवह एनवायरनमेंट जिसमें बातचीत चल रही है, जिसका इस्तेमाल एनवायरनमेंट वेरिएबल्स को रिज़ॉल्व करने के लिए होता है।"production"

समय और टाइमज़ोन

वेरिएबलटाइपविवरणउदाहरण
system__timezonestring | nullकॉन्फ़िगर किया गया टाइमज़ोन (conversation_config.agent.prompt.timezone) या कॉलर द्वारा दिया गया IANA टाइमज़ोन। सेट न होने पर डिफ़ॉल्ट UTC है।"America/New_York"
system__time †stringकॉन्फ़िगर किए गए टाइमज़ोन में मौजूदा तारीख और समय (%A, %H:%M %d %B %Y)। हर टर्न पर फिर से आकलित होता है (हर मिनट बदलता है)।"Friday, 12:33 12 December 2025"
system__time_utc †stringISO 8601 फ़ॉर्मैट में मौजूदा UTC टाइमस्टैंप। हर टर्न पर फिर से आकलित होता है।"2025-12-12T12:33:45.123456+00:00"
system__time_datestringकॉन्फ़िगर किए गए टाइमज़ोन में मौजूदा तारीख (या कोई सेट न होने पर UTC) (%A, %d %B %Y)। दिन में एक बार बदलती है।"Friday, 12 December 2025"
system__time_hourintegerकॉन्फ़िगर किए गए टाइमज़ोन में मौजूदा घंटा (0–23) (या कोई सेट न होने पर UTC)। अधिकतम हर घंटे एक बार बदलता है।12
system__time_minute †integerकॉन्फ़िगर किए गए टाइमज़ोन में मौजूदा मिनट (0–59) (या कोई सेट न होने पर UTC)। हर मिनट बदलता है।33
system__time_second †integerकॉन्फ़िगर किए गए टाइमज़ोन में मौजूदा सेकंड (0–59) (या कोई सेट न होने पर UTC)। हर टर्न पर बदलता है।45

टेलीफ़ोनी और मैसेजिंग

ये वेरिएबल्स टेलीफ़ोनी और मैसेजिंग चैनलों के लिए लागू होने पर भरे जाते हैं:

वेरिएबलटाइपविवरणउदाहरण
system__caller_idstring | nullकॉलर का फ़ोन नंबर (वॉइस/SMS/WhatsApp/Amazon Connect)।"+14155552671"
system__called_numberstring | nullजिस डेस्टिनेशन फ़ोन नंबर पर कॉल की गई।"+18005551234"
system__call_sidstring | nullTwilio कॉल SID (केवल Twilio कॉल्स)।"CA3498076234a8bbf65c8f09fb8ad7ac1b"
system__call_idstring | nullSIP कॉल-ID (केवल SIP ट्रंक कॉल्स)।"757f72cf-e80f-44f7-87d6-a961ffbf5b3d"

हर टर्न की बातचीत स्थिति

वेरिएबलटाइपविवरणउदाहरण
system__call_duration_secs †integerसेकंड में बीता हुआ बातचीत समय। हर टर्न पर फिर से आकलित होता है।142
system__agent_turns †integerअब तक बातचीत में एजेंट टर्न की कुल संख्या। हर टर्न पर बढ़ती है।5
system__current_agent_turns †integerमौजूदा एजेंट के एजेंट टर्न की संख्या; एजेंट ट्रांसफ़र के बाद 0 पर रीसेट हो जाती है।3
system__current_subagent_turns †integerमौजूदा वर्कफ़्लो नोड में एजेंट टर्न की संख्या; नोड ट्रांज़िशन पर 0 पर रीसेट हो जाती है।2
system__conversation_history †stringमौजूदा टर्न तक का JSON-सीरियलाइज़्ड बातचीत ट्रांसक्रिप्ट ({"entries": [{"role": "user", "message": "..."}]})। बातचीत इतिहास फ़ॉर्मैट देखें।'{"entries": [...]}'

बातचीत इतिहास फ़ॉर्मैट

system__conversation_history वेरिएबल में इस संरचना वाला एक JSON ऑब्जेक्ट होता है:

{
"x-elevenlabs-history": true,
"entries": [
{ "role": "user", "message": "Hello" },
{ "role": "agent", "message": "Hi, how can I help?" },
{
"role": "agent",
"tool_requests": [{ "tool_name": "lookup_order", "params_as_json": { "order_id": "123" } }]
},
{
"role": "tool",
"tool_results": [{ "tool_name": "lookup_order", "result_value": "{\"status\": \"shipped\"}" }]
}
]
}

हर एंट्री में एक role ("user", "agent", या "tool") और इनमें से एक होता है:

  • message: टर्न की टेक्स्ट सामग्री
  • tool_requests: एजेंट द्वारा किए गए टूल कॉल्स का एक ऐरे, जिसमें रिज़ॉल्व किए गए पैरामीटर वैल्यू होते हैं
  • tool_results: टूल रिस्पॉन्स का एक ऐरे

अगर किसी टूल रिज़ल्ट या पैरामीटर में नेस्टेड बातचीत इतिहास है, तो अनबाउंडेड रिकर्सिव विस्तार से बचने के लिए उसे प्लेसहोल्डर (जैसे [conversation_history (5 turns)]) से रिडैक्ट कर दिया जाता है।

यह वेरिएबल टूल्स (जैसे वेबहुक या कस्टम LLMs) को बातचीत का संदर्भ पास करने या हैंडऑफ़ के दौरान सब-एजेंट प्रॉम्प्ट्स में बातचीत इतिहास शामिल करने के लिए उपयोगी है।

सीक्रेट डायनामिक वेरिएबल्स

सीक्रेट डायनामिक वेरिएबल्स सामान्य डायनामिक वेरिएबल्स की तरह ही भरे जाते हैं, लेकिन ये ElevenAgents को बताते हैं कि इनका उपयोग केवल डायनामिक वेरिएबल हेडर्स में किया जाना चाहिए और एजेंट के सिस्टम प्रॉम्प्ट या पहले संदेश के हिस्से के रूप में कभी किसी LLM प्रोवाइडर को नहीं भेजा जाना चाहिए।

ऐसे ऑथ टोकन या निजी IDs के लिए सीक्रेट डायनामिक वेरिएबल्स इस्तेमाल करें जिन्हें LLM को नहीं भेजना चाहिए। सीक्रेट डायनामिक वेरिएबल बनाने के लिए, डायनामिक वेरिएबल के आगे secret__ लगाएं।

सीक्रेट वैल्यू रिडैक्ट करके स्टोर की जाती हैं, इसलिए conversations API उन्हें <REDACTED> के रूप में लौटाता है। कॉल के बाद ट्रांसक्रिप्शन वेबहुक मूल वैल्यू भेजते हैं, इसलिए सुनिश्चित करें कि आपका वेबहुक एंडपॉइंट उन्हें सीक्रेट के रूप में हैंडल करता है। जिन वैल्यू को आपको conversations API से वापस पढ़ना हो, उनके लिए secret__ प्रीफ़िक्स का इस्तेमाल न करें। उन्हें सामान्य डायनामिक वेरिएबल्स के रूप में पास करें, या कोई गैर-संवेदनशील आइडेंटिफ़ायर पास करें और संवेदनशील वैल्यू को अपने सिस्टम पर देखें।

टूल्स से डायनामिक वेरिएबल्स अपडेट करना

अगर टूल कॉल्स एक वैध JSON ऑब्जेक्ट लौटाते हैं, तो वे डायनामिक वेरिएबल्स बना या अपडेट कर सकते हैं। क्या एक्सट्रैक्ट किया जाना चाहिए, यह तय करने के लिए डॉट नोटेशन से ऑब्जेक्ट पाथ सेट करें। अगर फ़ील्ड या पाथ मौजूद नहीं है, तो कुछ भी अपडेट नहीं होगा।

रिस्पॉन्स ऑब्जेक्ट और डॉट नोटेशन का उदाहरण:

  • स्टेटस इस पाथ से संबंधित है: response.status
  • users ऐरे में पहले यूज़र का ईमेल इस पाथ से संबंधित है: response.users.0.email
JSON
{
"response": {
"status": 200,
"message": "Successfully found 5 users",
"users": [
"user_1": {
"user_name": "test_user_1",
"email": "test_user_1@email.com"
}
]
}
}

डायनामिक वेरिएबल को पहले यूज़र के ईमेल से अपडेट करने के लिए, असाइनमेंट इस तरह सेट करें।

क्वेरी पैरामीटर

असाइनमेंट हर वेबहुक टूल पर कॉन्फ़िगर किए जाते हैं; API रेफरेंस में टूल असाइनमेंट्स देखें।

गाइड

ज़रूरी शर्तें:

1

प्रॉम्प्ट्स में डायनामिक वेरिएबल्स तय करें

अपने इन हिस्सों में डबल कर्ली ब्रेसेज़ {{variable_name}} का इस्तेमाल करके वेरिएबल्स जोड़ें:

  • सिस्टम प्रॉम्प्ट्स
  • पहले संदेश
  • टूल पैरामीटर

संदेशों में डायनामिक वेरिएबल्स

संदेशों में डायनामिक वेरिएबल्स

2

टूल्स में डायनामिक वेरिएबल्स तय करें

आप टूल कॉन्फ़िगरेशन में भी डायनामिक वेरिएबल्स तय कर सकते हैं। नया डायनामिक वेरिएबल बनाने के लिए, वैल्यू टाइप को Dynamic variable पर सेट करें और + बटन पर क्लिक करें।

प्लेसहोल्डर्स सेट करना

प्लेसहोल्डर्स सेट करना

3

प्लेसहोल्डर्स सेट करें

रनटाइम पर वेरिएबल्स पास किए बिना टेस्टिंग के लिए डिफ़ॉल्ट वैल्यू कॉन्फ़िगर करें।

एजेंट के डैशबोर्ड में हर डायनामिक वेरिएबल के लिए डिफ़ॉल्ट वैल्यू सेट करें।

प्लेसहोल्डर्स सेट करना

4

रनटाइम पर वेरिएबल्स पास करें

बातचीत शुरू करते समय, अपने कोड में डायनामिक वेरिएबल्स दें:

सुनिश्चित करें कि आपके पास नवीनतम SDK इंस्टॉल है।

import os
import signal
from elevenlabs.client import ElevenLabs
from elevenlabs.conversational_ai.conversation import Conversation, ConversationInitiationData
from elevenlabs.conversational_ai.default_audio_interface import DefaultAudioInterface
agent_id = os.getenv("AGENT_ID")
api_key = os.getenv("ELEVENLABS_API_KEY")
elevenlabs = ElevenLabs(api_key=api_key)
dynamic_vars = {
"user_name": "Angelo",
}
config = ConversationInitiationData(
dynamic_variables=dynamic_vars
)
conversation = Conversation(
elevenlabs,
agent_id,
config=config,
# Assume auth is required when API_KEY is set.
requires_auth=bool(api_key),
# Use the default audio interface.
audio_interface=DefaultAudioInterface(),
# Callbacks that print the conversation to the console.
callback_agent_response=lambda response: print(f"Agent: {response}"),
callback_agent_response_correction=lambda original, corrected: print(f"Agent: {original} -> {corrected}"),
callback_user_transcript=lambda transcript: print(f"User: {transcript}"),
# Uncomment the below if you want to see latency measurements.
# callback_latency_measurement=lambda latency: print(f"Latency: {latency}ms"),
)
conversation.start_session()
signal.signal(signal.SIGINT, lambda sig, frame: conversation.end_session())

पब्लिक टॉक-टू पेज इंटीग्रेशन

पब्लिक टॉक-टू पेज URL पैरामीटर्स के ज़रिए डायनामिक वेरिएबल्स सपोर्ट करता है, जिससे एजेंट लिंक शेयर करते समय आप बातचीत को वैयक्तिकृत कर सकते हैं। यह खास तौर पर वेबसाइट्स, ईमेल या मार्केटिंग कैंपेन में वैयक्तिकृत एजेंट एम्बेड करने के लिए उपयोगी है।

URL पैरामीटर तरीके

पब्लिक टॉक-टू पेज पर डायनामिक वेरिएबल्स पास करने के दो तरीके हैं:

तरीका 1: Base64-एन्कोडेड JSON

vars पैरामीटर का इस्तेमाल करके वेरिएबल्स को base64-एन्कोडेड JSON ऑब्जेक्ट के रूप में पास करें:

https://elevenlabs.io/app/talk-to?agent_id=agent_7101k5zvyjhmfg983brhmhkd98n6&vars=eyJ1c2VyX25hbWUiOiJKb2huIiwiYWNjb3VudF90eXBlIjoicHJlbWl1bSJ9

vars पैरामीटर में base64-एन्कोडेड JSON होता है:

{ "user_name": "John", "account_type": "premium" }

तरीका 2: अलग-अलग क्वेरी पैरामीटर्स

var_ प्रीफ़िक्स वाले क्वेरी पैरामीटर्स से वेरिएबल्स पास करें:

https://elevenlabs.io/app/talk-to?agent_id=agent_7101k5zvyjhmfg983brhmhkd98n6&var_user_name=John&var_account_type=premium

पैरामीटर प्राथमिकता

जब दोनों तरीके एक साथ इस्तेमाल किए जाते हैं, तो टकराव रोकने के लिए अलग-अलग var_ पैरामीटर्स की प्राथमिकता base64-एन्कोडेड वेरिएबल्स से ज़्यादा होती है:

https://elevenlabs.io/app/talk-to?agent_id=agent_7101k5zvyjhmfg983brhmhkd98n6&vars=eyJ1c2VyX25hbWUiOiJKYW5lIn0=&var_user_name=John

इस उदाहरण में user_name, "Jane" (base64-एन्कोडेड vars से) की जगह "John" (var_user_name से) होगा।

इंप्लीमेंटेशन उदाहरण

// Method 1: Base64-encoded JSON
function generateTalkToURL(agentId, variables) {
const baseURL = 'https://elevenlabs.io/app/talk-to';
const encodedVars = btoa(JSON.stringify(variables));
return `${baseURL}?agent_id=${agentId}&vars=${encodedVars}`;
}
// Method 2: Individual parameters
function generateTalkToURLWithParams(agentId, variables) {
const baseURL = 'https://elevenlabs.io/app/talk-to';
const params = new URLSearchParams({ agent_id: agentId });
Object.entries(variables).forEach(([key, value]) => {
params.append(`var_${key}`, encodeURIComponent(value));
});
return `${baseURL}?${params.toString()}`;
}
// Usage
const variables = {
user_name: "John Doe",
account_type: "premium",
session_id: "sess_123"
};
const urlMethod1 = generateTalkToURL("agent_7101k5zvyjhmfg983brhmhkd98n6", variables);
const urlMethod2 = generateTalkToURLWithParams("agent_7101k5zvyjhmfg983brhmhkd98n6", variables);

सर्वोत्तम तरीके

सिस्टम प्रॉम्प्ट, वर्कफ़्लो नोड्स और प्रक्रियाओं में वेरिएबल्स हर टर्न पर रिज़ॉल्व होते हैं। अगर टर्न के बीच कोई वैल्यू बदलती है, तो प्रॉम्प्ट कैश नहीं हो सकता, जिससे लागत और लेटेंसी बढ़ती है। {{system__time_utc}} और {{system__time_second}} हर टर्न पर बदलते हैं; {{system__time}} और {{system__time_minute}} हर मिनट बदलते हैं।

एजेंट को मौजूदा तारीख और समय देने के लिए, प्रॉम्प्ट टेक्स्ट में {{system__time}} या {{system__time_utc}} रखने के बजाय सिस्टम प्रॉम्प्ट एडिटर में टाइमज़ोन बटन से टाइमज़ोन सेट करें (conversation_config.agent.prompt.timezone)। टाइमज़ोन सेट होने पर, प्लेटफ़ॉर्म कैश किए गए प्रॉम्प्ट प्रीफ़िक्स के बाहर मौजूदा तारीख और समय जोड़ता है, इसलिए आपका सिस्टम प्रॉम्प्ट टर्न्स के बीच कैश रहता है। टाइमज़ोन के बिना, एजेंट को मौजूदा तारीख और समय नहीं मिलता।

अगर आपके प्रॉम्प्ट में तारीख या घंटा इनलाइन चाहिए, तो {{system__time_date}}, {{system__time_hour}}, और {{system__timezone}} को मिलाएं (उदाहरण के लिए, आज {{system__time_date}} है, घंटा {{system__time_hour}} है ({{system__timezone}}))। ये अधिकतम हर घंटे एक बार बदलते हैं।

अगर किसी टूल को † से चिह्नित वैल्यू चाहिए, तो उसे प्रॉम्प्ट में रखने के बजाय टूल पैरामीटर या हेडर से बाइंड करें। टूल पैरामीटर्स सिर्फ़ टूल कॉल होने पर रिज़ॉल्व होते हैं, इसलिए वे प्रॉम्प्ट कैशिंग को प्रभावित नहीं करते। LLM बातचीत पहले से देखता है, इसलिए प्रॉम्प्ट्स में {{system__conversation_history}} की शायद ही ज़रूरत होती है।

अगर आपका प्रॉम्प्ट {{system__agent_turns}} जैसे टर्न काउंटर्स जाँचता है, तो इन विकल्पों पर विचार करें। स्थिर शुरुआती अभिवादन या डिस्क्लोज़र के लिए first_message का इस्तेमाल करें।

पहले जवाब के व्यवहार के लिए, आप बातचीत इतिहास के आधार पर निर्देश लिख सकते हैं (उदाहरण के लिए, “अपने पहले जवाब में, जब आपने अभी तक कॉलर का अभिवादन नहीं किया है…”)। यह LLM द्वारा निर्देश का पालन करने पर निर्भर करता है, इसलिए अपने मॉडल के साथ इसे टेस्ट करें और अगर नतीजे कम भरोसेमंद हों तो टर्न काउंटर रखें।

अगर काउंटर सिर्फ़ यह तय करता है कि ब्रांच या एस्केलेट कब करना है, तो वर्कफ़्लो एज एक्सप्रेशन कंडीशन या स्ट्रक्चर्ड प्रक्रिया का If स्टेप एक्सप्रेशन (जैसे system__agent_turns >= 5) इसे प्रॉम्प्ट के बाहर हैंडल कर सकता है। यह उन स्थितियों को कवर नहीं करता जहाँ LLM को खुद वैल्यू चाहिए।

ऑथ टोकन और API कीज़ के आगे secret__ लगाएं, ताकि उन्हें केवल टूल हेडर्स से बाइंड किया जा सके और वे LLM को कभी न भेजे जाएं। क्योंकि secret__ वैल्यू conversations API में <REDACTED> के रूप में रिडैक्ट की जाती हैं (कॉल के बाद ट्रांसक्रिप्शन वेबहुक को फिर भी मूल वैल्यू मिलती हैं), जिन वैल्यू को आपको conversations API से वापस पढ़ना हो उन्हें सामान्य डायनामिक वेरिएबल्स के रूप में पास करें, या कोई गैर-संवेदनशील आइडेंटिफ़ायर पास करें और संवेदनशील वैल्यू को अपने सिस्टम पर देखें।

system__user_id क्लाइंट द्वारा ट्रैकिंग और एनालिटिक्स के लिए दिया जाता है और ElevenAgents द्वारा सत्यापित नहीं होता। अकाउंट डेटा दिखाने से पहले बातचीत शुरू करने वाले वेबहुक, secret__ हेडर वेरिएबल में साइन किया गया टोकन, या वेरिफ़िकेशन टूल कॉल से कॉलर की पहचान सत्यापित करें।

अपने प्रॉम्प्ट्स, पहले संदेशों और टूल्स में इस्तेमाल होने वाले हर कस्टम वेरिएबल के लिए dynamic_variable_placeholders में डिफ़ॉल्ट वैल्यू सेट करें। डैशबोर्ड में प्रीव्यू बातचीत और सिम्युलेशन टेस्ट्स बातचीत शुरू करने वाले वेबहुक नहीं चलाते, इसलिए टेस्टिंग के दौरान अनसेट वेरिएबल्स लिटरल {{variable_name}} प्लेसहोल्डर्स के रूप में रहते हैं।

समस्या निवारण

पुष्टि करें कि:

  • वेरिएबल के नाम बिल्कुल मेल खाते हों (अक्षर केस-सेंसिटिव है)
  • वेरिएबल में डबल कर्ली ब्रेसेस हों: {{variable_name}}
  • वेरिएबल आपके dynamic_variables ऑब्जेक्ट में शामिल हों

सुनिश्चित करें कि:

  • वेरिएबल की वैल्यू अपेक्षित टाइप से मेल खाती हो
  • वैल्यू केवल स्ट्रिंग, नंबर या बूलियन हों