0Pricing
AI Agents · درس

متغيرات البيئة للوكلاء

os.environ وos.getenv() ولماذا يجب عدم تضمين الأسرار مباشرة في الشيفرة المصدرية

متغيرات البيئة للوكلاء درس مجاني في AI Agents على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في AI Agents، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة AI Agents 4 دروس في المجموع.

لماذا لا ينبغي تضمين مفاتيح API مباشرة في الشفرة؟

يُعد تضمين مفاتيح API مباشرة في الشفرة المصدرية من أكثر أخطاء الأمان شيوعًا وتكلفة. فالمفاتيح التي تُحفظ في نظام التحكم بالإصدارات تصبح مرئية لكل من يملك صلاحية الوصول إلى المستودع — بما في ذلك المساهمون المستقبليون وأنظمة CI وأي شخص يعثر على المستودع عبر الإنترنت.

مشكلة سجل Git

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

import os

os.environ['OPENAI_API_KEY'] = 'sk-proj-abc123def456'  # simulate deployment env

OPENAI_API_KEY = os.environ['OPENAI_API_KEY']
print('Key loaded from environment — never hard-coded')

os.environ[] في مقابل os.getenv()

هناك طريقتان لقراءة متغيرات البيئة. ترفع os.environ['KEY'] الاستثناء KeyError إذا كان المتغير مفقودًا — وهذا مفيد للمفاتيح المطلوبة. أما os.getenv('KEY', default) فتعيد قيمة افتراضية عند غياب المتغير — وهذا مفيد للإعدادات الاختيارية.

import os

os.environ['OPENAI_API_KEY'] = 'sk-proj-demo-key'

try:
    openai_key = os.environ['OPENAI_API_KEY']
except KeyError:
    print('ERROR: OPENAI_API_KEY environment variable is not set!')
    raise

model = os.getenv('AGENT_MODEL', 'gpt-4o-mini')
timeout = float(os.getenv('AGENT_TIMEOUT', '30'))
log_level = os.getenv('LOG_LEVEL', 'INFO')
max_steps = int(os.getenv('AGENT_MAX_STEPS', '20'))

print(f'Model: {model}, Timeout: {timeout}s, Log: {log_level}')

التحقق من متغيرات البيئة المطلوبة عند بدء التشغيل

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

import os
import sys

REQUIRED_VARS = [
    'OPENAI_API_KEY',
    'SEARCH_API_KEY',
    'DATABASE_URL'
]

def check_required_env_vars():
    missing = [var for var in REQUIRED_VARS if not os.getenv(var)]
    if missing:
        print('FATAL: Missing required environment variables:')
        for var in missing:
            print(f'  - {var}')
        print('\nSet these in your .env file or shell environment.')
        sys.exit(1)
    print(f'All {len(REQUIRED_VARS)} required environment variables are set.')

# Call this at the very start of your agent:
# check_required_env_vars()

if __name__ == '__main__':
    for var in REQUIRED_VARS:
        os.environ.setdefault(var, 'demo-value')
    check_required_env_vars()

مبدأ تطبيق 12-Factor

تحدد منهجية 12-Factor App أفضل الممارسات للبرمجيات الحديثة. العامل III: تخزين الإعدادات في البيئة. يجب أن تأتي كل القيم التي تختلف بين عمليات النشر (التطوير والاختبار المرحلي والإنتاج) — مثل مفاتيح API وعناوين URL ومفاتيح الميزات — من متغيرات البيئة، لا من الشفرة.

import os

os.environ['OPENAI_API_KEY'] = 'sk-proj-demo'
os.environ['SEARCH_API_KEY'] = 'tvly-demo'
os.environ['DATABASE_URL'] = 'postgresql://user:pass@localhost/agentdb'

config = {
    'openai_key': os.environ['OPENAI_API_KEY'],
    'search_key': os.environ['SEARCH_API_KEY'],
    'database_url': os.environ['DATABASE_URL'],
    'redis_url': os.getenv('REDIS_URL', 'redis://localhost:6379'),
    'enable_caching': os.getenv('ENABLE_CACHING', 'true') == 'true',
    'max_results': int(os.getenv('MAX_RESULTS', '10')),
    'log_level': os.getenv('LOG_LEVEL', 'INFO'),
    'env': os.getenv('ENV', 'development')
}

print('Config loaded from environment:', config['env'])

تعيين متغيرات البيئة في الصدفة

عيّن متغيرات البيئة في جلسة الطرفية باستخدام export (في Mac/Linux) أو set (في Windows). وتصبح هذه المتغيرات متاحة لأي برنامج يُشغّل في تلك الجلسة.

# Mac/Linux (bash/zsh):
# export OPENAI_API_KEY='sk-proj-your-key-here'
# export AGENT_MODEL='gpt-4o-mini'
# python agent.py

# Windows (Command Prompt):
# set OPENAI_API_KEY=sk-proj-your-key-here
# python agent.py

# Windows (PowerShell):
# $env:OPENAI_API_KEY = 'sk-proj-your-key-here'
# python agent.py

# One-liner (temporary, only for this command):
# OPENAI_API_KEY='sk-proj-...' python agent.py

print('Shell exports set env vars for the current session only')

إدراج المتغيرات المطلوبة في تعليقات الشفرة

وثّق متغيرات البيئة التي يحتاج إليها وكيلك مباشرةً في الشفرة المصدرية. ينبغي أن يتمكن المطور الجديد من قراءة بداية ملف الوكيل ومعرفة ما يجب إعداده بالضبط.

# agent.py
#
# REQUIRED ENVIRONMENT VARIABLES:
#   OPENAI_API_KEY       OpenAI API key (get from platform.openai.com)
#   SEARCH_API_KEY       Tavily search API key (get from tavily.com)
#
# OPTIONAL ENVIRONMENT VARIABLES:
#   AGENT_MODEL          LLM model (default: gpt-4o-mini)
#   AGENT_MAX_STEPS      Max loop iterations (default: 20)
#   LOG_LEVEL            Logging verbosity: DEBUG|INFO|WARNING (default: INFO)
#   DATABASE_URL         PostgreSQL URL (default: none, disables memory storage)
#
# EXAMPLE SETUP:
#   cp .env.example .env
#   Edit .env with your keys
#   python agent.py --query 'Your question'

print('Document required variables at the top of each agent file')

الوصول الآمن إلى الإعدادات المتداخلة

بالنسبة إلى الوكلاء الذين لديهم خيارات إعداد كثيرة، أنشئ فئة إعدادات تقرأ جميع متغيرات البيئة وتتحقق منها في مكان واحد. يؤدي ذلك إلى توحيد عملية التحقق وجعل بقية الشفرة أكثر تنظيمًا.

import os

class AgentConfig:
    def __init__(self):
        self.openai_key = self._require('OPENAI_API_KEY')
        self.search_key = self._require('SEARCH_API_KEY')
        self.model = os.getenv('AGENT_MODEL', 'gpt-4o-mini')
        self.max_steps = int(os.getenv('AGENT_MAX_STEPS', '20'))
        self.log_level = os.getenv('LOG_LEVEL', 'INFO')
        self.env = os.getenv('ENV', 'development')

    def _require(self, key: str) -> str:
        value = os.getenv(key)
        if not value:
            raise EnvironmentError(
                f'Required environment variable {key} is not set. '
                f'See .env.example for setup instructions.'
            )
        return value

# config = AgentConfig()  # raises clear error if any key is missing
# client = openai.OpenAI(api_key=config.openai_key)

if __name__ == '__main__':
    os.environ.setdefault('OPENAI_API_KEY', 'sk-demo-1234')
    os.environ.setdefault('SEARCH_API_KEY', 'demo-search-key')
    config = AgentConfig()
    print(f'Model: {config.model}, max_steps: {config.max_steps}, env: {config.env}')

إخفاء المفاتيح في السجلات

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

import os

def mask_key(key: str) -> str:
    if not key or len(key) < 8:
        return '****'
    return '*' * (len(key) - 4) + key[-4:]

def log_config_summary(config: dict):
    print('Agent configuration:')
    for name, value in config.items():
        if 'key' in name.lower() or 'secret' in name.lower() or 'token' in name.lower():
            print(f'  {name}: {mask_key(value)}')
        else:
            print(f'  {name}: {value}')

config = {
    'openai_key': os.getenv('OPENAI_API_KEY', ''),
    'model': 'gpt-4o-mini',
    'max_steps': '20'
}
log_config_summary(config)
# openai_key: ****abcd
# model: gpt-4o-mini

متغيرات البيئة في Docker وCI

في Docker، مرّر متغيرات البيئة باستخدام خيارات -e أو ملف --env-file. وفي GitHub Actions، خزّنها بوصفها Secrets وأشر إليها في YAML الخاص بسير العمل. لا تضعها داخل صورة Docker مطلقًا.

# Docker run with env vars:
# docker run -e OPENAI_API_KEY='sk-...' -e AGENT_MODEL='gpt-4o-mini' myagent:latest

# Docker with an env file:
# docker run --env-file .env myagent:latest

# GitHub Actions workflow (secrets stored in repo settings):
# env:
#   OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
#   SEARCH_API_KEY: ${{ secrets.SEARCH_API_KEY }}

# docker-compose.yml:
# services:
#   agent:
#     image: myagent:latest
#     env_file:
#       - .env

print('Never bake secrets into Docker images — always inject at runtime')

ما الذي ينبغي فعله عند كشف مفتاح؟

إذا حفظت مفتاح API عن طريق الخطأ في مستودع عام أو مشترك، فاتخذ إجراءً فورًا. افترض أن المفتاح قد اختُرق لحظة خروجه من سيطرتك — إذ تفحص الروبوتات GitHub بحثًا عن المفاتيح خلال ثوانٍ من إجراء الحفظ.

# Immediate response if a key is exposed:
# 1. REVOKE the key immediately (provider dashboard)
#    OpenAI: platform.openai.com/api-keys -> Delete key
#    Anthropic: console.anthropic.com -> API Keys
# 2. Generate a new key
# 3. Update your .env file with the new key
# 4. Rotate in all environments (staging, prod)

# Remove from git history (does NOT guarantee removal from forks/clones):
# git filter-branch or git-filter-repo to rewrite history
# Force push to all branches

# Note: Rewriting git history cannot undo exposure
# if others have already cloned or forked the repo
print('Revoke immediately. Do not just remove from code — rotate the key.')

اختبار المعرفة: متغيرات البيئة

اختبر مدى فهمك لمتغيرات البيئة في إدارة أسرار الوكلاء.

مراجعة: متغيرات البيئة للوكلاء

أصبحت الآن تفهم النهج الصحيح لإدارة أسرار الوكلاء:

  • لا تضمّن مفاتيح API مباشرة في الشفرة مطلقًا — إذ ينتهي بها الأمر في سجل git إلى الأبد
  • استخدم os.environ['KEY'] للمتغيرات المطلوبة وos.getenv('KEY', default) للمتغيرات الاختيارية
  • تحقق من جميع المتغيرات المطلوبة عند بدء التشغيل مع عرض رسالة خطأ واضحة
  • وثّق المتغيرات المطلوبة في تعليقات الشفرة و.env.example
  • أخفِ المفاتيح في السجلات — واعرض الأحرف الأربعة الأخيرة فقط
  • مرّر الأسرار أثناء التشغيل في Docker؛ واستخدم GitHub Secrets في CI
  • إذا كُشف مفتاح: أبطله أولًا، ثم بدّله في كل المواضع

الأسئلة الشائعة

هل درس «متغيرات البيئة للوكلاء» مجاني؟

نعم — نص درس «متغيرات البيئة للوكلاء» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة AI Agents، انتقل إلى CoddyKit PRO. تتضمن دورة AI Agents 4 دروس في المجموع.

ماذا ستتعلم في «متغيرات البيئة للوكلاء»؟

os.environ وos.getenv() ولماذا يجب عدم تضمين الأسرار مباشرة في الشيفرة المصدرية تتمرن على AI Agents مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ AI Agents؟

لا تُشترط خبرة سابقة. AI Agents على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.

كم من الوقت يستغرق درس «متغيرات البيئة للوكلاء»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس AI Agents هذا؟

نعم. كل درس في AI Agents يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. متغيرات البيئة للوكلاء
  2. ملفات .env وpython-dotenv
  3. تدوير الأسرار وأمنها
  4. ملفات تعريف الإعدادات للتطوير والإنتاج
← العودة إلى AI Agents