uz
Feedback
ToCode

ToCode

Kanalga Telegramโ€™da oโ€˜tish

ื˜ื™ืคื™ื ืงืฆืจื™ื ืœืžืชื›ื ืชื™ื ืžืืช ื™ื ื•ืŸ ืคืจืง

Ko'proq ko'rsatish
1 419
Obunachilar
Ma'lumot yo'q24 soatlar
+17 kunlar
-430 kunlar
Postlar arxiv
ToCode
1 419
Url: https://www.gutenberg.org/cache/epub/1342/pg1342.txt; size: 763083
Url: https://www.gutenberg.org/cache/epub/45304/pg45304.txt; size: 1356681
Url: https://www.gutenberg.org/cache/epub/2701/pg2701.txt; size: 1260594
6.713048083242029
=== client_parallel_threads ===
Url: https://www.gutenberg.org/cache/epub/1342/pg1342.txt; size: 763083
Url: https://www.gutenberg.org/cache/epub/84/pg84.txt; size: 446583
Url: https://www.gutenberg.org/cache/epub/45304/pg45304.txt; size: 1356681
Url: https://www.gutenberg.org/cache/epub/2701/pg2701.txt; size: 1260594
11.749367957934737
=== client_parallel ===
Url: https://www.gutenberg.org/cache/epub/84/pg84.txt; size: 446583
Url: https://www.gutenberg.org/cache/epub/45304/pg45304.txt; size: 1356681
Url: https://www.gutenberg.org/cache/epub/2701/pg2701.txt; size: 1260594
Url: https://www.gutenberg.org/cache/epub/1342/pg1342.txt; size: 763083
7.422760541085154
ืžื•ืคืชืขื™ื? ื’ื ืื ื™ ื”ื•ืคืชืขืชื™ ืงืฆืช. ื›ืœื•ืžืจ ื‘ืจื•ืจ ืœืžื” ื”ื’ืจืกื” ื”ืจืืฉื•ื ื” ืžืื•ื“ ืื™ื˜ื™ืช ืื‘ืœ ืื ื™ ืžื•ื“ื” ืฉื’ืจืกืช ื”ืชื”ืœื™ื›ื•ื ื™ื ื‘ืœื™ client ื”ืคืชื™ืขื” ืœื˜ื•ื‘ื” ื•ืขืงืคื” ื’ื ืืช ื”ื’ืจืกื” ื”ืืกื™ื ื›ืจื•ื ื™ืช. ื–ื” ืœื ื”ื—ื–ื™ืง ืžืขืžื“ ื•ื‘ื”ืจืฆื” ืื—ืจืช ืงื™ื‘ืœืชื™ ืืช ื”ืชื•ืฆืื” ื”ื–ื•:
=== serial ===
Url: https://www.gutenberg.org/cache/epub/84/pg84.txt; size: 446583
Url: https://www.gutenberg.org/cache/epub/45304/pg45304.txt; size: 1356681
Url: https://www.gutenberg.org/cache/epub/2701/pg2701.txt; size: 1260594
Url: https://www.gutenberg.org/cache/epub/1342/pg1342.txt; size: 763083
24.061222000047565
=== client_serial ===
Url: https://www.gutenberg.org/cache/epub/84/pg84.txt; size: 446583
Url: https://www.gutenberg.org/cache/epub/45304/pg45304.txt; size: 1356681
Url: https://www.gutenberg.org/cache/epub/2701/pg2701.txt; size: 1260594
Url: https://www.gutenberg.org/cache/epub/1342/pg1342.txt; size: 763083
14.5340595417656
=== parallel ===
Url: https://www.gutenberg.org/cache/epub/84/pg84.txt; size: 446583
Url: https://www.gutenberg.org/cache/epub/1342/pg1342.txt; size: 763083
Url: https://www.gutenberg.org/cache/epub/45304/pg45304.txt; size: 1356681
Url: https://www.gutenberg.org/cache/epub/2701/pg2701.txt; size: 1260594
8.315202291123569
=== client_parallel_threads ===
Url: https://www.gutenberg.org/cache/epub/1342/pg1342.txt; size: 763083
Url: https://www.gutenberg.org/cache/epub/84/pg84.txt; size: 446583
Url: https://www.gutenberg.org/cache/epub/45304/pg45304.txt; size: 1356681
Url: https://www.gutenberg.org/cache/epub/2701/pg2701.txt; size: 1260594
7.089039749931544
=== client_parallel ===
Url: https://www.gutenberg.org/cache/epub/1342/pg1342.txt; size: 763083
Url: https://www.gutenberg.org/cache/epub/84/pg84.txt; size: 446583
Url: https://www.gutenberg.org/cache/epub/45304/pg45304.txt; size: 1356681
Url: https://www.gutenberg.org/cache/epub/2701/pg2701.txt; size: 1260594
5.17865683324635
ืกืš ื”ื›ืœ ื”ื ื™ืกื•ื™ ืžื•ื›ื™ื— ืžื” ืฉื›ื‘ืจ ื™ื“ืขื ื• - ืฉืขื“ื™ืฃ ืœื”ื•ืจื™ื“ ืงื‘ืฆื™ื ื‘ืžืงื‘ื™ืœ ืžืืฉืจ ื‘ื˜ื•ืจ ืื‘ืœ ืฉืื™ืŸ ื™ืชืจื•ืŸ ืžืฉืžืขื•ืชื™ ืœื”ืจืฆื” ืืกื™ื ื›ืจื•ื ื™ืช ืขืœ ืคื ื™ ืฉื™ืžื•ืฉ ื‘ืชื”ืœื™ื›ื•ื ื™ื. ืžืขื ื™ื™ืŸ ื’ื ืœืฉื™ื ืœื‘ ืœืชืงื•ืจื” ื‘ืฉื™ืžื•ืฉ ื‘ืงื•ื“ ืืกื™ื ื›ืจื•ื ื™: ื’ื ื”ืจืฆื” ืขื asyncio.run, ื’ื ืฉื™ืžื•ืฉ ื‘ asyncio.gather ื‘ืฉื‘ื™ืœ ืœื”ืจื™ืฅ ื“ื‘ืจื™ื ื‘ืžืงื‘ื™ืœ ื•ื’ื ืื™ ืืคืฉืจ ื”ื™ื” ืœื”ืฉืชืžืฉ ื‘ืงื•ื“ ื”ืกื™ื ื›ืจื•ื ื™ ื”ืงื™ื™ื ื•ืฆืจื™ืš ื”ื™ื” ืœื›ืชื•ื‘ ืžื—ื“ืฉ ืืช ืคื•ื ืงืฆื™ื™ืช ื”ื”ื•ืจื“ื”. ืื ื™ ื”ืจืฆืชื™ ืขืœ ืคื™ื™ืชื•ืŸ 3.14 ื•ื”ืจืฆืชื™ ื›ืžื” ืคืขืžื™ื ื”ืชื•ืฆืื•ืช ื›ืœ ื”ืจืฆื” ื›ืžื•ื‘ืŸ ืงืฆืช ืฉื•ื ื•ืช ืื‘ืœ ืžื‘ื—ื™ื ืช ื”ืฉื•ื•ืืช ืžื”ื™ืจื•ืช ื‘ื™ืŸ ื”ืื•ืคืฆื™ื•ืช ื”ืชื•ืฆืื” ืขืงื‘ื™ืช.

ToCode
1 419
๐Ÿ“Œ ื ื™ืกื•ื™ httpx - ื”ืฉื•ื•ืื” ื‘ื™ืŸ ืงื•ื“ ืžืงื‘ื™ืœื™, ื˜ื•ืจื™ ื•ืืกื™ื ื›ืจื•ื ื™ ื—ื‘ื™ืœืช httpx ื‘ืคื™ื™ืชื•ืŸ ื”ื™ื ืกื•ื’ ืฉืœ ื”ื“ื•ืจ ื”ื‘ื ืฉืœ requests ืขื ืชื™ืขื•ื“ ื™ื•ืชืจ ืžืขื•ื“ื›ืŸ ื•ืชืžื™ื›ื” ื‘ื›ืชื™ื‘ื” ืืกื™ื ื›ืจื•ื ื™ืช. ื‘ื•ืื• ื ืจืื” ืื™ืš ื–ื” ืขื•ื‘ื“ ื“ืจืš ืชื•ื›ื ื™ืช ืงืฆืจื” ื•ื’ื ื ืฉื•ื•ื” ื–ืžื ื™ื ื‘ื™ืŸ ื’ืจืกื” ื˜ื•ืจื™ืช, ืžืงื‘ื™ืœื™ืช ื•ืืกื™ื ื›ืจื•ื ื™ืช. ื‘ืฉื‘ื™ืœ ื”ื“ื•ื’ืžื” ืœืงื—ืชื™ 4 ืกืคืจื™ื ืžืคืจื•ื™ืงื˜ ื’ื˜ื ื‘ืจื’ ื•ื‘ื ื™ืชื™ 4 ืคื•ื ืงืฆื™ื•ืช ืฉืžื•ืจื™ื“ื•ืช ืืช ืืจื‘ืขืช ื”ืกืคืจื™ื, ื›ืœ ืื—ืช ื‘ื“ืจืš ืื—ืจืช. ื”ืงื•ื“ ืžืชื—ื™ืœ ื‘ import-ื™ื ื•ื”ื’ื“ืจืช ืจืฉื™ืžืช ื”ืกืคืจื™ื:
import httpx
from timeit import timeit
from multiprocessing.dummy import Pool
import asyncio

book_urls = [
        "https://www.gutenberg.org/cache/epub/84/pg84.txt",
        "https://www.gutenberg.org/cache/epub/45304/pg45304.txt",
        "https://www.gutenberg.org/cache/epub/2701/pg2701.txt",
        "https://www.gutenberg.org/cache/epub/1342/pg1342.txt"
        ]
ื”ืคื•ื ืงืฆื™ื” ื”ืจืืฉื•ื ื” ืคืฉื•ื˜ ืžืคืขื™ืœื” get ืืจื‘ืข ืคืขืžื™ื ืื—ืช ืื—ืจื™ ื”ืฉื ื™ื”:
def download_and_print_size(client, url):
    r = client.get(url, timeout=60.0)
    size = len(r.text)
    print(f"Url: {url}; size: {size}")

def serial():
    print("=== serial ===")
    for url in book_urls:
        download_and_print_size(httpx, url)
ื ืฉื™ื ืœื‘ ืฉ httpx ืžื’ื“ื™ืจื” timeout ื‘ืจื™ืจืช ืžื—ื“ืœ ืฉืœ 5 ืฉื ื™ื•ืช ื•ืขื‘ื•ืจ ืคืจื•ื™ืงื˜ ื’ื˜ื ื‘ืจื’ ื–ื” ืœื ืชืžื™ื“ ืžืกืคื™ืง ืื– ื”ื’ื“ืœืชื™ ืœื“ืงื”. ื”ื’ื“ืจืชื™ ื’ื ืคื•ื ืงืฆื™ื™ืช ื”ื•ืจื“ื” ื ืคืจื“ืช ื›ื“ื™ ืœื—ืกื•ืš ื›ืคืœ ืงื•ื“ ื‘ื“ื•ื’ืžืื•ืช ื”ื‘ืื•ืช. ืคื•ื ืงืฆื™ื” ืฉื ื™ื” ื›ื‘ืจ ืžืฉืชืžืฉืช ื‘ client ืฉืœ httpx ืฉื–ื” ืžื ื’ื ื•ืŸ ืฉืœื”ื ืฉืฉื•ืžืจ ืืช ื”ื—ื™ื‘ื•ืจ ืœืืชืจ ืคืชื•ื— ื›ื“ื™ ืœื”ื•ืจื™ื“ ืžืกืคืจ ืงื‘ืฆื™ื:
def client_serial():
    print("=== client_serial ===")
    with httpx.Client() as client:
        try:
            for url in book_urls:
                download_and_print_size(client, url)

        finally:
            client.close()
ื‘ื’ืจืกื” ื”ืฉืœื™ืฉื™ืช ืจืฆื™ืชื™ ืœืจืื•ืช ืื™ืš ื”ืกื™ืคื•ืจ ื”ื–ื” ื™ืขื‘ื•ื“ ืžื›ืžื” ืชื”ืœื™ื›ื•ื ื™ื ื‘ืžืงื‘ื™ืœ ื›ื™ ืฉืžืขืชื™ ืฉื›ืฉืžื•ืจื™ื“ื™ื ืงื•ื‘ืฅ ื‘ืžืงื‘ื™ืœ ื”ื–ืžื ื™ื ืžืชืงืฆืจื™ื. ืคื” ื›ืชื‘ืชื™ ืฉืชื™ ื’ืจืกืื•ืช ืื—ืช ืขื client ื•ื”ืฉื ื™ื” ื‘ืœื™:
def parallel():
    print("=== parallel ===")
    with Pool(5) as p:
        p.map(lambda url: download_and_print_size(httpx, url), book_urls)

def client_parallel_threads():
    print("=== client_parallel_threads ===")
    with httpx.Client() as client:
        try:
            with Pool(5) as p:
                p.map(lambda url: download_and_print_size(client, url), book_urls)

        finally:
            client.close()
ื•ืœืกื™ื•ื ื”ื•ืจื“ื” ืืกื™ื ื›ืจื•ื ื™ืช. ื›ืืŸ ืœื ืจืื™ืชื™ ื“ืจืš ื‘ืœื™ client ืื– ื”ื’ื“ืจืชื™ ืื•ืชื• ื•ื’ื ื‘ื’ืœืœ ืฉืžื“ื•ื‘ืจ ื‘ืงืœืื™ื™ื ื˜ ืืกื™ื ื›ืจื•ื ื™ ื›ื‘ืจ ืื™ ืืคืฉืจ ื”ื™ื” ืœื”ืฉืชืžืฉ ื‘ืื•ืชื” ืคื•ื ืงืฆื™ื™ืช download ืฉื›ื‘ืจ ื›ืชื‘ืชื™ ื•ืœื›ืŸ ื‘ื ื™ืชื™ ื’ืจืกื” ืืกื™ื ื›ืจื•ื ื™ืช ืฉืœื” ื’ื:
async def download_and_print_size_async(client, url):
    r = await client.get(url, timeout=60.0)
    size = len(r.text)
    print(f"Url: {url}; size: {size}")
    

async def client_parallel():
    print("=== client_parallel ===")
    async with httpx.AsyncClient() as client:
        try:
            await asyncio.gather(*[download_and_print_size_async(client, url) for url in book_urls])

        finally:
            await client.aclose()
    
ืœืกื™ื•ื ืคื•ื ืงืฆื™ื™ืช main ืฉืžืจื™ืฆื” ืืช ื›ืœ ื”ืขืกืง ื•ื’ื ืžื•ื“ื“ืช ื–ืžื ื™ื:
def main():
    print(timeit(lambda: serial(), number=1))
    print(timeit(lambda: client_serial(), number=1))
    print(timeit(lambda: parallel(), number=1))
    print(timeit(lambda: client_parallel_threads(), number=1))
    print(timeit(lambda: asyncio.run(client_parallel()), number=1))


if __name__ == "__main__":
    main()
ืืœื” ื”ืชื•ืฆืื•ืช:
=== serial ===
Url: https://www.gutenberg.org/cache/epub/84/pg84.txt; size: 446583
Url: https://www.gutenberg.org/cache/epub/45304/pg45304.txt; size: 1356681
Url: https://www.gutenberg.org/cache/epub/2701/pg2701.txt; size: 1260594
Url: https://www.gutenberg.org/cache/epub/1342/pg1342.txt; size: 763083
32.953853541985154
=== client_serial ===
Url: https://www.gutenberg.org/cache/epub/84/pg84.txt; size: 446583
Url: https://www.gutenberg.org/cache/epub/45304/pg45304.txt; size: 1356681
Url: https://www.gutenberg.org/cache/epub/2701/pg2701.txt; size: 1260594
Url: https://www.gutenberg.org/cache/epub/1342/pg1342.txt; size: 763083
12.404891041107476
=== parallel ===
Url: https://www.gutenberg.org/cache/epub/84/pg84.txt; size: 446583

ToCode
1 419
๐Ÿ“Œ ื ื›ืชื‘ ืขืœ ื™ื“ื™ ืงืœื•ื“ ืื•ืคื•ืก 4.6 ื‘ื™ืงืฉืชื™ ืžืงืœื•ื“ ืงื•ื“ ืœืชืงืŸ ื‘ืขื™ื” ืœืคื ื™ ื›ืžื” ื™ืžื™ื ื•ืขืœ ื“ืขืช ืขืฆืžื• ื”ื•ื ื’ื ืขืฉื” ืงื•ืžื™ื˜ ื•ื”ื•ืกื™ืฃ ืœื”ื•ื“ืขืช ื”ืงื•ืžื™ื˜ ืืช ื”ืกื™ื•ืžืช
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
ืกืš ื”ื›ืœ ื–ื” ื—ืžื•ื“ ืฉื”ื ืขื•ืฉื™ื ืœืขืฆืžื ืคืจืกื•ืžืช ืœืžืจื•ืช ืฉืฆืจื™ืš ืœื”ื’ื™ื“ ืืช ื”ืืžืช ื”ืžื•ื“ืœ ืฉืขืฉื” ืืช ื”ืชื™ืงื•ืŸ ื”ื™ื” ื—ื™ืงื•ื™ ืกื™ื ื™ ื‘ืฉื qwen ื•ืœื ืงืœื•ื“ ืื•ืคื•ืก. ืคืชื™ื—ืช ื”ื•ื“ืขืช ื”ืงื•ืžื™ื˜ ื‘ื’ื™ื˜ื”ืื‘ ืžืจืื” ื‘ืฉื“ื” "ืžื—ื‘ืจ ื”ืงื•ืžื™ื˜" ืืช ื”ืฉื ืฉืœื™ ื•ืฉืœ claude ื•ืืคื™ืœื• ืืช ื”ืชืžื•ื ื” ืฉืœ ืฉื ื™ื ื•. ื”ื•ื“ืขืช ื”ืงื•ืžื™ื˜ ืขืฆืžื” ื›ืœืœื” ื”ืกื‘ืจ ืžืื•ื“ ืฉื˜ื—ื™ ืขืœ ื”ืคื™ืฆ'ืจ ืขื ื“ื’ืฉ ืขืœ "ืžื” ื‘ื•ืฆืข" ื•ืœื "ืœืžื” ื‘ื•ืฆืข", ืžื” ืฉืื•ืžืจ ืฉืžื™ ืฉื™ื’ื™ืข ืืœื™ื” ื‘ืขืชื™ื“ ื™ืฆื˜ืจืš ืœืงืจื•ื ื”ืจื‘ื” ื˜ืงืกื˜ ื‘ืœื™ ืœืงื‘ืœ ื”ืจื‘ื” ืชื•ื‘ื ื•ืช. ื’ื ื‘ืขื‘ื•ื“ื” ืขื ื’ื™ื˜ ื”ื™ื›ืจื•ืช ืขื ื”ื›ืœื™ื ื™ื›ื•ืœื” ืœืขื–ื•ืจ ืœื ื• ืœื”ื’ื™ืข ืœืชื•ืฆืื•ืช ื˜ื•ื‘ื•ืช ื™ื•ืชืจ ื•ื’ื ืœืชืงืŸ ื˜ืขื•ื™ื•ืช ืฉืœ ืกื•ื›ื ื™ ืงื™ื“ื•ื“ ื•ื‘ืขื™ืงืจ ืœื”ืจื’ื™ืฉ ืคื—ื•ืช ืื‘ื•ื“ื™ื ื›ืฉืกื•ื›ืŸ ืงื™ื“ื•ื“ ืขื•ืฉื” ืคืขื•ืœื” ื‘ืฉืžื ื•. ืืœื” ืคืงื•ื“ื•ืช ื’ื™ื˜ ื”ื›ื™ ืฉื™ืžื•ืฉื™ื•ืช ื‘ืขื™ื ื™ื™ ื‘ืขื‘ื•ื“ื” ืขื ืกื•ื›ื ื™ ืงื™ื“ื•ื“. ืœื ืžื›ื™ืจื™ื ืื—ืช ืžื”ืŸ? ืืœ ืชืชื‘ื™ื™ืฉื• ืœื‘ืงืฉ ืž AI ื”ื—ื‘ื™ื‘ ืขืœื™ื›ื ื”ืกื‘ืจื™ื ื•ื“ื•ื’ืžืื•ืช: โœ ืชื™ืงื•ืŸ ืงื•ืžื™ื˜ ืคืงื•ื“ืช git commit --amend ืžืชืงื ืช ืืช ื”ืงื•ืžื™ื˜ ื”ืื—ืจื•ืŸ ื‘ืืžืฆืขื•ืช ื”ื•ืกืคืช ืงื‘ืฆื™ื ืื• ืฉื™ื ื•ื™ ื”ื•ื“ืขืช ื”ืงื•ืžื™ื˜. ื‘ืชื”ืœื™ืš ืขื‘ื•ื“ื” ืจื’ื™ืœ ืฉืœื™ ืขื ืกื•ื›ืŸ ืงื™ื“ื•ื“ ืื ื™ ืžืฉืชืžืฉ ื‘ืงื•ืžื™ื˜ ืชื™ืงื•ืŸ ืื—ืจื™ ื›ืœ ืฉื™ื ื•ื™ ืงื•ื“ ืฉื”ื•ื ืขื•ืฉื” ื›ืœื•ืžืจ ืœืคื ื™ ื›ืœ ื”ื•ื“ืขื” ื ื•ืกืคืช ืฉืื ื™ ื›ื•ืชื‘ ืœืกื•ื›ืŸ. ื‘ืฆื•ืจื” ื›ื–ืืช ืื ืื—ืจื™ ื”ื”ื•ื“ืขื” ื”ืกื•ื›ืŸ ื”ื—ืœื™ื˜ ืœื–ืจื•ืข ื”ืจืก ื‘ื›ืœ ื”ืคืจื•ื™ืงื˜ ืชืžื™ื“ ืืคืฉืจ ืœื—ื–ื•ืจ ืฆืขื“ ืื—ื•ืจื”, ื’ื ืื ื›ืคืชื•ืจ ื”ื‘ื™ื˜ื•ืœ ื‘ VS Code ืื• ืงืจืกืจ ืœื ื‘ื“ื™ื•ืง ืขื•ื‘ื“. โœ ืจื™ื‘ื™ื™ืก ืื™ื ื˜ืจืงื˜ื™ื‘ื™ ืื ื›ืŸ ืฉืžืจืชื™ ื›ืžื” ืงื•ืžื™ื˜ื™ื ื™ืฉื ื™ื ืื• ืฉื‘ื–ืžืŸ ืืžืช ืœื ื›ืชื‘ืชื™ ื”ื•ื“ืขื•ืช ืงื•ืžื™ื˜ ืžืกืคื™ืง ื˜ื•ื‘ื•ืช ืื ื™ ืžืงืคื™ื“ ืœื”ืคืขื™ืœ ืจื™ื‘ื™ื™ืก ืื™ื ื˜ืจืงื˜ื™ื‘ื™ ืœืคื ื™ ืฉืžื‘ืฆืข push ื›ื“ื™ ืœืชืงืŸ ื”ื•ื“ืขื•ืช ืงื•ืžื™ื˜ ื‘ืื•ืชื ืงื•ืžื™ื˜ื™ื ื™ืฉื ื™ื ื•ืœืžื—ื•ืง ืงื•ืžื™ื˜ื™ ื‘ื™ื ื™ื™ื ืฉืœื ืžื•ืกื™ืคื™ื ืขืจืš ืœืคืจื•ื™ืงื˜. ืื—ืจื™ push ืื ื™ ืœื ืื•ื”ื‘ ืœืฉื ื•ืช ืงื•ืžื™ื˜ื™ื ืื‘ืœ ื‘ืขื‘ื•ื“ื” ืฉื•ื˜ืคืช ืื ื™ ืขื•ืฉื” ื”ืจื‘ื” ื™ื•ืชืจ commit ืž push. โœ ืคืชื™ื—ืช worktree ืคืงื•ื“ืช git-worktree ืคื•ืชื—ืช ืขื•ืชืง ื ื•ืกืฃ ืฉืœ ื”ืงื‘ืฆื™ื ื‘ืคืจื•ื™ืงื˜ ื‘ืชื™ืงื™ื™ื” ื ืคืจื“ืช, ืงืฆืช ื›ืžื• clone ืื‘ืœ ื‘ืœื™ ืฉืฆืจื™ืš ืœืขืฉื•ืช push ื• pull ื›ื“ื™ ืœืกื ื›ืจืŸ ืื•ืชื” ืขื ื”ืขื•ืชืง ื”ืžืจื›ื–ื™ ืฉื™ืฉ ืœื ื• ืขืœ ื”ืžื—ืฉื‘. ื‘ื›ืœ worktree ืืคืฉืจ ืœืชืช ืœืกื•ื›ื ื™ ืงื™ื“ื•ื“ ืœื”ืฉืชื•ืœืœ ื‘ืœื™ ืฉื”ื ืžืคืจื™ืขื™ื ืื—ื“ ืœืฉื ื™. ืื ื™ืฉ ื“ื•ืงืจ ื‘ืคืจื•ื™ืงื˜ ื–ื” ืงืกื•ื ื›ื™ ืื– ื›ืœ ืกื•ื›ืŸ ื™ื›ื•ืœ ื’ื ืœื”ืจื™ืฅ ืขื•ืชืง ืฉืœื• ืฉืœ ื›ืœ ื”ืžืขืจื›ืช ื•ืœื”ืจื™ืฅ ื‘ื“ื™ืงื•ืช ืขื“ ืฉื”ื•ื ืžืฆืœื™ื— ืœื‘ื ื•ืช ืืช ื”ืคื™ืฆ'ืจ. โœ ื‘ื“ื™ืงืช ื”ื‘ื“ืœื™ื ื•ืฉื—ื–ื•ืจ ืคืงื•ื“ื•ืช git log -p ื• git diff ืžืจืื•ืช ืœื ื• ื‘ืฆื•ืจื” ื ื•ื—ื” ื”ื‘ื“ืœื™ื ื‘ื™ืŸ ื’ืจืกืื•ืช. ืื ื ืชืชื ืœืกื•ื›ืŸ ืœืขื‘ื•ื“ ืขืœ ืขื ืฃ ื ืคืจื“ ืชื•ื›ืœื• ืœื”ืคืขื™ืœ git diff feature...main ื›ื“ื™ ืœืจืื•ืช ืืช ื›ืœ ื”ืขื‘ื•ื“ื” ืฉืœื•. ืชืœื•ื™ ื‘ื”ื’ื“ืจืช ื”ืคืจื•ื™ืงื˜ ืฉืœื›ื ืื‘ืœ ื”ืจื‘ื” ืคืขืžื™ื ืื ื—ื ื• ื ืžืฆื ื‘ืขื‘ื•ื“ื” ืฉื™ื ื•ื™ื™ื ืœื ืจืœื•ื•ื ื˜ื™ื™ื, ืœืžืฉืœ ืชื™ืงื•ื ื™ ืกื’ื ื•ืŸ. ืื ื™ ื‘ื“ืจืš ื›ืœืœ ืžื‘ืงืฉ ืžื”ืกื•ื›ืŸ ืœื ืงื•ืช ืืช ื”ืคื™ืฆ'ืจ ื•ืœื”ืฉืื™ืจ ืจืง ืืช ื”ืฉื™ื ื•ื™ื™ื ื”ืจืœื•ื•ื ื˜ื™ื™ื ืœืžื” ืฉื”ืชื‘ืงืฉ ื•ื’ื ืžืฉืชืžืฉ ื‘ืขืฆืžื™ ื‘ git restore ื›ื“ื™ ืœื‘ื˜ืœ ืฉื™ื ื•ื™ื™ื ืฉื ืขืฉื• ื‘ืงื•ื‘ืฅ ืžืกื•ื™ื. โœ ืžื—ื™ืงืช ื›ืœ ื”ืขื‘ื•ื“ื” ืฉืœ ื”ืกื•ื›ืŸ ืžืื– ื”ืงื•ืžื™ื˜ ื”ืื—ืจื•ืŸ ืขื•ื“ ืฉืชื™ ืคืงื•ื“ื•ืช ืกื•ืคืจ ืฉื™ืžื•ืฉื™ื•ืช ื”ืŸ:
$ git restore .
$ git clean -f -d
ื›ืฉื”ืกื•ื›ืŸ ื”ืชื—ื™ืœ ืœื”ืฉืชื•ืœืœ ื•ืื ื™ ืžื‘ื™ืŸ ืฉื”ื•ื ืœื ื‘ื›ื™ื•ื•ืŸ ืฉืชื™ ื”ืคืงื•ื“ื•ืช ื”ืืœื” ืžื•ื—ืงื•ืช ืืช ื›ืœ ื”ืฉื™ื ื•ื™ื™ื ื•ืžื—ื–ื™ืจื•ืช ืื•ืชื ื• ืœืงื•ืžื™ื˜ ื”ืื—ืจื•ืŸ. ื•ืื ืืชื ืžื’ืœื™ื ืฉื’ื ื”ืงื•ืžื™ื˜ ื”ืื—ืจื•ืŸ ื›ื‘ืจ ืœื ืจืœื•ื•ื ื˜ื™ ืชืžื™ื“ ืืคืฉืจ ืœื”ืฉืชืžืฉ ื‘ git reset ื›ื“ื™ ืœื”ื–ื™ื– ืืช ืจืืฉ ื”ืคืจื•ื™ืงื˜ ืœืงื•ืžื™ื˜ ื™ืฉืŸ ื™ื•ืชืจ. ื™ืฉ ืœื›ื ืคืงื•ื“ื•ืช ื’ื™ื˜ ื ื•ืกืคื•ืช ืฉืืชื ืื•ื”ื‘ื™ื ืœื”ืฉืชืžืฉ ืขื ืกื•ื›ื ื™ ืงื™ื“ื•ื“? ืกืคืจื• ืœื™ ื‘ืชื’ื•ื‘ื•ืช.

ToCode
1 419
๐Ÿ“Œ ืฉืชื™ ื’ื™ืฉื•ืช ืœื‘ื“ื™ืงืช ืงื•ื“ ืžืชื•ื–ืžืŸ ื‘ Rails ื‘ืฉื‘ื™ืœ ืœื–ื”ื•ืช ื˜ืงืกื˜ AI ื‘ืงื˜ืข ืกืคืจื•ืชื™ ืžืฉืชืžืฉื™ื ื‘ืžืงืคื™ื ื”ืžื™ื•ื—ื“ื™ื ืฉืœื”ื ืฉืจืง AI ืื•ื”ื‘ ืœื›ืชื•ื‘. ื‘ืฉื‘ื™ืœ ืœื–ื”ื•ืช ืงื•ื“ ืฉื™ื•ืฆืจ ืขืœ ื™ื“ื™ AI ืื ื—ื ื• ื ืจืฆื” ืœืฉื™ื ืœื‘ ืœืฉื™ืžื•ืฉ ื™ืชืจ ื‘ืชื‘ื ื™ื•ืช ื•ืขืจื‘ื•ื‘ ืขื“ื™ืŸ ื‘ื™ืŸ ืชื‘ื ื™ื•ืช. ื–ื” ื ืจืื” ื™ืคื” ื‘ืžื‘ื˜ ืจืืฉื•ืŸ ืื‘ืœ ืžืฉื”ื• ืงื˜ืŸ ืฆื•ืจื ืฉื. ื”ื“ื•ื’ืžื” ืฉืœ ื”ื™ื•ื ื”ื™ื ื‘ื“ื™ืงื” ื‘ืชื•ื›ื ื™ืช ืจื™ื™ืœืก:
context 'when multi-part SMS - first chunk' do
  it 'stores in Redis and schedules delayed job' do
    allow(Vonage::InboundSmsService).to receive(:new).and_return(double(create_message: nil))
    allow(described_class).to receive(:set).and_return(described_class)
    allow(described_class).to receive(:perform_later)

    freeze_time

    described_class.handle_concatenated_chunk(params)

    expect(described_class).to have_received(:set).with(wait: 2.minutes)
  end
end
ื”ืงื•ื“ ืžื˜ืคืœ ื‘ืกืžืกื™ื ืฉืžื’ื™ืขื™ื ื‘ื—ืœืงื™ื ื›ื™ ื”ื”ื•ื“ืขื” ืืจื•ื›ื” ื•ืจื•ืฆื” ืœื‘ื“ื•ืง ืฉืื—ืจื™ ื”ื—ืœืง ื”ืจืืฉื•ืŸ ืฉืžื ื• ืžืฉื™ืžื” ืœ-2 ื“ืงื•ืช ืงื“ื™ืžื” ืฉืชืืกื•ืฃ ืืช ื”ื—ืœืงื™ื. ื”ื—ืฉื™ื‘ื•ืช ืฉืœ ืžืฉื™ืžื” ื›ื–ื• ื”ื™ื ืœืฆื•ืจืš ื˜ื™ืคื•ืœ ื‘ื”ื•ื“ืขื” ื—ืœืงื™ืช, ื›ืœื•ืžืจ ืื ื›ืœ ื”ื—ืœืงื™ื ื”ื’ื™ืขื• ืื– ื”ื—ืœืง ื”ืื—ืจื•ืŸ ื™ืืกื•ืฃ ืืช ื›ื•ืœื ื•ื™ื—ื‘ืจ ืื•ืชื ืœื”ื•ื“ืขื” ืื—ืช. ืื‘ืœ ืื ืจืง ื—ืœืง ืžื”ื—ืœืงื™ื ื”ื’ื™ืขื• ืื ื—ื ื• ืฆืจื™ื›ื™ื ืœื–ื”ื•ืช ืฉืขื‘ืจ ืžืกืคื™ืง ื–ืžืŸ ืžื”ื—ืœืง ื”ืจืืฉื•ืŸ, ืœื”ื ื™ื— ืฉื”ื”ืžืฉืš ื›ื‘ืจ ืœื ื™ื’ื™ืข ื•ืœื—ื‘ืจ ืืช ืžื” ืฉื™ืฉ. ืคื” ืžื•ื’ื“ืจ ืคืจืง ื–ืžืŸ ืฉืœ 2 ื“ืงื•ืช ื”ืžืชื ื” ืื‘ืœ ืืคืฉืจ ืœืฉื—ืง ืขื ื–ื”. ื‘ื›ืœ ืžืงืจื” ืžื” ืฉื—ืฉื•ื‘ ืœืกื™ืคื•ืจ ืฉืœื ื• ื”ื•ื ืœื ื”ืงื•ื“ ื”ืืžื™ืชื™ ืืœื ื”ื‘ื“ื™ืงื”. ื”ื‘ื“ื™ืงื” ืžื ืกื” ืœื•ื•ื“ื ืฉืื—ืจื™ ื”ืคืขืœืช ื”ืคื•ื ืงืฆื™ื” handle_concatenated_chunk ื ืฉืœื—ืช ื”ื•ื“ืขื” ืžืชื•ื–ืžื ืช ืœืฉืชื™ ื“ืงื•ืช ืงื“ื™ืžื” ื›ื“ื™ ืœื˜ืคืœ ื‘ื”ื•ื“ืขื•ืช ื”ื—ืœืงื™ื•ืช. ืื‘ืœ ื”ื™ื ืขื•ืฉื” ืืช ื–ื” ื‘ืืžืฆืขื•ืช ืขืจื‘ื•ื‘ ืฉืœ ืฉืชื™ ืชื‘ื ื™ื•ืช: 1. ื“ืจืš ืื—ืช ืœื–ื”ื•ืช ืฉืžืฉื™ืžื” ืžืชื•ื–ืžื ืช ื ืฉืœื—ื” ื”ื™ื ืœื”ืกืชื›ืœ ืขืœ ื”ืงืจื™ืื•ืช ืœืคื•ื ืงืฆื™ื•ืช ืฉืœ ื”ืžืฉื™ืžื” - ืื ื—ื ื• ืžืฆืคื™ื ืฉื”ืคื•ื ืงืฆื™ื” set ืชืงืจื ืขื ืคืจืžื˜ืจ ืฉืœ ืฉืชื™ ื“ืงื•ืช ื”ืžืชื ื” ื•ื‘ืฉื‘ื™ืœ ื–ื” ืื ื—ื ื• ื“ื•ืจืกื™ื ื—ืœืง ืžื”ืคื•ื ืงืฆื™ื•ืช ื•ืžื•ื•ื“ืื™ื ื”ืคืขืœื”. 2. ื“ืจืš ืฉื ื™ื” ืœื–ื”ื•ืช ืฉืžืฉื™ืžื” ืžืชื•ื–ืžื ืช ื ืฉืœื—ื” ื”ื™ื ืœื ืœื“ืจื•ืก ืžื™ืžื•ืฉื™ื ืืœื ืœื”ืกืชื›ืœ ื‘ืชื•ืจ ื”ืžืฉื™ืžื•ืช ื”ืžืชื•ื–ืžื ื•ืช ื•ืœืจืื•ืช ืฉื™ืฉ ืฉื ืžืฉื™ืžื” ืžืชื•ื–ืžื ืช ืœืฉืชื™ ื“ืงื•ืช ืงื“ื™ืžื”. ืžื™ ืฉื™ืจืฆื” ืœืขืฉื•ืช ืืช ื–ื” ื™ื’ืœื” ืฉื™ืฉ ืคืขืจ ื–ืžืŸ ืงื˜ืŸ ื‘ื™ืŸ ื”ืžืฉื™ืžื” ื”ืžืชื•ื–ืžื ืช ื‘ืชื•ืจ ืœื‘ื™ืŸ "ืฉืชื™ ื“ืงื•ืช ืงื“ื™ืžื”" ืžืจื’ืข ื”ื‘ื“ื™ืงื”, ื›ื™ ืขื‘ืจื• ื›ืžื” ืžื™ืœื™ ืฉื ื™ื•ืช ืžื”ืจื’ืข ืฉื™ืฆืจื ื• ืืช ื”ืžืฉื™ืžื” ื”ืžืชื•ื–ืžื ืช ืœืจื’ืข ื‘ื• ื‘ื“ืงื ื• ืื•ืชื”. ื‘ืฉื‘ื™ืœ ื–ื” ืื ื—ื ื• ื ื•ื”ื’ื™ื ืœื”ืงืคื™ื ืืช ื”ื–ืžืŸ ืœืคื ื™ ื”ืงืจื™ืื” ืœืคื•ื ืงืฆื™ื”. ื›ืœื•ืžืจ ื‘ื’ื™ืฉื” ื”ืจืืฉื•ื ื” ื ื›ืชื•ื‘ ืืช ื”ื‘ื“ื™ืงื” ื”ื–ื•:
context 'when multi-part SMS - first chunk' do
  it 'stores in Redis and schedules delayed job' do
    allow(Vonage::InboundSmsService).to receive(:new).and_return(double(create_message: nil))
    allow(described_class).to receive(:set).and_return(described_class)
    allow(described_class).to receive(:perform_later)

    described_class.handle_concatenated_chunk(params)

    expect(described_class).to have_received(:set).with(wait: 2.minutes)
  end
end
ื•ื‘ื’ื™ืฉื” ื”ืฉื ื™ื™ื” ื ื›ืชื•ื‘ ืืช ื”ื‘ื“ื™ืงื” ื”ื–ื•:
context 'when multi-part SMS - first chunk' do
  it 'stores in Redis and schedules delayed job' do
    freeze_time

    expect do
      described_class.handle_concatenated_chunk(params)
    end.to have_enqueued_job(described_class).at(2.minutes.from_now)
  end
end
ื•ื”ื’ื™ืฉื” ื”ืžืขื•ืจื‘ื‘ืช? ืจืง ืขื•ื“ ืกื™ืžืŸ ืœืงื•ื“ ืฉื ื›ืชื‘ ื‘ืœื™ ื”ืฉื’ื—ื”.

ToCode
1 419
๐Ÿ“Œ ืœื“ื‘ืจ ืขื ื‘ืŸ ืื“ื ื‘ื ื™ ืื“ื ืื•ืžืจื™ื "ืื ื™ ืœื ื™ื•ื“ืข". ื‘ื ื™ ืื“ื ืฉื•ืืœื™ื ืœืฉืœื•ืžื™ ื•ืžืชื›ื•ื•ื ื™ื ืœื–ื”. ื‘ื ื™ ืื“ื ืœื ื ื›ื ืกื™ื ืœืœื•ืœืื” ื•ื‘ื“ืจืš ื›ืœืœ ืœื ืžื•ื—ืงื™ื ืืช ื›ืœ ื‘ืกื™ืก ื”ื ืชื•ื ื™ื ืžืชื•ืš ื™ืื•ืฉ. ื‘ื ื™ ืื“ื ืฉื•ืืœื™ื ื‘ื ื™ ืื“ื ืื—ืจื™ื ื•ืžืฉืชืžืฉื™ื ื‘ื”ื’ื™ื•ืŸ ื›ื“ื™ ืœืกื ืŸ ืžื™ื“ืข ื ื›ื ืก. ื‘ื ื™ ืื“ื ืžื•ืฆืื™ื ืคืชืจื•ื ื•ืช ื™ืฆื™ืจืชื™ื™ื ืฉืืฃ ืื—ื“ ืืฃ ืคืขื ืœื ื—ืฉื‘ ืขืœื™ื”ื. ื‘ื ื™ ืื“ื ื™ืฉืืœื• "ืžื” ื”ืชื›ื•ื•ื ืช ืœืขืฉื•ืช ืฉื" ืœืคื ื™ ืฉื™ืขื–ืจื• ืœื™ ืœื”ืชืงื“ื ื‘ื“ืจืš ื”ืœื ื ื›ื•ื ื”. ื‘ื ื™ ืื“ื ืœื ื™ื’ื™ื“ื• "ื–ื” ืžืกื•ื‘ืš ืžื“ื™ ืื ื™ ืืžืžืฉ ื‘ื™ื ืชื™ื™ื ืคืชืจื•ืŸ ื—ืœืงื™" ื›ืฉื”ื ืžืงื‘ืœื™ื ืžืฉื™ืžื”. ืขื“ื™ื™ืŸ ื“ื•ืื’ื™ื ืฉืžื›ื•ื ื•ืช ื™ื—ืœื™ืคื• ืืชื›ื? ื›ืœ ืžื” ืฉืฆืจื™ืš ื–ื” ืœื”ืฉืงื™ืข ื‘ืื•ืชืŸ ืชื›ื•ื ื•ืช ืฉื”ื•ืคื›ื•ืช ืืชื›ื ืœื‘ื ื™ ืื“ื. ื—ืœืง ืœื ืžื‘ื•ื˜ืœ ืžื”ื–ืžืŸ ืœื“ื‘ืจ ืขื ื‘ืŸ ืื“ื ื–ื” ืžื” ืฉืื ื—ื ื• ืฆืจื™ื›ื™ื.

ToCode
1 419
ืžืฉืชืฃ ื›ืืŸ ื ื™ืกื•ื— ืžืื•ื“ ืžื“ื•ื™ืง ืฉืœ ื”ืžืคืชื—ื™ื ื‘ Django https://www.better-simple.com/django/2026/03/16/give-django-your-time-and-money/ ืžืชื•ืš ื”ืคื•ืกื˜ ืฉืœื”ื This isnโ€™t about whether you use an LLM, itโ€™s about whether you still understand whatโ€™s being contributed. ื•ื–ื” ื”ืžืคืชื— - ืชืฉืชืžืฉื• ื‘ืกื•ื›ืŸ ืงื™ื“ื•ื“ ื‘ืฉื‘ื™ืœ ืœื‘ื ื•ืช ืžื”ืจ ื™ื•ืชืจ ืืช ื”ืคืชืจื•ื ื•ืช ื”ื˜ื•ื‘ื™ื ืฉื”ื™ื™ืชื ื‘ื•ื ื™ื ื‘ื›ืœ ืžืงืจื”, ืœื ื‘ืฉื‘ื™ืœ ืœืขืฉื•ืช ืกืคื™ื“ ืจืืŸ ืœื˜ื™ืงื˜ื™ื

ToCode
1 419
ืขืœ ืคื ื™ื• ื™ืฉ ืคื” ืฉืœื•ืฉื” ืžืงืจื™ื ื›ืœ ืื—ื“ ืžื™ื™ืฆืจ ืžื—ืจื•ื–ืช ืฉื•ื ื”, ืื‘ืœ ื‘ืขืฆื ืฉื ื™ ื”ืžืงืจื™ื ื”ืจืืฉื•ื ื™ื ืžื›ื™ืœื™ื ืืช ืื•ืชื• ืงื•ื“ ืœื™ื™ืฆื•ืจ ืžื—ืจื•ื–ืช ื•ืœื ื‘ืจื•ืจ ื‘ืื™ื–ื” ืžืฆื‘ื™ื ื”ืžืงืจื” ื”ืฉืœื™ืฉื™ ืืžื•ืจ ืœื˜ืคืœ ืžืื—ืจ ื•ืืจื’ื•ืžื ื˜ื™ื ืฉืœ tool call ืชืžื™ื“ ื ื™ืชืŸ ืœื”ืฆื™ื’ ืขื JSON.stringify. ืกืš ื”ื›ืœ ื•ืœืžื™ื˜ื‘ ื”ื‘ื ืชื™ ื”ืงื•ื“ ื™ื”ื™ื” ืฉืงื•ืœ ืœ:
const args = Object.entries(toolCall.arguments)
  .map(([key, value]) => `${key}=${JSON.stringify(value)}`)
  .join(", ");
ืกื•ื›ื ื™ ืงื™ื“ื•ื“ ืฉื ื™ืกื™ืชื™ ืœื”ืจื™ืฅ ืขืœ ื”ืงื•ื“ ืฉืžื—ื• ืœื ืงื•ืช ืื•ืชื• ื•ืœื”ื’ื™ืข ืœื’ืจืกื” ื”ืงืฆืจื” ืœื›ืŸ ื‘ืจื•ืจ ืฉื”ื ื™ื›ื•ืœื™ื, ืคืฉื•ื˜ ืœื ืชืžื™ื“ ื‘ื›ืชื™ื‘ืช ื”ืงื•ื“ ื”ื ื™ืขืฉื• ืืช ื”ืฆืขื“ ื”ื ื•ืกืฃ ื”ื–ื”. โœ ืฉื•ืจื” ืชื—ืชื•ื ื” ืกื•ื›ื ื™ ืงื™ื“ื•ื“ ื”ื ื›ื‘ืจ ื—ืœืง ื‘ืœืชื™ ื ืคืจื“ ืžื”ื—ื™ื™ื ืฉืœื ื• ื•ื™ืžืฉื™ื›ื• ืœื”ื™ื•ืช. ื”ื˜ืขื•ืช ื”ื™ื ืœื ื”ืฉื™ืžื•ืฉ ื‘ืกื•ื›ืŸ ืงื™ื“ื•ื“ ืืœื ื”ืขื“ืคืช ืžื”ื™ืจื•ืช ื”ื›ืชื™ื‘ื” ืขืœ ืคื ื™ ื”ืื™ื›ื•ืช. ื”ืื‘ืกื•ืจื“ ื”ื•ื ืฉืกื•ื›ื ื™ ืงื™ื“ื•ื“ ืงื ื• ืœื ื• ื–ืžืŸ ื‘ื›ืš ืฉื”ื ื—ื•ืกื›ื™ื ืœื ื• ืžืื‘ืงื™ื ืขื ืชื—ื‘ื™ืจ ื•ืžื‘ื™ืื™ื ืื•ืชื ื• ื”ืจื‘ื” ื™ื•ืชืจ ืžื”ืจ ืœื’ืจืกื” ืจืืฉื•ื ื” ืขื•ื‘ื“ืช. ืืช ื”ื–ืžืŸ ื”ื–ื” ืฉื—ืกื›ื ื• ืขืœื™ื ื• ืœื ืฆืœ ื›ื“ื™ ืœืœืžื•ื“, ืœื”ืชืžืงืฆืข ื•ืœืฉืคืจ ืืช ื”ืงื•ื“. ื”ืžื˜ืจื” ืืฃ ืคืขื ืœื ื”ื™ืชื” ื™ื•ืชืจ ืงื•ื“ ื’ืจื•ืข ืฉื ื›ืชื‘ ืžื”ืจ ื™ื•ืชืจ. ื”ืžื˜ืจื” ื”ื™ื ืžื•ืฆืจื™ื ื™ืฆื™ื‘ื™ื ื•ืคืฉื•ื˜ื™ื ื™ื•ืชืจ, ื•ืงื•ื“ ืฉืžืืคืฉืจ ืœื”ืชืžื•ื“ื“ ื˜ื•ื‘ ื™ื•ืชืจ ืขื ืžืขืจื›ื•ืช ื’ื“ื•ืœื•ืช ืœืื•ืจืš ื–ืžืŸ.

ToCode
1 419
ืฉืชื™ ื”ืœื•ืœืื•ืช ื–ื”ื•ืช ื•ืื—ืจื™ื”ืŸ ื”ืžืฉืชื ื™ื lines1 ื• lines2 ืžื›ื™ืœื™ื ืืช ืื•ืชื• ืžืขืจืš. ื”ื”ื‘ื“ืœื™ื ื”ื ื‘ืืคืฉืจื•ืช ืœืฉื™ืžื•ืฉ ื—ื•ื–ืจ ื•ื‘ืงืจื™ืื•ืช. ื”ืœื•ืœืื” ื”ืฉื ื™ื™ื” ืžื‘ื˜ื™ื—ื” ืœื™ ืฉืื ื™ ืœื•ืงื— ืžืขืจืš ื•ืžื—ื–ื™ืจ ืžืขืจืš ื›ื ืจืื” ืœื ื‘ืื•ืชื• ื’ื•ื“ืœ, ื–ื” ืœื ืงืœ ื›ืžื• map ืื‘ืœ ืขื“ื™ื™ืŸ ืื ื™ ืžื‘ื™ืŸ ืžื” ืงืจื” ืคื”. ื™ื•ืชืจ ืžื–ื”, ื”ื’ื™ืฉื” ื”ืฉื ื™ื” ื”ืฉืื™ืจื” ืื•ืชื™ ืขื ืคื•ื ืงืฆื™ื” serializeMessage ื‘ื” ืืคืฉืจ ืœื”ืฉืชืžืฉ ื‘ื ืคืจื“ ืžื”ืœื•ืœืื”. ื ืฉื•ื•ื” ืืช ื–ื” ืœืงื˜ืข ืžืชื•ืš ื”ืคื•ื ืงืฆื™ื” ื”ืžืงื•ืจื™ืช:
for (const message of messages) {
  if (message.role === "user") {
    let textContent: string;
    if (typeof message.content === "string") {
      textContent = message.content;
    } else {
      const content = Array.isArray(message.content) ? message.content : [];
      textContent = content
        .filter((block): block is TextContent => block.type === "text")
        .map((block) => block.text)
        .join("");
    }
    lines.push(`User: ${textContent}`);
  } else if (message.role === "assistant") {
ื”ื—ืœืง ื”ืคื ื™ืžื™ ืฉื”ื•ืคืš ื”ื•ื“ืขื” ืœืฉื•ืจืช ื˜ืงืกื˜ื™ื ื™ื•ืคื™ืข ื‘ืขื•ื“ ืžืงื•ืžื•ืช ื‘ืคืจื•ื™ืงื˜ ืื‘ืœ ืื™ ืืคืฉืจ ืœื”ืฉืชืžืฉ ื‘ืื•ืชื• ืงื•ื“ ื›ื™ ื”ื•ื ืžื•ื—ื‘ื ื‘ืชื•ืš ืœื•ืœืืช ื” for. ื™ื•ืชืจ ืžื–ื”, ืจืง ืงืจื™ืื” ืžืœืื” ืฉืœ ื›ืœ ื”ื‘ืœื•ืง ืชืืคืฉืจ ืœื™ ืœื”ื‘ื™ืŸ ืื™ืš ื”ืคื•ื ืงืฆื™ื” ืขื•ื‘ื“ืช ื•ื›ืš ื‘ืฉื‘ื™ืœ ืœืงืจื•ื ืืช ื”ืงื•ื“ ืกื•ื›ืŸ ื”ืงื™ื“ื•ื“ ืฆืจื™ืš ืœื‘ื–ื‘ื– ื™ื•ืชืจ ืžืงื•ื ื‘ื—ืœื•ืŸ ื”ืงื•ื ื˜ืงืกื˜. ืชื‘ื ื™ืช ื˜ื•ื‘ื” ื™ื•ืชืจ ืœืคื•ื ืงืฆื™ื” ื”ื™ืชื” ื™ื›ื•ืœื” ืœื”ื™ื•ืช:
function serializeAgentMessage(message: AgentMessage): string[] {
    switch(message.role) {
        case "user":
            return serializeUserMessage(message);
        case "assistant":
            return serializeAssistantMessage(message);
        case "toolResult":
            return serializeToolResult(message);
        default:
            throw new Error(`Unknown message role: ${message.role}`);

    }
}

export function serializeMessagesForSummary(messages: AgentMessage[]): string {
    return messages.flatMap(serializeAgentMessage).join("\n");
}
ืื ื—ื ื• ืจื•ืื™ื ื‘ืคื•ื ืงืฆื™ื” ื”ืžืงื•ืจื™ืช ืฉื—ื•ืกืจ ื”ื“ื™ื•ืง ื”ื•ื‘ื™ืœ ืœื›ืคืœ ืงื•ื“ ื•ื”ื‘ืœื•ืง ื”ื–ื” ืžื•ืคื™ืข ืžืกืคืจ ืคืขืžื™ื ื‘ืคื•ื ืงืฆื™ื”:
const textContent = content
  .filter((block): block is TextContent => block.type === "text")
  .map((block) => block.text)
  .join("");
โœ ื˜ื™ืคื•ืœ ืœื ืžื•ืกื‘ืจ ื‘ื›ืœ ื”ืžืงืจื™ื ื”ืืคืฉืจื™ื™ื (ื•ื‘ืžืงืจื™ื ืœื ืืคืฉืจื™ื™ื) ื ืงื•ื“ื” ืฉื ื™ื” ืฉื—ื•ื–ืจืช ื”ืžื•ืŸ ื‘ืงื•ื“ AI ื”ื™ื ืชื›ื ื•ืช ื“ืคื ืกื™ื‘ื™, ื›ืœื•ืžืจ ืงื•ื“ ืžื”ืกื•ื’ ื”ื–ื”:
if (message.role === "user") {
  let textContent: string;
  if (typeof message.content === "string") {
    textContent = message.content;
  } else {
    const content = Array.isArray(message.content) ? message.content : [];
    textContent = content
      .filter((block): block is TextContent => block.type === "text")
      .map((block) => block.text)
      .join("");
  }
ื ืฉื™ื ืœื‘ - ืื ืชื•ื›ืŸ ื”ื”ื•ื“ืขื” ื”ื•ื ืžืกื•ื’ string ืื– ื ืงื— ืื•ืชื•, ืื—ืจืช ืื ื”ื•ื ืžืกื•ื’ ืžืขืจืš ืื– ื ื™ืงื— ืžืžื ื• ืืช ื›ืœ ื”ื‘ืœื•ืงื™ื ืฉื”ื ืžืกื•ื’ ื˜ืงืกื˜, ื ื™ืงื— ืืช ื”ื˜ืงืกื˜ ืฉืœื”ื ื•ื ืื—ื“ ืื•ืชื ืœืฉื•ืจื” ืื—ืช. ืื ื”ืชื•ื›ืŸ ื”ื•ื ืžื›ืœ ืกื•ื’ ืื—ืจ ื ื—ื–ื™ืจ ืžื—ืจื•ื–ืช ืจื™ืงื”. ื”ื‘ืœื•ืง ืžื˜ืคืœ ื‘-3 ืžืงืจื™ื ืื‘ืœ ืœื ืžืกื‘ื™ืจ ืœื ื• ืื™ื–ื” ืกื•ื’ื™ ื”ื•ื“ืขื•ืช ื™ืฉ ื•ืœืžื” ืฉื”ืชื•ื›ืŸ ื™ื”ื™ื” ื˜ืงืกื˜ ืื• ืžืขืจืš. ื™ื•ืชืจ ืžื–ื” ื”ืงื•ื“ ืžื•ื›ืŸ ืœื˜ืคืœ ื‘ื”ื•ื“ืขื” ืฉื™ืฉ ื‘ื” ืžืกืคืจ ื‘ืœื•ืงื™ื ืฉืœ ื˜ืงืกื˜, ืœืžืจื•ืช ืฉืืคืฉืจ ื”ื™ื” ืœืขืฆื•ืจ ื‘ื‘ืœื•ืง ื”ืจืืฉื•ืŸ ื›ื™ ื™ื›ื•ืœ ืœื”ื™ื•ืช ืžืงืกื™ืžื•ื ื‘ืœื•ืง ื˜ืงืกื˜ ืื—ื“ ื‘ื”ื•ื“ืขื”. ืื ื™ื”ื™ื” ื‘ืขืชื™ื“ ืฉื™ื ื•ื™ ื‘ืžืงื•ื ืื—ืจ ืฉื™ื’ืจื•ื ืœื–ื” ืฉื”ืคื•ื ืงืฆื™ื” ืชื•ืคืขืœ ืจืง ืขื ื”ื•ื“ืขื•ืช ืžืกื•ื’ ื˜ืงืกื˜ ืื• ืจืง ืขื ื”ื•ื“ืขื•ืช ืžืกื•ื’ ืžืขืจืš ื™ื”ื™ื” ืงืฉื” ืœื–ื”ื•ืช ืืช ื”ืฉื™ื ื•ื™ ื•ืœืžื—ื•ืง ืืช ื”ืงื•ื“ ื”ืžื™ื•ืชืจ. ืกืคืจื™ื™ืช pi ืฉืžืžื ื” ื”ื’ื™ืข ื”ื˜ื™ืคื•ืก AgentMessage ื•ื”ื™ื ืฉืžื’ื“ื™ืจื” ืืช ื”ื”ื•ื“ืขื•ืช ื”ืฉืชืžืฉื” ื‘ืฉื•ืจื” ื”ื‘ืื” ื›ื“ื™ ืœืžืฆื•ื ืชื•ื›ืŸ ื˜ืงืกื˜ื•ืืœื™ ืžื”ื•ื“ืขื”:
const content =
 typeof this.message.content === "string"
  ? this.message.content
  : this.message.content.find((c) => c.type === "text")?.text || "";
ื—ื•ืฅ ืžื–ื” ืฉื”ืงื•ื“ ืงืฆืจ ื™ื•ืชืจ ื”ื•ื ื’ื ื”ืจื‘ื” ื™ื•ืชืจ ืžื“ื•ื™ืง. ื‘ื–ื›ื•ืช ื”ื“ื™ื•ืง ื”ื ืœื ืฆืจื™ื›ื™ื ืืช ื” map ื•ื” join ื›ื“ื™ ืœืื—ื“ ืืช ื›ืœ ื”ื‘ืœื•ืงื™ื ืฉืœ ื”ื˜ืงืกื˜ ื›ื™ ืžืžื™ืœื ื™ืฉ ืจืง ืื—ื“. โœ ื—ืกืจ ืžืขื‘ืจ ื ื™ืงื™ื•ืŸ ืกื•ื›ื ื™ ืงื™ื“ื•ื“ ื”ืจื‘ื” ืคืขืžื™ื ืขื•ืฆืจื™ื ืœืคื ื™ ื”ื–ืžืŸ, ื›ืฉื‘ืจื•ืจ ืฉื”ื ื™ื›ื•ืœื™ื ืœืชืงืŸ ืืช ื”ื‘ืขื™ื” ืขื ืขื•ื“ ืื™ื˜ืจืฆื™ื” ืื‘ืœ ืžืฉื”ื• ื‘ืœื•ืœืื” ืœื ืขื‘ื“. ื ืชื‘ื•ื ืŸ ื‘ื‘ืœื•ืง ื”ื–ื”:
const args = Object.entries(toolCall.arguments)
  .map(([key, value]) => {
    if (typeof value === "string") {
      return `${key}=${JSON.stringify(value)}`;
    }
    if (typeof value === "object" && value !== null) {
      return `${key}=${JSON.stringify(value)}`;
    }
    return `${key}=${String(value)}`;
  })
  .join(", ");

ToCode
1 419
๐Ÿ“Œ ืกืงื™ืจืช ืคื•ื ืงืฆื™ื™ืช TypeScript ืฉื›ืชื‘ ืกื•ื›ืŸ ืงื™ื“ื•ื“ ื ืชืงืœืชื™ ื‘ stavrobot, ืกื•ื›ืŸ AI ืฉืืžื•ืจ ืœื”ื™ื•ืช ื’ืจืกื” ืžืื•ื‘ื˜ื—ืช ืฉืœ ืื•ืคืŸืงืœื•. ืœื ื”ืชืงื ืชื™ ืื‘ืœ ืžืื—ืจ ื•ื”ืคืจื•ื™ืงื˜ ื‘ืงื•ื“ ืคืชื•ื— ื•ื”ืžืคืชื— ื”ื“ื’ื™ืฉ ืฉื”ื•ื ืขื‘ื“ ืขื ืกื•ื›ืŸ ืงื™ื“ื•ื“ ื›ื“ื™ ืœื‘ื ื•ืช ืืช ื–ื” ื”ื™ื” ืœื™ ืžืขื ื™ื™ืŸ ืœื”ืกืชื›ืœ ื‘ืงื•ื“. ืืคืฉืจ ืœืžืฆื•ื ืืช ื”ืคืจื•ื™ืงื˜ ื‘ืงื™ืฉื•ืจ ื”ื–ื”: https://github.com/skorokithakis/stavrobot ื‘ืคื•ืกื˜ ื”ื™ื•ื ื ืชื‘ื•ื ืŸ ื‘ืคื•ื ืงืฆื™ื” ืื—ืช ืžืชื•ืš ื”ืงื•ื“ ื•ื ืืชืจ ื‘ื” ืžืกืคืจ Anti Patterns, ื›ืœื•ืžืจ ืชื‘ื ื™ื•ืช ืงื•ื“ ืฉืœื™ืœื™ื•ืช ืฉืื ื™ ืžื–ื”ื” ืฉื—ื•ื–ืจื•ืช ื‘ืฆื•ืจื•ืช ืฉื•ื ื•ืช ื‘ืงื•ื“ AI. ืชื‘ื ื™ื•ืช ืืœื” ื™ืขื‘ื“ื• ื ื’ื“ื ื• ื›ืฉื ืจืฆื” ืœื”ืžืฉื™ืš ื•ืœืคืชื— ืืช ื”ืคืจื•ื™ืงื˜. ื ืชื—ื™ืœ ื‘ื”ืฆื’ืช ืงื•ื“ ื”ืคื•ื ืงืฆื™ื” ื›ืžื• ืฉืžืฆืืชื™ ืื•ืชื” ื‘ืคืจื•ื™ืงื˜:
export function serializeMessagesForSummary(messages: AgentMessage[]): string {
  const lines: string[] = [];

  for (const message of messages) {
    if (message.role === "user") {
      let textContent: string;
      if (typeof message.content === "string") {
        textContent = message.content;
      } else {
        const content = Array.isArray(message.content) ? message.content : [];
        textContent = content
          .filter((block): block is TextContent => block.type === "text")
          .map((block) => block.text)
          .join("");
      }
      lines.push(`User: ${textContent}`);
    } else if (message.role === "assistant") {
      const content = Array.isArray(message.content) ? message.content : [];
      const textContent = content
        .filter((block): block is TextContent => block.type === "text")
        .map((block) => block.text)
        .join("");
      if (textContent) {
        lines.push(`Assistant: ${textContent}`);
      }
      for (const block of content) {
        if (block.type === "toolCall") {
          const toolCall = block as ToolCall;
          const args = Object.entries(toolCall.arguments)
            .map(([key, value]) => {
              if (typeof value === "string") {
                return `${key}=${JSON.stringify(value)}`;
              }
              if (typeof value === "object" && value !== null) {
                return `${key}=${JSON.stringify(value)}`;
              }
              return `${key}=${String(value)}`;
            })
            .join(", ");
          lines.push(`Assistant called ${toolCall.name}(${args})`);
        }
      }
    } else if (message.role === "toolResult") {
      const content = Array.isArray(message.content) ? message.content : [];
      const textContent = content
        .filter((block): block is TextContent => block.type === "text")
        .map((block) => block.text)
        .join("");
      lines.push(`Tool result (${message.toolName}): ${textContent}`);
    }
  }

  return lines.join("\n");
}
ื”ืคื•ื ืงืฆื™ื” ืžืงื‘ืœืช ืžืขืจืš ืฉืœ ื”ื•ื“ืขื•ืช ื•ืฆืจื™ื›ื” ืœื”ืคื•ืš ืื•ืชื• ืœืžืขืจืš ืฉืœ ืฉื•ืจื•ืช ื›ืœื•ืžืจ ื›ืœ ื”ื•ื“ืขื” ืฆืจื™ื›ื” ืœื”ืคื•ืš ืœืฉื•ืจืช ื˜ืงืกื˜ ื‘ืžืขืจืš ื”ืชื•ืฆืื”. โœ ืœื•ืœืื” ื™ื•ืฆืจืช ื‘ืžืงื•ื map ืชื‘ื ื™ืช ื‘ืขื™ื™ืชื™ืช ืจืืฉื•ื ื” ื‘ืงื•ื“ ื”ื™ื ืœื•ืœืืช ื” for. ื‘ื“ื•ื’ืžื” ืคืฉื•ื˜ื” ืฉืชื™ ื”ืœื•ืœืื•ืช ื”ืืœื” ื–ื”ื•ืช:
const messages = [{text: 'one'}, {text: 'two'}, {text: 'three'}];

// 1. using for loop
const lines1 = [];
for (const message of messages) {
    lines1.push(message.text);
}

// 2. using map
const lines2 = messages.map(message => message.text);
ื”ื”ื‘ื“ืœ ื‘ื™ืŸ ืฉืชื™ ื”ืœื•ืœืื•ืช ื”ื•ื ื“ื•ื•ืงื ื‘ืžื” ืฉืื™ ืืคืฉืจ ืœืขืฉื•ืช ื‘ืœื•ืœืื” ื”ืฉื ื™ื”. ืœื•ืœืืช map ืžืืคืฉืจืช ืจืง ื”ื—ืœืคื” ืฉืœ ืจืฉื™ืžืช ืขืจื›ื™ื ืื—ืช ืœืจืฉื™ืžื” ืื—ืจืช. ืœื•ืœืืช for ื”ื™ื ื›ืœืœื™ืช ื™ื•ืชืจ ื•ืžืืคืฉืจืช ื’ื ืคืขื•ืœื•ืช ื ื•ืกืคื•ืช. ื‘ืžืงืจื” ืฉืœื ื• ื”ืœื•ืœืื” ื‘ืืžืช ืžืฉืชืžืฉืช ื‘ื™ื›ื•ืœืช ืฉืœ for ืœื™ื™ืฆืจ ืžืขืจืš ืคืœื˜ ื‘ืื•ืจืš ืฉื•ื ื” ืžื”ืงืœื˜, ื›ืœื•ืžืจ ืžืขืจืš ื”ืฉื•ืจื•ืช ืฉืžื•ื—ื–ืจ ืขืฉื•ื™ ืœื›ืœื•ืœ ื™ื•ืชืจ ืžืฉื•ืจื” ืื—ืช ืœื›ืœ ื”ื•ื“ืขื” - ืื‘ืœ ืงืฉื” ืœื ื• ืœืจืื•ืช ืืช ื–ื” ืžืงืจื™ืื” ืคืฉื•ื˜ื” ืฉืœ ื”ืงื•ื“. ืคืชืจื•ืŸ ืžื“ื•ื™ืง ื™ื•ืชืจ ื™ืฉืชืžืฉ ื‘ flatMap ื›ื“ื™ ืœื™ืฆื•ืจ ืžืกืคืจ ืฉื•ืจื•ืช ืžื›ืœ ื”ื•ื“ืขื”. ื”ื ื” ื“ื•ื’ืžื” ืคืฉื•ื˜ื” ื‘ืงื•ื“ ืงื˜ืŸ ืœื”ืžื—ื™ืฉ ืืช ื”ืขืงืจื•ืŸ:
const messages = [{text: 'one', times: 3}, {text: 'two'}, {text: 'three'}];

const lines1 = [];
for (const message of messages) {
  const times = message.times ?? 1;
  for (let i=0; i < times; i++) {
    lines1.push(message.text);
  }
}
console.log(lines1);

function serializeMessage(message) {
  const times = message.times ?? 1;
  return new Array(times).fill(message.text);
}

const lines2 = messages.flatMap(serializeMessage);
console.log(lines2);

ToCode
1 419
๐Ÿ“Œ ื—ื•ื–ืจื™ื ืœืžืฆื™ืื•ืช ื›ืฉืื ื—ื ื• ืžื‘ื™ื ื™ื ืื™ืš ื“ื‘ืจื™ื ืขื•ื‘ื“ื™ื ื”ืจื‘ื” ื™ื•ืชืจ ืงืœ ืœื ื• ืœืจืื•ืช ืืช ื”ืื™ืœื•ืฆื™ื ื•ืื™ืชื ืœื”ื‘ื“ื™ืœ ื‘ื™ืŸ ื”ื‘ื˜ื—ื• ืœื”ื™ื™ืค. ื‘ืจื•ืจ ืฉื”ืœื•ื˜ื• ื—ื™ื™ื‘ ืœื”ืจื•ื•ื™ื— ื•ืœื›ืŸ ื”ืกื™ื›ื•ื™ื™ื ืฉืœืš ืœื–ื›ื•ืช ื”ื ื–ื ื™ื—ื™ื. ืื ื™ื•ืชืจ ืื ืฉื™ื ื”ื™ื• ื–ื•ื›ื™ื ื”ืœื•ื˜ื• ืื•ืœื™ ืœื ื”ื™ื” ืžืจื•ื•ื™ื—. ื‘ืจื•ืจ ืฉื‘ืฉื‘ื™ืœ ืœื“ื‘ืจ ืฉืคื” ื‘ืฆื•ืจื” ืฉื•ื˜ืคืช ืฆืจื™ืš ื–ืžืŸ. ื›ืฉืื ื™ ืคืจืกื•ืžืช ืฉืžื‘ื˜ื™ื—ื” ืœื™ ืฉืชื•ืš ืฉืœื•ืฉื” ื—ื•ื“ืฉื™ื ืื ื™ ืื“ื‘ืจ ืกื™ื ื™ืช ืฉื•ื˜ืฃ ืื ื™ ื‘ื•ืจื—. ืœืžื“ืชื™ ืžืกืคื™ืง ืฉืคื•ืช ื‘ืฉื‘ื™ืœ ืœื”ื›ื™ืจ ืืช ื”ื’ื‘ื•ืœื•ืช ื•ื”ืื™ืœื•ืฆื™ื ืฉืœื™ ื•ืื ื™ ื™ื•ื“ืข ืžื” ืืคืฉืจื™ ื•ืžื” ืจืง ื—ืœื•ื. ื•ืื—ืจื™ ืฉืœื•ืฉ ื•ื—ืฆื™ ืฉื ื™ื ืฉืœ ืฉื™ื—ื•ืช ืขื ืžื•ื“ืœื™ ืฉืคื” ื•ืœื™ืžื•ื“ ืขืงืจื•ื ื•ืช ื”ืขื‘ื•ื“ื” ืฉืœื”ื ืื ื—ื ื• ื›ื‘ืจ ืืžื•ืจื™ื ืœื“ืขืช ืžื” ืืคืฉืจื™ ื•ืžื” ืจืง ื—ืœื•ื ื’ื ืื™ืชื. ืื ื—ื ื• ืžื‘ื™ื ื™ื ืฉ LLM ื”ื•ื ืžื›ื•ื ืช ื”ืฉืœืžื” ื•ืฉื”ื˜ืงืกื˜ ืฉื”ื•ื ื™ื›ืชื•ื‘ ื”ื•ื ืชื•ืฆืื” ืฉืœ ื”ืคืจื•ืžืคื˜ ื•ืฉืœ ื ืชื•ื ื™ ื”ืื™ืžื•ืŸ ืฉืœื•, ื‘ืชื•ืกืคืช ืชื™ื‘ื•ืœ ืกื˜ื˜ื™ืกื˜ื™. ืœืžืจื•ืช ื”ืจืฆื•ืŸ "ืœื–ื›ื•ืช ื‘ืœื•ื˜ื•" ืงืœ ืœืจืื•ืช ืœืžื” ืžื•ืฆืจื™ AI ืจื‘ื™ื ืœื ืฉื•ื•ื™ื ืืช ื”ืžืืžืฅ. ื›ืฉืžื™ืฉื”ื• ืžื‘ื˜ื™ื— ืกื•ื›ืŸ ืงื•ืœื™ ืฉื™ืกื™ื™ื ื‘ืฉื‘ื™ืœื™ ืžืฉื™ืžื•ืช ืื ื™ ื ื–ื›ืจ ื‘ OpenClaw ื•ื‘ื˜ืขื•ื™ื•ืช ืฉื”ื•ื ืขืฉื” ืœืื ืฉื™ื. ื”ื˜ืขื•ื™ื•ืช ื•ื”ื”ื–ื™ื•ืช ื”ืŸ ื—ืœืง ื‘ืœืชื™ ื ืคืจื“ ืžืžื•ื“ืœ ืฉืคื” ื•ืœื›ืŸ ื‘ืจื•ืจ ืฉืื ื™ ืœื ื™ื›ื•ืœ ืœืกืžื•ืš ืขืœ ื”ื›ืœื™ ืฉืœื”ื. ื›ืฉืžื™ืฉื”ื• ืžื‘ื˜ื™ื— ืกื•ืฃ ืœื‘ืขื™ื•ืช ืื‘ื˜ื—ืช ื”ืžื™ื“ืข ื‘ื–ื›ื•ืช ืžื•ืฆืจ AI ื—ื“ืฉ ืฉื™ืงืจื ืืช ื”ืงื•ื“ ืฉืœื™ ื›ื“ื™ ืœื—ืคืฉ ืฉื’ื™ืื•ืช ืื ื™ ื ื–ื›ืจ ืฉื”ืคืชืจื•ืŸ ืœื‘ืขื™ื•ืช ืื‘ื˜ื—ื” ื”ื•ื ืœื ืงืจื™ืื” ื—ื“ ืคืขืžื™ืช ืฉืœ ื”ืงื•ื“ ืืœื ืชื”ืœื™ืš ืคื™ืชื•ื— ื•ื ื™ื”ื•ืœ ืืจื’ื•ื ื™ ืฉืœื. ื›ืœื™ ื‘ื•ื“ื“ ืฉืจืง ืขื•ื‘ืจ ืขืœ ื”ืงื•ื“ ื™ื›ื•ืœ ืœืขื–ื•ืจ ืื‘ืœ ื‘ืœื™ ื”ืชื”ืœื™ืš ื”ืžืœื ืœืขื•ืœื ืœื ื ื•ื›ืœ ืœื˜ืคืœ ื‘ื‘ืขื™ื•ืช ืฉืงื•ืจื•ืช ืžื—ื•ืฅ ืœืกืงื•ืค ืฉืœ ืื•ืชื• ื›ืœื™ (ืœืžืฉืœ ืฉื™ื ื•ื™ื™ ื’ืจืกื” ื‘ืคืœื˜ืคื•ืจืžืช ื”ืจื™ืฆื”, ื‘ืขื™ื•ืช ืงื•ื ืคื™ื’ื•ืจืฆื™ื” ืื• ื”ื ื“ืกื” ื—ื‘ืจืชื™ืช). ื›ืฉืžื™ืฉื”ื• ืžื‘ื˜ื™ื— ืกื•ื›ืŸ AI ืฉืžื•ืฆื ืืช ื”ืกื™ื‘ื” ืœื›ืœ ืชืงืœื” ื‘ืžืขืจื›ืช ืื ื™ ืืคื™ืœื• ืœื ืžื ืกื” ืื•ืชื•. ืื ื™ ื‘ื˜ื•ื— ืฉื”ื›ื•ื•ื ื•ืช ืฉืœื”ื ื˜ื•ื‘ื•ืช ืื‘ืœ ืื ื™ ื ื–ื›ืจ ื‘ื›ืœ ื”ืคืขืžื™ื ืฉืžื•ื“ืœ ืฉืคื” ื“ืžื™ื™ืŸ ืจืžื–ื™ื ื‘ืœื•ื’ื™ื ืขืœ ื‘ืกื™ืก ื ืชื•ื ื™ ื”ืื™ืžื•ืŸ ืฉืœื•, ืจืžื–ื™ื ืฉืจืง ื”ื•ื‘ื™ืœื• ืขืžื•ืง ื™ื•ืชืจ ืœืžื—ื™ืœืช ื”ืืจื ื‘. ื›ืœ ืขื•ื“ ื”ื‘ืกื™ืก ืฉืœ ื”ื›ืœื™ ืฉืœืš ื”ื•ื ืžื•ื“ืœ ืฉืคื” ื”ื–ื™ื•ืช ื”ืŸ ื—ืœืง ืžื”ืกื™ืคื•ืจ. ื”ื”ื‘ื˜ื—ื” ืœื–ื›ื•ืช ื‘ืœื•ื˜ื• ื‘ื ื•ื™ื” ืขืœ ื›ืš ืฉืชืžื™ื“ ื™ืฉ ืืช ื”ืกื™ื›ื•ื™ ื”ืงื˜ืŸ ืฉืชื–ื›ื”. ื“ื•ื ืกืงืจื•ืœื™ื ื’ ื–ื” ื”ืฉื ืฉื ืชื ื• ืœืจืฉืชื•ืช ื—ื‘ืจืชื™ื•ืช ื‘ื”ืŸ ืื ืฉื™ื ื’ื•ืจืจื™ื ืขื•ื“ ื•ืขื•ื“ ื‘ืฉื‘ื™ืœ ื”ืกื™ื›ื•ื™ ื”ืงื˜ืŸ ืœืงืจื•ื ืžืฉื”ื• ืžืขื ื™ื™ืŸ. ืขืœ ืื•ืชื• ืžืฉืงืœ ืฆืจื™ืš ืœืžืฆื•ื ืžื•ืฉื’ ืฉื™ืชืืจ ืืช ื”ืžืจื“ืฃ ืื—ืจื™ ื”ืžื•ื“ืœ ื”ื‘ื, ื”ื›ืœื™ ื”ื‘ื, ื”ืงืกื ื”ื‘ื. ืื‘ืœ ืื™ืŸ ืฉื•ื ื˜ืจื™ืง. ื‘ืฉื‘ื™ืœ ืœื”ืจื•ื•ื™ื— ื›ืกืฃ ืขื“ื™ืฃ ืœืขื‘ื•ื“ ื•ืœื ืœืžืœื ืœื•ื˜ื•. ื‘ืฉื‘ื™ืœ ืœื›ืชื•ื‘ ืžืขืจื›ื•ืช ื™ืฆื™ื‘ื•ืช ืขื“ื™ืฃ ืœืœืžื•ื“ ืชื›ื ื•ืช ื•ืœื ืœืงื•ื•ืช ืฉืกื•ื›ืŸ ื”ืงื™ื“ื•ื“ ื”ื‘ื ื™ืฆืœื™ื— ืœื™ื™ืฆืจ ื‘ื“ื™ื•ืง ืืช ื”ืžืขืจื›ืช ืฉื“ืžื™ื™ื ืช.

ToCode
1 419
๐Ÿ“Œ ื˜ื™ืคื•ืœ ื‘ืฉื’ื™ืื•ืช ื‘ืงื•ื“ asyncio ื”ืงื•ื“ ื”ื‘ื ื”ื•ื ื’ืจืกื” ืคืฉื•ื˜ื” ืฉืœ ืงื˜ืข ืฉื›ืชื‘ ืœื™ ืกื•ื›ืŸ ืงื™ื“ื•ื“ ื•ืื ื™ ืฉืžื— ืฉืขืฆืจืชื™ ืœืงืจื•ื ืœืคื ื™ ืฉื”ืกื›ืžืชื™ ืœืงื‘ืœ ืื•ืชื•. ื‘ื•ืื• ื ืจืื” ืืช ื”ืงื•ื“ ื•ืื– ื ื ืชื— ืžื” ื”ืกื•ื›ืŸ ืขืฉื” ื™ืคื”, ืื™ืคื” ื”ื•ื ื˜ืขื” ื•ืžื” ืืคืฉืจ ืœืœืžื•ื“ ืขืœ ื‘ื™ื˜ื•ืœื™ื ื•ืฉื’ื™ืื•ืช ื‘ asyncio:
async def worker(..., queue, visited, ...):
    while True:
        try:
            url, depth = await queue.get()
        except asyncio.CancelledError:
            break
            
        try:
            ...
        except Exception as e:
            logger.error(f"Error processing {url}: {e}")
        finally:
            queue.task_done()
            if stop_event.is_set():
                break
ื”ืงื•ื“ ืžื•ืฉืš url ืžืชื•ืจ ื•ืื– ืขื•ืฉื” ืžืฉื”ื• ืขื ื” url ื”ื–ื”, ืื‘ืœ ืžื” ืฉืžืขื ื™ื™ืŸ ื‘ื• ื”ื•ื ื›ืœ ืคืงื•ื“ื•ืช ื”ื˜ื™ืคื•ืœ ื‘ืฉื’ื™ืื•ืช ื•ื‘ื‘ื™ื˜ื•ืœื™ื. โœ ื‘ื™ื˜ื•ืœ ืœืคื ื™ ืงื‘ืœืช ืืœืžื ื˜ ื ืชื‘ื•ื ืŸ ื‘ื‘ืœื•ืง ื”ืจืืฉื•ืŸ:
while True:
    try:
        url, depth = await queue.get()
    except asyncio.CancelledError:
        break
ืžื” ืคืชืื•ื ื™ืฉ ืฉื ื˜ื™ืคื•ืœ ื ืคืจื“ ื‘ CancelledError? ื•ืœืžื” ืจืง ื”ื•ื ืžืงื‘ืœ ืืช ื” break? ื”ืชืฉื•ื‘ื” ืฉื›ืฉืžื‘ื˜ืœื™ื ืคืขื•ืœื” ืืกื™ื ื›ืจื•ื ื™ืช ื”ื‘ื™ื˜ื•ืœ ื™ื’ื™ืข ืœืื™ื–ืฉื”ื• await, ื›ืœื•ืžืจ ื›ืœ await ื‘ืคื•ื ืงืฆื™ื” ืขืœื•ืœ ืœื–ืจื•ืง CancelledError. ืื ื”ื‘ื™ื˜ื•ืœ ืงื•ืจื” ืœืคื ื™ ืฉืžืฉื›ื ื• ืืœืžื ื˜ ืžื”ืชื•ืจ ืขืœื™ื ื• ืœืฆืืช ืžื”ืœื•ืœืื” ื‘ืœื™ ืœื”ื•ื“ื™ืข ืขืœ task_done. ื‘ืœื™ ื˜ื™ืคื•ืœ ืžื™ื•ื—ื“ ื–ื” ื”ืฉื’ื™ืื” ืชื’ื™ืข ืœ finally ื• task_done ื™ื“ื•ื•ื— ื’ื ื‘ืžืงืจื” ืฉืœ ื‘ื™ื˜ื•ืœ ื‘ื–ืžืŸ ื”ืžืชื ื” ืœืืœืžื ื˜. โœ ื˜ื™ืคื•ืœ ื‘ืฉื’ื™ืื•ืช ืœืœื ื‘ื™ื˜ื•ืœื™ื ื”ื‘ืœื•ืง ื”ืฉื ื™ ืžื˜ืคืœ ื‘ืฉื’ื™ืื•ืช ืžืกื•ื’ Exception. ื›ืืŸ ืฆืจื™ืš ืœื–ื›ื•ืจ ืฉ CancelledError ื™ื•ืจืฉ ืž BaseException ื‘ืคื™ื™ืชื•ืŸ ื•ืœื ืž Exception ื•ืœื›ืŸ ืœื ื™ื˜ื•ืคืœ ื‘ except. ืื ื™ ืžื–ื›ื™ืจ ื”ืงื•ื“ ื”ื™ื”:
try:
    ...
except Exception as e:
    logger.error(f"Error processing {url}: {e}")
finally:
    queue.task_done()
    if stop_event.is_set():
        break
ืฉื’ื™ืื” ืจื’ื™ืœื” ืชื’ื™ืข ื›ืืŸ ืœ except ื•ืชืฆื™ื’ ืืช ื”ื•ื“ืขืช ื”ืฉื’ื™ืื”. ืื—ืจื™ื” ื™ื•ืคืขืœ ื” finally, ื”ืžืฉื™ืžื” ืชื“ื•ื•ื— ื‘ืชื•ืจ ื”ื•ืฉืœืžื” ื•ืื ื”ื•ืคืขืœ ื“ื’ืœ ื”ื™ืฆื™ืื” ืื– ื ืฆื ืžื”ืœื•ืœืื”. ื‘ื™ื˜ื•ืœ ื™ื’ื™ืข ื™ืฉืจ ืœ finally, ืฉื•ื‘ ื™ื•ื‘ื™ืœ ืœื“ื™ื•ื•ื— ืขืœ task_done ืื‘ืœ ืื– ื™ืžืฉื™ืš ืœืคืขืคืข ืœืžืขืœื” ื•ื™ื•ืฆื™ื ืื•ืชื ื• ืžื”ืœื•ืœืื”. ืžื” ื”ื‘ืขื™ื” ืขื ื–ื”? ืงื•ื“ ื—ื™ืฆื•ื ื™ ืฉื”ืจื™ืฅ ืืช ื”ืคื•ื ืงืฆื™ื” ื•ื‘ื™ื˜ืœ ื™ืฆื˜ืจืš ืœื”ืชืžื•ื“ื“ ืขื ืชืฉื•ื‘ื” ืœื ืขืงื‘ื™ืช - ืื ื”ื‘ื™ื˜ื•ืœ ื”ืชืจื—ืฉ ื‘ื–ืžืŸ ื”ืžืชื ื” ืœืคืจื™ื˜ ืžื”ืชื•ืจ ืื– ืžืคืขื™ืœื™ื break ื•ืคืฉื•ื˜ ืžืกื™ื™ืžื™ื ืืช ื”ืคื•ื ืงืฆื™ื” ืจื’ื™ืœ (ื‘ืชื•ืจ ื”ืฆืœื—ื”). ืื ื”ื‘ื™ื˜ื•ืœ ื”ืชืจื—ืฉ ื‘ื–ืžืŸ ื‘ื™ืฆื•ืข ื”ืขื‘ื•ื“ื” ื” CancelledException ื™ื’ืจื•ื ืœืกื™ื•ื ื”ืคื•ื ืงืฆื™ื” ื•ืงื•ื“ ื—ื™ืฆื•ื ื™ ื™ื•ื›ืœ ืœืจืื•ืช ืฉื”ื™ื ื”ืชืจืกืงื” ื‘ื’ืœืœ ื‘ื™ื˜ื•ืœ. ื‘ืขื™ื” ืฉื ื™ื” ื‘ืงื•ื“ ื”ื™ื ื”ื˜ื™ืคื•ืœ ื‘ืฉื’ื™ืื•ืช ืฉืื™ื ืŸ ื‘ื™ื˜ื•ืœื™ื - ื›ืืŸ ื”ื˜ื™ืคื•ืœ ื”ื•ื ื‘ืกืš ื”ื›ืœ ืœื›ืชื•ื‘ ื”ื•ื“ืขื” ืœืœื•ื’ ืœืžืจื•ืช ืฉื‘ืขื‘ื•ื“ืช ืจืฉืช ื ื›ื•ืŸ ื™ื•ืชืจ ืœื ืกื•ืช ืคืจื™ื˜ ื›ืžื” ืคืขืžื™ื, ืœืคื—ื•ืช ืขื‘ื•ืจ ืฉื’ื™ืื•ืช ื–ืžื ื™ื•ืช. ื”ืงื•ื“ ื›ืืŸ ืœื ื›ื•ืœืœ ืžื ื’ื ื•ืŸ ืœืงื™ื˜ืœื•ื’ ืฉื’ื™ืื•ืช ื•ื’ื ืœื ืžื ื’ื ื•ืŸ ืœื ืกื™ื•ื ื•ืช ื—ื•ื–ืจื™ื. ืกืš ื”ื›ืœ ื”ืงื•ื“ ื”ื™ื” ืขื•ื‘ื“ ื˜ื•ื‘ ื™ื•ืชืจ ืขื context manager ืฉื™ื˜ืคืœ ื‘ task_done ื‘ืžืงื•ื ืžื‘ื ื” ื” except ื”ื›ืคื•ืœ. ืœื’'ืžื™ื ื™ ืœื ื”ื™ืชื” ื‘ืขื™ื” ืœื›ืชื•ื‘ ืืช ื–ื” ืขื ื›ืžื• ืฉืจืฆื™ืชื™ ื›ืฉื‘ื™ืงืฉืชื™ ื”ื˜ืจื™ืง ื”ื™ื—ื™ื“ ื”ื™ื” ืœืจืื•ืช ืืช ื”ื‘ืขื™ื•ืช ื‘ืงื•ื“ ื”ืžืงื•ืจื™ ื•ืœื”ื‘ื™ืŸ ืื™ืš ื–ื” ืฆืจื™ืš ืœื”ื™ื•ืช. ื–ื” ื”ืงื•ื“ ืฉืœืงื—ืชื™ ื‘ืกื•ืฃ:
from contextlib import asynccontextmanager
import asyncio

@asynccontextmanager
async def get_task(queue):
    # If this is cancelled, Exception propagates and finally is NOT run (which is correct)
    item = await queue.get()
    try:
        yield item
    finally:
        queue.task_done()
        
        
async def worker(queue):
    # No need to catch CancelledError at all!
    # When task.cancel() is called, the exception will break the loop 
    # automatically and cleanly cancel the task.
    while True:
        async with process_task(queue) as (url, depth):
            ... # Do work

ToCode
1 419
๐Ÿ“Œ ื’ื ื’ื™ื˜ื”ืื‘ ืœื ื‘ื•ื“ืงื™ื ื–ืžื™ื ื•ืช ืœืคื ื™ ืฉืžืฆื™ืขื™ื ืฉื ืœืคืจื•ื™ืงื˜ ืžืกืš ื™ืฆื™ืจืช ืจื™ืคื• ื—ื“ืฉ ื‘ื’ื™ื˜ื”ืื‘ ื›ื•ืœืœ ืชื•ื•ื™ืช ืžืชื—ืช ืœืฉื ื”ืคืจื•ื™ืงื˜ ืขื ื”ืฆืขื” ืœืฉื ืืงืจืื™. ื›ืœ ื˜ืขื™ื ื” ืžื—ื“ืฉ ืฉืœ ื”ืขืžื•ื“ ืžืฉื ื” ืืช ื”ืฉื. ืœื›ื• ื ืกื• ืืช ื–ื” ืื ืืชื ืœื ืžื›ื™ืจื™ื: https://github.com/new ื ืฉื™ื ืœื‘ ืฉืื—ืจื™ ืฉืœื•ื—ืฆื™ื ืขืœ ื”ืฉื ื”ืืงืจืื™ ืฉื”ื•ื ื”ืฆื™ืข ืžื•ืคื™ืขื” ืชื•ื•ื™ืช ื ื•ืกืคืช, Checking availability, ื•ืจืง ืื—ืจื™ ื”ื‘ื“ื™ืงื” ืžื•ืคื™ืขื” ื”ืชื•ื•ื™ืช ื”ื™ืจื•ืงื” ืฉืื•ืžืจืช ืฉืฉื ื”ืคืจื•ื™ืงื˜ ื–ืžื™ืŸ. ื•ืืชื” ืจื•ืฆื” ืœืฉืื•ืœ, ืœื ื™ื›ื•ืœืชื ืœื‘ื“ื•ืง ืœืคื ื™? ืœืžื” ืฉืชืฆื™ืขื• ืœื™ ืฉื ืืงืจืื™ ืื ื”ื•ื ื›ื‘ืจ ืชืคื•ืก? ื’ื ื‘ืงื•ื“ ืฉืœื™ ืื ื™ ื ืชืงืœ ื‘ื“ื™ืœืžื” ื“ื•ืžื”: ืงื•ื“ ืฆื“ ืฉืจืช ืžื™ื™ืฆืจ ืžื–ื”ื” ืืงืจืื™ ื•ืฆืจื™ืš ืœื”ื‘ื™ืŸ ืื ื”ืžื–ื”ื” ื”ื–ื” ื‘ื›ืœืœ ื—ื•ืงื™ ืœืคื ื™ ืฉืžืฆื™ืข ืื•ืชื• ืœืœืงื•ื—. ื”ืื™ื ืกื˜ื™ื ืงื˜ ื”ื•ื ืœื›ืชื•ื‘ ืงื•ื“ "ื ื›ื•ืŸ", ื›ืœื•ืžืจ ืœื”ื’ืจื™ืœ ืืช ื”ืžื–ื”ื”, ืœื•ื•ื“ื ืฉื”ื•ื ืคื ื•ื™ ืžื•ืœ ื‘ืกื™ืก ื”ื ืชื•ื ื™ื ื•ื›ืš ืœื”ืžืฉื™ืš ื‘ืœื•ืœืื” ืขื“ ืฉืžื•ืฆืื™ื ืžื–ื”ื” ืคื ื•ื™. ืžืžื™ืœื ืœื•ืœืื” ื›ื–ืืช ืœื ืชืจื•ืฅ ื™ื•ืชืจ ืžื“ื™ ืคืขืžื™ื ื›ื™ ื”ืกื™ื›ื•ื™ ืœื”ื’ืจื™ืœ ืžื–ื”ื” ืชืคื•ืก ื”ื•ื ืžืื•ื“ ื ืžื•ืš. ื’ื™ื˜ื”ืื‘ ืื•ืžืจื™ื ืœื ื• ืคื” ืžืฉื”ื• ืžืื•ื“ ื—ืฉื•ื‘ ืœื’ื‘ื™ ืงื™ื“ื•ื“ - ื™ืฉ ืžืฆื‘ื™ื ื‘ื”ื ื™ื•ืชืจ ื—ืฉื•ื‘ ืœื”ื—ื–ื™ืจ ืชืฉื•ื‘ื” ืžื”ืจ ืžืืฉืจ ืœื”ื—ื–ื™ืจ ืืช ื”ืชืฉื•ื‘ื” ื”ื ื›ื•ื ื”. ืจื•ื‘ ื”ืื ืฉื™ื ืฉืžื’ื™ืขื™ื ืœืžืกืš ื”ื–ื” ืžืžื™ืœื ืœื ื™ืฉืชืžืฉื• ื‘ืฉื ื”ืืงืจืื™ ืืœื ื™ื‘ื—ืจื• ืฉื ื‘ืขืฆืžื, ื•ื’ื ืืœื” ืฉื™ื‘ื—ืจื• ืจื•ื‘ ื”ื–ืžืŸ ื™ืงื‘ืœื• ืžื–ื”ื” ืคื ื•ื™. ื”ืกื™ื›ื•ื™ ืœืงื‘ืœ ืžื–ื”ื” ืชืคื•ืก ื”ื•ื ืžืžื™ืœื ื›ืœ ื›ืš ื ืžื•ืš ืฉื—ื‘ืœ ืœื‘ื–ื‘ื– ืœื›ื•ืœื ื–ืžืŸ ืขืœ ื”ื‘ื“ื™ืงื” ื”ืจืืฉื•ื ื” ื•ืขื“ื™ืฃ ืœื‘ื“ื•ืง ืจืง ืขื‘ื•ืจ ืžื™ ืฉื‘ืืžืช ืžืชื›ื•ื•ืŸ ืœื”ืฉืชืžืฉ ื‘ืžื–ื”ื” ื–ื”. ื‘ื‘ื™ืฆื•ืขื™ื, ืฉืœื ื›ืžื• ื‘ื—ื™ื™ื, ื”ืžืคืชื— ืœืื•ืฉืจ ื”ื•ื ืขืฆืœื•ืช ื•ื“ื—ื™ื™ื ื•ืช. ืžื” ืฉืืคืฉืจ ืœื ืœืขืฉื•ืช ืขื“ื™ืฃ ืœื ืœืขืฉื•ืช, ื•ืื ื—ื™ื™ื‘ื™ื ืœืขืฉื•ืช ืขื“ื™ืฃ ื›ืžื” ืฉื™ื•ืชืจ ืžืื•ื—ืจ.