−25%

Windows-ის წლიურ გადახდაზე, 31 ოქტომბრამდე. ტარიფებზე

EQVPS
დაწყება

თქვენი პირველი აგენტის ამოცანა sandbox-ში: ენობრივი მოდელი წერს კოდს, microVM უშვებს

ააწყვეთ AI-ით კოდის შესრულების უმცირესი სასარგებლო ციკლი: მოდელი წერს Python სკრიპტს, Firecracker sandbox უშვებს მას, შეცდომები კი მოდელს უბრუნდება, სანამ სკრიპტი არ იმუშავებს. დაახლოებით 40 ხაზი, პლუს იგივე ამოცანა MCP-ით, საერთოდ კოდის გარეშე.

აგენტი, რომელიც კოდს წერს, მხოლოდ მაშინაა სასარგებლო, როცა რაღაც ამ კოდს უსაფრთხოდ ასრულებს და შედეგს აცნობებს. ეს გზამკვლევი ამ ციკლს თავიდან ბოლომდე აწყობს: მოდელი წერს Python სკრიპტს, sandbox უშვებს მას, და თუ ის ვერ სრულდება, შეცდომა მოდელს უბრუნდება. შემდეგ იგივე ამოცანა კოდის ერთი ხაზის გარეშე, MCP-ით.

გჭირდებათ Python 3.8+, EQVPS-ის ანგარიშის ტოკენი (იხ. ანგარიშის დაკავშირება) და მოდელის API გასაღები.

1. ჯერ დააყენეთ ხარჯის ლიმიტი

აგენტი sandbox-ებს თავად ქმნის, ამიტომ დაწყებამდე მიეცით ჭერი. ექსპერიმენტებისთვის დღეში ორი დოლარი და თვეში ოცი დოლარი სრულიად საკმარისია:

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}'

ლიმიტის მიღწევისას ახალი sandbox-ები იღებენ 429 budget_exceeded-ს, ხოლო გაშვებული დროებითი sandbox-ები იშლება. დეტალები sandbox-ის ლიმიტებსა და ბილინგშია.

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-ს. თუ თქვენი სკრიპტი შუა გზაზე მოკვდება, sandbox მაინც თავს წაშლის 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, EQVPS-ის MCP სერვერთან ერთად, აგენტს უკვე აქვს sandbox-ის ხელსაწყოები: create_sandbox, run_code, exec_command, upload_file, download_file და kill_sandbox. ერთი პრომპტი საკმარისია:

შექმენი პატარა დროებითი sandbox. დაწერე Python სკრიპტი, რომელიც 1 000 000-ზე ნაკლებ მარტივ რიცხვებს დაითვლის, გაუშვი იქ, გაასწორე, თუ ვერ შესრულდება, მითხარი შედეგი და წაშალე sandbox.

აგენტი იმავე გამოძახებებს აკეთებს, რასაც ზემოთ მოცემული სკრიპტი. რომელი ხელსაწყოების დაშვება შეიძლება დადასტურების გარეშე, ახსნილია MCP-ის დამცავ ზღვრებში.

რა დაჯდა

sandbox ერთ წუთზე გაცილებით ნაკლები არსებობდა და მინიმალური 60 წამით დაირიცხა: small-ზე $0.00055. მოდელის გამოძახება sandbox-ზე ძვირი ჯდება. ახალი ანგარიშის $1-იანი საცდელი კრედიტი დაახლოებით 1 800 ასეთ გაშვებას ჰყოფნის.

სად წავიდეთ შემდეგ

ხდკ

რატომ არ გავუშვა მოდელის კოდი პირდაპირ ჩემს მანქანაზე?

იმიტომ, რომ არ იცით, რას გააკეთებს. გენერირებულმა კოდმა შეიძლება წაშალოს ფაილები, წაიკითხოს თქვენი გასაღებები ან უსასრულო ციკლში ჩავარდეს. sandbox-ში ის მუშაობს ცალკე microVM-ში საკუთარი ბირთვით, შემდეგ კი sandbox იშლება.

მუშაობს ეს მაგალითის მოდელის გარდა სხვა მოდელებთანაც?

დიახ. ციკლს მხოლოდ ფუნქცია სჭირდება, რომელიც შეტყობინებებს იღებს და ტექსტს აბრუნებს. ჩაანაცვლეთ ask() ფუნქცია ნებისმიერი ჩატის API-ით, ლოკალური მოდელის ჩათვლით.

რა უშლის აგენტს ხელს, უსასრულოდ შექმნას sandbox-ები?

დაწყებამდე დააყენეთ დღიური და თვიური ხარჯის ლიმიტი. ლიმიტის მიღწევისას ახალი sandbox-ები 429 budget_exceeded-ით უარყოფილია. გარდა ამისა, ერთ ანგარიშზე ერთდროულად მხოლოდ ორი ბრძანება მუშაობს, ამიტომ კონტროლიდან გასული ციკლი ვერ გამრავლდება.

შეუძლია გენერირებულ კოდს ინტერნეტზე გასვლა?

დიახ, sandbox-ებს გამავალი ინტერნეტი აქვთ, რომ კოდმა პაკეტები დააყენოს და მონაცემები ჩამოტვირთოს. შემომავალი პორტები არ აქვთ. საიდუმლოებები პრომპტში ან კოდში ნუ ჩადებთ; ის, რაც სკრიპტს ნამდვილად სჭირდება, გარემოს ცვლადებად გადაეცით.

კომენტარები

ჯერ არ არის კომენტარები. იყავით პირველი.

დატოვეთ კომენტარი

კომენტარები მოდერირდება გამოჩენამდე.