Megosztás a következőn keresztül:


Azure Communication JobRouter Package ügyfélkódtár Pythonhoz – 1.0.0-s verzió

Ez a csomag egy Python SDK-t tartalmaz a JobRouterhez készült Azure Communication Services számára. További információ a Azure Communication Services itt

Forráskód | Csomag (Pypi) | Termékdokumentáció

Felelősséget kizáró nyilatkozat

Az Azure SDK Python-csomagok támogatása a Python 2.7-hez 2022. január 01-én véget ért. További információkért és kérdésekért lásd: https://github.com/Azure/azure-sdk-for-python/issues/20691

Első lépések

Előfeltételek

A csomag használatához Azure-előfizetésre és kommunikációs szolgáltatási erőforrásra van szüksége.

A csomag telepítése

Telepítse a Pythonhoz készült Azure Communication JobRouter ügyfélkódtárat a pip használatával:

pip install azure-communication-jobrouter

Fő fogalmak

Feladat

A feladatok a munkaegységet jelölik, amelyet egy elérhető feldolgozóhoz kell irányítani. Erre valós példa lehet egy bejövő hívás vagy csevegés egy call center környezetében.

Munkavállaló

A feldolgozó a feladat kezeléséhez rendelkezésre álló készletet jelöli. Minden egyes feldolgozó több üzenetsort regisztrál a feladatok fogadásához. Erre valós példa lehet egy call centerben dolgozó ügynök.

Üzenetsor

Az üzenetsor a feldolgozó által kiszolgálni kívánt feladatok rendezett listáját jelöli. A feldolgozók regisztrálnak egy üzenetsorsal, hogy munkát kapjanak tőle. Erre valós példa lehet egy hívássor egy call centerben.

Csatorna

A csatornák a feladatok valamilyen típusú csoportosítását jelölik. Amikor egy feldolgozó regisztrál a munka fogadásához, meg kell adnia azt is, hogy mely csatornákon tudja kezelni a munkát, és hogy az egyes felhasználók mennyit tudnak egyszerre kezelni. Erre egy valós példa lehet voice calls , vagy chats egy call centerben.

Ajánlat

A JobRouter kiterjeszt egy ajánlatot egy feldolgozóra egy adott feladat kezelésére, amikor egyezést határoz meg, ezt az értesítést általában az EventGriden keresztül küldi el. A feldolgozó elfogadhatja vagy elutasíthatja az ajánlatot a JobRouter API használatával, vagy a terjesztési szabályzatban konfigurált élettartamnak megfelelően lejár. Erre valós példa lehet egy ügynök csengetése egy call centerben.

Terjesztési szabályzat

A terjesztési szabályzatok olyan konfigurációs készletet jelölnek, amely szabályozza, hogy az üzenetsorban lévő feladatok hogyan legyenek elosztva az adott várólistán regisztrált feldolgozók között. Ez a konfiguráció magában foglalja, hogy mennyi ideig érvényes egy ajánlat, mielőtt lejár, és a terjesztési mód, amely meghatározza a feldolgozók kiválasztásának sorrendjét, ha több elérhető van.

Terjesztési mód

A 3 módtípus a következő:

  • Ciklikus időszeletelés: A feldolgozókat a rendszer az előző ajánlat után rendeli Id el, és a következő feldolgozót választja ki.
  • Leghosszabb tétlenség: Az a feldolgozó, aki a leghosszabb ideje nem dolgozik egy feladaton.
  • Legjobb feldolgozó: Megadhat egy kifejezést, amely 2 feldolgozót hasonlít össze annak meghatározásához, hogy melyiket válassza.

Címkék

Címkéket csatolhat feldolgozókhoz, feladatokhoz és üzenetsorokhoz. Ezek olyan kulcsértékpárok, amelyek lehetnek string, number vagy boolean adattípusok. Erre valós példa lehet egy adott feldolgozó képzettségi szintje, a csapat vagy a földrajzi hely.

Címkeválasztók

A címkeválasztók csatolhatók egy feladathoz az üzenetsort kiszolgáló feldolgozók egy részhalmazának megcélzásához. Erre valós példa lehet egy bejövő hívás feltétele, amely szerint az ügynöknek rendelkeznie kell egy adott termék minimális ismeretével.

Besorolási szabályzat

A besorolási szabályzatok segítségével dinamikusan választhat ki egy üzenetsort, meghatározhatja a feladat prioritását, és egy szabálymotor használatával csatolhatja a munkavégzőcímkék választóit egy feladathoz.

Kivételszabályzat

A kivételszabályzat egy eseményindítón alapuló feladat viselkedését szabályozza, és végrehajt egy kívánt műveletet. A kivételszabályzat egy üzenetsorhoz van csatolva, így szabályozhatja a feladatok viselkedését az üzenetsorban.

Példák

Ügyfél inicializálása

Az SMS-ügyfél inicializálásához a kapcsolati karakterlánc használható a példányosításhoz. Alternatív megoldásként az Active Directory-hitelesítést is használhatja a DefaultAzureCredential használatával.

from azure.communication.jobrouter import (
    JobRouterClient,
    JobRouterAdministrationClient
)

connection_string = "endpoint=ENDPOINT;accessKey=KEY"
router_client = JobRouterClient.from_connection_string(conn_str = connection_string)
router_admin_client = JobRouterAdministrationClient.from_connection_string(conn_str = connection_string)

Terjesztési szabályzat

Mielőtt létrehozhatnánk egy üzenetsort, szükségünk van egy terjesztési szabályzatra.

from azure.communication.jobrouter.models import (
    LongestIdleMode,
    DistributionPolicy
)

distribution_policy: DistributionPolicy = DistributionPolicy(
    offer_expires_after_seconds = 24 * 60 * 60,
    mode = LongestIdleMode(
        min_concurrent_offers = 1,
        max_concurrent_offers = 1
    )
)

distribution_policy: DistributionPolicy = router_admin_client.upsert_distribution_policy(
    "distribution-policy-1",
    distribution_policy
)

Üzenetsor

Ezután létrehozhatjuk az üzenetsort.

from azure.communication.jobrouter.models import (
    RouterQueue
)

queue: RouterQueue = RouterQueue(
    distribution_policy_id = "distribution-policy-1"
)

queue: RouterQueue = router_admin_client.upsert_queue(
    "queue-1",
    queue
)

Feladat

Most közvetlenül az üzenetsorba küldhetünk be egy feladatot, a munkavégző kiválasztásával a munkavégzőnek 10-nél nagyobb címkét Some-Skill kell használnia.

from azure.communication.jobrouter.models import (
    RouterJob,
    RouterWorkerSelector,
    LabelOperator
)

router_job: RouterJob = RouterJob(
    channel_id = "my-channel",
    queue_id = "queue-1",
    channel_reference = "12345",
    priority = 1,
    requested_worker_selectors = [
        RouterWorkerSelector(key = "Some-Skill", label_operator = LabelOperator.EQUAL, value = 10)
    ]
)

job: RouterJob = router_client.upsert_job(
    "jobId-1",
    router_job
)

Munkavállaló

Most regisztrálunk egy feldolgozót, hogy munkát fogadjon az üzenetsorból, 11-nek egyenlő címkével Some-Skill .

from azure.communication.jobrouter.models import (
    RouterWorker,
    RouterChannel
)

router_worker: RouterWorker = RouterWorker(
    capacity = 1,
    queues = [
        "queue-1"
    ],
    labels = {
        "Some-Skill": 11
    },
    channels = [
        RouterChannel(channel_id = "my-channel", capacity_cost_per_job = 1)
    ],
    available_for_offers = True
)

worker = router_client.upsert_worker(
    "worker-1",
    router_worker
)

Ajánlat

Az EventGrid-előfizetésből le kell szereznünk egy RouterWorkerOfferIssued azonosítót.

Számos különböző Azure-szolgáltatás működik eseménykezelőként. Ebben a forgatókönyvben webhookokat fogunk feltételezni az eseménykézbesítéshez. További információ a Webhook eseménykézbesítéséről

Miután az eseményeket az eseménykezelőnek kézbesítettük, deszerializálhatjuk a JSON hasznos adatait egy eseménylistába.

# Parse the JSON payload into a list of events
from azure.eventgrid import EventGridEvent
import json

## deserialize payload into a list of typed Events
events = [EventGridEvent.from_json(json.loads(msg)) for msg in payload]
offer_id = ""
for event in events:
    if event.event_type == "Microsoft.Communication.RouterWorkerOfferIssued":
        offer_id = event.data.offer_id
    else:
        continue

Várhatunk azonban néhány másodpercet is, majd lekérdezhetjük a feldolgozót közvetlenül a JobRouter API-val, és megállapíthatjuk, hogy ki lett-e adva egy ajánlat.

from azure.communication.jobrouter.models import (
    RouterWorker,
)

router_worker: RouterWorker = router_client.get_worker(worker_id = "worker-1")

for offer in router_worker.offers:
    print(f"Worker {router_worker.id} has an active offer for job {offer.job_id}")

Ajánlat elfogadása

Miután egy feldolgozó megkapja az ajánlatot, két lehetséges műveletet hajthat végre: elfogadás vagy elutasítás. Elfogadjuk az ajánlatot.

from azure.communication.jobrouter.models import (
    RouterJobOffer,
    AcceptJobOfferResult,
    RouterJobStatus
)

# fetching the offer id
job_offer: RouterJobOffer = [offer for offer in router_worker.offers if offer.job_id == "jobId-1"][0]
offer_id = job_offer.offer_id

# accepting the offer sent to `worker-1`
accept_job_offer_result: AcceptJobOfferResult = router_client.accept_job_offer(
    worker_id = "worker-1",
    offer_id = offer_id
)

print(f"Offer: {job_offer.offer_id} sent to worker: {router_worker.id} has been accepted")
print(f"Job has been assigned to worker: {router_worker.id} with assignment: {accept_job_offer_result.assignment_id}")

# verify job assignment is populated when querying job
updated_job = router_client.get_job(job_id = "jobId-1")
print(f"Job assignment has been successful: {updated_job.job_status == RouterJobStatus.Assigned and accept_job_offer_result.assignment_id in updated_job.assignments}")

Feladat befejezése

Miután a feldolgozó végzett a feladattal, a feldolgozónak meg kell jelölnie a feladatot a következőként: completed.

import datetime
from azure.communication.jobrouter.models import (
    CompleteJobOptions
)
complete_job_result = router_client.complete_job(
    "jobId-1",
    accept_job_offer_result.assignment_id,
    CompleteJobOptions(
        note = f"Job has been completed by {router_worker.id} at {datetime.datetime.utcnow()}"
    )
)

print(f"Job has been successfully completed.")

Feladat bezárása

A feladat befejezése után a feldolgozó a feladat bezárása előtt lezárási műveleteket hajthat végre a feladaton, és végül felszabadíthatja a kapacitását, hogy több bejövő feladatot fogadjon el.

from azure.communication.jobrouter.models import (
    RouterJob,
    RouterJobStatus,
    CloseJobOptions,
)

close_job_result = router_client.close_job(
    "jobId-1",
    accept_job_offer_result.assignment_id,
    CloseJobOptions(
        note = f"Job has been closed by {router_worker.id} at {datetime.datetime.utcnow()}"
    )
)

print(f"Job has been successfully closed.")

update_job: RouterJob = router_client.get_job(job_id = "jobId-1")
print(f"Updated job status: {update_job.job_status == RouterJobStatus.CLOSED}")
import time
from datetime import datetime, timedelta
from azure.communication.jobrouter.models import (
    RouterJob,
    RouterJobStatus,
    CloseJobOptions,
)

close_job_in_future_result = router_client.close_job(
    "jobId-1",
    accept_job_offer_result.assignment_id,
    CloseJobOptions(
        note = f"Job has been closed by {router_worker.id} at {datetime.utcnow()}",
        close_at = datetime.utcnow() + timedelta(seconds = 2)
    )
)

print(f"Job has been marked to close")
time.sleep(secs = 2)
update_job: RouterJob = router_client.get_job(job_id = "jobId-1")
print(f"Updated job status: {update_job.job_status == RouterJobStatus.CLOSED}")

Hibaelhárítás

Problémákba ütközik? Ennek a szakasznak tartalmaznia kell a teendők részleteit.

Következő lépések

További mintakód

A kódtár használatára vonatkozó részletes példákért tekintse meg a mintakönyvtárat.

Visszajelzés küldése

Ha bármilyen hibába ütközik, vagy javaslatai vannak, küldjön egy problémát a projekt Problémák szakaszában.

Közreműködés

A projektben szívesen fogadjuk a hozzájárulásokat és a javaslatokat. A legtöbb hozzájáruláshoz el kell fogadnia egy Közreműködői licencszerződést (CLA-t), amelyben kijelenti, hogy jogosult arra, hogy ránk ruházza hozzájárulása felhasználási jogát, és ezt ténylegesen meg is teszi. A részletekért látogasson el a cla.microsoft.com.

A projekt a Microsoft nyílt forráskódú projekteket szabályozó etikai kódexe, a Microsoft Open Source Code of Conduct hatálya alá esik. További információkért lásd a viselkedési szabályzattal kapcsolatos gyakori kérdéseket , vagy vegye fel a kapcsolatot opencode@microsoft.com az esetleges további kérdésekkel vagy megjegyzésekkel.