← All AI Engineer talks

AI Engineer Summit 2025

Building AI-Powered Developer Tools at Jane Street

John Crepezzi· Software Engineer, Jane Street16:57

Read the talk

Building AI Developer Tools for Jane Street’s OCaml Environment

Jane Street connects task-shaped training data, executable feedback, and a shared editor service to build AI assistance around its OCaml development environment.

From a talk by John Crepezzi

Before you start: Familiarity with code diffs, static type checking, and the distinction between model training and inference will help; no OCaml experience is required.

When the development environment runs on OCaml

How do you make AI coding assistance useful when conventional developer tools fit your company poorly? At Jane Street, that problem falls to the AI Assistance team, whose mandate is to maximize the value the firm gets from large language models. John Crepezzi brings a career in developer tools, including years at GitHub, to an environment with an unusual constraint: OCaml is the development platform. The functional language is associated with theorem proving, formal verification, and programming-language implementation. Jane Street uses it much more broadly.

  • Web applications: Developers write OCaml and use js_of_ocaml to compile OCaml bytecode into JavaScript.
  • Editor plugins: VCaml lets developers continue working in OCaml for editor tooling. Editor’s note: Crepezzi describes this as transpilation to Vimscript. VCaml actually provides OCaml bindings for Neovim over Msgpack RPC, as documented in package metadata predating the talk.
  • FPGA development: Developers use Hardcaml to describe hardware in OCaml instead of writing Verilog directly.

An assistant therefore needs to support OCaml across very different kinds of engineering work.

Three constraints make off-the-shelf tools difficult to adopt:

  • Limited language coverage: Crepezzi attributes weak OCaml model performance to the scarcity of training data. He suspects that Jane Street’s private OCaml corpus may exceed all the OCaml code outside the firm; this is his estimate, not a measured corpus comparison.
  • Unusual infrastructure: Jane Street has its own build systems, distributed build environment, and code-review system, Iron. Its giant monorepo lives in Mercurial. At Crepezzi's last count, 67% of the firm used Emacs, though VS Code was also in use. An integration designed around a different repository, build system, or editor cannot simply be dropped into this environment.
  • Work that crosses system boundaries: The team wants to apply models to merge-conflict resolution, feature descriptions, and reviewer selection. Those tasks reach beyond code generation inside a single editor, so the infrastructure must let capabilities span the development workflow.
Slide listing weak OCaml performance, custom tooling and unconventional choices, monorepo search difficulty, and unavailable editor integrations, followed by “We're dreamers!” A speaker inset appears at bottom left.
“Public models & tools” lists OCaml and tooling obstacles, ending with “We're dreamers!”
0:210:32
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

0:21 · section reference included

Define the editing task before training

Training a model is an expensive response to these constraints: it takes time, and there are many ways for it to fail. Meta’s CodeCompose work helped convince the team to try. Its fine-tuning for Hack offered a useful analogy: like OCaml at Jane Street, Hack is heavily concentrated inside one company despite being open source. The similarity concerns the distribution of code, not the languages’ syntax or behavior. Crepezzi also notes Hack’s OCaml implementation connection as a coincidence.

Editor’s note: CodeCompose studied code completion. Its results are not measurements of the OCaml prompt-to-diff task Jane Street developed.

The initial expectation was straightforward: take an existing model, expose it to Jane Street’s code, and get back the same model with knowledge of internal libraries and idioms. That did not work as hoped. Training examples need to resemble the interaction the model will perform. A corpus of source code does not, by itself, teach a model how to respond to an editing request. The team first needed a concrete objective.

The objective became generating diffs from a prompt. A developer would describe a desired change inside an editor, and the model would propose a potentially multi-file diff. One request might require coordinated edits to a test file, an .ml implementation, and an .mli interface.

The diff should apply cleanly and have a good likelihood of type-checking afterward. The intended task size was up to 100 lines of changes, a design target rather than a measured capability limit. This narrowed the training problem to a particular input, output, and set of checks.

Slide titled “The Goal” lists generating diffs from a prompt, potentially across multiple files, with a higher likelihood of applying and type checking, and fewer than 100 lines.
The goal: generate small, potentially multi-file diffs that apply and type-check.
4:074:23
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

4:07 · section reference included

Find examples that match an editor request

Each supervised example needs three parts:

  • Context: What the model would have been able to see before the edit.
  • Prompt: A request phrased the way a developer might ask for help.
  • Diff: The change that accomplishes the request.

The challenge is finding many examples where those three parts belong together. Existing development records contain descriptions and code changes, but their structure reflects how people review and checkpoint work, not necessarily how they ask an assistant to edit it.

CandidateWhat it providesWhy it does not fit directly
Iron Features, comparable to pull requestsA human-written Description tab and the corresponding Diff tabDescriptions are longer than terse editor requests, and features often contain 500–1,000 lines, according to Crepezzi. Training would require automated decomposition into smaller changes.
CommitsSmaller checkpoints in a development sessionMessages can be as uninformative as Summary Z. Commits are used as places to revert to, can bundle multiple changes, and lack useful descriptions of individual editing tasks.

A feature description explains a completed piece of work to a reviewer. An editor request may simply ask to fix the error currently visible. Smaller commits do not solve that mismatch if they still combine changes and omit intent. The team therefore turned to workspace snapshotting to capture edits closer to the moment they happened.

6:086:15
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

6:08 · section reference included

Use build transitions to recover isolated edits

Workspace snapshotting captures code as development unfolds, together with signals that help identify meaningful changes:

  1. Capture workstation state throughout the day. Crepezzi gives roughly every 20 seconds as an illustrative snapshot cadence.
  2. Record the build state alongside the code. Preserve whether the build is green and, when it is red, the available error.
  3. Look for green → red → green transitions. A developer starts from working code, makes a change that temporarily breaks the build, and restores it. This often marks an isolated change, though the transition is a heuristic rather than proof of isolation.
  4. Extract red → green repairs. When a developer fixes a type or compilation error, pair the error from the red state with the diff that returns the build to green.

The repair case supplies a particularly direct training example: the model can see the failure that preceded the edit and the code change that resolved it.

Snapshots still do not supply the developer’s request. To fill that part of the tuple, the team asks an LLM to write a very detailed description of the captured change. It then progressively shortens the description until it resembles something a person would type into an editor. The resulting prompt is synthetic, but the underlying edit comes from observed development work.

8:198:27
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

8:19 · section reference included

Turn executable checks into training feedback

Supervised examples form the first part of the training cycle Crepezzi describes. Reinforcement learning follows, with the aim of making the model’s output better match what developers consider good code. That requires turning a broad preference into checks that can actually be performed.

The checks become progressively stronger:

  1. Parse the code. Output that the OCaml parser rejects fails the most basic requirement.
  2. Type-check the applied change. Apply the edit to its base revision and ask the type checker whether the resulting code is valid.
  3. Compile and run tests. Give the model a verifiable task, apply its edit, and check whether the result compiles and passes the tests.

The object being judged is the changed codebase, not just the generated text. That makes the base revision and execution environment part of the training machinery.

Jane Street built the Code Evaluation Service, or CES, to perform these checks repeatedly. It resembles a build service, with a key optimization: a successful build is pre-warmed at a particular revision. Workers take model-generated diffs, apply them, and determine whether the build stays green or turns red. They send success or error information back to the reward function.

Crepezzi describes using this service over months to align the model toward code that compiles and passes tests. The pre-warmed build makes repeated verification faster; the feedback gives training a signal grounded in the consequences of each edit.

9:259:34
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

9:25 · section reference included

Evaluate whether the model performs the task

The same execution setup also supports evaluation. Hold out some of the reinforcement-learning data, give the model a problem, let it generate code, and use the service to check whether that code works. Training and evaluation can share the verification machinery while using separate examples.

Slide titled “Practice makes perfect” lists giving the model a problem, letting it write code, and evaluating its ability to write code that passes tests.
Evaluate generated code by whether it passes tests.

A separate code-review experiment exposed a different kind of failure. The team wanted a model to perform a first review pass like a human reviewer, reducing repetitive work. After months of training, they submitted the first code for automated review. Instead of doing the review, the model responded, in Crepezzi’s recollection, that it would do the work tomorrow.

The training examples came from humans, and humans sometimes postpone reviews. The model had learned a behavior present in the data but contrary to the purpose of the tool. Imitating human responses is not the same as completing the intended task. Meaningful evaluations need to catch that distinction before more time and money go into training.

11:1911:28
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

11:19 · section reference included

Share the intelligence across editors

Passing evaluations is not the final test: the model has to work for developers inside their editors. Jane Street needed integrations for Neovim, VS Code, and Emacs, with three requirements:

  • Implement shared behavior once. Context construction and prompting should not be rewritten for every editor.
  • Keep models and strategies replaceable. The initial integrations used a model without fine-tuning, while the team expected a fine-tuned model to follow. Model choice and prompting needed to remain flexible.
  • Measure the actual editing experience. Developers care about latency and whether a proposed diff applies. The team wanted evidence from real editor use about whether the changes were useful.

The resulting AI development environment, or AIDE, sits between the language models and thin editor integrations. AIDE constructs prompts, assembles context, and accesses build status. Each editor supplies its own interaction layer over those shared capabilities.

AIDE runs as a sidecar application on the developer’s machine. That placement also separates service deployment from editor deployment: the team can update and restart AIDE across workstations without changing each editor integration or waiting for developers to restart their editors. The shared service is both the place to implement model-facing behavior and the place to roll out changes to it.

12:3212:43
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

12:32 · section reference included

Let each editor keep its own interaction style

Sharing AIDE does not require making every editor look or behave alike. The demonstrated interfaces follow the conventions their users already know:

EditorAIDE interaction
VS CodeA visual sidebar, familiar in form to Copilot, where a developer submits a request and receives potentially multi-file diffs.
EmacsA Markdown buffer where developers navigate and copy text normally, ask questions, and use key bindings that append additional content to the bottom of the buffer.

The Emacs interface treats the conversation as another text buffer rather than importing the sidebar design. Shared prompting and context construction leave room for an editor-specific experience.

14:1614:27
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

14:16 · section reference included

Extend and compare capabilities behind the editors

AIDE provides a shared place to replace models and change context-building strategies. Additional editor support was being developed at the time of the talk. Teams elsewhere in the firm can also supply domain-specific tools through AIDE, making them available in the supported editors without writing a separate integration for each one.

The same boundary supports A/B testing. One example is to route 50% of the company to one model and 50% to another, then compare acceptance rates. Crepezzi presents this as an experiment the architecture enables, not a reported result. When model behavior or prompting changes, the team can make that change in one shared service and expose it across the editor experiences.

The work extends beyond the editing flow described here. Crepezzi closes with new uses of retrieval-augmented generation inside editors, similar approaches applied to large-scale multi-agent workflows, and increasing use of reasoning models. Across those directions, the intended foundation stays the same: replaceable components, shared infrastructure, and a way for domain teams to contribute specialized tools. That gives new capabilities a route into the development environment without requiring every editor integration to be rebuilt.

14:5915:08
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

14:59 · section reference included

Resources

From the talk

Read the complete timestamped transcript
  1. 0:00

    [on-hold music] My name is John Crepezzi, and I work on a team at Jane Street called AI Assistance.

  2. 0:21

    Our group roughly, uh, is there at Jane Street to try to maximize the value that Jane Street can get from large language models. And I've spent my entire career, uh, in dev tools.

  3. 0:32

    Before I worked at Jane Street, I was at GitHub for a long time, and then before that, I worked at a variety of other dev tools companies. And LLMs kind of present this really amazing opportunity in that they're so open-ended that we can build kind of anything that we can imagine.

  4. 0:45

    And it seems like right now, the only thing moving faster than the progress of the models is kind of our creativity around how to employ them. Uh, at Jane Street, though, we've made some choices that make adoption of off-the-shelf tooling a little bit more difficult than it is for other companies.

  5. 1:01

    And kind of the biggest reason that we have this problem is that we use OCaml as a development platform. For those not familiar with OCaml, it is a, a functional, very powerful language, but it's also incredibly obscure language.

  6. 1:15

    Uh, it was built in France, and its most common applications are in things like theorem proving or formal verification. It's also used to write programming languages. Um, we use OCaml kind of for everything at Jane Street.

  7. 1:31

    So just a couple quick examples. When we write web applications, of course, web applications have to be written in JavaScript. But instead, we write OCaml, and we use a library called Js_of_ocaml that is essentially a, uh, OCaml bytecode-to-JavaScript transpiler.

  8. 1:46

    When we write plugins for Vim, those have to be written in Vim script. Uh, but we actually use a library called Vcaml, which again is a OCaml to Vim script transpiler.

  9. 1:56

    And, uh, even people at the company that are working on FPGA code, they're not writing Verilog, they're writing in an OCaml library called Hardcaml.

  10. 2:06

    Uh, so why are the tools on the market available not good for working with OCaml? I think it kind of comes down to a few primary reasons. The first and the most important is that models themselves are just not very good at OCaml.

  11. 2:19

    And this isn't the fault of the AI labs. This is just kind of a by-product of the amount of data that exists for training. So it's-- there's a really good chance that the amount of OCaml code that we have inside of Jane Street is just more than, like, the total combined amount of OCaml code that there exists

  12. 2:34

    in the world, uh, outside of our walls.

  13. 2:37

    The second is that we've made things really hard on ourselves. Partially as a by-product of working in OCaml, we've had to build our own build systems. We built our own distributed build environment.

  14. 2:47

    We even built our own code review system, which is called Iron.

  15. 2:51

    We develop all of our software on a giant monorepo application, and just for fun, instead of storing that monorepo in Git, we store it in Mercurial. [laughing]

  16. 3:02

    And, uh, s- at last count, sixty-seven percent of the firm uses Emacs instead of normal editors, maybe like VS Code. Uh, we do have people using VS Code, but Emacs is the most popular.

  17. 3:14

    And the last thing is we're dreamers. I mean, kind of everyone in this room hopefully is, is a dreamer in a way. Uh, and what I mean by this is we want the ability to kind of take LLMs and apply them to different parts of our development flow and light up different parts.

  18. 3:26

    So maybe we wanna use large language models to resolve merge conflicts or build better feature descriptions or figure out who reviewers for features be. And we don't wanna be hampered by the boundaries between different systems when we do that.

  19. 3:41

    Over the next fifteen minutes, I'm gonna cover our approach to large language models at Jane Street, uh, particularly when it comes to developer tools. Um, I'm gonna talk about custom models that we're building and how we build them.

  20. 3:52

    I'm gonna talk about editor integrations. So these are the integrations into, uh, to VS Code, Emacs, and Neovim. And I will talk about, uh, the ability that we've built over time to evaluate models and figure out how to make them perform best.

  21. 4:07

    And I guess at first glance, it's not really obvious that training models at all is a good idea. I mean, it's a very expensive proposition. It takes a lot of time, and it can go wrong in a ton of different ways.

  22. 4:16

    Who here has trained a model before or tried to train something like a model? Maybe you took a foundation model and trained on top of it.

  23. 4:23

    Cool. We were more convinced after we read this paper. This is a paper from Meta about a project called CodeCompose. And in this paper, they detail the results fine-tuning a model specifically for use with Hack.

  24. 4:36

    Uh, Hack is actually pretty similar to OCaml, uh, not in its, like, syntax or function, but really just in the fact that it's used primarily at one company and not really used much outside of that company, even though it's open source.

  25. 4:49

    So... Oh, actually, a fun fact, Hack is implemented in OCaml. So I think that's just, like, a total coincidence, but... [laughing]

  26. 4:56

    Uh, we were pretty naive early on. We read this paper, and we decided that it would be really cool if we could, uh, replicate the results. We thought we would just take a model off the shelf, we would show it a bunch of our code, and then we would get back a model that, uh, worked like the

  27. 5:09

    original model but knew about our libraries and idioms. It turns out that's just not how it works. Uh, it's not that easy. In order to get good outcomes, you have to have the model see a bunch of examples that are in the shape of the type of question that you want to ask the model.

  28. 5:24

    So we needed to first create a goal, a thing that we wanted the model to be able to do. And in our, in our world, the goal that we came up with was this: We wanted to be able to generate diffs given a prompt.

  29. 5:35

    So what that means is we wanted ed-- a, a user inside of an editor to be able to write a description of what they want it to happen, and then have the model suggest a potentially multi-file diff.

  30. 5:44

    So maybe you wanna modify the test file, an ML file, and an MLI, which is kind of like a header file.

  31. 5:51

    We wanted the diffs to apply cleanly, and we wanted them to have a good likelihood of type checking after they had been applied. And we were kinda targeting this range of up to one hundred lines as, uh, an i-ideal zone of what we thought LLMs would actually be capable of.

  32. 6:08

    And in order for that to work, we needed to collect data, like I was talking about before. We needed data of the training shape that looked just like the test shape.

  33. 6:15

    And this is what that shape looks like for this task. You need to be able to collect a bunch of examples of what context the model would have had beforehand, and then some prompt of what you want the model to do, written hopefully in the same way that a human would write it, and then some diff that

  34. 6:28

    would accomplish that goal. So context, prompt, diff, and we need a bunch of these examples. So how do we get these? How do we get these training examples?

  35. 6:37

    Kind of the first place to look is Features. Features is, I mentioned a code review system that we built internally. This is what it looks like. It's called Iron.

  36. 6:45

    Uh, Features are very similar to pull requests. I think you can just, you know, swap that term in your head. And Features at first glance have exactly the data they want.

  37. 6:54

    On the Description tab, they have a human-written description of a change, and on the Diff tab, they have the code that accomplishes the goal of the developer.

  38. 7:02

    But on closer look, they're not exactly what you want, right? The way that you write a feature description or a pull request description is really very different from what you might wanna say inside of an editor.

  39. 7:11

    So you're not writing multiple paragraphs in the editor. You're just saying something like, "Fix that error that's happening right now," and that's just not how we write feature descriptions.

  40. 7:19

    Another problem with these features or pull requests is that they're really large, right? Often it's, uh, a feature is five hundred lines or a thousand lines. So in order to use it as training data, we would need to have an automated way to pull features apart into individual smaller components that we could train on.

  41. 7:36

    So we need smaller things than features. What are those? Well, maybe commits. Commits are smaller chunks than features. Uh, this is what a typical commit log looks like at Jane Street.

  42. 7:45

    So this is not like a Git short log. This is literally just, like, an actual... I want you to look at this as an actual Git log. And where it says Summary Z, that's my commit message.

  43. 7:57

    We don't really use commits the same way that the rest of the world uses them. So we use commits mostly as checkpoints between different parts, parts of a development cycle that you might wanna revert back to.

  44. 8:08

    Commits don't have a description, and they also have the same problem in that they're not isolated changes. They're, they're a collection of changes. What we actually ended up with was a approach called workspace snapshotting.

  45. 8:19

    And the way that that works is we take snapshots of developer workstations throughout the workday. So you can think like every twenty seconds, we just take a snapshot of what the developer's doing.

  46. 8:27

    And as we take the snapshots, we also take snapshots of the build status. So as the build that's running on the box, we can see what the error is or whether the build is green.

  47. 8:35

    And we can kinda notice these little patterns. If you have a green to red to green, that often corresponds to a place where a developer has made an isolated change, right?

  48. 8:45

    You start writing some code, you break the build, and then you get it back to green, and that's how you make a change. Maybe this one, the red to green, this is a place where the developer encountered an error, whether that's a type error or a compilation error, and then they fixed it.

  49. 8:57

    So if we capture the build error at the red state and then the diff from red to green, we can use that as training data to help the model be able to recover from mistakes.

  50. 9:07

    The next thing we need is a description, and the way that we did that, we just used a large language model. So we had a large language model write a really detailed description of a change in, in as much words as it possibly could, and then we just kept filtering it down until it was something that was

  51. 9:20

    around the right level of what a human would write.

  52. 9:25

    So now we have this training data, and training data is kind of only half the picture of training a model. So you, you have the, the supervised training data, and then you need to do the second part, which is the reinforcement learning.

  53. 9:34

    This is really where models get a lot of their power, right? We, we align the model's ability to what humans think is actually good code. So what is good code?

  54. 9:45

    I guess on the surface, good code is, I mean, it's, it's code. It has to parse as code, meaning if a piece of code doesn't go through the OCaml parser and come out with a green status, that is, that is not good code [chuckles] I would say by most definitions.

  55. 9:59

    Uh, good code in OCaml, because it's statically typed, is code that type checks. So we wanna have good code be code that when it is applied on top of a, a base revision, can go through the type checker, and the type checker agrees that the code is valid.

  56. 10:14

    And of course, the, the gold standard is that good code is code that compiles and passes tests. So ideally, in, during the reinforcement learning phase of a model, you could give the model a bunch of tasks that are, like, verifiable.

  57. 10:26

    We have the model perform some, some edit, and then we check whether or not it actually passes the test when applied to the code.

  58. 10:34

    So we did that. Uh, we've done this as part of our, our training cycle, and we built this thing that is called, uh, CES. It's the Code Evaluation Service.

  59. 10:43

    You can think of it kinda like a build service, except with a slight modification to make it much faster, and that's that first we pre-warm a build. It sits at a, a revision and is green, and then we have these workers that all day just take diffs from the model, they apply them, and then we determine whether

  60. 11:00

    the build status turns red or green, and then we report that error or, or success back up to the build function. And through continued use of this service over the course of, like, months, we're able to better align the model to write code that actually does compile and pass tests.

  61. 11:19

    It turns out this exact same setup is the one that you would want for evaluation. So if you just hold out some of the RL data, you can also use it to evaluate model's ability to write code.

  62. 11:28

    Kinda looks like this. You give the model a problem, you let it write some code, and then you evaluate whether or not the code that it writes actually works.

  63. 11:38

    And training is hard, and it can have kind of, uh, catastrophic but hilarious results. So at, at one point, we were training a code review model, and this is a totally separate model, but the idea was we wanna be able to give some code to this model and have it do a first pass of code review just

  64. 11:53

    like a human would do to try to save some of the toil of, of code review. We trained this model, we put a bunch of data into it, we worked on it for months, we were real excited, and we put our first code in for, uh, for code review through the automated agent.

  65. 12:06

    It spun for a bit, and it came back with something along the lines of, "Mm, I'll do it tomorrow."

  66. 12:13

    And [laughs] like, of course, it did that because it's trained on a bunch of human examples, and humans write things like, "I'll do things tomo- or I'll do this tomorrow."

  67. 12:21

    Uh, so it's, it's, you know, not very surprising. So having evaluations that are meaningful is kind of a cornerstone of making sure that models don't go off the rails like this, and you don't waste a bunch of your time and money.

  68. 12:32

    In the end though, the real test of models is whether or not they work for humans. So I'm gonna talk a little bit about the editor integrations that we've built to expose these models to developers at Jane Street.

  69. 12:43

    Kind of when we were starting building these integrations, we had three ideas in mind. The first idea was, wow, we support three editors. We have Neovim, VS Code, and Emacs, and we really don't wanna write the same thing three times.

  70. 12:54

    So ideally, we don't wanna write all the same context building strategies and all of the same prompting strategies. We wanna just write it once. The second is that we wanted to maintain flexibility, so we had a model that we were using at the time, uh, that was not a fine-tuned model.

  71. 13:08

    We were pretty convinced that a fine-tuned model was in our future. We wanted the ability to do things like swap the model or swap the prompting strategy out. And last, we wanted to be able to collect metrics.

  72. 13:18

    So in a developer, uh, in their, in their editor, developers care about latency, and they care about whether or not the diffs actually apply. So we wanted to get kind of on-the-ground, real experience of whether or not the diffs really were meaningful for people.

  73. 13:33

    This is the simplified version of the architecture that we settled on for this service, the AI development environment. Essentially, you have LLMs on one side, and then Aid handles all of the, uh, ability to construct prompts and to construct context and to see the build status, and then we are able to just write these really thin lo-

  74. 13:51

    layers on top of Aid, uh, for each of the individual editors. And what's really neat about this is that Aid sits as a sidecar application on the developer's machine, which means that we w- when, when we wanna make changes to Aid, we don't have to make changes to the individual editors and hope that people restart their editors.

  75. 14:07

    We can just restart the Aid service on all of the boxes. So we restart Aid, and then everyone gets the most recent copy.

  76. 14:16

    Uh, this is an example of Aid working inside of VS Code. So this is the sidebar in VS Code, very similar to something like Copilot, except this thing allows you to, uh, ask for it and get back multi-file diffs.

  77. 14:27

    Uh, and you can see it kinda looks like what you'd expect in VS Code. It's, it's, you know, a visual interface that lays things out really nicely.

  78. 14:35

    This is what we built in Emacs though. So in Emacs, developers are used to working in text buffers. They move around files. They wanna be able to copy things the normal way that they copy things.

  79. 14:44

    So we actually built the Aid experience in Emacs into a markdown buffer. So users can move around inside this markdown buffer, they can ask questions, and then there are key binds that essentially append extra content to the bottom of the markdown buffer.

  80. 14:59

    Aid's architecture lets us plug various pieces in and out, like I mentioned. Uh, so we can swap in new models. We can, uh, make changes to the context building.

  81. 15:08

    We can add support for new editors, which I think probably sounds far-fetched, but we're-- this is something we're actually just doing right now.

  82. 15:15

    Uh, and we can even add domain-specific tools. So different areas of the company can supply tools that are available inside of the editors, and they kind of end up in all the editors without hav- having to write individual integrations.

  83. 15:27

    Aid also allows us to A/B test different approaches, so we can do something like send fifty percent of the company to one model and fifty percent to another and then determine which one gets the higher acceptance rate.

  84. 15:38

    Aid is kind of a, an investment that pays off over time. Every time something changes in large language models, we're able to change it in one place downstream of the editors and then have it a-available everywhere.

  85. 15:51

    And things change, like, really often, and we need to be ready, uh, when things change. What I, what I've had time to show you today is only a small portion of what my team is doing.

  86. 16:01

    Uh, we've got a lot of other things going on, so we're finding new ways to apply RAG inside of the editors. We're applying similar approaches to what you've seen here to large scale, uh, multi-agent workflows.

  87. 16:12

    We are working with reasoning models more and more. But the approach is the same through all of these. We keep things pluggable. We lay a strong foundation to build on top of, and we build the ways for the rest of the company to add to our experience by adding more domain-specific tooling on top of it.

  88. 16:30

    Uh, if you think what I've said is interesting and you wanna talk more about this, I would love to hear from you. You can just find me outside, and thank you for your time. [upbeat music]