Onyesha Kurasa 10,000 kwa Mwezi kwa Picha Halisi — katika Maombi 500 ya API

Tafuta mara moja kwa kila kundi la mada badala ya mara moja kwa kila picha, na maombi 40,000 ya API yanakuwa 500. Mtindo wa kuunda pool na kugawa, mfanyakazi anayestahimili mipaka ya kiwango, na sehemu ya uwazi kuhusu kile ambacho picha haziwezi kurekebisha.

Ofisi yenye msongamano ambapo wenzake wanafanya kazi bega kwa bega kwenye kompyuta katika meza ndefu za pamoja.
Picha kupitia Unsplash

Kuna toleo la tatizo la kuonyesha maudhui ambalo hakuna kiasi cha ladha nzuri kinachoweza kulitatua: hutafuti picha moja, unajaza nafasi 40,000 za picha kwa mwezi katika makundi 800 ya mada, lugha 9 na tovuti 14 za wateja, na kila moja inahitaji leseni, sifa, ukubwa na kuwa tofauti na ile iliyo karibu nayo. Katika kiwango hicho swali linaacha kuwa "picha ipi?" na linakuwa "muundo ni upi?"

Makala haya ni jibu la API: mtindo wa ombi unaopunguza idadi ya miito kwa mara mia, mfanyakazi anayestahimili vikomo vya kiwango, uzuiaji wa marudio unaozuia tovuti ya kurasa 10,000 kutoonekana kama ukuta wa picha ile ile ya hisa — na sehemu ya kweli kuhusu kile picha haziwezi kukufanyia.

Kizuizi halisi katika makala 10,000

Timu zinazochapisha kwa wingi — mali za SEO za kiprogramu, kurasa za jamii za soko, wakusanyaji, mitandao ya washirika, mashirika yanayoendesha maudhui kwa kundi la wateja, mifumo ya utafsiri inayogeuza makala moja kuwa 20 — zote zinagonga kuta zile zile tatu, kwa mfuatano ule ule:

  1. Idadi ya miito. Utafutaji mmoja kwa kila nafasi ya picha unamaanisha miito 40,000 ya API kwa makala 10,000 zenye picha nne kila moja. Kila mtoa huduma anakutoza bei, anakuzuia na kukukagua kulingana na idadi hiyo.
  2. Marudio. Karibu ukurasa wa thelathini, picha ile ile huanza kujitokeza tena. Kufikia ukurasa wa elfu tatu, tovuti yako ina saini ya kuona: imezalishwa kwa wingi.
  3. Uratibu. Makala mia moja katika kundi moja yanapaswa kuonekana kama mfululizo, siyo bao mia moja tofauti ya Pinterest — na lugha inayofuata ya makala yale yale inapaswa kutumia tena picha ile ile, siyo kutafuta tena kwa lugha nyingine.

Angalia kile kisichoko katika orodha hiyo: kutafuta picha nzuri. Injini ya kisemantiki hurejesha ukurasa wa mgombea zinazoweza kutumika ndani ya milisekunde 130 hivi. Utafutaji ulishatatuliwa; ugavi haukutatuliwa. Kila kitu kilicho hapa chini kinahusu ugavi.

Kwa nini picha halisi, hasa katika kiwango hiki

Hoja ya upigaji picha dhidi ya uzalishaji inakuwa imara zaidi kadri wingi unavyoongezeka, kwa sababu ambazo mara nyingi ni za uendeshaji zaidi kuliko za urembo.

Katika picha 40,000/mwezi Kuzizalisha Kuzitafuta
Muda kwa kila picha Sekunde hadi dakika, pamoja na majaribio yaliyokataliwa Ombi moja (~130 ms) linahudumia kundi zima
Kinachosukuma gharama Kwa kila picha, milele Kwa kila ombi — na ombi moja linahudumia makala ~25
Metadata unayopata Hakuna. Unaandika maandishi mbadala na vipimo mwenyewe Vipimo, rangi kuu, blur hash, rasimu ya maelezo, mstari wa sifa
Chanzo Inaalamishwa kimashine kama ya kubuni chini ya EU AI Act tangu 2 Agosti 20261 Mpiga picha aliyetajwa, tarehe, kiungo cha chanzo msomaji anaweza kufungua
Aina ya hitilafu Maelezo yanayoonekana sahihi lakini si kweli, mtindo mmoja wa nyumba Hakuna kilicholingana na maelekezo — unapata matokeo sifuri, ambayo unaweza kuyashughulikia

Safu ya metadata ndiyo inayoamua mifumo. Kila matokeo ya utafutaji tayari yanabeba width, height, blur_hash, color_hex, alt_description na mfuatano wa attribution.html tayari — ambao ndio kile injini ya kiolezo inahitaji kutoa <img> isiyobadilisha mpangilio ikiwa na nafasi tayari na sifa. Picha zilizozalishwa zinakupa faili tu na zinakuachia sehemu nyingine sita za kuzitunga.

Pale uzalishaji bado unashinda kwa wingi. Uonyeshaji wa ngazi ya kategoria kwa taksonomia dhahania ("cloud migration", "index funds"), michoro, na mtindo wa nyumba unaotaka kurudiwa katika mali nzima kwa sababu za chapa. Mgawanyo ambao wachapishaji wengi wakubwa hufikia: picha halisi kwa chochote kilichopo duniani, sanaa iliyozalishwa kwa chochote kilichopo tu kwenye hoja. Tulitoa hoja kamili kwa mgawanyo huo katika jinsi ya kuonyesha kila makala unayochapisha.

Ombi moja, picha mia moja

Hii ndiyo mabadiliko pekee yanayounda upya hesabu. Kituo cha utafutaji kinakubali per_page hadi 100, na uwekaji kurasa wa cursor unakuruhusu kuendelea kupitia seti ile ile ya matokeo yaliyopangwa. Kwa hivyo kitengo cha kazi si picha, ni rasilimali.

Ombi moja → rasilimali kwa kundi zima
curl -sG "https://api.pexafy.com/api/v1/search/photos" \
  -H "X-Api-Key: $PEXAFY_API_KEY" \
  --data-urlencode "q=a woman signing paperwork with an insurance agent at a kitchen table in her home" \
  --data-urlencode "per_page=100" \
  --data-urlencode "orientation=landscape" \
  --data-urlencode "score_threshold=0.5" \
  --data-urlencode "fields=photo_id,urls,width,height,blur_hash,alt_description,attribution"

# → { "success": true, "data": [ …hadi picha 100… ],
#     "pagination": { "per_page": 100, "has_more": true, "next_cursor": "eyJyc…" },
#     "meta": { "took_ms": 122.33, "request_id": "7ff1fb9b-…" } }

Vigezo vitatu humo vinafanya kazi kimya kimya kwa wingi:

  • fields — seti finyu ya sehemu. Omba sehemu saba ambazo kiolezo chako kinachora na jibu litaacha kutuma maelezo marefu ya AI ya kila picha. Kwa picha 40,000 hii ndiyo tofauti kati ya ujenzi unaomiminika na ule unaobadilishana.
  • score_threshold — mkia wa ukurasa wa matokeo 100, kwa ufafanuzi, una umuhimu mdogo kuliko sehemu ya juu. Kuweka kiwango cha chini kinamaanisha kundi hafifu linarejesha picha 34 badala ya picha 100 za wastani, na mfumo wako unaweza kuitikia hilo badala ya kulichapisha.
  • next_cursor — kundi linapohitaji kweli picha 300, pitia seti ile ile iliyopangwa badala ya kupiga maswali matatu tofauti yanayopishana.

Na hii ndiyo hesabu, kwa tovuti inayochapisha kurasa 10,000 kwa mwezi zenye picha nne kila moja:

Mkakati Maombi / mwezi Mzunguko mmoja kwa kikomo cha kiwango cha mpango wa bure20 maombi/dakika Yanaingia katika kiwango cha mwezi cha bure?
Utafutaji mmoja kwa kila nafasi ya picha 40,000 33 hours Hapana — mpango wa kulipia
Utafutaji mmoja kwa kila makala 10,000 8 hours Hapana — mpango wa kulipia
Utafutaji mmoja kwa kila kundi la makala ~20mtindo katika makala haya 500 25 minutes Ndiyo

Picha 40,000 zile zile zilizochapishwa katika safu mlalo zote tatu. Kitu pekee kilichobadilika ni mahali ambapo mzunguko upo.

Kusanya na gawa: mtindo unaokua

Muundo mzima ni awamu mbili zinazoendesha kwa mzunguko tofauti, na jedwali kati yao:

Umbo lake
                     ┌─────────── inaendesha kila wiki, maombi ~500 ───────────┐
  makundi ya mada ──▶ KUSANYA   tafuta mara moja kwa kila kundi, per_page=100
                     │       └─▶ hifadhi safu 100 za picha kwa kila kundi
                     └──────────────────┬───────────────────────────────┘
                                        ▼
                              jedwali la image_pool
                        (cluster, photo_id, urls, blur_hash,
                         alt, credit, used_by_page, used_at)
                                        │
                     ┌──────────────────┴──── inaendesha kwa kila kuchapisha, maombi 0 ───┐
  makala ─────────▶ GAWA  chagua safu bora isiyotumika kwa
                     │        kundi hili, iweke alama kuwa imetumika, chora
                     └────────────────────────────────────────────────────────┘

Hiki ndicho unachopata, kwa mpangilio wa umuhimu kwa wingi:

  1. Uchapishaji hausubiri API kamwe. Ugawaji ni usomaji wa hifadhidata. Mchakato wa uhifadhi wa CMS yako, ujenzi wako tuli na uingizaji wako wa wingi wa saa 3 asubuhi vyote vinaendesha kwa kasi ya ndani, bila mtandao, bila kikomo chochote cha kiwango popote katika njia hiyo.
  2. Uzuiaji wa marudio ni bure na sahihi. used_by_page IS NULL ndiyo kipengele kizima. Kurasa mbili haziwezi kuchota picha ile ile, kwa sababu ugawaji ni muamala, siyo hesabu ya upangaji.
  3. Kuendesha upya ni gharama nafuu na kisicho na madhara ya kurudia. Onyesha upya rasilimali ya kundi inapopungua au unapotaka picha mpya (after_date, au sort_by=newest) — ombi moja, na hakuna kilichokwisha kuchapishwa kinachohamishwa.
  4. Lugha zinapatikana bure. Tafsiri 20 za makala moja ni ukurasa mmoja katika mfumo wako wenye michoro 20; zinashiriki photo_id iliyogawiwa na huwezi kamwe kutafuta mara mbili. Unapotaka mwonekano wa picha zilizopigwa mahali husika, endesha swali la rasilimali kwa kundi hilo kwa lugha lengwa — injini inakubali sentensi kwa zaidi ya lugha 100.

Mfanyakazi, katika msimbo

Takribani mistari sitini. Kijazaji cha rasilimali ndicho kipengele pekee kinachozungumza na mtandao, kwa hivyo ndicho pekee kinachohitaji uangalifu — ushindani wa wakati mmoja umepunguzwa, 429 unaheshimiwa, matokeo yaliyoandikwa katika muamala mmoja.

pool.py — jaza rasilimali moja kwa kila kundi, kwa adabu
import asyncio, os, time, httpx

SEARCH = "https://api.pexafy.com/api/v1/search/photos"
KEY    = os.environ["PEXAFY_API_KEY"]
FIELDS = "photo_id,urls,width,height,blur_hash,alt_description,attribution"

# Free = 20 maombi/dakika. Baki chini ya moja. Kipima muda ni WA JUMLA: usingizi kwa kila kazi
# ndani ya lango la ushindani ungeruhusu wafanyakazi N kupiga N× kiwango.
PER_MIN = 19
gate    = asyncio.Semaphore(4)         # miunganisho inayoendelea
_lock   = asyncio.Lock()
_slot   = 0.0                          # wakati ujao huru katika ratiba ya pamoja

async def pace():
    """Toa nafasi moja ya ombi kila sekunde 60/PER_MIN, kwa fleet nzima."""
    global _slot
    async with _lock:
        now  = time.monotonic()
        _slot = max(now, _slot) + 60 / PER_MIN
        wait  = _slot - now
    if wait > 0:
        await asyncio.sleep(wait)

class QuotaExhausted(Exception): ...   # kila mwezi: kujaribu tena hakusaidii

async def fill_pool(client, cluster) -> list[dict]:
    """Ombi moja → hadi picha 100 zenye sifa kwa kundi moja la mada."""
    for attempt in range(4):
        await pace()
        async with gate:
            r = await client.get(
                SEARCH,
                headers={"X-Api-Key": KEY},
                params={
                    "q": cluster["camera_brief"],   # tukio, siyo neno kuu
                    "per_page": 100,
                    "orientation": "landscape",
                    "score_threshold": 0.5,
                    "fields": FIELDS,
                },
                timeout=15,
            )
        if r.status_code == 429:
            retry_after = r.headers.get("Retry-After")
            if retry_after is None:            # hakuna Retry-After ⇒ kiwango cha mwezi,
                raise QuotaExhausted(cluster["id"])   # simamisha mzunguko mzima
            await asyncio.sleep(int(retry_after))   # kwa dakika: kinaisha
            continue
        r.raise_for_status()
        return r.json()["data"]
    return []                                  # andika kumbukumbu; rasilimali inabaki na safu zake za zamani

async def refill(clusters):
    async with httpx.AsyncClient(http2=True) as client:
        pools = await asyncio.gather(*(fill_pool(client, c) for c in clusters))
    for cluster, photos in zip(clusters, pools):
        db.upsert_pool(cluster["id"], photos)     # ON CONFLICT DO NOTHING kwa photo_id

Maelezo mawili humo ndiyo tofauti kati ya mfanyakazi anayeendesha bila kusimamiwa na mmoja anayekuamsha. Kipima muda ni cha jumla, siyo cha kila kazi: kuweka usingizi ndani ya lango la ushindani ni kosa la kawaida — wafanyakazi wanne kila mmoja akisimama sekunde 3 baada ya ombi lake mwenyewe hutoa maombi manne kila sekunde 3, takribani 75 kwa dakika, na mpango wa bure huanza kurejesha 429 mara moja. Na 429 mbili hizo si mnyama mmoja: ile ya kwa dakika hubeba Retry-After na inajiondoa yenyewe, ile ya kiwango-cha-mwezi haibebi hilo na haitawahi — kujaribu tena hilo ni mzunguko dhidi ya ukuta.

Ugawaji, sehemu inayoendesha kwa kila kuchapisha, haiguzi mtandao kamwe:

assign.py — thabiti, ya muamala, bila marudio popote
# Upekee unatekelezwa na muundo, siyo kwa swali kuwa makini.
# Picha inaweza kukaa katika rasilimali kadhaa za makundi; inaweza KUCHAPISHWA mara moja tu.
# CREATE UNIQUE INDEX one_use_per_photo ON image_pool (photo_id)
#        WHERE used_by_page IS NOT NULL;

def assign_hero(page_id: str, cluster_id: str) -> dict | None:
    for _ in range(5):                # mashindano yaliyopotea huchukua tu picha inayofuata
        try:
            return db.query_one("""
                UPDATE image_pool p SET used_by_page = %s, used_at = NOW()
                WHERE p.id = (
                    SELECT c.id FROM image_pool c
                    WHERE c.cluster_id = %s AND c.used_by_page IS NULL
                      AND NOT EXISTS (              -- imetumika na kundi lingine LOLOTE?
                          SELECT 1 FROM image_pool u
                          WHERE u.photo_id = c.photo_id
                            AND u.used_by_page IS NOT NULL
                      )
                    ORDER BY c.rank ASC
                    LIMIT 1 FOR UPDATE SKIP LOCKED  -- salama na wafanyakazi wa sambamba
                )
                RETURNING photo_id, urls, width, height, blur_hash, alt, credit
            """, [page_id, cluster_id])
        except UniqueViolation:      # makundi mawili yaliidai katika milisekunde ile ile
            continue
    return None                     # rasilimali imekauka → panua maelekezo, jaza tena

# Kuchora: kila sifa inatoka kwenye safu — hakuna mabadiliko ya mpangilio, hakuna kubahatisha.
# <img src="{urls[regular]}" width="{width}" height="{height}"
#      alt="{alt}" loading="lazy" style="background:{blur_placeholder}">
# <figcaption>{credit}</figcaption>

Aina mbili za hitilafu, mifumo miwili, na zote zinahitajika. FOR UPDATE SKIP LOCKED hushughulikia ushindani ndani ya kundi: zalisha kurasa kwa sambamba — na kwa wingi huu utafanya hivyo — na wafanyakazi wawili wanafikia picha ile ile ya juu ya orodha katika milisekunde ile ile.

Kielezo cha kipekee kisicho kamili kinashughulikia kile ambacho kila mtu husahau: picha ile ile inaweza kutokea kihalali katika rasilimali za makundi kadhaa, kwa sababu makundi ya jirani ("bima ya nyumba kwa wapangaji", "…kwa wamiliki wa nyumba") yanarejesha matokeo yanayopishana. Ukaguzi wa used_by_page IS NULL wa kila kundi haujali hilo — kila kundi linaamini picha ni huru. NOT EXISTS inaweka swali kuwa la kweli, na kielezo kinafanya iwe haiwezekani kupata kosa chini ya ushindani: mshindwa wa mashindano anapata ukiukaji, anajaribu tena, na anachukua picha inayofuata. Bila hilo, "hakuna kurasa mbili zinazoshiriki picha kuu" ni dai, siyo dhamana.

Rasilimali inapokauka katikati ya ujenzi, njia ya kurudi inayofanya vizuri zaidi ni kupanua badala ya kurudia: ondoa kishazi cha mwisho cha maelekezo ya kamera, endesha tena swali la rasilimali mara moja, na kisha tu tumia tena picha iliyogawiwa zamani zaidi — kwa sheria kali kwamba haitawahi kutua kwenye ukurasa katika kundi lile lile.

Kundi moja, rasilimali moja: swali halisi

Chukua mali ya kulinganisha: bima ya nyumba, kurasa ishirini — "bima ya nyumba kwa wapangaji", "…kwa wamiliki wa nyumba", "sera inavyofunika kwa hakika", kurasa kumi na mbili za miji, miongozo mitatu ya madai. Maelekezo moja ya kamera kwa kundi, ombi moja, na hii ndiyo sehemu ya juu ya rasilimali, iliyorejeshwa katika 122 ms:

GET /search/photos — "mwanamke akitia sahihi karatasi na wakala wa bima kwenye meza ya jikoni nyumbani kwake" · 122 ms
Sehemu ya juu ya rasilimali: matukio sita tofauti kutoka seti moja ya matokeo yaliyopangwa — saini, karibu ya fomu, sera ikielezwa, karatasi za mezani, wanandoa na wakala, ulinganisho juu ya kahawa. Hiyo ni sita kati ya kurasa ishirini tayari zimeshughulikiwa; ombi la rasilimali linaomba per_page=100 na linahifadhi zilizobaki. Endesha utafutaji huu halisi →

Maelekezo yana umuhimu zaidi kuliko msimbo. Sheria mbili zinaishi baada ya kugusana na mali halisi ya makundi: andika maelekezo kwa ajili ya kundi, siyo kwa ukurasa (majina ya kurasa yanafanana karibu kabisa katika seti za kiprogramu, hivyo maelekezo ya kila ukurasa yanarejesha picha zinazofanana karibu kabisa), na eleza tukio ambalo kamera ingeweza kupiga badala ya mada — bima ya nyumba hurejesha picha za karibu za hati na hakuna kingine. Tulichapisha maelekezo yanayoweza kubandikwa yanayozalisha maelekezo haya katika makala kuhusu kuonyesha kila chapisho.

Kuweka mfululizo wa kurasa 200 sawia kimwonekano

Hitilafu kinyume cha marudio ni kutokuwiana: kurasa ishirini katika kundi moja, kila moja ikiwa na picha yenye usahihi kiufundi, katika rejista ishirini tofauti za kuona. Suluhisho ni kituo kimoja — GET /photos/{id}/similar — kinachoendeshwa mara moja kwenye picha uliyoikubali kwa ukurasa mkuu:

GET /photos/019e143f…/similar — zaidi kama picha kuu iliyokubaliwa · 48 ms
Mwanga ule ule, chumba kile kile, mavazi yale yale, nyakati tofauti — kwa sababu ufanano wa kuona hupata sehemu iliyobaki ya kikao cha mpiga picha, siyo tu mhusika yule yule. Gawa hizi katika kundi na mfululizo unasomeka kama umeagizwa badala ya kukusanywa.

Vishikizo viwili zaidi vinavyofaa kuunganishwa katika swali la rasilimali wakati uwiano wa chapa ni sharti: color_hex pamoja na color_tolerance huweka mali nzima ndani ya paleti, na photographer hufunga kundi kwa kazi za mpiga picha mmoja. Zote ni vigezo vya kawaida vya swali — hakuna kizuizi cha mpango kwenye vichujio vya utafutaji.

Vikomo vya kiwango, viwango vya mwezi na gharama halisi

Chagua mpango kulingana na msukumo wa haraka, siyo kwa wingi. Ukishaanza kukusanya rasilimali, kiwango cha mwezi kinaacha kuwa kizuizi kwa karibu kila mtu; kinachoamua mpango wako ni kasi ambayo onyesho kamili la upya linahitaji kukamilika.

Mpango Maombi / mwezi= makundi yanayoweza kuonyeshwa upya Kikomo cha kiwango Funguo za API Onyesha upya makundi 1,000saa halisi, mzunguko mmoja
Free — $0 5,000 20 / dakika 1 50 min
Starter — $5 25,000 30 / dakika 3 34 min
Pro — $19 100,000 60 / dakika 5 17 min
Team — $99mashirika: funguo kwa kila mteja 500,000 200 / dakika 25 5 min
Business — $249 1,000,000 300 / dakika unlimited 4 min
Enterprise — $599 2,000,000 500 / dakika unlimited 2 min

Soma safu wima ya kwanza kama makundi: ombi moja la kukusanya rasilimali linajaza kundi moja, hivyo kiwango cha mwezi ni idadi ya makundi unayoweza kuonyesha upya, na safu wima ya mwisho ni muda gani mzunguko kamili wa mali ya makundi 1,000 unachukua kwa kikomo cha kiwango cha mpango huo. Zote ni thamani hai kutoka katalogi ya bei — ukurasa wa bei unaeleza vikomo vile vile vya kiwango kwa saa badala ya kwa dakika.

Kwa hivyo mali ya kurasa 10,000-kwa-mwezi kwenye mtindo wa kukusanya rasilimali inatumia maombi ~500 na kulipa hakuna kitu. Kinachosukuma timu juu ya jedwali si mara nyingi wingi — ni moja ya mambo matatu: onyesho jipya kamili la mali iliyopo katika usiku mmoja, utengano wa funguo kwa kila mteja (shirika linataka funguo moja kwa kila mteja ili matumizi yaweze kuhesabiwa bila mchezo wa siri za pamoja), au dirisha la ujenzi linalopimwa kwa dakika badala ya masaa.

Maelezo mawili ya uendeshaji yanayookoa usiku wa kutafuta hitilafu. Kila jibu linabeba X-RateLimit-Limit na X-RateLimit-Remaining, hivyo mfanyakazi anaweza kujidhibiti badala ya kubahatisha. Na 429 iliyo kikomo halisi cha kiwango cha dakika inabeba Retry-After, wakati kizuizi cha kiwango cha mwezi kwa makusudi hakibebi hilo — kujaribu tena hakutaondoa hilo, na mfanyakazi anayetofautisha hizo mbili anaacha kupiga endelea kituo ambacho hakina kilichobaki kutoa.

Wakati wakala ndiye anayechapisha

Ikiwa maudhui yako yanazalishwa na wakala — na katika wingi huu, hilo linazidi kutokea — safu ya kukusanya rasilimali haipotei, inahamia tu. Mpe wakala zana za utafutaji naye atajaza rasilimali huku akiwa bado na maelekezo ya kundi katika muktadha, akitumia seva ya Model Context Protocol katika mcp.pexafy.com/mcp: zana tatu, search_photos (sentensi), search_photos_by_image (picha ya rejea, ikiwa na hiari sentensi pia) na get_similar_photos (ile ya mfululizo-uwiano kutoka hapo juu).

Iunganishe kwenye wakala asiye na kichwa — kiunganishi kimoja, funguo moja
# Claude Code / CI runner
claude mcp add --transport http pexafy https://mcp.pexafy.com/mcp \
  --header "Authorization: Bearer $PEXAFY_API_KEY"

# au weka .mcp.json ili kila mfanyakazi katika fleet aurithi
{
  "mcpServers": {
    "pexafy": {
      "type": "http",
      "url": "https://mcp.pexafy.com/mcp",
      "headers": { "Authorization": "Bearer YOUR_API_KEY" }
    }
  }
}

Maelekezo yanayofanya kazi kwa wingi ni maelekezo ya kundi, siyo ya kila makala — na yanalingana moja kwa moja na awamu mbili zilizo hapo juu:

Onyesho upya la kundi, likiendeshwa na wakala
You  Hapa kuna makundi 12 ya mada kutoka kalenda ya maudhui. Kwa kila moja,
     andika maelekezo moja ya kamera, chukua picha 100 za mlalo, na andika
     rasilimali kwenye Postgres. Onyesha kundi lolote linalorejesha chini ya 40
     matokeo juu ya 0.5 — maelekezo hayo yanahitaji kuandikwa upya.

Agent  → search_photos(q="a woman signing paperwork with an insurance
           agent at a kitchen table in her home", orientation="landscape")
      ← picha 100 · 122 ms · 87 juu ya kiwango
      … makundi mengine 11 …

      ✓ rasilimali 11 zimeandikwa (picha 1,043, zote zenye sifa)
      ⚠ "index fund rebalancing" → matokeo 12. Maelekezo ni dhahania;
        pendekezo: "mtu mezani jikoni akikagua tarakimu kwenye
        laptop akiwa na daftari na kahawa kando yake"

Mstari huo wa mwisho ndiyo sababu ya kumweka wakala katika mzunguko huu badala ya hati: hitilafu ya uonyeshaji wa kiprogramu ni maelekezo mabaya, na maelekezo mabaya ni exactly kitu ambacho modeli ya lugha inaweza kutambua na kuandika upya. Hati zinabaki kusimamia ugawaji, ambapo uthabiti unahitajika na ubunifu hauhitajiki.

Kile picha haziwezi kurekebisha

Sehemu ya kweli, kwa sababu hitilafu inayoelezea ni ghali. Upigaji picha halisi wenye sifa unaboresha ukurasa. Haugeuzi maudhui hafifu kuwa maudhui mazuri, na hakuna mfumo wa picha unaobadilisha jinsi injini za utafutaji zinavyoshughulikia kurasa zilizozalishwa kwa wingi zinazokusudia kupanda daraja badala ya kusaidia. Sera za taka za Google zinaeleza hili moja kwa moja: matumizi mabaya ya maudhui ya kiwango hufunika kutengeneza kurasa nyingi zenye thamani ndogo iwe otomatiki inahusika au la, na michoro katika kurasa hizo haihusiani na hukumu hiyo.2

Kwa hivyo mfumo muhimu ni finyu na wa kweli: upigaji picha ni ishara ya ubora unayodhibiti katika kurasa ambazo tayari zinastahili kuwepo. Mahali panapoonekana kulipa:

  • Chanzo msomaji anaweza kuthibitisha. Mstari wa sifa wenye jina la mpiga picha na kiungo cha chanzo ni dai linaloweza kukaguliwa — kinyume cha picha isiyo na sifa kwenye ukurasa wenye mwandishi asiyetajwa.
  • Ufikivu na Core Web Vitals. width/height kutoka kwenye jibu huondoa mabadiliko ya mpangilio, blur_hash hutoa nafasi halisi tayari, na alt_description ni rasimu ya maandishi mbadala ambayo kiolezo chako kinaweza kuboresha badala ya kuvumbua. Zidisha kwa nafasi 40,000 na hii ndiyo hadithi nzima ya ubora wa picha ya tovuti.
  • Kutoonekana kuzalishwa kwa wingi. Uzuiaji wa marudio na uwiano wa mfululizo ndicho kinachozuia mali kuwa na saini ya kuona. Hiyo ni gharama halisi ya utambuzi yenye madhara halisi, na inaangukia kabisa chini ya udhibiti wako.

Na leseni bado inasimamia picha. Sifa haihitajiki na masharti ya API ya Pexafy — kila matokeo linatoa attribution.html na attribution.plain tayari kuchora — lakini leseni iliyoambatanishwa na maktaba asili inatumika kwenye matumizi yako ya picha hiyo, na kwa picha 40,000 kwa mwezi, kuchora sifa kiotomatiki ni gharama nafuu kuliko kukagua baadaye.

Pa kuanzia Jumatatu

  1. Gawanya orodha yako iliyorundikana katika makundi ya kurasa 15–30 ambazo zingeweza kwa uhalisia kushiriki kikao cha kupiga picha. Hii ndiyo hatua pekee ya kweli ya kufanywa kwa mikono, na ni jedwali la kuhesabu, siyo mradi.
  2. Andika maelekezo moja ya kamera kwa kila kundi — tukio, maneno 12 hadi 25. Yazalishe kwa modeli, kisha uyasome; maelekezo yanayotaja mada badala ya tukio yanaonekana kwa mtazamo wa haraka.
  3. Jaza rasilimali moja kwa ombi moja la per_page=100 na uangalie sehemu ya juu yake. Ikiwa kumi za juu haziwezi kutumika, maelekezo ndiyo yasiyo sahihi — siyo injini.
  4. Ongeza safu wima ya used_by_page kabla ya kuchapisha chochote. Ni dakika tano sasa na uhamishaji katika kurasa 3,000 hai baadaye.
  5. Endesha kila kitu kwenye mpango wa bure mpaka dirisha la ujenzi likulazimishe kupanda. Katika maombi 500 kwa mwezi, itachukua muda.

Marejeleo na maelezo ya chini

1 EU AI Act, Kifungu cha 50 — wajibu wa uwazi unaotumika kuanzia 2 Agosti 2026: watoa huduma wa mifumo inayozalisha picha, sauti, video au maandishi ya kubuni lazima waweke alama kwenye matokeo kwa muundo unaosomeka na mashine na kuyafanya yatambulike kama yaliyozalishwa kiholela. Inawabana watoa huduma na wapelekaji wa AI; siyo sheria kuhusu picha zipi tovuti inaweza kuchapisha.

2 Sera za taka za Google Search — matumizi mabaya ya maudhui ya kiwango: kutengeneza kurasa nyingi hasa kwa lengo la kudanganya upangaji na kutoa thamani ndogo kwa watumiaji, iwe zimeundwa kwa otomatiki, juhudi za binadamu au mchanganyiko wa hivyo. Ubora wa uonyeshaji si sababu katika tathmini hiyo, ndiyo maana hasa makala haya yanatenganisha mambo hayo mawili.

Maswali yanayoulizwa mara kwa mara

Ninawezaje kupata picha kwa maelfu ya kurasa za SEO za kiprogramu?
Tafuta mara moja kwa kila kundi la mada, sio mara moja kwa kila ukurasa. Ombi moja la GET /api/v1/search/photos lenye per_page=100 hurejesha hadi picha 100 zenye sifa kwa kundi moja; unazihifadhi kwenye jedwali la pool na kugawa moja kwa kila ukurasa wakati wa kuchapisha. Mfumo wa kurasa 10,000 kwa mwezi wenye picha nne kwa kila ukurasa unahitaji takribani maombi 500 badala ya 40,000, jambo ambalo linaingia ndani ya mpango wa bure (maombi 5,000/mwezi).
Ni API gani bora ya picha za hisa kwa uzalishaji wa maudhui kwa wingi mkubwa?
Vigezo vinavyohusika zaidi ya picha elfu chache kwa mwezi ni: ni picha ngapi ombi moja linaweza kurejesha, kama maktaba kadhaa zinarejea katika muundo mmoja wa sanifu, mpaka wa kiwango kwa dakika, na kama ukaguzi wa programu unazuia upatikanaji wa uzalishaji. Pexafy hurejesha hadi picha 100 kwa kila ombi kutoka maktaba 9 za bure katika muundo mmoja, hutoa ufunguo unaofanya kazi papo hapo, na inaruhusu maombi 20 kwa dakika kwenye mpango wa bure hadi 300/dakika kwenye Business. Tunalinganisha kila API ya bure kwa vigezo hivyo katika makala maalum.
Ninawezaje kuzuia picha ile ile ya hisa isionekane kwenye kurasa kadhaa?
Hifadhi photo_id ya kila picha unayochapisha na dai picha kutoka kwenye pool kwa njia ya muamala — katika SQL, UPDATE … WHERE used_by_page IS NULL … FOR UPDATE SKIP LOCKED. Kuondoa nakala basi kunakuwa sahihi kabisa badala ya kwa uwezekano, na wafanyakazi wa ujenzi wanaofanya kazi sambamba hawawezi kushindania picha ile ile iliyo juu ya orodha. Ni safu moja tu, na kuiongeza baadaye kwenye maelfu ya kurasa zilizo hai ni ghali zaidi kuliko kuiweka siku ya kwanza.
Ombi moja la API linaweza kurejesha picha ngapi?
Hadi 100, kupitia per_page=100, na uwekaji kurasa wa cursor unakuruhusu kuendelea kupitia matokeo yale yale yaliyopangwa kwa pool za kina zaidi. Changanya na score_threshold ili kundi lenye picha chache lirejeshe picha 40 zenye ulinganifu mkubwa badala ya picha 100 zisizolingana vizuri, na na fields ili kurejesha tu sifa ambazo kiolezo chako kinaonyesha, jambo linalofanya majibu kuwa madogo kwa wingi mkubwa.
Je, picha halisi husaidia kurasa zinazozalishwa kwa wingi kupanda daraja vizuri zaidi?
Hapana — na inafaa kuwa sahihi kuhusu hilo. Sera za spam za Google zinafafanua matumizi mabaya ya maudhui kwa kiwango kama kuzalisha kurasa nyingi hasa ili kudhibiti daraja kwa thamani ndogo kwa watumiaji, iwe otomatiki inahusika au la; vielelezo kwenye kurasa hizo havibadilishi tathmini hiyo. Upigaji picha halisi wenye sifa ni ishara ya ubora kwenye kurasa ambazo tayari zinastahili kuwepo: unabeba chanzo kinachothibitishwa, hutoa upana, urefu, blur hash na maandishi mbadala yanayolinda Core Web Vitals na ufikivu, na kuzuia mfumo usionekane kama umezalishwa kwa wingi bila mpangilio.
Je, wakala wa AI anaweza kujaza pool ya picha kiotomatiki?
Ndiyo, kupitia seva ya MCP (Model Context Protocol) inayohifadhiwa na Pexafy katika mcp.pexafy.com/mcp, ambayo inatoa search_photos, search_photos_by_image na photo_similar. Mpe wakala orodha ya makundi naye ataandika maelekezo moja ya kamera kwa kila kundi, achukue pool na abainishe maelekezo yaliyorejesha ulinganifu mchache sana wenye nguvu — ambayo ndiyo hitilafu halisi ya vielelezo vya kiprogramu. Ugawaji unabaki kwenye script zako, ambapo uthabiti ni muhimu zaidi kuliko ubunifu.

Acha kuwinda maneno muhimu. Eleza unachomaanisha.

Tafuta picha 9M+ za bure kwa maana — katika lugha yoyote, kwa chini ya 100 ms.