0Pricing
AI Agents · Pelajaran

Agen Interaktif Bergaya REPL

Putaran input, riwayat, dan percakapan multigiliran dalam agen terminal.

Agen Interaktif Bergaya REPL adalah pelajaran AI Agents gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar AI Agents, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus AI Agents mencakup 4 pelajaran total.

Apa Itu Agen Bergaya REPL?

REPL (Baca-Evaluasi-Cetak) adalah sesi terminal interaktif tempat Anda mengetik masukan, mendapatkan keluaran, lalu melanjutkan. Agen percakapan di terminal bekerja persis seperti ini: pengguna mengetik pesan, agen merespons, dan percakapan berlanjut hingga pengguna keluar.

Perulangan REPL Dasar

REPL paling sederhana adalah perulangan while True yang membaca masukan pengguna dengan input(), memprosesnya, lalu mencetak hasilnya. Perulangan berjalan tanpa batas hingga pengguna memberikan sinyal keluar.

def run_agent_repl(inputs):
    print('Agent started. Type /exit to quit.')
    conversation_history = []
    for user_input in inputs:
        user_input = user_input.strip()
        if not user_input:
            continue
        if user_input == '/exit':
            print('Goodbye!')
            break
        conversation_history.append({'role': 'user', 'content': user_input})
        agent_reply = f'[Agent reply to: {user_input}]'
        conversation_history.append({'role': 'assistant', 'content': agent_reply})
        print(f'Agent: {agent_reply}')

run_agent_repl(['Hello agent', 'What can you do?', '/exit'])

Menangani KeyboardInterrupt dengan Anggun

Saat pengguna menekan Ctrl+C, Python memunculkan KeyboardInterrupt. Tangkap kondisi ini di tingkat teratas untuk mencetak pesan perpisahan yang ramah, bukan pelacakan tumpukan.

def run_agent_repl():
    print('Agent ready. Press Ctrl+C to exit.')
    conversation_history = []

    try:
        while True:
            user_input = input('You: ').strip()
            if not user_input:
                continue

            conversation_history.append({'role': 'user', 'content': user_input})
            reply = '[mocked agent response]'
            conversation_history.append({'role': 'assistant', 'content': reply})
            print(f'Agent: {reply}')

    except KeyboardInterrupt:
        print('\nSession ended. Goodbye!')
    except EOFError:
        # Triggered when stdin is closed (piped input ends)
        print('\nEnd of input. Exiting.')

if __name__ == '__main__':
    import builtins
    _demo_inputs = iter(['What agents can you build?', EOFError])
    def _fake_input(prompt=''):
        val = next(_demo_inputs)
        if val is EOFError:
            raise EOFError
        print(prompt + val)
        return val
    builtins.input = _fake_input
    run_agent_repl()

Mempertahankan Riwayat Percakapan Banyak Giliran

Untuk memberi agen ingatan tentang percakapan, pertahankan daftar pesan dan teruskan seluruh riwayat ke LLM pada setiap giliran. Awali dengan pesan sistem yang menetapkan karakter agen.

import openai

client = openai.OpenAI(api_key='YOUR_API_KEY')

def run_chat_repl():
    history = [
        {'role': 'system', 'content': 'You are a helpful AI assistant.'}
    ]

    print('Chat started. Type /exit to quit.')

    try:
        while True:
            user_input = input('You: ').strip()
            if not user_input or user_input == '/exit':
                break

            history.append({'role': 'user', 'content': user_input})

            response = client.chat.completions.create(
                model='gpt-4o-mini',
                messages=history
            )

            reply = response.choices[0].message.content
            history.append({'role': 'assistant', 'content': reply})
            print(f'Agent: {reply}')

    except KeyboardInterrupt:
        print('\nGoodbye!')

readline: Riwayat dan Penyuntingan Masukan

Modul readline (Unix/Mac) memungkinkan navigasi dengan tombol panah melalui masukan sebelumnya, seperti pada terminal sungguhan. Pengguna dapat menekan tombol panah atas untuk memanggil kembali pesan sebelumnya.

try:
    import readline  # available on Unix/Mac, not Windows
    # Enable persistent history between sessions
    import os
    HISTORY_FILE = os.path.expanduser('~/.agent_history')
    try:
        readline.read_history_file(HISTORY_FILE)
    except FileNotFoundError:
        pass

    import atexit
    atexit.register(readline.write_history_file, HISTORY_FILE)
    readline.set_history_length(500)
    print('History enabled (use up/down arrows)')
except ImportError:
    pass  # readline not available on Windows

# After this, input() automatically has history support

Perintah Garis Miring Bawaan

Berikan perintah garis miring bawaan kepada agen REPL untuk operasi umum: /help, /exit, /clear untuk mengatur ulang percakapan, dan /history untuk melihat pesan sebelumnya.

def handle_command(cmd: str, history: list) -> bool:
    'Returns True if the command was handled, False if it is a regular message'
    if cmd == '/exit' or cmd == '/quit':
        print('Goodbye!')
        raise SystemExit(0)

    elif cmd == '/help':
        print('Commands: /exit, /clear, /history, /help')
        return True

    elif cmd == '/clear':
        # Keep only the system message
        system = history[0] if history and history[0]['role'] == 'system' else None
        history.clear()
        if system:
            history.append(system)
        print('[Conversation cleared]')
        return True

    elif cmd == '/history':
        for i, msg in enumerate(history):
            if msg['role'] != 'system':
                print(f'  [{msg["role"]}] {msg["content"][:80]}')
        return True

    return False  # not a command, treat as regular message

if __name__ == '__main__':
    demo_history = [
        {'role': 'system', 'content': 'You are a helpful agent.'},
        {'role': 'user', 'content': 'Hi there'},
        {'role': 'assistant', 'content': 'Hello! How can I help?'},
    ]
    handle_command('/help', demo_history)
    handle_command('/history', demo_history)

Membatasi Panjang Riwayat Percakapan

Meneruskan seluruh riwayat percakapan ke LLM pada setiap giliran membuat jumlah token bertambah secara linear. Pangkas riwayat menjadi N pesan terakhir (dengan tetap mempertahankan pesan sistem) untuk mengendalikan biaya.

def trim_history(history: list, max_turns: int = 10) -> list:
    system_messages = [m for m in history if m['role'] == 'system']
    non_system = [m for m in history if m['role'] != 'system']

    # Keep the last max_turns messages (each turn = 1 user + 1 assistant)
    max_messages = max_turns * 2
    trimmed = non_system[-max_messages:]

    return system_messages + trimmed

# Usage in the REPL loop:
# history.append({'role': 'user', 'content': user_input})
# trimmed = trim_history(history, max_turns=10)
# response = client.chat.completions.create(model='gpt-4o-mini', messages=trimmed)
print('Trimming history prevents token count from growing unboundedly')

Menampilkan Spanduk Selamat Datang

Spanduk selamat datang membuat REPL Anda terasa lebih rapi. Cetak spanduk tersebut sekali saat memulai, dengan nama agen, versi, dan perintah yang tersedia. Gunakan seni ASCII sederhana atau pustaka rich untuk warna.

def print_banner():
    banner = '''
====================================
  AI Research Agent v1.0
====================================
  Type your question to begin.
  Commands: /help  /clear  /exit
====================================
    '''
    print(banner)

# Or with rich colors:
# from rich.console import Console
# from rich.panel import Panel
# console = Console()
# console.print(Panel('[bold cyan]AI Research Agent[/] v1.0', subtitle='Type /help for commands'))

print_banner()

Menampilkan Indikator Pengetikan

Pemanggilan LLM dapat memerlukan waktu beberapa detik. Tampilkan pesan 'sedang berpikir...' saat menunggu agar pengguna tahu bahwa agen sedang memproses. Hapus pesan tersebut saat respons tiba.

import sys
import threading
import time

def thinking_spinner(stop_event: threading.Event):
    frames = ['|', '/', '-', '\\']
    i = 0
    while not stop_event.is_set():
        sys.stdout.write(f'\rAgent is thinking... {frames[i % 4]}')
        sys.stdout.flush()
        time.sleep(0.1)
        i += 1
    sys.stdout.write('\r' + ' ' * 30 + '\r')  # clear the line
    sys.stdout.flush()

def call_agent_with_spinner(query: str) -> str:
    stop = threading.Event()
    spinner = threading.Thread(target=thinking_spinner, args=(stop,))
    spinner.start()

    # result = agent.run(query)  # the actual slow call
    time.sleep(1)  # simulating work
    result = 'The answer is 42.'

    stop.set()
    spinner.join()
    return result

if __name__ == '__main__':
    answer = call_agent_with_spinner('What is 6 * 7?')
    print(f'\nFinal answer: {answer}')

Menyimpan Sesi ke Berkas

Izinkan pengguna menyimpan percakapan ke berkas pada akhir sesi. Ini berguna untuk sesi penelitian ketika Anda ingin menyimpan catatan tentang hal-hal yang ditemukan agen.

import json
import datetime
import os

def save_session(history: list, directory: str = 'sessions'):
    os.makedirs(directory, exist_ok=True)
    timestamp = datetime.datetime.now().strftime('%Y%m%d_%H%M%S')
    filename = os.path.join(directory, f'session_{timestamp}.json')

    with open(filename, 'w') as f:
        json.dump({
            'saved_at': timestamp,
            'messages': history
        }, f, indent=2)

    print(f'Session saved to {filename}')

# Usage in REPL on /save command:
# save_session(conversation_history)

if __name__ == '__main__':
    import tempfile
    demo_dir = tempfile.mkdtemp()
    demo_history = [
        {'role': 'user', 'content': 'Hello'},
        {'role': 'assistant', 'content': 'Hi! How can I help?'},
    ]
    save_session(demo_history, directory=demo_dir)

Templat Agen REPL Lengkap

Menggabungkan semuanya: templat REPL siap produksi dengan pengelolaan riwayat, perintah garis miring, penanganan interupsi papan ketik, dan penyimpanan sesi.

def run_repl(agent):
    history = [{'role': 'system', 'content': 'You are a helpful AI assistant.'}]
    print('Agent ready. Type /help for commands.')
    try:
        while True:
            user_input = input('You: ').strip()
            if not user_input:
                continue
            if user_input.startswith('/'):
                handle_command(user_input, history)
                continue
            history.append({'role': 'user', 'content': user_input})
            trimmed = trim_history(history, max_turns=10)
            reply = agent.run(trimmed)
            history.append({'role': 'assistant', 'content': reply})
            print(f'Agent: {reply}')
    except KeyboardInterrupt:
        print('\nSession ended.')
        save_session(history)

Pemeriksaan Pemahaman: Agen Bergaya REPL

Uji pemahaman Anda tentang agen REPL interaktif.

Ringkasan: Agen REPL Interaktif

Sekarang Anda dapat membangun agen interaktif dengan fitur lengkap untuk terminal:

  • Gunakan while True: input() sebagai perulangan pembacaan inti
  • Tangkap KeyboardInterrupt untuk keluar dengan bersih melalui Ctrl+C
  • Pertahankan daftar conversation_history untuk ingatan banyak giliran
  • Gunakan readline untuk riwayat masukan dengan tombol panah
  • Implementasikan perintah garis miring /help, /clear, dan /exit
  • Pangkas riwayat untuk mencegah pertumbuhan token tanpa batas
  • Tampilkan indikator putar atau indikator kemajuan selama pemanggilan LLM

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Agen Interaktif Bergaya REPL” gratis?

Ya — teks lengkap “Agen Interaktif Bergaya REPL” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus AI Agents, upgrade ke CoddyKit PRO. Kursus AI Agents mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Agen Interaktif Bergaya REPL”?

Putaran input, riwayat, dan percakapan multigiliran dalam agen terminal. Kamu berlatih AI Agents dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai AI Agents?

Tidak diperlukan pengalaman sebelumnya. AI Agents di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.

Berapa lama pelajaran “Agen Interaktif Bergaya REPL” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran AI Agents ini?

Ya. Setiap pelajaran AI Agents menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Membangun Antarmuka Agen Baris Perintah
  2. Agen Interaktif Bergaya REPL
  3. Penguraian Argumen dan Teks Bantuan
  4. Mengalirkan Output dalam Agen CLI
← Kembali ke AI Agents