Пређите на главни садржај
OpenAI

6. август 2024.

Компанија

Представљамо структуриране излазе у API-ју

Представљамо структуриране излазе у API-ју — излази модела сада се поуздано придржавају JSON Schema шема које достављају програмери.

Слика приказује апстрактан образац малих квадрата у различитим нијансама плаве, зелене и светложуте боје. Квадрати су распоређени у формацији налик мрежи, стварајући ефекат мозаика са меком, пастелном палетом боја.

Прошле године смо на DevDay-у представили JSON режим — користан градивни блок за програмере који желе да праве поуздане апликације са нашим моделима. Иако JSON режим побољшава поузданост модела при генерисању исправних JSON излаза, он не гарантује да ће одговор модела бити у складу са одређеном шемом. Данас представљамо структуриране излазе у API-ју, нову функцију осмишљену да обезбеди да излази које модел генерише тачно одговарају JSON Schema шемама које достављају програмери.

Генерисање структурираних података из неструктурираних улаза један је од кључних случајева употребе AI-ја у данашњим апликацијама. Програмери користе OpenAI API за изградњу моћних асистената који имају могућност да прибављају податке и одговарају на питања путем позивања функције(отвара се у новом прозору), издвајају структуриране податке за унос података и граде вишекорачне агентске токове рада који омогућавају великим језичким моделима (LLM) да предузимају радње. Програмери већ дуго заобилазе ограничења великих језичких модела (LLM) у овој области помоћу open source алата, инструкција и поновљеног слања захтева како би осигурали да излази модела одговарају форматима потребним за интероперабилност са њиховим системима. Структурирани излази решавају овај проблем тако што ограничавају OpenAI моделе да одговарају шемама које достављају програмери и тако што обучавају наше моделе да боље разумеју сложене шеме.

У нашим евалуацијама праћења сложених JSON Schema шема, наш нови модел gpt-4o-2024-08-06 са структурираним излазима постиже савршених 100%. Поређења ради, gpt-4-0613 постиже мање од 40%.

Са структурираним излазима, gpt-4o-2024-08-06 постиже 100% поузданости у нашим евалуацијама, уз савршено поклапање са излазним шемама.

Како користити структуриране излазе

Представљамо структуриране излазе у два облика у API-ју: 

1. Позивање функције: структурирани излази преко tools доступни су подешавањем strict: true унутар дефиниције ваше функције. Ова функција ради са свим моделима који подржавају алатке, укључујући све моделе gpt-4-0613 и gpt-3.5-turbo-0613 и новије. Када су структурирани излази омогућени, излази модела ће одговарати достављеној дефиницији алатке.

JSON

1
POST /v1/chat/completions
2
{
3
"model": "gpt-4o-2024-08-06",
4
"messages": [
5
{
6
"role": "system",
7
"content": "You are a helpful assistant. The current date is August 6, 2024. You help users query for the data they are looking for by calling the query function."
8
},
9
{
10
"role": "user",
11
"content": "look up all my orders in may of last year that were fulfilled but not delivered on time"
12
}
13
],
14
"tools": [
15
{
16
"type": "function",
17
"function": {
18
"name": "query",
19
"description": "Execute a query.",
20
"strict": true,
21
"parameters": {
22
"type": "object",
23
"properties": {
24
"table_name": {
25
"type": "string",
26
"enum": ["orders"]
27
},
28
"columns": {
29
"type": "array",
30
"items": {
31
"type": "string",
32
"enum": [
33
"id",
34
"status",
35
"expected_delivery_date",
36
"delivered_at",
37
"shipped_at",
38
"ordered_at",
39
"canceled_at"
40
]
41
}
42
},
43
"conditions": {
44
"type": "array",
45
"items": {
46
"type": "object",
47
"properties": {
48
"column": {
49
"type": "string"
50
},
51
"operator": {
52
"type": "string",
53
"enum": ["=", ">", "<", ">=", "<=", "!="]
54
},
55
"value": {
56
"anyOf": [
57
{
58
"type": "string"
59
},
60
{
61
"type": "number"
62
},
63
{
64
"type": "object",
65
"properties": {
66
"column_name": {
67
"type": "string"
68
}
69
},
70
"required": ["column_name"],
71
"additionalProperties": false
72
}
73
]
74
}
75
},
76
"required": ["column", "operator", "value"],
77
"additionalProperties": false
78
}
79
},
80
"order_by": {
81
"type": "string",
82
"enum": ["asc", "desc"]
83
}
84
},
85
"required": ["table_name", "columns", "conditions", "order_by"],
86
"additionalProperties": false
87
}
88
}
89
}
90
]
91
}

2. Нова опција за параметар response_format: програмери сада могу да наведу JSON Schema преко json_schema, нове опције за параметар response_format. Ово је корисно када модел не позива алатку, већ уместо тога одговара кориснику на структуриран начин. Ова функција ради са нашим најновијим GPT‑4o моделима: gpt-4o-2024-08-06, објављеним данас, и gpt-4o-mini-2024-07-18. Када се response_format наведе са strict: true, излази модела ће одговарати достављеној шеми.

Захтев

1
POST /v1/chat/completions
2
{
3
"model": "gpt-4o-2024-08-06",
4
"messages": [
5
{
6
"role": "system",
7
"content": "You are a helpful math tutor."
8
},
9
{
10
"role": "user",
11
"content": "solve 8x + 31 = 2"
12
}
13
],
14
"response_format": {
15
"type": "json_schema",
16
"json_schema": {
17
"name": "math_response",
18
"strict": true,
19
"schema": {
20
"type": "object",
21
"properties": {
22
"steps": {
23
"type": "array",
24
"items": {
25
"type": "object",
26
"properties": {
27
"explanation": {
28
"type": "string"
29
},
30
"output": {
31
"type": "string"
32
}
33
},
34
"required": ["explanation", "output"],
35
"additionalProperties": false
36
}
37
},
38
"final_answer": {
39
"type": "string"
40
}
41
},
42
"required": ["steps", "final_answer"],
43
"additionalProperties": false
44
}
45
}
46
}
47
}

Безбедни структурирани излази

Безбедност је највећи приоритет за OpenAI — нова функционалност структурираних излаза придржаваће се наших постојећих безбедносних политика и и даље ће омогућавати моделу да одбије небезбедан захтев. Да би развој био једноставнији, у API одговорима постоји нова стринг вредност refusal која омогућава програмерима да програмски открију да ли је модел генерисао одбијање уместо излаза који одговара шеми. Када одговор не укључује одбијање и одговор модела није превремено прекинут (као што показује finish_reason), тада ће одговор модела поуздано произвести исправан JSON који одговара достављеној шеми.

JSON

1
{
2
"id": "chatcmpl-9nYAG9LPNonX8DAyrkwYfemr3C8HC",
3
"object": "chat.completion",
4
"created": 1721596428,
5
"model": "gpt-4o-2024-08-06",
6
"choices": [
7
{
8
"index": 0,
9
"message": {
10
"role": "assistant",
11
"refusal": "I'm sorry, I cannot assist with that request."
12
},
13
"logprobs": null,
14
"finish_reason": "stop"
15
}
16
],
17
"usage": {
18
"prompt_tokens": 81,
19
"completion_tokens": 11,
20
"total_tokens": 92
21
},
22
"system_fingerprint": "fp_3407719c7f"
23
}

Изворна подршка у SDK-у

Наши Python и Node SDK-ови су ажурирани са изворном подршком за структуриране излазе. Достављање шеме за алатке или као формат одговора једноставно је као достављање Pydantic или Zod објекта, а наши SDK-ови ће се побринути за претварање типа података у подржану JSON шему, аутоматску десеријализацију JSON одговора у типизирану структуру података и рашчлањивање одбијања ако до њих дође.

Следећи примери приказују изворну подршку за структуриране излазе са позивањем функције.

Python

1
from enum import Enum
2
from typing import Union
3

4
from pydantic import BaseModel
5

6
import openai
7
from openai import OpenAI
8

9

10
class Table(str, Enum):
11
orders = "orders"
12
customers = "customers"
13
products = "products"
14

15

16
class Column(str, Enum):
17
id = "id"
18
status = "status"
19
expected_delivery_date = "expected_delivery_date"
20
delivered_at = "delivered_at"
21
shipped_at = "shipped_at"
22
ordered_at = "ordered_at"
23
canceled_at = "canceled_at"
24

25

26
class Operator(str, Enum):
27
eq = "="
28
gt = ">"
29
lt = "<"
30
le = "<="
31
ge = ">="
32
ne = "!="
33

34

35
class OrderBy(str, Enum):
36
asc = "asc"
37
desc = "desc"
38

39

40
class DynamicValue(BaseModel):
41
column_name: str
42

43

44
class Condition(BaseModel):
45
column: str
46
operator: Operator
47
value: Union[str, int, DynamicValue]
48

49

50
class Query(BaseModel):
51
table_name: Table
52
columns: list[Column]
53
conditions: list[Condition]
54
order_by: OrderBy
55

56

57
client = OpenAI()
58

59
completion = client.beta.chat.completions.parse(
60
model="gpt-4o-2024-08-06",
61
messages=[
62
{
63
"role": "system",
64
"content": "You are a helpful assistant. The current date is August 6, 2024. You help users query for the data they are looking for by calling the query function.",
65
},
66
{
67
"role": "user",
68
"content": "look up all my orders in may of last year that were fulfilled but not delivered on time",
69
},
70
],
71
tools=[
72
openai.pydantic_function_tool(Query),
73
],
74
)
75

76
print(completion.choices[0].message.tool_calls[0].function.parsed_arguments)

Изворна подршка за структуриране излазе доступна је и за response_format.

Python

1
from pydantic import BaseModel
2

3
from openai import OpenAI
4

5

6
class Step(BaseModel):
7
explanation: str
8
output: str
9

10

11
class MathResponse(BaseModel):
12
steps: list[Step]
13
final_answer: str
14

15

16
client = OpenAI()
17

18
completion = client.beta.chat.completions.parse(
19
model="gpt-4o-2024-08-06",
20
messages=[
21
{"role": "system", "content": "You are a helpful math tutor."},
22
{"role": "user", "content": "solve 8x + 31 = 2"},
23
],
24
response_format=MathResponse,
25
)
26

27
message = completion.choices[0].message
28
if message.parsed:
29
print(message.parsed.steps)
30
print(message.parsed.final_answer)
31
else:
32
print(message.refusal)

Додатни случајеви употребе

Програмери често користе OpenAI моделе за генерисање структурираних података за разне случајеве употребе. Неки додатни примери укључују:

Динамичко генерисање корисничких интерфејса на основу намере корисника

На пример, програмери могу да користе структуриране излазе за прављење апликација које генеришу код или кориснички интерфејс. Сви следећи примери користе исти response_format и могу се користити за генерисање различитих корисничких интерфејса на основу уноса корисника.

Систем
Помоћник сте за кориснички интерфејс. Ваш задатак је да помогнете корисницима да визуализују своје идеје за веб-сајт и апликацију.
Формат одговора
Асистент
1
{
2
"type": "div",
3
"label": "",
4
"children": [
5
{
6
"type": "header",
7
"label": "",
8
"children": [
9
{
10
"type": "div",
11
"label": "Green Thumb Gardening",
12
"children": [],
13
"attributes": [{ "name": "className", "value": "site-title" }]
14
},
15
{
16
"type": "div",
17
"label": "Bringing Life to Your Garden",
18
"children": [],
19
"attributes": [{ "name": "className", "value": "site-tagline" }]
20
}
21
],
22
"attributes": [{ "name": "className", "value": "header" }]
23
},
24
{
25
"type": "section",
26
"label": "",
27
"children": [
28
{
29
"type": "div",
30
"label": "",
31
"children": [
32
{
33
"type": "div",
34
"label": "About Us",
35
"children": [
36
{
37
"type": "div",
38
"label": "At Green Thumb Gardening, we specialize in transforming your outdoor spaces into beautiful, thriving gardens. Our team has decades of experience in horticulture and landscape design.",
39
"children": [],
40
"attributes": [
41
{ "name": "className", "value": "about-description" }
42
]
43
}
44
],
45
"attributes": [{ "name": "className", "value": "about-section" }]
46
}
47
],
48
"attributes": [{ "name": "className", "value": "content" }]
49
}
50
],
51
"attributes": [{ "name": "className", "value": "about-container" }]
52
},
53
{
54
"type": "section",
55
"label": "",
56
"children": [
57
{
58
"type": "div",
59
"label": "",
60
"children": [
61
{
62
"type": "div",
63
"label": "Our Services",
64
"children": [
65
{
66
"type": "div",
67
"label": "Garden Design",
68
"children": [],
69
"attributes": [
70
{ "name": "className", "value": "service-item" }
71
]
72
},
73
{
74
"type": "div",
75
"label": "Plant Care & Maintenance",
76
"children": [],
77
"attributes": [
78
{ "name": "className", "value": "service-item" }
79
]
80
},
81
{
82
"type": "div",
83
"label": "Seasonal Cleanup",
84
"children": [],
85
"attributes": [
86
{ "name": "className", "value": "service-item" }
87
]
88
},
89
{
90
"type": "div",
91
"label": "Custom Landscaping",
92
"children": [],
93
"attributes": [
94
{ "name": "className", "value": "service-item" }
95
]
96
}
97
],
98
"attributes": [{ "name": "className", "value": "services-list" }]
99
}
100
],
101
"attributes": [{ "name": "className", "value": "content" }]
102
}
103
],
104
"attributes": [{ "name": "className", "value": "services-container" }]
105
}
106
],
107
"attributes": [{ "name": "className", "value": "landing-page" }]
108
}
109

Welcome to Green Thumb Gardening
Bringing Life to Your Garden
At Green Thumb Gardening, we specialize in transforming your outdoor spaces into beautiful, thriving gardens. Our team has decades of experience in horticulture and landscape design.
Our services
Garden Design
Plant Care & Maintenance
Seasonal Cleanup
Custom Landscaping

Раздвајање коначног одговора од пратећег резоновања или додатних коментара

Може бити корисно дати моделу засебно поље за chain of thought како би се побољшао коначни квалитет одговора.

JSON

1
{
2
"model": "gpt-4o-2024-08-06",
3
"messages": [
4
{
5
"role": "system",
6
"content": "You are a helpful assistant"
7
},
8
{
9
"role": "user",
10
"content": "9.11 and 9.9 -- which is bigger?"
11
}
12
],
13
"response_format": {
14
"type": "json_schema",
15
"json_schema": {
16
"name": "reasoning_schema",
17
"strict": true,
18
"schema": {
19
"type": "object",
20
"properties": {
21
"reasoning_steps": {
22
"type": "array",
23
"items": {
24
"type": "string"
25
},
26
"description": "The reasoning steps leading to the final conclusion."
27
},
28
"answer": {
29
"type": "string",
30
"description": "The final answer, taking into account the reasoning steps."
31
}
32
},
33
"required": ["reasoning_steps", "answer"],
34
"additionalProperties": false
35
}
36
}
37
}
38
}

Издвајање структурираних података из неструктурираних података

На пример, да се моделу зада да издвоји ствари као што су обавезе, рокови и задужења из бележака са састанка.

JSON

1
POST /v1/chat/completions
2
{
3
"model": "gpt-4o-2024-08-06",
4
"messages": [
5
{
6
"role": "system",
7
"content": "Extract action items, due dates, and owners from meeting notes."
8
},
9
{
10
"role": "user",
11
"content": "...meeting notes go here..."
12
}
13
],
14
"response_format": {
15
"type": "json_schema",
16
"json_schema": {
17
"name": "action_items",
18
"strict": true,
19
"schema": {
20
"type": "object",
21
"properties": {
22
"action_items": {
23
"type": "array",
24
"items": {
25
"type": "object",
26
"properties": {
27
"description": {
28
"type": "string",
29
"description": "Description of the action item."
30
},
31
"due_date": {
32
"type": ["string", "null"],
33
"description": "Due date for the action item, can be null if not specified."
34
},
35
"owner": {
36
"type": ["string", "null"],
37
"description": "Owner responsible for the action item, can be null if not specified."
38
}
39
},
40
"required": ["description", "due_date", "owner"],
41
"additionalProperties": false
42
},
43
"description": "List of action items from the meeting."
44
}
45
},
46
"required": ["action_items"],
47
"additionalProperties": false
48
}
49
}
50
}
51
}

Како то ради у позадини

Применили смо дводелни приступ за побољшање поузданости излаза модела који одговарају JSON Schema шеми. Прво, обучили смо наш најновији модел gpt-4o-2024-08-06 да разуме сложене шеме и како да на најбољи начин производи излазе који им одговарају. Међутим, понашање модела је по својој природи недетерминистичко — упркос побољшањима перформанси овог модела (93% на нашем бенчмарку), он и даље није достигао поузданост која је програмерима потребна за изградњу робусних апликација. Зато смо применили и детерминистички, инжењерски заснован приступ да ограничимо излазе модела и постигнемо 100% поузданост.

Ограничено декодирање

Наш приступ је заснован на техници познатој као ограничено узорковање или ограничено декодирање. Подразумевано, када се модели узоркују да би произвели излазе, они су потпуно неограничени и могу изабрати било који токен из речника као следећи излаз. Управо та флексибилност омогућава моделима да греше; на пример, углавном су слободни да у било ком тренутку изаберу токен витичасте заграде, чак и када то не би произвело исправан JSON. Да бисмо форсирали исправне излазе, ограничавамо наше моделе само на токене који би били важећи према достављеној шеми, а не на све доступне токене.

Ово ограничење може бити тешко спровести у пракси, пошто се токени који су важећи мењају током излаза модела. Рецимо да имамо следећу шему:

JSON

1
{
2
"type": "object",
3
"properties": {
4
"value": { "type": "number" }
5
},
6
"required": ["value"],
7
"additionalProperties": false
8
}

Токени који су важећи на почетку излаза укључују ствари као што су {, {“, {
итд. Међутим, када је модел већ изабрао {“val, онда { више није важећи токен. Зато морамо да применимо динамичко ограничено декодирање и да одредимо који су токени важећи после сваког генерисаног токена, уместо унапред на почетку одговора.

Да бисмо то урадили, достављену JSON Schema шему претварамо у бесконтекстну граматику (CFG). Граматика је скуп правила која дефинишу језик, а бесконтекстна граматика је граматика која је у складу са одређеним правилима. Можете размишљати о JSON-у и JSON Schema шеми као о посебним језицима са правилима која дефинишу шта је у њима важеће. Као што у енглеском није исправно имати реченицу без глагола, тако ни у JSON-у није исправно имати завршни зарез.

Зато за сваку JSON Schema шему израчунавамо граматику која представља ту шему и унапред обрађујемо њене компоненте да би биле лако доступне током узорковања модела. Зато први захтев са новом шемом има кашњење — морамо унапред да обрадимо шему да бисмо генерисали овај артефакт који можемо ефикасно да користимо током узорковања.

Током узорковања, после сваког токена, наш механизам за инференцију ће одредити који су токени важећи за следећу производњу на основу претходно генерисаних токена и правила унутар граматике која указују који су токени следећи важећи. Затим користимо ову листу токена да маскирамо следећи корак узорковања, што ефективно снижава вероватноћу неважећих токена на 0. Пошто смо шему унапред обрадили, можемо користити кеширану структуру података да то урадимо ефикасно, уз минимално додатно кашњење.

Алтернативни приступи

Алтернативни приступи овом проблему често користе коначне аутомате (FSM) или регуларне изразе (који се углавном имплементирају помоћу FSM-а) за ограничено декодирање. Они функционишу слично по томе што динамички ажурирају који су токени важећи након што се сваки токен произведе, али имају неке кључне разлике у односу на CFG приступ. Посебно, CFG-ови могу да изразе ширу класу језика него FSM-ови. У пракси, то није важно за веома једноставне шеме као што је горе приказана шема value. Међутим, сматрамо да је та разлика значајна за сложеније шеме које укључују угнежђене или рекурзивне структуре података. На пример, FSM-ови генерално не могу да изразе рекурзивне типове, што значи да приступи засновани на FSM-у могу имати потешкоћа да упаре заграде у дубоко угнежђеном JSON-у. Следи пример рекурзивне шеме која је подржана у OpenAI API-ју са структурираним излазима, али је не би било могуће изразити помоћу FSM-а.

JSON

1
{
2
"name": "ui",
3
"description": "Dynamically generated UI",
4
"strict": true,
5
"schema": {
6
"type": "object",
7
"properties": {
8
"type": {
9
"type": "string",
10
"description": "The type of the UI component",
11
"enum": ["div", "button", "header", "section", "field", "form"]
12
},
13
"label": {
14
"type": "string",
15
"description": "The label of the UI component, used for buttons or form fields"
16
},
17
"children": {
18
"type": "array",
19
"description": "Nested UI components",
20
"items": {
21
"$ref": "#"
22
}
23
},
24
"attributes": {
25
"type": "array",
26
"description": "Arbitrary attributes for the UI component, suitable for any element",
27
"items": {
28
"type": "object",
29
"properties": {
30
"name": {
31
"type": "string",
32
"description": "The name of the attribute, for example onClick or className"
33
},
34
"value": {
35
"type": "string",
36
"description": "The value of the attribute"
37
}
38
}
39
}
40
}
41
},
42
"required": ["type", "label", "children", "attributes"],
43
"additionalProperties": false
44
}
45
}

Имајте на уму да сваки елемент корисничког интерфејса може имати произвољну децу која се рекурзивно позивају на коренску шему. Ова флексибилност је нешто што CFG приступ омогућава.

Ограничења и рестрикције

Постоји неколико ограничења која треба имати на уму када користите структуриране излазе:

  • Структурирани излази дозвољавају само подскуп JSON Schema, детаљно описан у нашој документацији(отвара се у новом прозору). То нам помаже да обезбедимо најбоље могуће перформансе.
  • Први API одговор са новом шемом имаће додатну латенцију, али ће наредни одговори бити брзи без додатне латенције. То је зато што током првог захтева обрађујемо шему као што је горе наведено, а затим кеширамо те артефакте за брзу поновну употребу касније. Обичним шемама је потребно мање од 10 секунди за обраду при првом захтеву, али сложенијим шемама може бити потребно и до једног минута.
  • Модел можда неће испоштовати шему ако одлучи да одбије небезбедан захтев. Ако одлучи да одбије, повратна порука ће имати логичку вредност refusal постављену на true да то укаже. 
  • Модел можда неће испоштовати шему ако генерисање достигне max_tokens или неки други услов заустављања пре завршетка. 
  • Структурирани излази не спречавају све врсте грешака модела. На пример, модел и даље може правити грешке унутар вредности JSON објекта (нпр. погрешити корак у математичкој једначини). Ако програмери уоче грешке, препоручујемо да дају примере у системским инструкцијама или да задатке поделе на једноставније подзадатке.
  • Структурирани излази нису компатибилни са паралелним позивима функција. Када се генерише паралелни позив функције, он можда неће одговарати достављеним шемама. Подесите parallel_tool_calls: false да бисте онемогућили паралелно позивање функција.
  • JSON Schema шеме достављене са структурираним излазима не испуњавају услове за незадржавање података(отвара се у новом прозору) (ZDR).

Доступност

Структурирани излази су од данас опште доступни у API-ју. 

Структурирани излази са позивањем функције доступни су на свим моделима који подржавају позивање функције у API-ју. То укључује наше најновије моделе (
gpt-4o, gpt-4o-mini), све моделе почев од gpt-4-0613 и gpt-3.5-turbo-0613, као и све фино подешене моделе који подржавају позивање функције. Ова функционалност је доступна у API-ју за довршавање ћаскања, Assistants API-ју и Batch API-ју. Структурирани излази са позивањем функције су такође компатибилни са визуелним улазима.

Структурирани излази са форматима одговора доступни су на
gpt-4o-mini и gpt-4o-2024-08-06, као и на свим фино подешеним верзијама заснованим на тим моделима. Ова функционалност је доступна у API-ју за довршавање ћаскања, Assistants API-ју и Batch API-ју. Структурирани излази са форматима одговора су такође компатибилни са визуелним улазима. 

Преласком на нови
gpt-4o-2024-08-06, програмери штеде 50% на улазима ($2.50/1M улазних токена) и 33% на излазима ($10.00/1M излазних токена) у поређењу са gpt-4o-2024-05-13.

Да бисте почели да користите структуриране излазе, погледајте нашу
документацију(отвара се у новом прозору)

Захвалнице

Аутор

Michelle Pokrass

Кључни сарадници

Chris Colby, Melody Guan, Michelle Pokrass, Ted Sanders, Brian Zhang

Захвалнице

John Allard, Filipe de Avila Belbute Peres, Ilan Bigio, Owen Campbell-Moore, Chen Ding, Atty Eleti, Elie Georges, Katia Gil Guzman, Jeff Harris, Johannes Heidecke, Beth Hoover, Romain Huet, Tomer Kaftan, Jillian Khoo, Karolis Kosas, Ryan Liu, Kevin Lu, Lindsay McCallum, Rohan Nuttall, Joe Palermo, Leher Pathak, Ishaan Singal, Felipe Petroski Such, Freddie Sulit, David Weedon