---
title: "Agenttrin og overdragelser"
description: "Opdel en agent i trin med egne instruktioner, værktøjer og indsamlede værdier, og overdrag opkald mellem agenter midt i opkaldet."
---

En enkelt prompt giver modellen hele opgaven på én gang. **Trin** giver den én
fase af opkaldet ad gangen: Hvert trin har sine egne instruktioner, sine egne værktøjer,
en valgfri replik, der siges ordret, og værdier, den skal indsamle, før den går
videre. **Overdragelser** lader en anden agent i din organisation overtage midt i
opkaldet med transskriptionen intakt, så den, der ringer, aldrig skal gentage sig selv.

Hver agent starter som en enkelt prompt. Intet ved den ændrer sig, før du tilføjer
trin eller overdragelser.

## Trin eller en enkelt prompt?

| Brug trin, når | Behold en enkelt prompt, når |
| --- | --- |
| Opkaldet har faser, der skal ske i rækkefølge: verificer, og book derefter. | Samtalen er åben: FAQ, reception, generel support. |
| En værdi skal indsamles, før agenten går videre. | Intet skal indsamles i en fast rækkefølge. |
| En regel aldrig må fraviges, såsom "personer, der ringer og er under 18, sendes til en værge". | Modellens vurdering er god nok for alle grene. |
| Et opslag skal udføres på et bestemt tidspunkt i opkaldet. | Værktøjer kan kaldes, når den, der ringer, beder om det. |
| En del af opkaldet tilhører en anden agent med sin egen prompt og stemme. | Én persona håndterer alt. |

Trin er ikke et scriptsstyret telefontræ. Inden for et trin styrer modellen
samtalen, som den gør med en enkelt prompt. Trinnet afgør, hvad den arbejder
med, hvilke værktøjer den kan bruge, og hvad den har brug for, før den kan forlade det.

## Sådan opbygges en agent med trin

Når en agent har trin, indeholder dens `prompt` de **fælles instruktioner**:
personaen og reglerne, der gælder i hvert trin. Hvert trin tilføjer sine egne
instruktioner ovenpå. Ved hver tur ser modellen de fælles instruktioner, det
aktuelle trins navn og instruktioner samt de værdier, der er indsamlet indtil videre.

I builderen skal du skifte agenten fra **Enkelt prompt** til **Trin**. Du får et
kort pr. trin med navn, instruktioner, replik, værktøjer, indsamlede værdier
og overgange, en vælger til overdragelser og en skrivebeskyttet flowgraf over
trinnene. Når du skifter tilbage til en enkelt prompt, får du tilbudt en samlet prompt,
der sammenfletter de fælles instruktioner og alle trin.

Over API'et er `steps` og `handoffs` felter på
[agenten](/api-reference/agents). Som alle agentfelter lægger en `PATCH` dem
i kladden; `POST /v1/agents/{agent_id}/deploy` gør dem aktive. Hvis du sender
`"steps": null`, skifter agenten tilbage til en enkelt prompt. Testopkald og
**Tal** kører kladden.

<Tip>
  [Copiloten](/da/guides/ask-the-copilot) kan opbygge trin ud fra en beskrivelse
  ("tilføj et trin, der verificerer fødselsdato før booking") og redigere ét trin
  uden at berøre de andre.
</Tip>

### Trinfelter

| Felt | Betydning |
| --- | --- |
| `id` | Påkrævet. Små bogstaver, cifre og understregninger, der starter med et bogstav, op til 40 tegn. Unik inden for agenten. |
| `name` | Påkrævet vist navn, 1 til 80 tegn. |
| `instructions` | Påkrævet, op til 20.000 tegn. Understøtter `{{var}}` [opkaldsvariabler](/da/guides/call-variables), ligesom `prompt`. |
| `say` | Valgfri replik, der siges ordret, når trinnet åbnes, op til 1.000 tegn. Understøtter `{{var}}`. |
| `tools` | `null` giver trinnet alle værktøjer, der er knyttet til agenten. En liste begrænser trinnet til disse værktøjer efter navn. Indbyggede handlinger som `end_call` og `transfer_call` følger agentens indstillinger i hvert trin. |
| `collect` | Op til 20 værdier, som trinnet indsamler. Hver har et `name`, en `type`, en `description` og `required` (standard `true`). |
| `on_enter_tool` | Valgfrit værktøjsnavn, der kaldes automatisk, når trinnet åbnes. Se [Webhook-trin](#webhook-steps). |
| `transitions` | Sorteret liste over, hvor trinnet kan gå hen næste gang. Se [Overgange](#transitions). |
| `global_when` | Valgfrit. Gør trinnet tilgængeligt fra ethvert trin. Se [Globale trin](#global-steps). |
| `voice` | Valgfrit stemme-id for dette trin. Ignoreres, når agenten bruger en tilpasset stemmekonfiguration. |

Selve grafen er `{"start_step": "<step id>", "steps": [...]}`. Opkaldet
begynder i `start_step`.

## Overgange

Hver overgang har `to`, et trin-id, og præcis én af følgende:

- **`when`**: almindeligt sprog, og **modellen afgør**. Agenten får et
  indbygget `go_to_step`-værktøj med en liste over de trin, den kan gå til,
  hvor hver `when` angiver årsagen til at vælge det.
- **`condition`**: en regel for indsamlede værdier, og **kode afgør**. Modellen
  kan ikke springe den over eller tale sig uden om den.
- **`"always": true`**: fortsæt uden kontrol. Kode afgør først: Så snart et
  trin åbnes, eller når dets obligatoriske værdier er indsamlet, vælges den
  første matchende `condition`- eller `always`-overgang, før modellen kan vælge
  en `when`. Placer derfor `always` efter betingelserne som deres reserve, eller
  alene for at kæde et trin direkte sammen med det næste. Et trin med `always`
  venter aldrig på et `when`-valg.

En `condition` er `{"value": <collected name or dotted path>, "op": <op>, "target": <literal>}`:

| `op` | Sand, når værdien |
| --- | --- |
| `eq`, `ne` | er lig med eller ikke er lig med `target` |
| `lt`, `lte`, `gt`, `gte` | er mindre end, højst, større end eller mindst `target` |
| `in`, `not_in` | er eller ikke er en af værdierne på listen `target` |
| `exists`, `missing` | er eller ikke er indsamlet (ingen `target`) |

`eq`, `ne`, `in` og `not_in` sammenligner tekst uden forskel på store og små
bogstaver efter fjernelse af mellemrum. Tal sammenlignes som tal og datoer som
`YYYY-MM-DD`-strenge. En værdi, der aldrig blev indsamlet, gør alle operatorer
falske undtagen `missing`.

Skriv `when` og `global_when` som en betingelse, for eksempel "Opkalderen vil
booke en aftale", ikke som noget, der skal siges. Agenten ser dem som interne
rutenoter og får besked på aldrig at læse dem op eller nævne, at den skifter
trin.

Når modellen kalder `go_to_step`:

1. Alle `required`-værdier i trinnet skal være til stede. Hvis en mangler, får
   modellen besked om hvilken, og spørger opkalderen efter den.
2. Værdierne gemmes.
3. `condition`- og `always`-overgange kontrolleres i rækkefølge. Det første
   match vælges.
4. Ellers flytter agenten til det trin, modellen valgte.
5. Hvis intet matcher, og modellen ikke angav noget trin, bliver agenten, hvor
   den er.

Et hop til et [globalt trin](#global-steps) er undtagelsen: Opkalderen har
skiftet emne, så det gennemføres, selv når det aktuelle trin stadig mangler
obligatoriske værdier, og før det trins betingelser kontrolleres.

`condition`- og `always`-overgange kontrolleres også, hver gang et trin åbnes,
så en række kodeafgjorte trin afvikles i et forløb. Kæden stopper:

- ved et trin, den allerede har besøgt i dette forløb;
- efter 8 hop;
- ved et trin, der stadig har obligatoriske værdier at indsamle, medmindre
  trinnet har et `on_enter_tool` (et webhook-trin ruter altid ud fra sit resultat).

Kun `say`-linjen i det trin, hvor kæden stopper, bliver sagt.

Et trin uden overgange er **afsluttende**. Agenten afslutter der og afslutter
eller viderestiller opkaldet med sine normale indbyggede handlinger.

## Indsamling af værdier

Angiv, hvad et trin skal bruge, i `collect`. Modellen sender værdierne, når den
kalder `go_to_step`, og de forbliver tilgængelige resten af opkaldet.

| `type` | Indeholder |
| --- | --- |
| `string` | Vilkårlig tekst |
| `number` | Et tal |
| `boolean` | `true` eller `false` |
| `date` | En dato som `YYYY-MM-DD` |

Indsamlede værdier er opkaldsindhold. De vises på opkaldet ved siden af
transskriptionen og følger de samme regler for opbevaring, sletning og
redigering. Når agentens opkaldsoptagelse er slået fra, gemmes indsamlede
værdier hverken eller sendes i webhooks; tidslinjen for trinnet vises stadig.
Se [Hvor du kan se det på et opkald](#where-to-see-it-on-a-call).

## Say-linjer

`say` siges præcis som skrevet, når agenten går ind i trinnet. Modellen fortsætter
derefter i det nye trin i samme svar og ved, at linjen lige er blevet sagt, så den
gentager den ikke. Brug `say` til hilsner, påkrævede oplysninger og faste
formuleringer, og lad modellen håndtere resten af svaret.

Starttrinnets `say` er agentens indledende linje, når den taler først, efter
eventuelle samtykkemeddelelser. Når opkalderen taler først, indleder den agentens
første svar til en person, aldrig til et IVR-system eller en telefonsvarers hilsen.

Et trins `say` siges ikke igen, når opkaldet vender tilbage til det via
`__previous__` eller en tilbageoverdragelse. Skriv det, som det skal lyde: stav
alt, som stemmen kan mislæse. Say-linjer understøtter opkaldsvariabler som
`{{var}}`, men ikke indsamlede værdier.

## Webhook-trin

Angiv `on_enter_tool` til et af agentens værktøjer, så kører det, så snart
trinnet åbnes, uden at vente på modellen. Dets argumenter er de indsamlede
værdier, hvis navne matcher værktøjets parameternavne. Resultatet gemmes som en
indsamlet værdi med navnet `<tool>_result`, afkortet til 4 KB, og trinnets
`condition`- og `always`-overgange kontrolleres med det samme, så opslaget kan
rute opkaldet baseret på sit eget resultat.

Den gemte værdi har to felter:

| Felt | Indeholder |
| --- | --- |
| `status` | HTTP-statuskoden, som dit endpoint returnerede. |
| `response` | Svarteksten. |

Rut på et felt i svarteksten med `lookup_account_result.response.<field>` og på
statuskoden med `lookup_account_result.status`.

Opslaget kører i op til 8 sekunder eller værktøjets egen timeout, hvis den er
kortere. Hvis det tager længere end 3 sekunder, siger agenten en kort linje, så
opkalderen ikke efterlades i stilhed. Hvis dit endpoint returnerer en statuskode
på 400 eller højere eller ikke svarer i tide, fortæller agenten opkalderen, at
den ikke kunne kontrollere det lige nu, og fortsætter med det, den kan gøre.

## Globale trin

Et trin med `global_when` kan nås fra ethvert trin, når den pågældende
beskrivelse gælder. Modellen afgør det, som med `when`. Brug det til emner, en
opkalder kan bringe op når som helst: spørgsmål om fakturering, en anmodning om
et menneske, en klage.

En overgang med `"to": "__previous__"` i et globalt trin returnerer opkaldet til
det trin, der var aktivt før det, så opkalderen fortsætter, hvor vedkommende slap.
Trinnet genoptages: dets `on_enter_tool` kører ikke igen, dets `say` gentages
ikke, og agenten fortsætter det uden at starte forfra.

## Overdragelser

`handoffs` viser andre agenter i din organisation, som kan overtage opkaldet:

```json
[{"agent_id": 413, "when": "The caller asks about billing or a refund"}]
```

Agenten får et indbygget `hand_off`-værktøj med disse agenter og begrundelser. Ligesom ved overgange er hver `when` en intern routingnote, som aldrig læses op.

Når agenten viderestiller, siger den én kort linje, der fortæller opkalderen, hvor de bliver stillet om til, såsom "Selvfølgelig, jeg stiller dig om til vores faktureringsteam", med sin egen stemme. Derefter overtager målagentens prompt, trin, værktøjer og stemme, og opkaldet fortsætter med samme transskription. Den nye agent præsenterer sig kort og besvarer opkalderens seneste anmodning; den annoncerer ikke en viderestilling. Målagentens vidensbase er derefter tilgængelig.

Første gang et opkald når en agent, starter det i agentens `start_step`: trinnets `on_enter_tool` kører, og dets `say` bliver sagt. Når opkaldet viderestilles tilbage til en agent, det allerede har besøgt, genoptager agenten det trin, den var på, uden at køre `on_enter_tool`, gentage sit `say` eller præsentere sig selv igen. Indsamlede værdier deles af alle agenter på opkaldet.

- En målagent skal være en agent i samme organisation, og en agent kan ikke viderestille til sig selv.
- Alt på opkaldsniveau forbliver hos agenten, der besvarede opkaldet: produkt, sprog, hvem der taler først, voicemail, samtykkeerklæring og alle andre opkaldsindstillinger.
- Målagenter kan viderestille yderligere og tilbage. Ét opkald kan nå op til 8 agenter.
- Et testopkald kører kladden af den agent, du tester. De agenter, den viderestiller til, kører deres implementerede versioner.
- Hvis to agenter har et værktøj med samme navn og forskellige definitioner, beholdes kun ét til opkaldet, og den besvarende agents værktøj vinder altid. Konfiguratoren advarer dig, når du gemmer.
- En agent kan have overdragelser uden trin. Hele dens prompt bruges som den er.

`go_to_step` og `hand_off` er reserveret på agenter med trin eller overdragelser, så dine egne værktøjer kan ikke bruge disse navne.

## Hvor du kan se det på et opkald

Åbn opkaldet i **Opkaldshistorik**. En trintidslinje ved siden af transskriptionen viser hvert trin, opkaldet gik ind i, og hvorfor, og de indsamlede værdier vises sammen med den.

[Opkaldsobjektet](/api-reference/calls#retrieve-a-call) og webhooken for fuldførte opkald ([`telephony.complete` / `web.complete`](/da/webhooks/call-complete)) indeholder de samme data som `steps_trace` og `collected_values`. Begge mangler på opkald uden trin.

```json
"steps_trace": [
  {"t_ms": 0, "agent": "a412", "step": "greet", "via": "start"},
  {"t_ms": 51230, "agent": "a412", "step": "verify", "via": "model"},
  {"t_ms": 98410, "agent": "a412", "step": "minor", "via": "condition"}
],
"collected_values": {"full_name": "Dana Reyes", "dob": "2010-04-02", "age": 15}
```

`agent` er `a` efterfulgt af agent-id'et. `via` angiver, hvad der flyttede opkaldet:

| `via` | Betydning |
| --- | --- |
| `start` | Opkaldet begyndte i dette trin. |
| `model` | Modellen valgte trinnet via `go_to_step`, en `when` eller en `global_when`. |
| `condition` | En `condition`- eller `always`-overgang matchede. |
| `on_enter` | En overgang matchede resultatet fra et webhook-trin. |
| `handoff` | En anden agent overtog. |

## Hvor trin kører

Trin kører indbygget på **Spark**, **Bolt** og alle **Storm**-produkter ved indgående, udgående og kampagneopkald, testopkald samt web- og widgetopkald.

Overalt ellers fungerer agenten stadig, blot uden strukturen: den kører en flad prompt, der samler de delte instruktioner og alle trin i rækkefølge. Det omfatter:

- de eksperimentelle Bolt-produkter;
- [Realtime](/da/guides/use-with-openai-realtime)-sessioner, herunder sessioner for en gemt agent;
- indlejrede konfigurationer returneret af en webhook for [dynamisk opkaldskonfiguration](/da/guides/dynamic-call-config). En webhook, der returnerer et `agent_id`, bruger den pågældende agents trin.

## Begrænsninger

| Begrænsning | Værdi |
| --- | --- |
| Trin pr. agent | 100 |
| Indsamlede værdier pr. trin | 20 |
| Overleveringsmål pr. agent | 8 |
| Agenter, der kan nås i ét opkald | 8 |
| Størrelse på `steps`-JSON | 200 KB |
| Trin-`instructions` | 20.000 tegn |
| `say`-linje | 1.000 tegn |
| Gemt `on_enter_tool`-resultat | 4 KB |

En gemning, der bryder en regel, returnerer `400` med stien til det ugyldige felt,
f.eks. `steps.steps[2].transitions[0].to`. Værktøjsnavne i `tools` og
`on_enter_tool` skal være værktøjer, der er knyttet til agenten.

Sprog pr. trin, scriptede trin, der springer modellen over, og indsamlede værdier
i say-linjer understøttes ikke.

## Importerede agenter

[Import](/da/guides/import-agents) fra Retell, Bland, Vapi eller ElevenLabs
overfører agenter med flere prompter, flows, pathways og workflows som trin,
og squads og agentoverførsler som overleveringer mellem de importerede agenter.
Gennemgangssiden viser begge dele, før du importerer.

## Eksempel: patientregistrering hos tandlægen

Tre trin i rækkefølge: hilsen, indsamling af patientoplysninger, booking.

```json
{
  "prompt": "You are Ava, the front desk assistant at Acme Dental. Be warm and brief. Ask one question at a time.",
  "steps": {
    "start_step": "greet",
    "steps": [
      {
        "id": "greet",
        "name": "Greeting",
        "instructions": "Greet the caller and ask how you can help.",
        "say": "Thanks for calling Acme Dental, this is Ava. How can I help you today?",
        "tools": null,
        "collect": [],
        "transitions": [
          {"to": "details", "when": "The caller wants to book an appointment"}
        ]
      },
      {
        "id": "details",
        "name": "Patient details",
        "instructions": "Ask for the caller's full name, date of birth and the reason for the visit. Read the date of birth back and ask the caller to confirm it.",
        "tools": null,
        "collect": [
          {"name": "full_name", "type": "string", "description": "Caller's full name", "required": true},
          {"name": "dob", "type": "date", "description": "Date of birth", "required": true},
          {"name": "reason", "type": "string", "description": "Reason for the visit", "required": true},
          {"name": "new_patient", "type": "boolean", "description": "First visit to the practice", "required": false}
        ],
        "transitions": [
          {"to": "book", "when": "The caller has confirmed their details"}
        ]
      },
      {
        "id": "book",
        "name": "Book",
        "instructions": "Offer the two earliest open slots from book_slot and book the one the caller picks. Confirm the date and time, then say goodbye and end the call.",
        "tools": ["book_slot"],
        "collect": [],
        "transitions": []
      }
    ]
  }
}
```

Klargør den med `PATCH /v1/agents/{agent_id}`, prøv den med **Tal**, og implementer den derefter.
Trinnet `details` kan ikke overlevere til booking, før navn, fødselsdato
og årsag er indsamlet. `new_patient` er valgfri.

## Eksempel: en gren med aldersgrænse

Modellen kan tale med alle, men kode afgør, hvem der får en booking. Indsaml
alderen, og diriger derefter ud fra den, før modellens eget valg tages i betragtning.

```json
{
  "id": "verify",
  "name": "Verify age",
  "instructions": "Ask for the caller's age.",
  "tools": null,
  "collect": [
    {"name": "age", "type": "number", "description": "Caller's age in years", "required": true}
  ],
  "transitions": [
    {"to": "guardian", "condition": {"value": "age", "op": "lt", "target": 18}},
    {"to": "book", "when": "The caller has given their age"}
  ]
}
```

En opkalder, der siger femten, går til `guardian`, uanset hvad modellen beslutter.
Alle andre går til `book`. Begge er almindelige trin andre steder i grafen.

## Eksempel: webhook-trin til kontoopslag

Den, der ringer, oplyser et kontonummer, opslaget køres ved indgang til næste trin,
og resultatet vælger ruten. Trinene `not_found`, `collections` og `support`
er udeladt for korthedens skyld.

```json
[
  {
    "id": "identify",
    "name": "Identify",
    "instructions": "Ask for the caller's account number and read it back digit by digit.",
    "tools": null,
    "collect": [
      {"name": "account_number", "type": "string", "description": "Account number", "required": true}
    ],
    "transitions": [
      {"to": "lookup", "when": "The caller has confirmed their account number"}
    ]
  },
  {
    "id": "lookup",
    "name": "Look up account",
    "instructions": "Tell the caller what you found on their account and ask how you can help.",
    "tools": ["lookup_account"],
    "collect": [],
    "on_enter_tool": "lookup_account",
    "transitions": [
      {"to": "not_found", "condition": {"value": "lookup_account_result.response.found", "op": "eq", "target": false}},
      {"to": "collections", "condition": {"value": "lookup_account_result.response.account_status", "op": "in", "target": ["past_due", "suspended"]}},
      {"to": "support", "when": "The caller needs help with an active account"}
    ]
  }
]
```

`lookup_account` modtager `account_number`, fordi parameteren har det
navn. Hvis svarbrødteksten indeholder `"found": false`, går opkaldet til
`not_found`. Hvis dets `account_status` er `past_due` eller `suspended`, går det til
`collections`. En aktiv konto forbliver i `lookup`, hvor modellen hjælper og
fortsætter til `support`. Hvis du vil sende et mislykket opslag til et særskilt trin, skal du først tilføje
betingelser for status: et fejlsvar gemmer sin statuskode, så
`{"value": "lookup_account_result.status", "op": "gte", "target": 400}`
opfanger det, og en timeout eller intet svar gemmer `"error"`, så
`{"value": "lookup_account_result.status", "op": "eq", "target": "error"}`
opfanger det.

## Eksempel: fra reception til fakturering

To agenter. Receptionen (agent `412`) besvarer alle opkald og viderestiller fakturerings-
spørgsmål til en faktureringsagent (agent `413`) med sin egen prompt, værktøjer og stemme.

På receptionen:

```json
{
  "handoffs": [
    {"agent_id": 413, "when": "The caller asks about a bill, a payment or a refund"}
  ]
}
```

På faktureringsagenten, så den kan viderestille den, der ringer, tilbage:

```json
{
  "handoffs": [
    {"agent_id": 412, "when": "The billing question is resolved and the caller needs something else"}
  ]
}
```

Receptionen siger en kort sætning som "Lad mig stille dig videre til vores fakturerings-
team", og faktureringsagenten præsenterer sig selv og fortsætter samtalen
der, hvor receptionen slap. Når fakturering viderestiller tilbage, fortsætter receptionen
der, hvor den var, uden at hilse på den, der ringer, igen. Opkaldets produkt,
sprog, samtykkemeddelelse og andre opkaldsindstillinger forbliver hos receptionen,
fordi den besvarede opkaldet.

Hvis fakturering kun har brug for sine egne instruktioner og ikke sin egen agent,
skal du i stedet bruge et globalt trin på receptionen. Når spørgsmålet er besvaret, går
opkaldet tilbage til det trin, den der ringer, var i:

```json
{
  "id": "billing",
  "name": "Billing questions",
  "instructions": "Answer questions about bills and payments. Offer to send a payment link by email.",
  "tools": null,
  "collect": [],
  "transitions": [
    {"to": "__previous__", "when": "The billing question is answered"}
  ],
  "global_when": "The caller asks about a bill or payment at any point"
}
```

## Næste trin

<CardGroup cols={2}>
  <Card title="Guide til prompting" icon="pen" href="/da/guides/prompting">
    Skriv fælles instruktioner og trininstruktioner, der fungerer i telefonen.
  </Card>
  <Card title="Byg en værktøjsintegration" icon="code" href="/da/guides/build-tool-integration">
    Opret de værktøjer, som dine trin og webhooktrin kalder.
  </Card>
  <Card title="Test dine agenter" icon="flask" href="/da/guides/test-agents">
    Kør de samme scenarier mod hver gren, før du implementerer.
  </Card>
  <Card title="Agents API" icon="robot" href="/api-reference/agents">
    Alle agentfelter, kladder og implementering.
  </Card>
</CardGroup>
