−25%

за Windows при годишно плащане, до 31.10. Към плановете

EQVPS
Започни

Първата ви агентска задача в пясъчник: LLM пише код, microVM го изпълнява

Изградете най-малкия полезен цикъл за изпълнение на код с AI: модел пише Python скрипт, пясъчник на Firecracker го изпълнява, грешките се връщат към модела, докато скриптът заработи. Около 40 реда, плюс същата задача през MCP изобщо без код.

Агент, който пише код, е полезен само ако нещо изпълнява този код безопасно и докладва резултата. Това ръководство изгражда такъв цикъл от началото до края: модел пише Python скрипт, пясъчник го изпълнява, а ако се провали, грешката се връща към модела. След това същата задача без нито ред код, през MCP.

Нужни са ви Python 3.8+, токен на акаунт в EQVPS (вижте свързване на акаунта) и API ключ за модел.

1. Първо задайте лимит на разходите

Агентът създава пясъчници сам, затова му дайте таван, преди да започне. Два долара на ден и двайсет на месец са повече от достатъчно за експерименти:

curl -X PUT https://api.eqvps.com/api/v1/eqvps/sandboxes/budget \
  -H "Authorization: Bearer $EQVPS_API_KEY" -H "Content-Type: application/json" \
  -d '{"daily_usd": 2, "monthly_usd": 20}'

Когато лимит бъде достигнат, новите пясъчници получават 429 budget_exceeded, а работещите временни се изтриват. Подробностите са в лимити и таксуване на пясъчниците.

2. Инсталирайте двете библиотеки

pip install eqvps anthropic
export EQVPS_API_KEY="your-eqvps-token"
export ANTHROPIC_API_KEY="your-model-key"

Примерът използва един доставчик на модели, но нищо не зависи от него. Само функцията ask() говори с модела.

3. Цикълът напиши, изпълни, поправи

Запазете това като agent.py:

import re
import anthropic
from eqvps import Sandbox

TASK = "Count the prime numbers below 1,000,000 and print only the number."
client = anthropic.Anthropic()

def ask(messages):
    msg = client.messages.create(model="claude-sonnet-5", max_tokens=2000, messages=messages)
    return msg.content[0].text

def extract_code(text):
    m = re.search(r"`{3}(?:python)?\n(.*?)`{3}", text, re.S)
    return m.group(1) if m else text

messages = [{"role": "user", "content": "Write a Python 3 script for this task. "
             "Reply with a single code block and nothing else.\n\nTask: " + TASK}]

with Sandbox.create(tariff="small", idle_timeout=120) as sb:
    for attempt in range(1, 4):
        reply = ask(messages)
        r = sb.run(extract_code(reply), timeout=55)
        print(f"attempt {attempt}: exit code {r.exit_code}")
        if r.ok:
            print(r.stdout.strip())
            break
        messages += [
            {"role": "assistant", "content": reply},
            {"role": "user", "content": f"The script failed with exit code {r.exit_code}.\n"
             f"stderr:\n{r.stderr[-3000:]}\nFix it. Reply with a single code block."},
        ]

Пуснете го:

python3 agent.py

Типично пускане отпечатва attempt 1: exit code 0, а след това 78498. Ако първият скрипт се провали, ще видите втория опит с поправената грешка.

Какво прави всяка част:

  • Sandbox.create(..., idle_timeout=120) стартира microVM за около секунда. Ако скриптът ви умре по средата, пясъчникът така или иначе ще се изтрие сам след 2 минути бездействие.
  • sb.run(code, timeout=55) изпълнява кода и връща кода на изход, stdout и stderr. Срив в кода е нормален резултат, а не изключение, затова цикълът може да го покаже на модела.
  • r.stderr[-3000:] изпраща само края на грешката. Пълен traceback от голям скрипт може да изхаби много от контекста на модела.
  • Три опита са съзнателно ограничение. Модел, който не е поправил скрипт за три опита, обикновено има нужда от по-добро описание на задачата, а не от четвърти опит.

4. Когато задачата изисква повече от 55 секунди

Синхронно извикване трае най-много 55 секунди. По-дългата работа пуснете във фонов режим и изчакайте:

task = sb.run(code, background=True)
result = task.wait(timeout=1800)

Задачата продължава да работи, дори ако вашият wait стигне таймаута си, и можете да я подхванете отново с sb.task(task_id).

5. Същата задача през MCP, без код

Ако използвате MCP клиент като Claude Desktop или Cursor с MCP сървъра на EQVPS, агентът вече има инструментите за пясъчници: create_sandbox, run_code, exec_command, upload_file, download_file и kill_sandbox. Достатъчен е един промпт:

Създай малък временен пясъчник. Напиши Python скрипт, който брои простите числа под 1 000 000, изпълни го там, поправи го, ако се провали, кажи ми резултата и изтрий пясъчника.

Агентът прави същите извиквания като скрипта по-горе. Кои инструменти е безопасно да разрешите без потвърждение, е обяснено в защитите на MCP.

Колко струваше

Пясъчникът живя доста по-малко от минута и беше таксуван с минимума от 60 секунди: 0,00055 $ на small. Извикването на модела струва повече от пясъчника. Пробният кредит от 1 $ на нов акаунт стига за около 1800 такива пускания.

Накъде оттук

Въпроси

Защо просто да не пусна кода на модела на собствената си машина?

Защото не знаете какво ще направи. Генерираният код може да изтрие файлове, да прочете ключовете ви или да се завърти безкрайно. В пясъчник той работи в отделна microVM със собствено ядро, а после пясъчникът се изтрива.

Работи ли това с други модели освен този от примера?

Да. На цикъла му трябва само функция, която приема съобщения и връща текст. Заменете функцията ask() с който и да е чат API, включително локален модел.

Какво пречи на агент да създава пясъчници безкрайно?

Задайте дневен и месечен лимит на разходите, преди да започнете. Когато лимитът бъде достигнат, новите пясъчници се отказват с 429 budget_exceeded. Освен това в един акаунт едновременно вървят само две команди, така че излязъл от контрол цикъл не може да се размножи.

Може ли генерираният код да излиза в интернет?

Да, пясъчниците имат изходящ достъп до интернет, за да може кодът да инсталира пакети и да изтегля данни. Нямат входящи портове. Не слагайте тайни в промпта или кода; подавайте тези, които скриптът наистина изисква, като променливи на средата.

Коментари

Още няма коментари. Бъди първият.

Остави коментар

Коментарите се модерират преди да се появят.