ToCode
Open in Telegram
ืืืคืื ืงืฆืจืื ืืืชืื ืชืื ืืืช ืื ืื ืคืจืง
Show more1 420
Subscribers
No data24 hours
+27 days
-230 days
Posts Archive
1 420
๐ ืืืชืจ ืืืืจ ืื ืืืืจ ืืืชืจ ืคืฉืื
ืืืจ ืืงืฉื - "ืืืชืื ืงืื ืืืื ืื ืืฉืขืื. ืืชื ืจืง ืืืงืฉ ืืฉืื ืื AI ืืืฉ ืื ืืช ืืงืื. ืขืืืื ืฉืคืขื ืืงืื ืืื ืืืฉืืื ืืืื ืขืืฉืื ืืืืืจ ืื. ืื ืื ืืขื ืืื".
ืื ืฉืืืชื ืืืืจื - "ื ื ืื ืื ืืชืืช ืืขื ืืื ืขื ื AI"?.
ืฉืชืืงื.
ืืืชืจ ืงื ืืจืื ืขื ืืืคื ืืื ืืืฉืจ ืื ืืื ืืืืื, ืืคืืื ืฉืืืืื ื ืืกืข ืืืชืจ ืืืจ ืืืคืืื ืฉืืืืื ืื ืืืืขืื. ืืฉืืฉืื ืืืืจ ืืืชืจ ืื ืืืืจ ืฉืืื ืคืฉืื ืืืชืจ.
ืืจืืจ ืฉืืคืฉืจ ืืืชืื ืืืื ืืฉืขืชืืื POC ืฉืคืขื ืืื ืืืจืฉ ืืกืฃ ืืื ืืืคืชืืื.
ืืจืืจ ืฉืืคืชืืื ืื ืืกืื ืืฆืืืืื ืืืชืื ืืืื ืขื AI ืงืื ืืืืืจืืช ืืืืื ืืฉืืขืืชืืช ืืื ืฉืืชืื ื ืืคื ื ืฉื ื.
ืืื ืฉืืื ืืืืืจ ืื ืฉ 50-70% ืืืขืืืืื ืืืืจืืช ืื ืื ืฆืืื ืืช ืชืงืฆืื ืืืืงื ืื ืฉืืื. ืื ืืฉืชืืฉืื ืืกืืื ื ืงืืืื ืืื ืืืชืงืื ืืืืืจืืช ืฉืืื ืืืื ืฉืืื ืจืืฆืื ืฉืื ืืชืงืืื. ืื ืืืื ื ืืกืขืื ืืืืื ืืื ืขืืืื ืืืืืจืืช 15 ืงื"ืฉ.
ืื ืื ืขืืฉืื ืืช ืื ืื ืื ืขืฆืื ืื ืื ืื ืื ืื ืจืืฆืื ืืขืืื. ื ืกืืขื ืืืืืจืืช ืืืืื ืืืจืฉืช ืืืืื ืืช ืฉืื ื ืื ืกืืขื ืืืืืจืืช ื ืืืื. ืืคืชืืื ืจืืื ืืืื ืืกืชืืืื ืขื "ืืืคืืช ื AI" ืืืืืช ืื ืืืื ืื ืื ืจืืฆืื ืืื. ืื ืืฉืชืืฉืื ื AI ืืื ืืืชืื ืงืื ืืื ืืงืื ืื ื ืืชื ืื ืื ืืจืื ืืืชืจ ืืืจ. ืืฉืืืฆืืื ืืขืืื ื POC ืื ืืืืื ืฉืื ืืฉืงืืขืื ืืจืื ืืืชืจ ืืื ื Code Review, ืืชืืงืื ืื. "ืืื ืืชืืื ืืขืฉืืช ืืืืื ืืืขืืื ืืืืคืื. ืืื ืฉืชืคืกืชื ืืืชื ืืืื ืืขืฆืจืชื ืืืชื".
ืืืชืืจ ืืื ืฉืืจืฃ ืขืืื. ืืืจืืช ืืืื ืืฆืคืืช ืืขืืืืื ืืืืฆืจ ืงืื ืืืืืจืืช ืฉื ืืืื ืืช. ืืกืืคืืจ ืืื ืื ืื ืืฉืชืืฉืื ื AI ืืื ืืื ืืฉืชืืฉืื ืื. ืืจืื ืืืืขืืืช ืฉื ืืชืืื ื ืคืชืจื. ืืจืื ืืขืืืช ืืืฉืืช ื ืืฆืจื. ืืืื ืื ืื ื ืฆืจืืืื ืืขืืืช ืจืื.
1 420
from repid import Job, Queue
from app_repid import app, QUEUE
async def main():
if len(sys.argv) < 2:
print("Usage: python dispatcher_repid.py <max_posts>")
sys.exit(1)
max_posts = int(sys.argv[1])
pages_needed = math.ceil(max_posts / 10)
print(f"Downloading up to {max_posts} posts across {pages_needed} index page(s)")
async with app.magic(auto_disconnect=True):
# Declare the queue so jobs can be enqueued before any worker starts.
await Queue(QUEUE).declare()
for page_num in range(1, pages_needed + 1):
# Each page has 10 posts; the last page may have fewer
already_allocated = (page_num - 1) * 10
posts_limit = min(10, max_posts - already_allocated)
await Job(
name="download_index_page",
queue=QUEUE,
args={"page_num": page_num, "posts_limit": posts_limit},
retries=3,
).enqueue()
print(f" Dispatched page {page_num} (limit={posts_limit})")
print("All index pages dispatched. Workers will now process the jobs.")
if __name__ == "__main__":
asyncio.run(main())
โ ืกืืืื - ืื ืืืฆืื ืืืืืื. ืื ืขืื ืฆืจืื ืืฉืคืจ.
ืืงืื ืืจืื ืืื ืืืืจืื ืืืงืืื ืคืืกืืื ืืืืืื. ืืงืื ืืงืื ืืกืคืจ ืคืืกืืื ืืืืจืื, ืืืฉื ืืื ืืคืื ืฆืจืื ืืฉืืืจ ืืื ืืืฆืื ืืฉืืืืช ืืืงืืื:
1. ืืฉืืื ืืื ืืฃ ืฉืฆืจืื ืืืืจืื.
2. ืืืื ืฉืืคื ืืืื ืืงืก ืืืจืืื, ืื ืืฃ ืฉืกืืื ืืืฆืจ ืืฉืืืืช ืืืฉืืช ืืืืจืืช ืืคืืกืืื ืฉืืืคืืขื ืื.
ืืื ืืกืื ืืจืื ื ืืืื ืืืืื ืืขื 10 ืืฉืืืืช ืืคืืขื ืืฉื ื ืคืืขืืื, ืกื ืืื ืขื 20 ืืืจืืืช ืืืงืืื ืืืืชืจ.
ืืืืืื ืื ืืืืืช Type Safety ืขื ืืืฉืืืืช ืขืฆืื. ืืจืคืื ืืฉ ืืื ืืืจืฆืื ืขื pydantic ืืื ืขืืืื ืื ื ืืกืืชื ืืืชื ืื ืื ืืืื ื ืืฉื ืืคืืกื ืืืฉื.1 420
def to_markdown_url(post_url: str) -> str:
"""Convert a blog post URL to its markdown version by stripping
the query string and appending .md."""
base = post_url.split("?")[0]
return f"{base}.md"
def extract_post_urls(soup: BeautifulSoup, limit: int):
"""
Generator that yields up to `limit` unique blog post URLs
from a blog index page BeautifulSoup parse tree.
Blog post URLs are like /blog/<date-slug>?page=1
Index page is /blog?page=N (no trailing slash) โ excluded by startswith.
"""
seen = set()
count = 0
for a_tag in soup.select("a[href]"):
href = a_tag["href"]
if href.startswith("/blog/") and href != "/blog/":
full_url = f"https://www.tocode.co.il{href}"
if full_url not in seen:
seen.add(full_url)
yield full_url
count += 1
if count >= limit:
return
@router.actor(queue=QUEUE)
async def download_index_page(page_num: int, posts_limit: int) -> dict:
"""
Download a blog index page, extract post links, and enqueue a
download_post job for each post found.
posts_limit: how many posts to download from this page (max 10).
"""
url = f"{BASE_URL}?page={page_num}"
resp = await client.get(url)
resp.raise_for_status()
soup = BeautifulSoup(resp.text, "html.parser")
for post_url in extract_post_urls(soup, posts_limit):
md_url = to_markdown_url(post_url)
# The worker holds the active (magic) connection, so jobs enqueued
# from inside an actor reuse it automatically.
await Job(
name="download_post",
queue=QUEUE,
args={"md_url": md_url},
retries=3,
).enqueue()
return {"page": page_num}
@router.actor(queue=QUEUE)
async def download_post(md_url: str) -> dict:
"""
Download a single blog post markdown file and save it to the data folder.
The URL is already the .md version (converted by the dispatcher).
"""
resp = await client.get(md_url)
resp.raise_for_status()
# Derive filename from the URL slug: /blog/slug.md โ slug
slug = md_url.rstrip("/").split("/")[-1].removesuffix(".md")
filename = f"{slug}.md"
filepath = os.path.join(DATA_DIR, filename)
os.makedirs(DATA_DIR, exist_ok=True)
with open(filepath, "w", encoding="utf-8") as f:
f.write(resp.text)
return {"file": filename, "size_bytes": len(resp.text)}
ืื ืคืื ืงืฆืื ืฉืืกืืืช ืืชืืจ actor ืืืืืจื ืืฉืืื. ืืฆืื ื ืืชืืื ืืช ืืื ืืคืื ืงืฆืืืช download_index_page ื download_post. ืืฉืืืืช ืืืืืจืืช ืขื ื Router ืืืืจื ืฉืื Worker ืืงืื ืืืฆืืจื ืืช ื Router-ืื ืืงืืช ืืื ืืฉืืืืช:
worker = Worker(routers=[router], tasks_limit=10)
ืืืฉืืืืช ืขืฆืื ืื ืคืฉืื ืงืื ืฉืืืจืื ืืฃ ืืื ืืงืก (ืจืฉืืื ืฉื ืคืืกืืื) ืื ืคืืกื ืกืคืฆืืคื ืืื ืฉืืฉืื ืืืืืื ืฉืืืื ืคืื ืงืฆืืืช ืืกืื ืืจืื ืืืช.
ืืขื ืืื ืืฉืื ืื ืืงืื ืืืฉืืื ืฉืืืจืืื ืืช ืืฃ ืืืื ืืงืก ืืื ืืื ืืืืฆืจืช ืืฉืืืืช ืืืฉืืช ืืื ืืืืจืื ืืช ืืคืืกืืื:
for post_url in extract_post_urls(soup, posts_limit):
md_url = to_markdown_url(post_url)
# The worker holds the active (magic) connection, so jobs enqueued
# from inside an actor reuse it automatically.
await Job(
name="download_post",
queue=QUEUE,
args={"md_url": md_url},
retries=3,
).enqueue()
return {"page": page_num}
โ ืฉืืืืจ ืืืฉืืืืช
ืืืืง ืืืืจืื ืฉื ืืืขืจืืช ืืื ืืงืื ืืืื ืจ ืฉืืฉืืจ ืืช ืืืฉืืืืช. ืืืขืฉื ืืืฉืืื ืืืืืื ืฉืื ืื ื ืฆืจืืืื ืืืคืขืื ืืื ืืืจืืช ืืฃ ืืืื ืืงืก ืื ืืคืื ืงืฆืื ืฉืื ืืืจ ืืคืขืืื ืืช ืืฉืืืช ืืืจืืช ืืคืืกืืื ืืื ืฉืงืืื ืจืืื ื.
ืื ืืงืื ืฉื dispatcher_repid.py ืฉืืชืืื ืืืจืื ืฉื ืืคื ืืืื ืืงืก ืืืงืืื:
"""
Dispatcher (repid version): calculates how many blog index pages are needed
and enqueues download_index_page jobs via repid.
Usage:
uv run python dispatcher_repid.py <max_posts>
Example:
uv run python dispatcher_repid.py 25 # downloads up to 25 posts
"""
import asyncio
import math
import sys1 420
๐ ืืืืืช Repid - ืืืจืืช ืืคืืกืืื ืืืืืื ืืืงืืื
ืจืคืื ืืื ืกืคืจืืืช ืคืืืชืื ืืืจืฆืช ืืฉืืืืช ืืืงืืื. ืืื ืืืื ื Celery ืืื ืคืืคืืืจืืช ืคืืืช ืืืกืื ืืจืื ืืช, ืืืืื ื dramatiq ืืคืขื ืืกืื ืืจืื ืืช ืืืื, ืืืฉื ืืืชืจ ืืคืืืช ืคืืคืืืจืืช.
ืืชืืื ืืช ืืืืืืช ืฉื Repid ืืืืืืช:
1. ืืฉืืืืช ืืกืื ืืจืื ืืืช (ืืืืื, ืืฉืืื ืื ืืื ื).
2. ืชืืืื ืืืื ืืืืืงืืช ืขื ืจืืื TestClient.
3. ืชืืขืื ืืืืืืชื ืืกืืื ืื ืขื ืงืืฆื llms.txt ื llms-full.txt.
4. ืืืืืจ ืืืื ื ื pydantic ืืฉืืื ืืืืจืช ืืืคืืกืื.
ืืืืื? ืืื ืืืื ื ืืชืื ืชืืื ืืช ืคืืืชืื ืฉืชืฉืืืจ ืคืืกืืื ืืืืืื ืืื ืืงืจืืื ืืืคืืืื.
โ ืืื ื ืืืขืจืืช docker-compose.yml
ืชืื ื ืจืืฉืื ื ืืื ืืื ื ืืืขืจืืช. ืืืืจ ืืจืคืื ืืื ืืขืจืืช ืืืจืฆืช ืืฉืืืืช ืืฆืืจื ืืืืืจืช ืืฉืชืืฉ ื docker-compose.yml ืืื ืืืืฆืจ ืืกืคืจ ืงืื ืืืื ืจืื. ืื ืืงืืืฅ:
services:
redis:
image: redis:7-alpine
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 5s
timeout: 3s
retries: 5
worker-1:
image: ghcr.io/astral-sh/uv:python3.14-bookworm
working_dir: /app
depends_on:
redis:
condition: service_healthy
command: sh -c "uv sync --frozen --no-dev && uv run python worker_repid.py"
volumes:
- .:/app
- ./data:/app/data
- /app/.venv
environment:
- REPID_REDIS_URL=redis://redis:6379/0
worker-2:
image: ghcr.io/astral-sh/uv:python3.14-bookworm
working_dir: /app
depends_on:
redis:
condition: service_healthy
command: sh -c "uv sync --frozen --no-dev && uv run python worker_repid.py"
volumes:
- .:/app
- ./data:/app/data
- /app/.venv
environment:
- REPID_REDIS_URL=redis://redis:6379/0
dispatcher:
image: ghcr.io/astral-sh/uv:python3.14-bookworm
working_dir: /app
depends_on:
redis:
condition: service_healthy
command: sh -c "uv sync --frozen --no-dev && uv run python dispatcher_repid.py ${MAX_POSTS:-10}"
volumes:
- .:/app
- ./data:/app/data
- /app/.venv
environment:
- REPID_REDIS_URL=redis://redis:6379/0
profiles:
- dispatch
ืืชืื ืืขืืืื ืืื ืจืืืก ืืงืื ืืืื ืจ ืืจืืฉืื. ืงืื ืืืื ืจืื 2 ื 3 ืื ืืคืืขืืื ืืงืื ืืืื ืจ ืจืืืขื ืฉืืื ืืช ืืืฉืืืืช ืืืชืืืื ืืช.
โ ืงืื ืืคืืขืืื
ืืกืงืจืืคื ืฉื ืืคืืขืืื ืืืฉ ืคืฉืื:
import asyncio
from repid import Worker
from app_repid import app, router, QUEUE
async def run_worker():
async with app.magic(auto_disconnect=True):
# auto_declare=True (default) makes the worker declare the queue
# before it starts consuming.
# tasks_limit caps how many actor coroutines run concurrently on this
# worker's event loop -> at most 10 concurrent downloads per worker.
worker = Worker(routers=[router], tasks_limit=10)
await worker.run()
if __name__ == "__main__":
asyncio.run(run_worker())
ืืื ืืจืืฅ ืคืื ืงืฆืื ืฉื ืจืคืื ืืืืืืจ ืืืืื ืฉื 10 ืืฉืืืืช ืืืงืืื. ืงืื ืืืฉืืื ืขืฆืื ืืืืืจ ืืงืืืฅ app_repid.py ืืืืชื ืชืืงืื. ืื ืชืืื ืืงืืืฅ:
"""
Repid application: defines the broker connection, the router and the
two actors (download_index_page, download_post).
This module is imported by both the worker (worker_repid.py) and the
dispatcher (dispatcher_repid.py). The actors are the repid equivalent of
the Celery tasks in tasks.py.
"""
import os
import httpx
from bs4 import BeautifulSoup
from repid import Repid, Connection, RedisMessageBroker, Job, Router
BROKER_URL = os.environ.get("REPID_REDIS_URL", "redis://localhost:6379/0")
# A single Repid app wraps the connection to the message broker (Redis).
# Entering `app.magic()` makes this connection the implicit one used by
# Job().enqueue(), Queue().declare() and the Worker.
app = Repid(Connection(RedisMessageBroker(BROKER_URL)))
# Shared async HTTP client. Because the actors `await` it, many downloads can
# be in flight on the worker's event loop at once (up to the worker's
# tasks_limit). follow_redirects mirrors requests' default behavior.
client = httpx.AsyncClient(timeout=30, follow_redirects=True)
router = Router()
QUEUE = "crawler"
BASE_URL = "https://www.tocode.co.il/blog"
DATA_DIR = "/app/data"1 420
๐ ืืืชืจ ืืืชืืจื? ืืื ืืคืืชืื ืฉืื ืื ื ืฆืจืืืื ืืชืืื ืืื ืืฉืื Agents ืืฆืืืช
ืฉืืืื AI Agents ืืฆืืืช ืคืืชืื ืืืืื ืืื ืขื ืืฉืืคืืจ ืืืืืจืืช ืืคืืชืื ืื ืืชืืจืื ืืืฉืื ืืืืืืื ืืจืื ืืืื ืขืืืืช Review ื Refactor. ื ืืื ืืืืื ืื ื ืืงืื ืงืื ืฉืืชื AI Agent ืจืง ืื ืืกืืื ืืฉื ื ืื ืืฉืืืฉื ืืืืืืฉ. ืืืขืื ืืื ืฉืื ืชืืื ืื ืื ื ืืฆืืืืื ืืขืฆืืจ ืืช ืจืฆืฃ ืืคืืชืื ืืฉืืื Code Review. ืืืืืื ืืฉืืฉ ืขืื ืื ืฉืื ืฉืืขืืจืืื ืืคืืชืื ืืืจืืืื ืืขืชืื ืื ืฉืืืื ืืงืจืืช ืื ืฉืื ืฉื ืืืฆืจ ืื ืื ืฉืื ืืื ืืื ืืืชืื ืืืคืืื ืื ืืืคืชืืื ืืฆืืจืื ืืืืืข ืืงืื ืืืืฉื ืืื ืืืฆืข Code Review ืืืฉืคืจ. ืืืชืืืื ืืื ืื ืื ื ืื ืขืจืืืื. ืื ื ืืื ืืขืืืช ืืจืขืืื ืืช ืืืืื ืขืชืืืืื ืืืืกืกื AI ืฉืืืื ืืขืืจื:
1. ืืื - ืืื ืื ืืืื ืฉืื ืื ื ืืื ืืกืื ืฉืื ืื ืืืจื ืฉืืฉ ืงืืืืืื ืืืฉืื ืฉืืชืืกืกื ืขื ืงืื ืฉืืืจ ื ืืืฃ ืืจืืคื. ืืขืืื ืืฉืืื AI ืื ืื ื ื ืจืฆื ืืื ื ืืืื ืืจืกืืืช ืฉืืืคืฉืจ ืื ืืฉื ืืช ืืช ืืืืกืืืจืื ืื ืขืืจ ื AI ืืื ืืืืฆืจ ืืืืฉ ืืช ืื ืืงืื ืฉืืืืข ืืืจื.
2. ืืกืืกื ื ืชืื ืื - ืืคืชืืืช ืืจืื ื Sequence-ืื ืืืกืืกื ื ืชืื ืื ืืืื ืื ืืืฆื ืฉืงืฉื ืื ืืืื ืืฉื ืืช ืืืกืืืจืื ืืืจื ืฉืืื ืงืจืชื. ืืขืชืื ืื ืื ื ื ืฆืืจื ืืืฆืื ืืจื ืืืืฆืื "ืขื ืฃ" ืืืจืกื ืืฉื ื ืฉื ืืกืืก ืื ืชืื ืื ืืืืืืืฉ ืืช ืื ืชืื ืื ืืืืฉืื ืขื ืืฉืื ืื ืฉื ืืฆืข ืืืืกืืืจืื.
3. ืชืฉืชืืืช - ืฉืื ืื ืืืืืจื ืชืฉืชืืช ืขื ืืืื ืืื ืื ืกืืื ืื ืืจืคืืจื ืืืื ืืืจืื ืืืชื ื ืืืฆืข ืืืืจืฆืื ืืื ืืช ืฉื ืื ืชืื ืื. ืื ืกืืื ืืืืื ืืืฉืชืืฉ ืืืื ืื ืืื ื ืืืื ืืช ืื ืืืจื ืฉืืกืืก ืื ืชืื ืื ืืืืฉ ืืืืืืจ ืื ื ืฆืจืื ืืืืืช ืืกืืื ืืฉื ืืช ืืช ืืืืืื ืืกืืื ืืืจื ืืืข ืืืขืืืจ ืืช ืื ืชืื ืื ืฉืืืจ ื ืืฆืจื ืืืจืืืืงืืืจื ืืืืฉื.
ืืืฉืืขืืช ืฉื ืืืืฆืื ืืช ืืืคืชืืื ืืืืืค ืืืืืชืจ ืขื ืฆืืืืจ ืืืงืืืง ืฉื Code Reviews ืืื ืืืืืืช ืืืชืืจื ืืืชืงื ืืขืืืืช ืฉื ืกืืื ืื. ืืื ืืืืฆื ืืืงืจื ื 2005. ืืขื ื ืฉื AWS ืืืงื ื 2002. ืืจืคืืจื ื 2014. ืืื ืกืืื ืืื ืื ืฉืืืืื ืืืื ืืืฉืืจื ืืืชื ื ืืขื.
1 420
4. ืชืจืืื ืืืืืื - ืื ืืชืืืกืชื ืืคืจืืืคื ืืืื ืืฉืืื ืืื ืืชืจืื ืืช ืืืืืื ืืืืืืืช ืืืื ืงืืื ืืฆืจ ืื ืื ืื ืืืืื ื ืฉืคืื ื ื LLM ืืื ืืชืจืื ืื ืืืื ืื ืคืจื. ืฉืืคืืจ ืืืจืื ืืื ืืงืืฅ ืืืืื ืืื ืืฉืืื ืืชืจืืื.
ืื ื ืฉืืจ? ืืืื ืืก ืชืื ืื ืืขืื ืฉืคืืช ืืืจืืืช ืื ืคืืืฉ ืขืืื ืืื, ืืืืื ืฉืงืจืืืงื ืื ืฉืืืจ ืืช ืืฆืคืืื ืืืืืืื.
ืจืืฆืื ืืจืืืช ืืช ืืงืจืืืงื ืืคืขืืื? ืื ื ืฉืืจ ืจืืฉืื ืฉืืขืืืชื ืืืชื:
https://langlets.app/courses/860/lessons/kissy-face-and-red-hearts
1 420
๐ ื ืืชืื ืคืจืืืคื - ืืฆื ืงืจืืืงื
ืืคื ื ืืฆื ืฉื ื ืื ืฉื ืืฆืืข ืฉืืืกืืฃ ื langlets ืืฆื ืงืจืืืงื ืฉืืืืืฉ ืืช ืืืืื ืื ืืืืืช ืืฉืื ืื ืื ืฉืืจ. ืืืืชื ืืื ืื ืืืื ืชื ืฉืื ืืคืฉืจื - ืืืื AI ืฉืืืืข ืืืฆืื ืืื ืืื ืืืื? ืื ืืงืืฉื ืืฆืืืืื ืืืฆืืจ ืื ืืชืืื ืืจืืืืืฆืื ืฉื ืืฉืคืืื.
ืืฆื ืฉื ื ืขืืจื ื Gemini 3.5 Flash ืขืืื ืืืฉืืื ืืฆืืจื ืืจืฉืืื. ืืืจื ืฉืจืืืชื ืืช ืืชืืฆืืืช ืืืืชื ืืฉื ืืช ืืช ืืงืื, ืื ืืืชืจ ื ืืื ื ืชืชื ืืงืืื ืืฉื ืืช. ืื ื ืจืืฆื ืืืฆืื ืืื ืืช ืืคืจืืืคื ืืืืืจ ืขื ืืฉืืงืืืื ืืืชืืืชื ืืื ืืกืื ืื ืขืื ืืื ืขืื ืืื ืฆืจืื ืืืืกืืฃ.
โ ืืคื ื ืืื ืืคืจืืืคื
ืืชืืืชื ืขื ืืคืจืืืคื ืืื ืืงืื ืืืฆื ืชืื ืื (ืขื ืืื ืืงืืขืื ืืืื ืืื ืฉืื ื ืืฆืืฆื ืคื ืืื ืืืงื ืืช ืืคืจืืืคื):
Switch to per word timing maintaining backward compatibility
Step 1 - Create Song Pipeline
Refactor the extract lyrics prompt to the following version:
[...]
each "word" in the output should create a token translation
Then create_token_translations step doesn't have to do language alignment, it should just translate each "word". Still give the LLM the full phrase for context though.
Step 2 - Schema
Add timestamp to token_translation
Step 3 - UI
Show karaoke style word highlight marking current token when playing in the video players
Step 4 - Verification and format
Use the existing apt_word_timing.json output with song URL as the result of extract youtube lyrics
https://www.youtube.com/watch?v=ekr2nIex040
Run the pipeline steps AFTER extract youtube lyrics to create the rest of the data and save it to a JSON file. I'll then manually import that JSON file to check the result. Create a reusable script so we can repeat our testing
Step 5 - Backward Compatibility
The video players should support 2 cases:
token_translations with timestamps (new functionality) - use karaoke style word highlight
token_trnslations without timestamps (existing data) - continue to use phrase level highlight
Pass a boolean value from rails video activity params to indicate if it should use the new or old style
ืืฆื ืกืืื ืฉืื ืืืชื ืืื ืฉืืืืช ืืืืจื, ืืฆืจ ืชืืื ืืช ืืื ืืฆื ืืืืืืื ืืืืฉ ืืืชื ืืืกืจื ืืจืืฉืื ื ืคืชื ืืืฆื ืงืจืืืงื ืื ืฉืืืขื ืืคืฉืจ ืืกืื ืืฆืืื.
โ ืื ืืื ืืคืจืืืคื
ืืื ืื ืงืืืืช ืืืืงืืช ืฉื ืืคืจืืืคื:
1. ืืฆืืช ืืืฉืคืขื - ืืจืืจ ืขื ืืืื ืืืงืื ืืงืื ืืฉืื ืื ืืฉืคืืข. ืืืืงืื ืืขืืงืจืืื ืื ืืฉืื ืื ืืื ืื ืื ืชืืืื ืืกืจื ืืืฉืื ืื ืืื ืื ืื ืชืจืืื ืืืืืื.
2. ืฉืื ืืืื ืืกืืืื - ืฉืื ืืืื ืืืืื ืืืื ืฉืฉืืืจืื ืืช ืืืืืข ืืืคืืขืื ืืฆืืจื ืืคืืจืฉืช ืืขืืืจืื ืืืงื ืืช ืงืืื. ืืืงืจื ืฉืื ื ืืฉ ืชืืกืคืช ืฉื ืขืืืื ืืืช ืืืืืช token_translations.
3. ืืืฉืง ืืฉืชืืฉ - ืฉืืืืฉ ืืืืืื Karaoke Style ืืืืืจ ืืืืืง ืืื ืืืจืื ืฆืจืืืื ืืืืจืืืช, ืืื ืืืื ืก ืืคืจืืื ืืืื ืืื ืฉื ืืื ืื ืืืืืฉ. ืืื ืฉืื ืืืจ ืืืืื ืืงืจืืืงื ืืืคืืืงืฆืื ืื ืืืฉืืืื ืืืฆื ืงืจืืืงื ืืื ืืงืื ืืืจ ืืืื ืืื ืฆืืจื ืืืจืืื ืขื ืื.
4. ืืื ืืืืื ืืฆืืื - ืืืืืง ืืืืจืื Verification and format ืืืื ืฆืืจืืฃ ืงืืืฅ ืฉืืจืื ืืช ืืคืืจืื ืืืืืืง ืฉื ืื ืชืื ืื ืขืืืจ ืืงืืื ืืืืื ืฉืืื ืืฆืจ ืืฉืื ืฉืขืืื.
5. ืืชืืจ ืืช ื"ืื" ืืื ืืช ื"ืืื" - ืื ืฉืืื ืืืืชื ืืคืจืืืคื. ืืื ืืชืืจ ืื ืืืขืจืืช ืฆืจืืื ืืืืืช ืืืจื ืืฉืื ืื ืืื ืื ื ืื ืก ืืงืื ืขืฆืื ืฉืฆืจืื ืืืืืช ืฉื. ืืืช ืขืืืืช ืืืืจืื ืืืืกืืจืงืฆืื ืฉืื ืื ื ืฆืจืืืื ืืืืฅ.
โ ืื ืื ืืื ืืคืจืืืคื
ืื ืงืืืืช ืฉืงืืื ืคืกืคืก ืืืืืืฉ ืืื ืืืื ืกืคืฆืืคืืืช ื Codebase. ืกืืคืจ ืืืืื ื ืืืืืืจ ืืื ืืฉืื ืืฉืืืจ ืงืืฆื ืชืืขืื ืฉืืชืืจืื ืืช ืืงืื ืืืืืืื ื ืงืืืืช ืฉืื ื ืืืื ื ืจืืืช ืืจืืจืืช ืืืืืื:
1. ืืืจืืช ืฉืืืงืฉืชื ืจืง ืชืืกืคืช ืฉื ืขืืืื ืืืช, ืงืืื ืืืกืืฃ ืฉืชื ืขืืืืืช "ืืื ืืชืืื" ื"ืืื ืกืืื", ืืืชืืื ืืืงืืืืช ืืืจืื ืืงืื.
2. ืื ืื ืื ืืืืื ืืืืื ืื ืืืืืช ืืงืจืืืงื ืืืื ืืืืื ื. ืื ืืงืื ืฉืงืืื ืืฆืจ:
updateWordHighlight(currentTime) {
if (!this.tokenSpans) {
this.tokenSpans = Array.from(this.element.querySelectorAll('[data-token-start]'));
}
for (const span of this.tokenSpans) {
const start = Number(span.dataset.tokenStart);
const end = Number(span.dataset.tokenEnd);
span.classList.toggle('s-token-active', currentTime >= start && currentTime <= end);
}
}
3. ืงืืื ืืืจ ืืืฆืื ืืกืื ืื ืงืจืืืงื ืชืืื ืื ืืืืง ืืืืืืื ืืฉ ืชืืืืช ืืื. ืืื ืืืืช ืืื ืฉืื ืจืง ืืืืง ืงืื ืืืืืืื ืืฉ ืชืืืืช ืืื ืขืืืฃ ืืืืชืจ ืขื ืืฆื ืงืจืืืงื. ืืกืืื ืืื ืฉืื ืืชืืืกืชื ืืคืจืืืคื ืืืฆืืื ืืื ืืฉ ืืืืข ืจืง ืขื ืืืง ืืืืืืื.1 420
๐ ืืคื ืงืื ืืืืกืืจืงืฆืื ืื ื ืืื ื
ืืืืืจ ืื ืืฉื ืืืกืืจืงืฆืืืช ืืชืงืืคื ืฉืืคืชืืื ืขืื ืืชืื ืงืื ืกื ืื ืืฅ ืืชืืจืช ืืช ืืชืจืืืฉ ืื ืคืืฅ ืืื:
1. ืืคืชื A ืจืืื ืืช ืืืชื ืงืื ืืืคืืข ืืฉื ื ืืงืืืืช. ืืืฆืื ืืคืื ืงืฆืื ืืฉืืชืคืช ืืฉืื ืขื ืืืกืืื ืืงืื.
2. ืืืื ืขืืืจ ืื ืื ืกืช ืืจืืฉื ืืืฉื ืืืขืจืืช.
3. ืืคืชื B ืืืื ืฉืืงืื ืืืขื ืืชืืื ืืืจืืฉื ืืืืฉื ืื ืืื ืจืง ืืืกืืฃ ืคืจืืืจ ืืคืื ืงืฆืื ืืืฉืืชืคืช ืืขืื if ืงืื ืืืื ืืกืชืืจ.
4. ืืืื ืืืฉืื ืืขืืืจ, ืืคืชืืื ื ืืกืคืื ืืจืืืืื ืืช ืืงืื ืืืฉืืชืฃ, ืืื ืฉืคืขื ืืื ืืืกืืจืงืฆืื ืืคื ืืคื ืืขืจืืื ืื ืืจืืจื ืฉื ืชื ืืื ืืืจืืืื.
ืืืกืงื ื ืฉื ืกื ืื ืืืชื ืฉืืืืกืืจืงืฆืื ืืื ื ืืื ื ืืงืจื ืืืจืื ืืงืื ืืฉืืืคื ืืืืื ืฉืขืืืช ืืคืืชืื ืฉืื ืืืืืช ืืช ืื ืืชืืืืงื ืฉื ืงืืขื ืืงืื ืืืืืืจืื. ืืืืกืืจืงืฆืื ืืื ื ืืื ื ืืื ืขื ืืื ืจืฆืื ืืื ืืกื ืืืชื ื ืืืจืื ืฉืืฃ ืืื ืืืจ ืื ืืืืข ืืื ืืฆืืช ืืื ื.
ืืื ืืชืจืืืฉ ืืืงืืจื ืืื ื ืืคืชื A ื ืืกื ืืืชืืื ื ืืื:
1. ืืืื ืขืืืจ ืื ืื ืกืช ืืจืืฉื ืืืฉื ืืืขืจืืช.
2. ืืคืชื B ืืชืงื ืืช ืืงืื ืืืงืื ืืื ืืฉืืื ืฉืืงืื ืืฉืืืคื ืืืืคืืข ืืืงืื ื ืืกืฃ ืืืขืจืืช.
3. ืืฉืชืืฉืื ืืืขืกืื ืื ืขืืฉืื ืืคืชืืจ ืืื ืืชื ืื ื ืืื ืืฉื ื ืขืืืื ืฉืืืจ.
ืขืฉืจ ืฉื ืื ืืืจื ืืืืืจ ืฉื ืกื ืื ืืฅ ืืื ืื ื ืฆืจืืืื ืืืืกืืฃ ืฉืืงืื ืืืฉ ืืืขืจืืช. ืืืื ืืืชืจืืืฉืื ืืืชืจ ืืืจืื ืืืชื ื ืืฉ AI ืืืชื ืืช ืืงืื. ืื ื ืื ืฉืื ืื ื ืืืืขืื:
1. ืกืืื ื ืงืืืื ืื ืืืืืื ืืืฆืืจ ืืืกืืจืงืฆืืืช ืืืฉืืช ืื ืืฉืืืจ ืืืกืืจืงืฆืืืช ืงืืืืืช. ื 2026 ืกืืื ืงืืืื ืืืื ืืืชื ืื ืืืืืง ืืื ืืคืชื B ืืืืืื ืืจืืฉืื ื ืืืขืืืก ืขืื ืืชื ืืืืช ืขื ืืืขืจืืช ืืงืืืืช. ืืืื ืืขืชืื ืื ืืฉืชื ื.
2. ืกืืื ื ืงืืืื ืฆืจืืืื ืขืืจื ืืฉืืื ืืืฆืื ืืช ืื ืืืงืืืืช ืฉืืฉืคืืขืื ืขื ืคืขืืื ืืกืืืืช. ืื ืืฉ ืื ืืืขืจืืช ืฉืชื ืงืืืคืื ื ืืืช ืฉื ื ืื ืืืืื ืืืืงืฉืชื ืฉืื ืื ืื ืื ืกืืื ื ืงืืืื ืืกืืืจืืช ืืืืื ืืชืงื ื ืจืง ืืช ืืื ืืื ืื ืื.
ืืืช ืื ืื ืฆืจืื ืืืืคืื ืคื 10 ืื ืกืืื ื ืงืืืื ืืืชืืื ืืจืื ืืืชืจ ืงืื ืืจืื ืืืชืจ ืืืจ ืืื ื ืืื.
ืื ืืื ืืคื ืงืื ืขืืืื ืืืชืจ ืืื? ืืื ืืฉืืื ืืขื ืืช ืฆืจืื ืงืืื ืืืืื ืืื ืืืื ืื ืื ื ืืชืืืืืื ืขื ืฉื ื ืืืฆืืื ืืขืืื ืฉื ืกืืื ื ืงืืืื:
1. ืืช ืืชืจืืืฉ ืืจืืฉืื ืื ืื ื ื ืืื ืจืง ืื ื ืงืจื ืืช ืืงืื ืฉ AI ืืืืฆืจ ืืจืง ืื ื ืืื ืจืืืฉืื ืืจืืืช ืืืกืืจืงืฆืื ืื ื ืืื ื ืฉืืืืืช ืืืกืชืืืช. ืชืงืื ืคืื ืงืฆืืื ืืืืช ืชืงืจื ืื ืจืื ืจืง ืืฉืืืจ ืืืื ืืืืืจ ืืื ืืืงืื ืืืื ืืกืืื ืืื ืืฉืืื ืืชืงื. ืืฉืืืจ ื ืจืื ืืช ืืืขืื ื ืฆืืจื ืืืจืื ืืืืฉ ืืช ืืงืื ืืืื AI ืื ืืืฉ ืืืื ืืขืืืจ ืื ื ืืื ืืืืื ืงืฉื ืืืื ื AI ืืจืืืช ืืืกืืจืงืฆืื ืื ื ืืื ื ืืืืืืื ืืจื ืืืชืจ ืืืื ืืืจืื ืืช ืืงืื.
2. ืืชืจืืืฉ ืืฉื ื ืืงืื ืืืคืื ืืขืืื ืืช ื AI ืืืฆืืจ ืขืื ืืคืืืืืืช, ืื ืื ืืืขืจืืช ืื ืืื. ืื ืื ื ื ืืื ืฉืืฉ ืืคืืืืช ืจืง ืืฉื ืงืจื ืืช ืืงืื. ืืฆื ืฉื ื ืคื ืืฉ ืกืืืื ืืืชืจ ืืื ืฉืืฉืื ืคืื ืงืฆืืื ืืืืช ืืืฉืืจ ืื AI ืชืืงื ืื ืขืืื ืืฉืื ืจืง ืืืงืื ืืื ืืื ืืื ืืืืคืขืื ืฉื ืืงืื ืืืคืื ืืื ืืคืชืืื ืื ืืฉืืื ืืืื ืกื ืืชืืื ื. ืืฉืืืจ ืืฉ ืืคื ืงืื ื AI ืื ืงื ืืืฆืืจ ืืืกืืจืงืฆืื ืฉืืชืืืื ืืงืื ืืืคืื ืื ืืืื (ืื ืืืื ืืฉืื ืื ืืืกืืจืงืฆืื ืฉืขืืืื ืื ืขืืื ืืื) ืืืื ืืื ื ืงืืื ืืืื ืงื ืืขืืืจ ืืงืื ืืฉืืืคื ืืงืื ืืฉืืชืฃ. ืื ืฉืืจืฆื ืืืืฉืื ืืขืืื ืขื ืืงืื ืืืฉืืืคื ืืืืจื ืืื ืืืื ืืืืกืืฃ ืงืืืฅ ืชืืขืื ืฉืืกืืืจ ืืืคื ืื ืืืงืืืืช ืฉืืงืื ืืืคืื ืืืคืืข.
ืืืืืื ื langlets ืืฉ ืื ืฉื ื ื ืื ื ืืืืื ืืืกืคืจ layouts ืืื ื ืื. ืืืง ืืืงืื ืืฉืืชืฃ ืืืืง ืืฉืืืคื ืืื ืื ืื ืื ืืืืืช ืืื ืคืขื ืืฉืืืงืฉืชื ืืขืืื ืคืืฆ'ืจ ืื ืื ืืืืืื ื AI ืืืืฉ ืืช ืืฉืื ืื ืจืง ืืืื ืืื. ืืคืชืจืื ืืื ืืืืกืืฃ ืงืืืฅ ืืงืกื ืฉืืกืืืจ ืขื ืืจืืืืงืืืจืช ืืืืืื ืืืขืจืืช, ืืคืฉืจ ืืจืืืช ืืืชื ืืื:
https://github.com/ynonp/langlets-rails/blob/main/docs/video-player.md
ืืืจื ืืชืืกืคืช ื AI ืืืจ ืืฆืืื ืืืชืืืื ืขื ืืงืื ืืืฉืืืคื ืืืชืงื ืืื ืื ืื ืื ืื ืืื ืฉืืฆืืื ืืช ืื ืืฆืืจื ืืคืืจืฉืช ืืคืจืืืคื.
ืืกืงื ืืช? ืืืขืชื ืืืงื ืฉื ืกื ืื ืืฅ ืขืืืื ืจืืืื ืื ืืืคืืื ืืคื ืืืชืจ ืจืืืื ืื ืืื ืฉืืืื AI ืืชืืืื ืืคืืชืื. ืื ืืคื ืงืื ืืขืืื ืืืชืจ ืืคื ืงืื. ืื ื AI ืืืชื ืงืื ืื ืื ืืืจ ืฉืืฃ ืืื ืืคืืื ืื ืืจืืืฉ ืฉืฆืจืื ืืืชืจ ืงืื ืืฉืืื ืืคืชืืจ ืืขืื. ืืื - ืื ืื ื ืื ื ืจืืืฉ ืืฉืืคืื ืงืฆืืื ืืืืืช ืฉื ืืืขืจืืช ื ืฉืืจืช ืืคืืฆ'ืจ ืื ืคืืชืจ ืืช ืื ืืืขืื, ืืขืืจืช ืงืืฆื ืชืืขืื ืืคืฉืจ ืืืืฉืืจ ืขื ืงืื ืืฉืืืคื ืืืงืื ืชืืฆืืืช ืืืืืช ืืืฉื ืจืฆื ืืืฆืืจ ืืืกืืจืงืฆืื ืืืขืืจ ืืงืื ืืฉืืืคื ืืืืกืืจืงืฆืื ืืืื ืืืื ืงื ืืืืืช ืกืืื ืืงืืืื.
1 420
print(result.output)
ืืฉ ืืื ืชืืืื ืืืื ื Server Side Tools ืืื ืืืคืืฉ ืืจืฉืช ืฉื OpenAI ืืฉืืืื ืขื ืืืืช ืืืฉืืื:
from pydantic_ai import Agent
from pydantic_ai.capabilities import Thinking, WebSearch
agent = Agent(
'anthropic:claude-opus-4-6',
instructions='You are a research assistant. Be thorough and cite sources.',
capabilities=[
Thinking(effort='high'),
WebSearch(local='duckduckgo'),
],
)
ืกื ืืื ืืกืคืจืื ืืืื ืืืคืืช - ืืืจืื ืฉืื ื ืื ืกื ืคื ืืจืฉืืื ืืื ืฉืืืื ืืืืืจ ืื ืืืืืืจ ืืืขืจืืช ืืืืืื ืฉืืื logfire (ืืืงืื ืืืช ืฉื OpenAI), ืชืืืื ื MCP, ืชืืืื ืืืื ืืช ืืืืืงืืช ืขื TestModel ืืืืฉืง Web Interface ืืืืกืก ืฆ'ื ืืื ืื ืกืืช ืืช ืืกืืื ืฉืืื.
ืื ืืืืชื ืืช OpenAI Agents SDK ืฉืืื ืืืื ืื ืกืืช ืืช Pydantic AI.1 420
๐ ืฉืืืฉื ืืืจืื ืฉืืืืชื ืืืืืื ื Pydantic AI
ืกืคืจืืืช ืคืืชืื ืืกืืื ืื Pydantic AI ืืื ืืฉื ืจืื ืืจืขื ื ืฉื ืคืฉืืืช. ืืื ืืืืืจื ืืช OpenAI Agents SDK ืืืืืื ืขืืื ืจืง ืืื ืืืืืืจ ื OpenAI ืืขื ืืจืื ืืืชืจ ืฉืืืื ืืคืจืืืจืื ืฉื ืืืืืืื. ืืขืืืื ืืืชื ืืืืื ืืืืื ืืืจืืืฉ ืืื ืืืฉืื ืฉืืืื ืื ืฉ OpenAI ื ืืกื ืืขืฉืืช ืขื Agents SDK ืืคืฉืื ืืืฉืื ืขื ืื.
ืืคืฉืจ ืืงืจืื ืืช ืืชืืขืื ืืืื ืืืืืืืืช ืฉืืื ืืื:
https://pydantic.dev/docs/ai/overview/
ืืื ื ืฉืืืฉื ืืืจืื ืฉืืืืชื ืืืืืื ืืกืคืจืื.
โ ืชืืขืื ืืื ืืืืืืืชื ืืกืืื
ื 2026 ืืืจืืฉื ืืจืืฉืื ื ืฉืื ืืกืคืจืืืช ืงืื ืืื ืฉืืคืฉืจ ืืืื ืืขืืื ืืืชื ืืงืืืช ืืชืื ืกืืื ืงืืืื. ืืืขืื ืฉื OpenAI Agents SDK ืืื ืฉืืฃ ืืื ืื ืืฉืชืืฉ ืืงืืืงืก ืืื ืื ืจืืฆืื ืืงืื ืืช ืงืืื ืงืื. ืืชืฉืืื ืฉืืื ืืื ืฉืืืงืฉื Agent Skill ืืืชื:
Thanks for writing in. Our current recommendation is to use codex for loading and utilizing agent skills because the codex layer already has a robust mechanism for it. We prefer to avoid reinventing the wheel for now.ืคืืื ืืืง ืื ืฆืจืืืื ืืช ืืคืืืืฆืื ืืืื ืืขืืื ืืชืืขืื ืืจืืฉื ืื ืฉืืืื ืืืจืื ืืื ืืืชืงืื ืืช ืืกืงืื ืืื ืืกืืื ืื. ืืืจื ืืืชืงื ื ืืฉืืคืขืืชื ืงืืื ืงืื ืืืืงืฉืชื ืกืืื ืจืืฉืื ืืืืืืฉ ืืื ืืืืื. โ ืื ืื ืื Fallback ืืืืืื ืื ืชืืื ืืขื ื ืืช ืืชืฉืืื ืื ืื ืื ื ืืฆืคืื - ืื ืืืื ืืืืืช ืืืืื ืขืฆืื ืฉืืืขื, ืืฉืืื ืืืคืขืืช ืืื, ืชืืื ืื ืืืื ืื ืืคืืื ืชืฉืืื ืฉืื ืงืฉืืจื ืืื ืฉืฉืืื ื. ืื ืื ืื Fallback Model ืฉื ืคืืื ืืืง ืืกืคืง ืืจื ืงืื ืืืืืืงืช ืืืืืช ืืืืคื ืืืงืจืื ืืืื. ืืชืืขืื ืืื: https://pydantic.dev/docs/ai/models/overview/#fallback-model ืืืืืื ืื ื ืจืื ืื:
from pydantic_ai.exceptions import ModelAPIError
from pydantic_ai.models.fallback import FallbackModel
from fallback_on_native_tool import anthropic_model, google_model, web_fetch_failed
fallback_model = FallbackModel(
google_model,
anthropic_model,
fallback_on=[
ModelAPIError, # Exception type
lambda exc: 'rate limit' in str(exc).lower(), # Exception handler (untyped lambda)
web_fetch_failed, # Response handler (auto-detected via type hint)
],
)
ืืืืืจืื ืืช ืืืขืืจ ืืืชื ืืื ืืืงืื ืืื ืืขืืืืื ืขื ืืืืื ืจืืื ืืื ืฉืืจ ืืชืืื ืืช. ืืืืืื ืฉืืืืงืชื ืื ืืืืื ืฉื ืืืื ืื ืืฆืืื ืืขื ืืช ืขื ืืืงืฉื ืืฉ ืืขืืืจ ืืืืื ืฉื ืื ืืจืืคืืง ืืืฉ 3 ืื ืื ืื ื ืืฉืืื, ืื ืฉืืืืื ืืืจืง ืฉืืืื ืืกืื ModelAPIError, ืื ืฉืืืืื ืืืจืง ืฉืืืื ืขื ืืืงืกื rate limit ืื ืฉืืชืฉืืื ืฉื ืืืืื ืืืืืช ืืฉืืื ืืืจืฆืช ืืื.
โ ืืืืฉืืช ืืืืืืื ืืฉืืืื ืืื ืืคืจืืืจืื
ืื ืคืืฆ'ืจ ืฉืืืื ืืื ืืกืจ ืื ื OpenAI Agents SDK ืฉื ืืืชื ืืขืืคื ืืจืืจื ืืืืืืื ืฉื OpenAI. ืคืืื ืืืง ืื ืจืง ืฉืืืคืฉืจืื ืื ืืืืืจ ืื ืกืคืง ืืื ืฉืืคืฉืจ ืื ืืฉืืื ืืคืจืืืจืื ืืกืคืฆืืคืืื ืฉื ืืืืื. ืืืืืื ืขื OpenAI ืืคืฉืจ ืืืชืืืจ ื Responses API ืฉืืื ืืื ืื ื Chat API, ืืื ืืคืจืืืืืืจืื ืืกืื ืื ืืืืืื:
from pydantic_ai import Agent
from pydantic_ai.models.openai import OpenAIChatModel
from pydantic_ai.providers.alibaba import AlibabaProvider
model = OpenAIChatModel(
'qwen-max',
provider=AlibabaProvider(
api_key='your-api-key',
base_url='https://dashscope.aliyuncs.com/compatible-mode/v1', # China region
),
)
agent = Agent(model)
...
ืืื ืืจืืคืืง ืืฉ ืืคืฉืจืืช ืืืฉืชืืฉ ืืื ืื ืื ื Cache System Instructions ืฉืืื ืืื ืืืกืื ืืืงื ืื:
from datetime import date
from pydantic_ai import Agent, RunContext
from pydantic_ai.models.anthropic import AnthropicModelSettings
agent = Agent(
'anthropic:claude-sonnet-4-6',
deps_type=str,
instructions='You are a helpful customer service agent. Follow company policy.',
model_settings=AnthropicModelSettings(
anthropic_cache_instructions=True,
),
)
@agent.instructions
def dynamic_context(ctx: RunContext[str]) -> str:
return f"Customer name: {ctx.deps}. Today's date: {date.today()}."
result = agent.run_sync('What is your return policy?', deps='Alice')
print(result.output)
ืืืคืืื ืืฉ ืืคืฉืจืืช ืืืืืืจ Cache Breakpoints ืืื ืืช.
ืืืืื ืืคืฉืจ ืืืขืืืจ ืืืืื ืืืืืืื ืฉืื ืืคื ืืคืืจืื ืฉื ื'ืื ื:
from pydantic_ai import Agent, VideoUrl
from pydantic_ai.models.google import GoogleModel
agent = Agent(GoogleModel('gemini-3-flash-preview'))
result = agent.run_sync(
[
'What is this video about?',
VideoUrl(url='https://www.youtube.com/watch?v=dQw4w9WgXcQ'),
]
)1 420
๐ ืืชื ื ืืื ืืืคืกืืง ืืงืจืื ืืช ืืงืื?
ืืืืืื ืฉื Spec Driven Development ืืื ืคืฉืืื - ืืืงืื ืืืชืื ืืืงืจืื ืงืื ื ืขืืืจ ืืืชืื ืืืงืจืื ืืืคืืื ืื. ืืืืืจ ืืจืื ืื ืืฉื ืจืืืชื ืืช ืืืืืฆื ืืืื:
Donโt kill the code reviews; just move the human checkpoint upstream to reviewing intent, specs, plans, constraints, and acceptance criteria. Code is actually the least important part of the reviews.
ืืื ืกืคืง ืฉืืชืขืฉืืื ืืื ืืืคืชืืื ืขืฆืื ืจืืฆืื ืืืืืข ืืฉื. ืืจืื ืืืชืจ ืืขื ืืื ืืชืื ื ืืจืืืืงืืืจืช ืืขืจืืช ืืืฉืืง ืขื ืืืืืฆืื ืืืฉืจ ืืงืืื ืืืืืืช ืืืืืืืจ ืืฉืืืช ืืืืืงืื ืฉื ืคืื ืงืฆืืืช. ืืขืืืื ืื ื ืืืฉื ืฉืืื ืืช ืื ืื ื ืขืื ืื ืฉื. ืืื ืืกืืืืช ืืืืื ืื ื ืขืืืื ืงืืจื ืืช ืืงืื:
1. ืกืืื ืงืืืื ืื ืชืืื ืืืืฆืจ ืืช ืืงืื ืืืืคืืื - ืืืช ืืืขืชื ืืืขืื ืืื ืืฉืืขืืชืืช ืขื SDD. ืฉืื ืื ืงืื ืืงืื ืืืื ืืืจืื ืืืขืจืืช ืืืชื ืื ืืืจืช ืืื ืฉืืชืืืื ืชื ืืืืคืืื, ืืืื ืืงืจืื ืืช ืืงืื ืืื ืื ืืื ืืืขืช ืขื ืืืขืื. (ืื ืงื ืืืืืง 100% ืืืคืื ืงืฆืืื ืืืืืช ืืืขืจืืช ืืขื ืืื ืช).
2. ืืืคืืื ืื ืื ืชืืื ืืืืืงืื - ืืืื ืขื ืืฉื ืื ื ืืื ืืืชืื ืืคืืื ืื ืืืชืจ ืืืืืงืื. ืืื ืชืืื ืื ื ืจืืื ืืจืื ืคืขืืื ืฉืื ื ืืืชื ืืืคืืื ืฉื ืจืื ืื ืืืื ืืืืืง ืืื ืืฉืืื ืืืคื ืืงืื ืื ื ืืืื ืฉืคืกืคืกืชื ืืงืจืื ืืฉืืืื. ืื ืื ืืฉืื ืฉืืืืชื ืจืืื ืืื ืืงืจืื ืืช ืืงืื ืฉื ืืฆืจ. ืืงืื ืืขืฆื ืืืงื ืืืืืง ืืช ืืืคืืื.
ืืืืื ืงืื ื ื langlets - ืืืงืฉืชื ืืืกืืื ืคืืฆ'ืจ ืฉืืฉืืืืฆืื ืขื ืืืื ืืืงืกื ืืงืคืืฅ ืคืืคืืค ืขื ืืชืจืืื ืฉืื. ืืกืืื ืืืกืืฃ onclick ืขื ืืืืื ืืื ืืืื ืฉืืืืืจ ื JavaScript ืจืืื (ืื ืจืืืงื) ืืขืืื ืฉืืืื ืืจืื ืืงืกื ื ืืฆืจื ืืืื Event Handlers. ืืื ืืืื ืืื ืืช ื onclick ืฉืื.
ืืืืื ืฉืืืืืชื ืืืชืื ืืืืคืืื ืืืืฆืจ ืจืง Event Listener ืืื ืขื ืืงืื ืืืื ืจ. ืื ืืฉืืชื ืขื ืื ืืฉืืชืืชื ืืช ืืืืคืืื. ืืืื ืื ืืืืืชื ืืฉืื ืื ืืืขืื ืืฉืืกืชืืืชื ืขื ืืืคืืืงืฆืื ืขืืืืช ืืื ืืืฃ ืืืืืงื ืฉืื ืื ืืื ืืกืคืืง ืืงืกื ืืฉืืื ืืืจืื ืืขืืืก. ืืขืืืก ื ืืฆืจ ืจืง ืืืฃ ืืจืื ืืืืืื ืฉื ืคืชื ืืชืื ืืคืืคื ืืืืืข ืืชืื ืืคืืืงืฆืื. ืืงืจืืืช ืืงืื ืจืืืื ืืื ืืช ืืืขืืช ืืืคืฉืจ ืืืืืื ืื ืืขืฉืืช ืืืชื. ืืื ืงืจืืื ืฉื ืืงืื ืฆืจืื ืืืชืืืื ืขื ืืฉืชืืฉืื ืฉืืกืืืืืฆืื ืืกืืืืช ืืืขืจืืช ืื ืขืืืืช ืืื ืืื ืืืืื ืืื.
ืืืื ืืืืืช ืฉืืขืื ืืื ืฉื ืื ืืืืืืื ืืืื ืื ืื ืืืืื ืฉืื ื ืฆืืจื ืืงืจืื ืืช ืืงืื. ืืจืืข ืื ื ืื ืจืืื ืืื ืื ืืงืจื. ืงืจืืืช ืืงืื ืืื ืขืืืื ืืืจื ืืืืื ืืืืชืจ ืฉืืฉ ืื ืืืืื ืืช ืืืขืจืืช.
ืฉืืื ืฉืืืืจืช ืืืงืฉืจ ืืื ืืื ืขื ืืืืื ืืื ืงืจืืืช ืงืื ืฉื AI ืืงืจืืืช ืงืื ืฉื ืงืืืคืืืืจ. ืืื ืืฉืื ืืงืจืื ืืช ืืงืื ืฉ AI ืืืืฆืจ ืืขืื ืฉืืื ืฆืืจื ืืงืจืื ืืช ืงืื ืืืืื ื ืฉืืงืืืคืืืืจ ืืืืฆืจ? ืืชืฉืืื ืขืื ื ืื ื ืืืืืง ืขื ืืฉืืื ืืืืชืจืช. ืืชื ื ืืื ืืืคืกืืง ืืงืจืื ืงืื? ืืฉืืืจ ืื ื ืฆืืจื. ืืฉื ืืื ืืงืื ืืื ื ืืืื ืฉื ืืืขืจืืช ืจืง ืืงืจืืืช ืืืืคืืื ืื ืืืชืืขืื ืฉืืืชื ืืกืืื. ืืื ืชืืื ืื ืื ื ืื ืฉื.1 420
๐ ืืงืคืืฆื ืืืื
ืืื 2015 ื 2018 ืืืืืชื ืงืืจืกืื ืืคืืชืื Web ื Mobile Web. ืืืจืืช ืฉืื ืืืืจ ืืฆืื ืืฉืืง ืืืจ ื 2010 ืืจืืืงื ื 2013, ืจืง ืืืืืจ 2015 ืืืื ืืืืืืืช ืืืื ืืืฉืืื ืืฉืื ื ืืช ืฉืืง ืืขืืืื. ืืืืชื ืฉื ืื ืคืืฉืชื ืืืื ืืคืชืื PHP ื jQuery ืฉืืืขื ืืจืื ืืืชืจ ืืื ื ืขื ืืคืืคื ืื ืืืืืืื ืขื ืืคืืคื ืื ืืฉื ืื ืืืื ืืืช ืืชืงืฉื ืืืฆืื ืขืืืื.
ืืืืชื ืืืื ืืืจืืช ืืฉืงืืขื ืืืืฆืื ืืืืจืื ืืืืืก ืืคืชืื Front End. ืืืื ืฉืืื ืืช ืืืื ืื ืืืืจ ืืืืื ืืืืืืฅ ืขื ืืคืชืืื, ืืคืืื ืืืืจื ืงืืจืกืื ืืจืืื ืืฆืื ืขืืืื ืืืกืืช ืืงืืืช. ืืืื ืืืฅ ืืื ืฉื ื PHP ืื jQuery. ืจืง ืืจืฉืื ืืช ืืืืืื ืืืื ืืงืืจืืช ืืืืื ืืื ืืืื ืืขืืืช ืื ืืคืกืืื ืืจืืืื ืืช.
ืืืฉืื ืืื ืืืื ืืืฉืื ืฉืืืืืจ ืืืืื ืืชื ืืืืช ืฉื ืืืชื ืื ืฉื PHP ืืืื ืืืืืื ืืืืฉื ืืื ืืืืช ืืืชืจ ืืืจืืืช. ืืืขืื ืฉื ืืืชื ืืคืชืืื ืืืฆืื ืขืืืื ืืืชื ืฉืื ืืฉืื ืืืื ืืช ืืืืื ืืืืฉืื ืื ืืืฉืืื ืืืฉืชืืฉ ืืื ืืืืชื ืืืฉื ืฉื ืืืืื ืืืฉื ืื. ืื ืื ืืชืืืืจ ืืฉืื ื ืฉืืื ืงืฉื ืืื ืืืชืจืืืืช ืืฉืืืช ืืขืืืื - ืืืืคืืฉ ืืืืืืช ืืืื ืืช ื npm, ืืืืืืฉ ืงืื ืื ืืฉืืื ืื ื ืจืื ืืืชื ืืืจ ืื ืืคืืื ืขืืื ืขื ืื ืืืคืืคื ืื, ืืืชืืงืืืช ืืืืฆืืขืื ืื ืขืืฉืื ืื ืืคืฉืจื.
ืืขืืฉืื ืื ืื ื ืขื ืกืฃ ืงืคืืฆื ื ืืกืคืช ืืื ืจืขืืืช ืืืื ืืื ืืืืื ืืืชื ืฉืื ืืืื, ืคืืืืจืื, ืงืืืืืื ืืชืืืืจืืืช ืฉืืฉืชื ืืช ืืืฉืืช ืืืงืจืื.
ืืืจืืช ืฉืื ื ืจืื ืืืืื ืื ืื ื ืจืง ืจืืฆืื ืืจืืฅ ืืืจ ืืืืืืืจ ืขืื ืคืืฆ'ืจืื, ืืกืืคืืจ ืฉื ื AI ืืื ืืืชืจ ืืืจืื:
1. ืืืคืชืืื ืฉื ืืขืชืื ืืฉืืื ืืืฉ ืขื ืคืืชืื ืชืฉืชืืืช ืืืงืืช ืืืกืืืืช ืืืงืื ืฉืืืืื ืืืคืฉืจ ื AI ืืื ืืช ืคืืฆ'ืจืื ืืืฉื ืืช ืืืจืื ืืืจ.
2. ืืืคืชืืื ืฉื ืืขืชืื ืืืื ืืจืื ืืืชืจ ืืืืื ืืืงืจืื ืงืื ืืืืื ืืจืื ืืืชืจ ืจืืืฉืื ืืฉืืงืื ืื ืชืืื ืืชืื ืืืช ืื Best Practices ืฉืื ืืืชืืื.
3. ืืืคืชืืื ืฉื ืืขืชืื ืื ืืื ืืขืจืืืช ืฉืืื ืืช ืืขืจืืืช ืืืฆืืจืื ืื ืืจ ืืช ืืฉืื ืืืื ืืงืื ืืืืจืืขืื ืืืืืื ืืืื ืืืช.
4. ืืืคืชืืื ืฉื ืืขืชืื ืืฆืืจืื ืืกื ืืจื ืืืืฆืข ืืืคืืืืืืฆืื ืืฆืืืชืื ืฉื ืกืืื ืื ืชืื ืฉืืคืืจ ืืืืืช ืืงืื, ืืืืจืืช ืืคืืชืื ืืฆืืฆืื ืขืืืืืช. ืื ืืืช ืื ืืกื.
ืฉืื ื ืืขื - ืื ืืืื ืืจืืฉื ืฉืืืื ืืื ืืืืชื ืชืงืืคื ืืืกืืจืืืืืคืื ืขืงื ืคืจืฉืืืช ืืื leftpad, ืื ืฉื ืืคืจืื ืืื ื ืื "ืืชืงืื ื ืื ืืืืื ื npm ืืื ืืืฉืื", ืืืขื ืืืชืื ืงืื ืื ืืขืฆืื ืืืืขืฉื ืืฉืงืืขื ืืืื ืืืืฅ ืืืชืืืช ืงืื, ืคืฉืื ืงืื ืืืจ ืืื ืฉืืชืื ืื ืฉื ื PHP ืฉืืื ืืคื ืืื. ืื ืืืื ืืขืืืื ืขื AI ืืฉืืื ืืืชืงืื ืขืืื ื ืืืืื ืืื ืืืฉืชืืฉ ืืืืืื ืืช ืืืืืข ืฉืื ื ืืืฉืื ืืื ื ืืืื ืืืืื ืืืืฉืื.
ืืกืืฃ ืืงืคืืฆื ืืขืจืืืช ืชืืื ื ืืฆืืืชื ืคืืชืื ืืจืื ืืืจืช ืืื ืฉืื ื ืจืืื ืืืื. ืืืขืืจ ื FrontEnd ืืืฆืื ืืืชื ื ืืืืื ืืืื, ืคืชื ืืช ืืืืช ืืคืืชืื Micro Services ืืืืืื ืจืื ืืชืฉืชืืืช ืขื ื. ืืฃ ืืื ืื ืืืืข ืืื ืืจืื ืืคืืชืื ืืขืชืื ืืืืื ืืืืื ืืืืช ื ืฆืืจื, ืื ืฉืืืื ืืื ืฉืืืจื ืืื ืื ืืืืื ืืื ืืืฉืชืืฉ ืืืืื ืืืืฉืื ืืื ืืขืฉืืช ืืช ืืืชื ืืืจ ืฉืขืฉืืช ืขื ืขืืฉืื. ืืืจื ืงืืืื ืืื ืืืฉืชืืฉ ืืืืื ืืืืฉืื ืืืืืฆืขืืชื ืืืืืช ืจืขืืื ืืช ืืืฉืื ืฉืื ืืคืฉืจ ืืื ืืืืฉ ืงืืื.
Available now! Telegram Research 2025 โ the year's key insights 
