Skip to content
This repository has been archived by the owner on Nov 3, 2023. It is now read-only.

[TOD][Datasets][Easy] Taskmaster(1) in Conversations format #4189

Merged
merged 141 commits into from
Dec 23, 2021
Merged
Changes from 1 commit
Commits
Show all changes
141 commits
Select commit Hold shift + click to select a range
e365e48
[TOD] Core converesation structure, serialization, const tokens
Nov 15, 2021
c939174
[Tod] Agents, teacher metrics, and tests for these
Nov 16, 2021
3bf655f
[TOD] Tod json structure to teacher task
Nov 16, 2021
6cb4b86
[TOD] Core converesation structure, serialization, const tokens
Nov 15, 2021
1480def
fix test by adding init folder
Nov 16, 2021
de84801
[Tod] Agents, teacher metrics, and tests for these
Nov 16, 2021
638eb28
[TOD] World, world metrics, script, tests
Nov 16, 2021
0e3f492
hmmm... hoping stacks don't bite me. (change that was kept in upper d…
Nov 16, 2021
0643a62
Merge branch 'simpler_tod_1_core_only' into simpler_tod_2_agents_teac…
Nov 16, 2021
37aced2
minor, remove commented out print
Nov 16, 2021
4f91279
Merge branch 'simpler_tod_2_agents_teachers' into simpler_tod_3_world
Nov 16, 2021
b05930f
comment
Nov 16, 2021
5086e85
more comment updates (not sure if it actually helps clarity..)
Nov 16, 2021
1e30035
Merge branch 'simpler_tod_3_world' into simpler_tod_4_tod_json
Nov 16, 2021
9a25fc5
[TOD][Dataset][Easy] Google SGD in TOD Conversations format
Nov 16, 2021
faa2356
[TOD][Dataset][Easyish] Google Simulation Splits
Nov 16, 2021
9426997
[TOD][Datasets][Easy] MetalWoz
Nov 16, 2021
9b2116c
[TOD][Datasets][Easy] MSR E2E into TOD Conversations format
Nov 16, 2021
61f7041
[TOD][Datasets][Easy] Multidogo -> TOD Conversations format
Nov 16, 2021
e8efc52
[TOD][Datasets][Easyish] MultiWoz V2.2 in Conversations Format
Nov 16, 2021
c17c3cc
lint
Nov 16, 2021
728c9bd
[TOD][Datasets][Easy] Taskmaster(1) in Conversations format
Nov 16, 2021
54890b4
Merge branch 'simpler_tod_5d_msr_e2e' into simpler_tod_5e_multidogo
Nov 16, 2021
45e9259
Merge branch 'simpler_tod_5e_multidogo' into simpler_tod_5f_multiwoz_v22
Nov 16, 2021
9284135
Merge branch 'simpler_tod_5f_multiwoz_v22' into simpler_tod_5g_taskma…
Nov 16, 2021
51ed1a9
Merge branch 'main' into simpler_tod_1_core_only
Nov 16, 2021
a6508be
Merge branch 'simpler_tod_1_core_only' into simpler_tod_2_agents_teac…
Nov 16, 2021
eebc36b
Merge branch 'simpler_tod_2_agents_teachers' into simpler_tod_3_world
Nov 16, 2021
3675781
use same version of black as in the pre-commit hook
Nov 16, 2021
086c91c
Merge branch 'simpler_tod_2_agents_teachers' into simpler_tod_3_world
Nov 16, 2021
0bc961e
use same version of black as in the pre-commit hook
Nov 16, 2021
ed26407
Merge branch 'simpler_tod_3_world' into simpler_tod_4_tod_json
Nov 16, 2021
677df09
Merge branch 'simpler_tod_4_tod_json' into simpler_tod_5a_google_sgd
Nov 16, 2021
24ee898
black with version from pre-commit hook
Nov 16, 2021
3ca7ae3
Merge branch 'simpler_tod_4_tod_json' into simpler_tod_5a_google_sgd
Nov 16, 2021
3145e0e
Shouldn't worry about tod_json being in task_list
Nov 16, 2021
1b2a3fb
Merge branch 'simpler_tod_4_tod_json' into simpler_tod_5a_google_sgd
Nov 16, 2021
f44b17b
add to task list; run lint with right version of black
Nov 16, 2021
43474c4
Merge branch 'simpler_tod_5a_google_sgd' into simpler_tod_5b_google_s…
Nov 16, 2021
d290ecd
Merge branch 'simpler_tod_5b_google_sgd_sim_splits' into simpler_tod_…
Nov 17, 2021
7c3ccf5
lint with right version
Nov 17, 2021
ab19cc2
lint
Nov 17, 2021
8c76a56
Merge branch 'simpler_tod_5c_metalwoz' into simpler_tod_5d_msr_e2e
Nov 17, 2021
724b255
add to task list
Nov 17, 2021
c79422c
lint right version
Nov 17, 2021
353fab1
Merge branch 'simpler_tod_5d_msr_e2e' into simpler_tod_5e_multidogo
Nov 17, 2021
c86760c
add to task list
Nov 17, 2021
625e632
right lint
Nov 17, 2021
ebd09b4
Merge branch 'simpler_tod_5e_multidogo' into simpler_tod_5f_multiwoz_v22
Nov 17, 2021
dcadadb
task_list
Nov 17, 2021
fff653f
right lint
Nov 17, 2021
406a84d
Merge branch 'simpler_tod_5f_multiwoz_v22' into simpler_tod_5g_taskma…
Nov 17, 2021
e8e366f
add init
Nov 17, 2021
e354c39
Merge branch 'simpler_tod_5d_msr_e2e' into simpler_tod_5e_multidogo
Nov 17, 2021
f637a29
Merge branch 'simpler_tod_5e_multidogo' into simpler_tod_5f_multiwoz_v22
Nov 17, 2021
ca898c5
Merge branch 'simpler_tod_5f_multiwoz_v22' into simpler_tod_5g_taskma…
Nov 17, 2021
dfc4989
Merge branch 'main' into simpler_tod_2_agents_teachers
Nov 29, 2021
2f15448
address eric comments; add new readme + more documentation
Nov 30, 2021
abd1c7e
Merge branch 'simpler_tod_2_agents_teachers' into simpler_tod_3_world
Nov 30, 2021
5d0197d
minor wording change
Nov 30, 2021
39792a8
Merge branch 'simpler_tod_2_agents_teachers' into simpler_tod_3_world
Nov 30, 2021
76bfa89
add more documtnation to world tests (following comment on teacher te…
Nov 30, 2021
73c5c7a
minor comment update
Nov 30, 2021
f6acccb
Merge branch 'simpler_tod_3_world' into simpler_tod_4_tod_json
Nov 30, 2021
dc4b70e
Merge branch 'simpler_tod_4_tod_json' into simpler_tod_5a_google_sgd
Nov 30, 2021
1299b68
Merge branch 'simpler_tod_5a_google_sgd' into simpler_tod_5b_google_s…
Nov 30, 2021
58965d3
Merge branch 'simpler_tod_4_tod_json' into simpler_tod_5c_metalwoz
Nov 30, 2021
55aa3ca
Merge branch 'simpler_tod_5b_google_sgd_sim_splits' into simpler_tod_…
Nov 30, 2021
6517301
Merge branch 'simpler_tod_5c_metalwoz' into simpler_tod_5d_msr_e2e
Nov 30, 2021
c344740
Merge branch 'simpler_tod_5d_msr_e2e' into simpler_tod_5e_multidogo
Nov 30, 2021
0b846d7
make build file less dumb; minor bug in agents.py
Nov 30, 2021
65d0a42
remove + rerun regression test data for multidogo
Dec 1, 2021
1ae8fc6
Merge branch 'simpler_tod_5e_multidogo' into simpler_tod_5f_multiwoz_v22
Dec 1, 2021
7f5c171
Merge branch 'simpler_tod_5f_multiwoz_v22' into simpler_tod_5g_taskma…
Dec 1, 2021
a1aba6a
see what happens if I bump up the build # (hoping tests work)
Dec 1, 2021
c9ef957
make the multidogo test not take forever
Dec 1, 2021
7ab9d70
update to respect actual count of episodes (I think this might have i…
Dec 1, 2021
c6c728d
Merge branch 'main' into simpler_tod_2_agents_teachers
Dec 1, 2021
b3283d0
Merge branch 'simpler_tod_2_agents_teachers' into simpler_tod_3_world
Dec 1, 2021
85ab0fd
Merge branch 'simpler_tod_3_world' into simpler_tod_4_tod_json
Dec 1, 2021
0969aa1
Merge branch 'simpler_tod_4_tod_json' into simpler_tod_5a_google_sgd
Dec 1, 2021
1869cee
Merge branch 'simpler_tod_5a_google_sgd' into simpler_tod_5b_google_s…
Dec 1, 2021
609f930
Merge branch 'simpler_tod_5b_google_sgd_sim_splits' into simpler_tod_…
Dec 1, 2021
1da3858
Merge branch 'simpler_tod_5c_metalwoz' into simpler_tod_5d_msr_e2e
Dec 1, 2021
01f37d2
Merge branch 'simpler_tod_5d_msr_e2e' into simpler_tod_5e_multidogo
Dec 1, 2021
0e1251e
Merge branch 'simpler_tod_5e_multidogo' into simpler_tod_5f_multiwoz_v22
Dec 1, 2021
992980f
Merge branch 'simpler_tod_5f_multiwoz_v22' into simpler_tod_5g_taskma…
Dec 1, 2021
0580ff0
Merge branch 'main' into simpler_tod_2_agents_teachers
Dec 2, 2021
e00accf
Merge branch 'simpler_tod_2_agents_teachers' into simpler_tod_3_world
Dec 2, 2021
701da8d
Merge branch 'simpler_tod_3_world' into simpler_tod_4_tod_json
Dec 2, 2021
d519dc2
Merge branch 'simpler_tod_4_tod_json' into simpler_tod_5a_google_sgd
Dec 2, 2021
c7c1c64
Merge branch 'simpler_tod_5a_google_sgd' into simpler_tod_5b_google_s…
Dec 2, 2021
828f44f
Merge branch 'simpler_tod_5b_google_sgd_sim_splits' into simpler_tod_…
Dec 2, 2021
3c209ab
Merge branch 'simpler_tod_5c_metalwoz' into simpler_tod_5d_msr_e2e
Dec 2, 2021
564f5c8
Merge branch 'simpler_tod_5d_msr_e2e' into simpler_tod_5e_multidogo
Dec 2, 2021
00f2c5f
Merge branch 'simpler_tod_5e_multidogo' into simpler_tod_5f_multiwoz_v22
Dec 2, 2021
c746e70
Merge branch 'simpler_tod_5f_multiwoz_v22' into simpler_tod_5g_taskma…
Dec 2, 2021
9466144
regen after changing tod teacher logic to respect episode/examples le…
Dec 2, 2021
1392d99
regen after changing tod teacher logic to respect episode/examples le…
Dec 2, 2021
77dccb7
regen after changing tod teacher logic to respect episode/examples le…
Dec 2, 2021
98aa5f7
regen after changing tod teacher logic to respect episode/examples le…
Dec 2, 2021
8291321
regen after changing tod teacher logic to respect episode/examples le…
Dec 2, 2021
71b5af8
Merge branch 'simpler_tod_5a_google_sgd' into simpler_tod_5b_google_s…
Dec 2, 2021
9da65a6
Merge branch 'simpler_tod_5b_google_sgd_sim_splits' into simpler_tod_…
Dec 2, 2021
8956db7
Merge branch 'simpler_tod_5c_metalwoz' into simpler_tod_5d_msr_e2e
Dec 2, 2021
e946dff
Merge branch 'simpler_tod_5d_msr_e2e' into simpler_tod_5e_multidogo
Dec 2, 2021
47651f0
Merge branch 'simpler_tod_5e_multidogo' into simpler_tod_5f_multiwoz_v22
Dec 2, 2021
a3d75b6
Merge branch 'simpler_tod_5f_multiwoz_v22' into simpler_tod_5g_taskma…
Dec 2, 2021
7b24acf
Merge branch 'main' into simpler_tod_3_world
Dec 18, 2021
e3fa063
Merge branch 'simpler_tod_3_world' into simpler_tod_4_tod_json
Dec 18, 2021
2384563
Merge branch 'simpler_tod_4_tod_json' into simpler_tod_5a_google_sgd
Dec 18, 2021
d9ba7e4
Merge branch 'main' into simpler_tod_5a_google_sgd
Dec 22, 2021
acd6ffe
not sure why this comment keeps not being merged correctly ugh...
Dec 22, 2021
a753a6d
Merge branch 'simpler_tod_5a_google_sgd' into simpler_tod_5b_google_s…
Dec 22, 2021
66d8bf8
Merge branch 'simpler_tod_5b_google_sgd_sim_splits' into simpler_tod_…
Dec 22, 2021
6900517
Merge branch 'simpler_tod_5c_metalwoz' into simpler_tod_5d_msr_e2e
Dec 22, 2021
235fbee
Merge branch 'simpler_tod_5d_msr_e2e' into simpler_tod_5e_multidogo
Dec 22, 2021
ef899c3
Merge branch 'simpler_tod_5e_multidogo' into simpler_tod_5f_multiwoz_v22
Dec 22, 2021
c9c8f3a
Merge branch 'simpler_tod_5f_multiwoz_v22' into simpler_tod_5g_taskma…
Dec 22, 2021
0f49cb5
noticed a different in episode lengths between old version of this da…
Dec 22, 2021
0fb3ecb
Merge branch 'main' into simpler_tod_5b_google_sgd_sim_splits
Dec 22, 2021
c2c1fa6
Merge branch 'main' into simpler_tod_5g_taskmaster1
Dec 22, 2021
66e09ee
Merge branch 'simpler_tod_5b_google_sgd_sim_splits' into simpler_tod_…
Dec 22, 2021
f556628
Merge branch 'simpler_tod_5c_metalwoz' into simpler_tod_5d_msr_e2e
Dec 22, 2021
3e43ef9
Merge branch 'simpler_tod_5d_msr_e2e' into simpler_tod_5e_multidogo
Dec 22, 2021
a72fe98
Merge branch 'simpler_tod_5e_multidogo' into simpler_tod_5f_multiwoz_v22
Dec 22, 2021
f092c7f
Merge branch 'simpler_tod_5f_multiwoz_v22' into simpler_tod_5g_taskma…
Dec 22, 2021
adff949
regen after changing tod teacher logic to respect episode/examples le…
Dec 22, 2021
d724cd8
regen after changing tod teacher logic to respect episode/examples le…
Dec 22, 2021
b4e5c1f
regen after changing tod teacher logic to respect episode/examples le…
Dec 22, 2021
21a05d2
regen after changing tod teacher logic to respect episode/examples le…
Dec 22, 2021
89a58a3
Merge branch 'simpler_tod_5d_msr_e2e' into simpler_tod_5e_multidogo
Dec 22, 2021
b139888
Merge branch 'simpler_tod_5e_multidogo' into simpler_tod_5f_multiwoz_v22
Dec 22, 2021
f0ecc98
Merge branch 'simpler_tod_5f_multiwoz_v22' into simpler_tod_5g_taskma…
Dec 22, 2021
00ae154
Merge branch 'main' into simpler_tod_5c_metalwoz
Dec 22, 2021
9816384
Merge branch 'simpler_tod_5c_metalwoz' into simpler_tod_5d_msr_e2e
Dec 22, 2021
1b4a0ca
Merge branch 'simpler_tod_5d_msr_e2e' into simpler_tod_5e_multidogo
Dec 22, 2021
69eeeff
Merge branch 'simpler_tod_5e_multidogo' into simpler_tod_5f_multiwoz_v22
Dec 22, 2021
7522f30
Merge branch 'simpler_tod_5f_multiwoz_v22' into simpler_tod_5g_taskma…
Dec 22, 2021
b090c5c
Merge branch 'main' into simpler_tod_5g_taskmaster1
Dec 23, 2021
90e54a8
Merge branch 'main' into simpler_tod_5g_taskmaster1
Dec 23, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Merge branch 'main' into simpler_tod_5a_google_sgd
  • Loading branch information
Moya Chen committed Dec 22, 2021

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature. The key has expired.
commit d9ba7e4f5a3bea97a1df947f25084382b50c3090
2 changes: 0 additions & 2 deletions parlai/core/tod/README.md
Original file line number Diff line number Diff line change
@@ -14,8 +14,6 @@ tl;dr Extend `TodStructuredDataParser` for your particular dataset and implement

See `tod_agents.py` for the classes.

See `tod_agents.py` for the classes.

## Overview of usage

For a given dataset, extend `TodStructuredDataParser` and implement `setup_episodes()` and `get_id_task_prefix()`. The former of these is expected to do the data processing to convert a dataset to `List[TodStructuredEpisode]`. From here, multiple inheritance can be used to define Agents and Teachers that utilize the data.
16 changes: 11 additions & 5 deletions parlai/core/tod/tod_world.py
Original file line number Diff line number Diff line change
@@ -4,8 +4,14 @@
# This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree.
"""
Class for running task-oriented dialogue chats. See long comment on TodWorld for
functionality descriptions.
Class for running task-oriented dialogue chats.

Specifically this class handles:
1. Setting up and running the different conversational agents to fit the TOD Conversational structure (see `tod_core.py`; also retiterated in TodWorld below)
2. Handle logic for batching when running dialogues
3. Recording various metrics associated with running the world.

See long comment on TodWorld for description of the conversation format and more functionality descriptions.

Metrics calculated from these simulations are documented in `world_metrics.py` (for
general usage) and `world_metrics_handlers.py` (for specific metric calculations)
@@ -46,19 +52,19 @@

class TodWorld(World):
"""
Base world for running TOD model-model chats. Following agents.
Base world for running TOD model-model chats. Includes the following agents:

* User utt agent
* API call agent
* Currently assumed to be same as system utt agent in script code, though used as if separate in this world.
* Currently assumed to be same as system utt agent in script code, though used as if separate in this world for clarity
* API responder agent
* System utt agent
* API schema groundinger agent (given to api call + response agent)
* Goal groundinger agent (given to user)

As is standard for ParlAI, these agents may be models or may be standalone classes that extend the "Agent" class. The models for these *are* expected to have their utterances in a standard format.

Note that we expect these to be passed in via the opt manually, since some assumptions of regular ParlAI Worlds (ex. task = agent[0], model = agent[1]) are broken here since there is no "task agent" and one agent can be two "roles" (ex. system agent also making API calls)
We do expect these agents to be passed in with a set order (see above), since some assumptions of regular ParlAI Worlds (ex. task = agent[0], model = agent[1]) are broken here since there is no "task agent" and one agent can be two "roles" (ex. system agent also making API calls)
"""

def __init__(self, opt: Opt, agents=None, shared=None):
5 changes: 5 additions & 0 deletions parlai/scripts/tod_world_script.py
Original file line number Diff line number Diff line change
@@ -11,6 +11,11 @@
```
python -u -m parlai.scripts.tod_world_script --api-schema-grounding-model parlai.tasks.google_sgd_simulation_splits.agents:OutDomainApiSchemaAgent --goal-grounding-model parlai.tasks.google_sgd_simulation_splits.agents:OutDomainGoalAgent --user-model parlai.tasks.google_sgd_simulation_splits.agents:OutDomainUserUttAgent --system-model parlai.tasks.google_sgd_simulation_splits.agents:OutDomainApiCallAndSysUttAgent --api-resp-model parlai.tasks.google_sgd_simulation_splits.agents:OutDomainApiResponseAgent -dt valid --num-episodes -1 --episodes-randomization-seed 42 --world-logs gold-valid
```

This file handles
1. Script param setup, including that used for loading agents which may have their own parameters
2. Running the world (including handling batching, until num episodes or length of epoch has been met).
3. File I/O for both reports (for metrics) and conversation logs + logic for displaying prints
"""

import json
66 changes: 61 additions & 5 deletions parlai/tasks/tod_json/agents.py
Original file line number Diff line number Diff line change
@@ -97,18 +97,30 @@ def _process_line(self, line):
for raw_round in blob["dialog"][1:]:
if "prefix_stripped_text" not in raw_round[0]:
for i in range(len(raw_round)):
if PREFIXES[i] not in raw_round[i]['text']:
raise RuntimeError(
f"Missing prefix `{PREFIXES[i]}` before turn of text: `{raw_round[i]}`"
)
raw_round[i]["prefix_stripped_text"] = raw_round[i].get(
"text", PREFIXES[i]
)[len(PREFIXES[i]) :]
if len(raw_round) != 4:
if raw_round[0]["prefix_stripped_text"] != tod.STANDARD_DONE:
return None # misformatted convo, don't learn this.
break # TodStructuredEpisode will add in [DONE]
api_call_machine = tod.SerializationHelpers.str_to_api_dict(
raw_round[1]["prefix_stripped_text"]
)
if (
len(api_call_machine) > 0
and tod.STANDARD_API_NAME_SLOT not in api_call_machine
):
raise RuntimeError(
f"Trying to make API call without `{tod.STANDARD_API_NAME_SLOT}`. Call is: `{raw_round[1]['text']}`"
)
r = tod.TodStructuredRound(
user_utt=raw_round[0]["prefix_stripped_text"],
api_call_machine=tod.SerializationHelpers.str_to_api_dict(
raw_round[1]["prefix_stripped_text"]
),
api_call_machine=api_call_machine,
api_resp_machine=tod.SerializationHelpers.str_to_api_dict(
raw_round[2]["prefix_stripped_text"]
),
@@ -136,14 +148,33 @@ def _process_line(self, line):
)
return episode

def _get_right_file(self, filepath):
"""
Part of the code for loading worlds or scripts does a regex of "_" to "-" when
loading agents.

Not a great hack but suffices
"""
try:
with open(filepath) as _:
pass
return filepath
except FileNotFoundError:
with open(filepath.replace("-", "_")) as _:
return filepath.replace("-", "_")
raise FileNotFoundError(
f"Note: tod_json breaks if path contains mixed '-' and '_' in path, due to opt + agent loading wonkiness. Please try renaming the file. Filename: {filepath}"
)

def setup_episodes(self, fold):
result = []
if self.opt["tod_metrics_datapath"] is not None:
with open(self.opt["tod_metrics_datapath"]) as f:
with open(self._get_right_file(self.opt["tod_metrics_datapath"])) as f:
report_data = json.load(f)
tod_metrics = report_data["report"]["tod_metrics"]

lines_to_process = []
with open(self.opt["datafile"], "r") as f:
with open(self._get_right_file(self.opt["datafile"]), "r") as f:
result = []
for i, line in enumerate(f.readlines()):
if (
@@ -183,3 +214,28 @@ class DefaultTeacher(SystemTeacher):

class UserSimulatorTeacher(JsonTodParser, tod_agents.TodUserSimulatorTeacher):
pass


## We define the following as a quick way to spot-check a file using TodWorldScript.
# Use
# python ~/ParlAI/parlai/scripts/tod_world_script.py --system-model parlai.tasks.tod_json.agents:ApiCallAndSysUttAgent --user-model parlai.tasks.tod_json.agents:UserUttAgent --api-resp-model parlai.tasks.tod_json.agents:ApiResponseAgent --goal-grounding-model parlai.tasks.tod_json.agents:GoalAgent --api-schema-grounding-model parlai.tasks.tod_json.agents:ApiSchemaAgent --display-examples true --jsonfile-datapath=<INSERT PATH HERE>
#
# Note: may be relevant to set `split_to_folds`to `False` depending on usage
class GoalAgent(JsonTodParser, tod_agents.TodGoalAgent):
pass


class ApiSchemaAgent(JsonTodParser, tod_agents.TodApiSchemaAgent):
pass


class UserUttAgent(JsonTodParser, tod_agents.TodUserUttAgent):
pass


class ApiCallAndSysUttAgent(JsonTodParser, tod_agents.TodApiCallAndSysUttAgent):
pass


class ApiResponseAgent(JsonTodParser, tod_agents.TodApiResponseAgent):
pass
Original file line number Diff line number Diff line change
@@ -6,7 +6,7 @@
"""
Metrics handlers - ie, classes that handle generations from Tod World and calculates metrics from them.

Note that only metrics handler classes in `WORLD_METRIC_HANDLERS` are actively being recorded as metrics.
Note that only metrics handler classes in `WORLD_METRIC_HANDLERS` of ` parlai/core/tod/world_metrics_handlers.py` are actively being recorded as metrics. These "extended" metrics were ones we experimented with at one point in the past, found to be inconclusive, and are including primarily to not delete already done work. (Or for testing purposes.)
"""

from parlai.core.message import Message
You are viewing a condensed version of this merge commit. You can view the full changes here.