Agents Without Code: Skills, YAML, and Filesystems Replaced Python — Philipp Schmid, Google DeepMind

Read the talk

Agents Without Code: Skills, YAML, and Filesystems Replaced Python

Philipp Schmid rebuilds a GitHub pull request reviewer three times, moving from a handwritten Python loop to a hosted agent with Bash, files, and search. The progression shows which code can disappear, where execution moves, and why instructions and evaluations remain your responsibility.

From a talk by Philipp Schmid

At a glance

Ideas worth remembering

  • Frameworks can remove handwritten loops and schemas while leaving the developer responsible for tool implementations and hosting.

  • The remote reviewer uses Bash, a filesystem, and the GitHub CLI to discover and satisfy an execution prerequisite before continuing its task.

  • A network proxy injects credentials outside the sandbox. Keeping the token hidden and limiting authenticated actions are distinct concerns.

  • Managed execution moves loops, routing, session state, and compaction server side; instructions, capabilities, evaluations, and outcome verification remain product work.

  • Skills and saved files can extend capabilities or carry preferences and handoffs. Improved models should create opportunities to delete orchestration that no longer earns its place.

The same reviewer, with less code each time

A GitHub pull request reviewer needs to retrieve changes, inspect code, and decide what deserves attention. Philipp Schmid of Google DeepMind builds that same agent three ways, deleting implementation code between versions. The working definition is deliberately small: an agent runs tools in a loop until it achieves its goal. The experiment changes who implements that loop and how the agent obtains its capabilities.

The common interface is the Gemini Interactions API, presented here as an API for both models and agents. It supports server-side state and background execution, alongside tool calls and multimodal inputs and outputs. Selecting a model or a managed agent can therefore preserve the application's basic request interface while changing how much execution the service handles.

Agent activity also needs a richer history than alternating user and model messages. A user request can lead to reasoning, a function call, a function result, and more reasoning before an answer appears. Interactions represents those events as a flat timeline of steps. A tool result can retain its own type instead of being squeezed into the user role merely to return environmental data to the model.

0:120:42
Suggest correction

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

0:12 · section reference included

Version one: Python connects each tool call to its result

The first implementation makes the developer responsible for the complete execution cycle. A Python run function calls the model, inspects its response, distinguishes a function call from text, matches the requested function to an implementation, and executes it. Results—and errors when something goes wrong—must return to the conversation so the model can choose its next action. That repeated request, dispatch, and return is the agent loop.

Three pieces define the reviewer:

  • System instructions: A separate prompt file establishes the role of GitHub PR reviewer.
  • Tool declarations: Handwritten JSON schemas describe the available actions and the arguments the model must generate.
  • Tool implementations: Python functions send requests to the GitHub API and return the data needed for review.

The declaration tells the model what it may request. The implementation performs the request outside the model.

The demo asks for a review of a pull request in the Gemini Skills repository. Function calls and results begin appearing, showing that the loop reaches the supplied GitHub capabilities. But a request outside that tool set receives a refusal. The model's ability to understand a question does not supply an implementation for answering it: this reviewer can act only through the tools the application defines.

The maintenance cost extends beyond GitHub logic. The application also owns routing, schemas, execution, error handling, and state. Each part is ordinary software, but each adds another place for the agent's execution to break. This is the boilerplate the second version removes.

2:122:41
Suggest correction

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

2:12 · section reference included

Version two: a framework removes the loop, while capabilities stay explicit

ADK replaces the custom agent implementation with an agent class that handles tool loops, function calling, retries, and errors. The reviewer keeps the same prompt and Python tools. Its handwritten JSON declarations disappear too: the framework derives the schemas from function signatures and supplies them to the model. Schemas still exist in the execution path; the developer no longer maintains them separately.

The second reviewer retrieves PR data, the diff, and the code needed for inspection. Then comes the revealing question: what is the weather in San Francisco? There is no weather tool, so the expected response remains that the agent cannot obtain it. Packaging the loop in a framework reduces implementation work without expanding the agent's available actions.

The framework owns turn-taking, routing, execution mapping, and schema creation. The application still owns Python tool implementations, domain rules, and the environment that runs them. Extending the reviewer still means adding application code and arranging somewhere for that code to execute.

4:585:28
Suggest correction

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

4:58 · section reference included

A remote agent gets a sandbox—and credentials through a proxy

The third approach uses the Antigravity remote agent on the Gemini API. It shares the harness—the machinery around the model—with the Antigravity IDE, but sharing a harness does not make the agents identical. The IDE agent is described as a coding agent; the API agent is general purpose, with potentially different instructions and tools. In particular, the Gemini API already supplies Google Search.

An environment parameter supplies a hosted, isolated cloud sandbox. The agent can run Bash commands, use tools, and save files there. Sources can come from a GitHub repository, a GCS bucket, or inline files. Instead of implementing every GitHub operation as a Python function, the application can provide an environment in which the agent uses existing software.

Authenticated requests pass through a network proxy around the sandbox. The agent initiates an outbound request, and the proxy injects the configured credential on the way to the external service. The agent can use GitHub without receiving the token itself. This separates access to the secret value from the ability to perform authenticated operations; it does not, by itself, limit what those operations may do.

Which component holds the credential, and which component sends the request? The diagram traces that separation. Network access has another control: permitted domains can be restricted, while the default described in the talk allows access to all domains for convenience. The demo later combines credentials for GitHub destinations with general web access that carries no GitHub credentials.

For reuse, the Agents API lets the developer register a configuration under a custom ID. That configuration includes the system instructions, base agent, and environment. Subsequent calls select the ID through the same style of interface used to select a model or the base remote agent. The configuration becomes a reusable agent definition rather than something rebuilt for every request.

How it fits togetherAn authenticated request without a token inside the sandbox

Runs commands and initiates outbound requests without seeing the credential.

The sandbox originates the request. The proxy adds the configured credential before it reaches GitHub; network reach and authenticated reach are separate configuration choices.

7:408:10
Suggest correction

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

7:40 · section reference included

Version three: the reviewer discovers and installs its CLI

In the third demo, the source directory is gone. An AGENTS.md file carries the review instructions and tells the agent that it has a GitHub CLI, Bash, and a filesystem. Dedicated functions for accessing a PR or reading its files have disappeared. The model chooses commands using its existing knowledge of the CLI.

There is still one small executable dependency: a Bash script that checks whether the GitHub CLI is installed and downloads and installs it if necessary. This matters immediately. When the review starts, the agent explores the sandbox, tries the CLI, discovers that it is missing, installs it, and proceeds with the review. The environment visibly changes from lacking the required program to containing a usable tool. The model handles that prerequisite through general commands rather than a developer-written branch in the PR-review loop.

The client streams the interaction so calls and results appear while the remote work continues. The same San Francisco weather question now produces a Google Search call and an answer of around 20°C, for July 2 in the demonstration. That is a concrete change from refusal to retrieval through an available general tool. It demonstrates broader task reach, rather than establishing weather accuracy or PR-review quality across repeated runs.

The weather answer also explains the architectural difference. No weather-specific Python wrapper was added. The API agent already had Search, and the model chose it for a question the GitHub CLI could not answer. General tools let the model compose a route to a task without the application naming every task-specific action in advance.

The client still makes an API call. It supplies user input, the environment, and the previous interaction ID to continue a multi-turn conversation. The environment sources include the installer script and AGENTS.md; credentials cover both GitHub API access and github.com, serving HTTP and Git commands. The backend starts the sandbox, loads the instructions and skills, and runs the repeated tool-call and tool-result cycle.

9:4010:11
Suggest correction

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

9:40 · section reference included

The loop moves server side; domain behavior stays yours

Where did the deleted Python work go? The following diagram shows the remaining client request beside the execution cycle now handled by the service. One client call can contain many model–tool exchanges. The loop remains essential; its implementation has moved out of the application.

The managed agent also handles conversation and session state, tool routing, and context compaction. The client sends new input instead of rebuilding the entire history or implementing its own compaction step. A remote Linux sandbox supplies the execution environment. These are the infrastructure responsibilities removed from the developer's reviewer.

Three responsibilities remain:

  • Instructions and rules: Define the desired behavior and domain requirements in AGENTS.md.
  • Capabilities and context: Supply the files, skills, and software the agent needs to accomplish the work.
  • Evaluations: Decide what successful behavior means and verify the outcomes.

Reducing orchestration code leaves more attention for these product-specific decisions. A hosted loop cannot decide whether a review meets your standards.

How it fits togetherOne client request, many remote execution steps

Sends input, environment, and previous interaction ID.

The client supplies the new input and continuation ID. The service loads the environment, then repeats model decisions and sandbox actions while managing session state and context.

13:1013:40
Suggest correction

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

13:10 · section reference included

Extend the reviewer with a skill, then reconsider the harness

Security scanning makes the extension cost concrete. In the earlier design, adding a scan requires choosing a scanning CLI, wrapping it in a Python function, defining a function schema, registering the tool, and running the updated implementation. In the file-based design, the developer provides skill instructions describing the scanner and, when needed, places the CLI in the environment. The agent can use those additions through its existing execution tools.

A skill does not make the scanning software unnecessary. It removes the need for a new application wrapper when Bash and the supplied program already provide the required action. The extension changes the agent's available knowledge and environment, while its client-side orchestration stays the same.

The talk points to a Git-worktree example that replaced roughly 12,000 lines of TypeScript orchestration with about 200 lines of agent files, skills, and Markdown. It also cites Manus refactoring its harness five times in six months during the previous year. These examples motivate revisiting orchestration as model capabilities change: a workflow that once required hardcoded coordination may become something a model can carry out from instructions.

The closing heuristic is pointed: if the harness grows more complex as the model improves, it is probably being overengineered. New capability should prompt a question about what can be removed. The aim is to benefit from improved model judgment rather than keep adding execution paths that reproduce decisions the model can now make.

14:4115:11
Suggest correction

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

14:41 · section reference included

Files carry preferences and handoffs beyond one conversation

Files can hold more than capabilities. An agent asked to remember a preference can write a note to disk and reuse it in a later session. A long-running session can also externalize a new feature request as a handoff file, leaving it available for later work. The mechanism is explicit storage followed by retrieval: later work benefits when the relevant file is available and read.

That brings the practical advice back to ownership. Give the agent general tools and room to explore, reason, and find a solution. Keep domain instructions and workflows clear, define useful tools, own the evals, and verify the results. “Build to delete” is the phrase that lands: preserve the behavior the product needs while allowing improved models to retire unnecessary implementation.

The final invitation is to try the harness in AI Studio, where prompting it starts a custom sandbox, then begin building files and skills. API-key setup is offered as another route. A free tier for the API is described as work in progress at the time of the recording, so the invitation does not establish free API availability.

16:1116:41
Suggest correction

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

16:11 · section reference included

Resources

Read the complete timestamped transcript
  1. 0:12

    Hi everyone. Uh thank you for coming. I

  2. 0:14

    know it's the fourth day, last session

  3. 0:16

    before the keynote starts again and we

  4. 0:18

    are going to do something fun. Uh we're

  5. 0:20

    going to look into how files are

  6. 0:22

    basically replacing Python. And before

  7. 0:25

    we begin, I would like to start with my

  8. 0:26

    favorite definition of what is an agent

  9. 0:29

    from Simon. An LLM agent runs tools uh

  10. 0:32

    in a loop until it achieves a goal. And

  11. 0:34

    what we are going to do is we are going

  12. 0:36

    to build uh the same agent, the same

  13. 0:38

    GitHub PR review agent in three

  14. 0:40

    different ways. And we are going to

  15. 0:42

    delete code on the way. Each new

  16. 0:44

    version, less code, more files

  17. 0:46

    basically. Um before we begin, I would

  18. 0:49

    like to quickly introduce you to the

  19. 0:51

    interactions API, which is our new

  20. 0:53

    Gemini API. It's a unified interface for

  21. 0:56

    um running models and agents. So you can

  22. 0:58

    use the interactions API to call the

  23. 1:00

    Gemini models directly or to call our

  24. 1:03

    new agents, which also comes with

  25. 1:05

    sandbox. It supports serverside state

  26. 1:07

    management, background execution. So

  27. 1:09

    it's perfectly suited for all that's

  28. 1:11

    coming in the next years. and um the

  29. 1:15

    capabilities it's the same API for tool

  30. 1:18

    call multimodality understanding

  31. 1:20

    multimodality generation so you always

  32. 1:22

    have the same interface might look very

  33. 1:25

    familiar if you're using other LLM

  34. 1:27

    applications we really try to build

  35. 1:29

    something for developers which you like

  36. 1:30

    to use uh to build and that's something

  37. 1:32

    we are going to do so something little

  38. 1:36

    bit different in the interactions API to

  39. 1:38

    other LLM applications or APIs is that

  40. 1:41

    we moved away from this term based based

  41. 1:44

    uh conversation history to steps. So

  42. 1:46

    until I would say a few months ago, most

  43. 1:49

    of the applications were really

  44. 1:50

    turnbased. Normally you had a user in

  45. 1:52

    input and then a model output, a user

  46. 1:54

    input, a model output, which definitely

  47. 1:56

    works for normal chat application. But

  48. 1:58

    as soon as you start to build agents,

  49. 2:00

    use reasoning model. We have more than

  50. 2:02

    just a user role and a model role,

  51. 2:04

    right? So we have like different inputs,

  52. 2:06

    we have different types, we have

  53. 2:08

    reasoning. So we decided to like make a

  54. 2:11

    cut, make a change and build something

  55. 2:13

    really for agents and that's what you

  56. 2:15

    see on the flat steps timeline on the

  57. 2:16

    right where you have a user input then

  58. 2:18

    you have reasoning you have a function

  59. 2:20

    call you have a function result and you

  60. 2:22

    no longer need to like abuse the user

  61. 2:24

    role for passing back data from an

  62. 2:27

    environment. So

  63. 2:29

    roughly a year one and a half years ago

  64. 2:32

    writing agents mostly meant writing a

  65. 2:34

    loop in Python. You needed to define a

  66. 2:36

    JSON schema. You needed to define Python

  67. 2:39

    functions. You needed to look at the

  68. 2:41

    output from the LLM. Need to check if it

  69. 2:43

    was a function call or if it was a text

  70. 2:45

    response. And then needed to match it

  71. 2:47

    against um the type and then like call

  72. 2:49

    the tool

  73. 2:51

    look of if you get an error and then

  74. 2:53

    like go back and forth and let's look at

  75. 2:56

    some some code example on how this would

  76. 2:58

    look and also run it and hope that uh

  77. 3:01

    the demo gods are great to us. So I

  78. 3:04

    built or I let Gemini build a basic

  79. 3:06

    implementation of this Python loop. So

  80. 3:09

    we have our uh class. We have a run

  81. 3:12

    function which uses the interactions

  82. 3:14

    API. We have all of the weird complex

  83. 3:17

    passing with function calling with uh

  84. 3:19

    appending the errors checking if we get

  85. 3:21

    an error and then we have uh the result

  86. 3:23

    again. And what we need of course for an

  87. 3:25

    agent is we also need a system

  88. 3:27

    instruction. So there's a separate file

  89. 3:29

    for the system instruction. Very basic.

  90. 3:31

    QR GitHub PR reviewer and then of course

  91. 3:34

    we need tools and for tools we needed to

  92. 3:36

    write those um JSON schemas

  93. 3:39

    specifications of description exactly

  94. 3:42

    define which uh actions the agent can

  95. 3:44

    take and then of course we need the

  96. 3:46

    implementation in this case using the

  97. 3:48

    the basic uh GitHub API just sending

  98. 3:51

    some some requests. So we can run this

  99. 3:55

    um in

  100. 3:58

    and basically the main main

  101. 3:59

    implementation is a very simple uh input

  102. 4:02

    interface and we can say something like

  103. 4:04

    hello

  104. 4:06

    and

  105. 4:08

    yes we get back hey I'm an agent and

  106. 4:10

    then we yes ask it to review a pull

  107. 4:13

    request on the Gemini skills repository

  108. 4:15

    and what we should see is like the agent

  109. 4:18

    should hopefully start soon sending

  110. 4:20

    function calls function results function

  111. 4:22

    calls function results but it's very

  112. 4:24

    limited to yes uh great it works very

  113. 4:28

    limited to the tools we define so if we

  114. 4:30

    ask the agent to do something which it

  115. 4:32

    does not have the capabilities to it

  116. 4:34

    just says hey I cannot do this um which

  117. 4:37

    is unfortunate but that's how we were

  118. 4:39

    building agents um raw Python code a lot

  119. 4:42

    of files a lot of things which can go

  120. 4:44

    wrong a lot of code to manage so what

  121. 4:47

    happened afterwards

  122. 4:49

    um or what we we need to do we have like

  123. 4:51

    a token generation We have the native

  124. 4:53

    function calling and we must execute the

  125. 4:56

    loop. We must handle the tool routing.

  126. 4:57

    We must create a JSON schemas. We must

  127. 5:00

    write the Python code. We need to

  128. 5:02

    execute the Python code. We need to

  129. 5:03

    manage the state. So there's a lot of

  130. 5:04

    things we need to do to get an agent

  131. 5:06

    running. And then we got agent

  132. 5:09

    frameworks. There were many different

  133. 5:10

    agent frameworks which abstracted away

  134. 5:12

    some of that complexity. One example

  135. 5:15

    here is the ADK framework um where you

  136. 5:17

    have an agent class now which handles

  137. 5:19

    all of the tool loops, the function

  138. 5:21

    calling, the retries, the error handling

  139. 5:24

    and it made it a little bit easier. We

  140. 5:27

    basically removed all of the boiler

  141. 5:29

    plate code which we always needed to

  142. 5:31

    write for agents put it into a framework

  143. 5:34

    and help people build with it. So back

  144. 5:37

    to the demo and

  145. 5:40

    um same example. So we go into the CR2

  146. 5:43

    and what is very interesting if you let

  147. 5:46

    me open both. So we still have our we

  148. 5:50

    don't have our agent file anymore. So

  149. 5:51

    the agent went away. We still have our

  150. 5:54

    prompt same system prompt. We still have

  151. 5:57

    our tools in this case also no JSON

  152. 5:59

    definitions anymore because those agent

  153. 6:01

    frameworks now use the uh signature of

  154. 6:05

    our functions to create those JSON

  155. 6:07

    schemas on the fly to provide the model.

  156. 6:10

    So let's stop our um agent. Now let's

  157. 6:14

    run our second agent.

  158. 6:17

    Similar interface,

  159. 6:19

    similar prompt and we should see a

  160. 6:22

    similar expected behavior where we have

  161. 6:24

    function calls. We try to get the PR

  162. 6:26

    data. We try to get the diff, we try to

  163. 6:29

    get all of the code we need and it works

  164. 6:33

    and we wait for for the agent to yes

  165. 6:36

    continue. But similar difficulty here.

  166. 6:38

    If I ask it like what's the weather in

  167. 6:42

    San Francisco

  168. 6:44

    um

  169. 6:46

    we should get back hopefully a result

  170. 6:48

    like hey I cannot do this I don't have

  171. 6:50

    access to the weather API which

  172. 6:51

    obviously makes sense because we did not

  173. 6:53

    define any tool still very unfortunate

  174. 6:55

    because we need to be very explicit on

  175. 6:57

    what our agent can do and we all know

  176. 6:59

    nowadays that we just want to prompt

  177. 7:01

    something and we wanted the agent to do

  178. 7:03

    whatever it takes to to achieve that

  179. 7:05

    goal. So what is left for us to do? What

  180. 7:08

    does the framework solve? The framework

  181. 7:10

    solves the turn taking loops, the

  182. 7:12

    routing, the execution mapping, the JSON

  183. 7:14

    schema creation for like the different

  184. 7:16

    function calls, but we still own the

  185. 7:18

    Python plumping. So we still need to

  186. 7:20

    write those tools with Python code. We

  187. 7:23

    still need to add specific rules or

  188. 7:26

    requirements to like make sure whatever

  189. 7:28

    we want the agent to do and we need to

  190. 7:30

    provide the environment where all of the

  191. 7:32

    tools are running, where we want to host

  192. 7:34

    it. So what comes afterwards? Afterwards

  193. 7:38

    hopefully comes remote agents and at

  194. 7:40

    Google IO we launched the anti-gravity

  195. 7:42

    remote agent on the Gemini API. The

  196. 7:45

    anti-gravity agent uh is powered by the

  197. 7:48

    same agent harness which powers the

  198. 7:50

    anti-gravity IDE. Here the same harness

  199. 7:52

    very important does not mean the same

  200. 7:54

    agent because the anti-gravity agent is

  201. 7:56

    a coding agent at the moment and the uh

  202. 7:58

    agent available in the Gemini API is a

  203. 8:00

    general purpose agent. So there might be

  204. 8:02

    different system instruction, there

  205. 8:04

    might be slightly different tools

  206. 8:05

    because the Gemini API already has a

  207. 8:07

    Google search tool. So we use that what

  208. 8:08

    we have built and but very importantly

  209. 8:11

    it comes with this new environment

  210. 8:13

    parameter and this environment parameter

  211. 8:15

    here allows the agent to get access to a

  212. 8:18

    hosted isolated cloud sandbox where it

  213. 8:21

    can run tools, where it can run bash

  214. 8:22

    commands and where it can save files.

  215. 8:25

    And those environments can be um

  216. 8:28

    configured. So you can provide sources

  217. 8:30

    and sources can be a GitHub repository,

  218. 8:32

    it can be a GCS bucket, it can be inline

  219. 8:35

    files and of course very important we

  220. 8:37

    want to make sure that those agents are

  221. 8:39

    secured and cannot use our credentials

  222. 8:42

    in any way possible. So we created a

  223. 8:44

    network proxy around the um agent

  224. 8:46

    sandbox which basically injects the

  225. 8:49

    credentials when the agent makes a

  226. 8:51

    request from inside the sandbox to

  227. 8:53

    outside the sandbox. So the agent never

  228. 8:55

    really sees your credential. It just

  229. 8:56

    knows hey I can call the GitHub API and

  230. 8:59

    then on the fly we make sure that it

  231. 9:01

    received the correct token which you

  232. 9:03

    define and you can also limit which

  233. 9:05

    domains the agent has access to. So if

  234. 9:06

    you want to restrict the agent

  235. 9:08

    completely on which network access it

  236. 9:10

    can or which website it can access you

  237. 9:12

    just leave it blank. By default the

  238. 9:14

    agent can access all because I mean it's

  239. 9:16

    a hassle if you first need to define

  240. 9:18

    where to go. So we tried to stay simple

  241. 9:20

    and of course making an API call is nice

  242. 9:23

    but we thought hey people want to reuse

  243. 9:25

    their configuration want to reuse their

  244. 9:28

    agents. So we added the agents API where

  245. 9:30

    you can define your own custom ID you

  246. 9:32

    the same system instruction the same

  247. 9:33

    base agent the same base environment and

  248. 9:36

    then you can create that agent and then

  249. 9:38

    you can use that agent in the same exact

  250. 9:40

    way as you use Gemini models or as you

  251. 9:42

    use the anti-gravity agent by providing

  252. 9:44

    the ID. So all of the existing code can

  253. 9:46

    be reused with your own custom agent,

  254. 9:48

    with your own custom tools, with your

  255. 9:49

    own custom uh credentials, environments,

  256. 9:52

    whatever you need for it to to run. So

  257. 9:55

    let's look at how this will look for SS

  258. 9:58

    code and as a demo. And

  259. 10:01

    okay, now 03. And what might be very

  260. 10:06

    obvious is that we no longer have a

  261. 10:07

    source directory. So the code went away.

  262. 10:11

    We have now an agents M uh folder with

  263. 10:14

    an agents MD file with system

  264. 10:16

    instructions. So very similar system

  265. 10:19

    instruction. The only difference here is

  266. 10:20

    that we tell the agent, hey, you have

  267. 10:22

    access to the GitHub CLI. So we no

  268. 10:26

    longer create specific tools for reading

  269. 10:29

    files from a GitHub pull request, for

  270. 10:31

    accessing a GitHub pull request. We just

  271. 10:33

    tell the agent, hey, you have a GitHub

  272. 10:34

    CLI, you have a bash tool, you have file

  273. 10:37

    systems. try to use it whenever you

  274. 10:39

    think it's important. And since we don't

  275. 10:42

    have the CLI installed, we have a very

  276. 10:44

    basic bash script in this case which

  277. 10:45

    checks, hey, if the GitHub CLI is

  278. 10:47

    installed, please use it. If not,

  279. 10:49

    download it and install it on the first

  280. 10:50

    turn. So, we go into our terminal and we

  281. 10:54

    run our agent here. In this case, maybe

  282. 10:57

    important I use a stream version because

  283. 10:59

    otherwise we would wait like a few

  284. 11:01

    seconds and we not get back any we would

  285. 11:03

    not get back any anything back. So same

  286. 11:06

    prompt

  287. 11:07

    and we should soon see um our function

  288. 11:11

    calls and function results coming in.

  289. 11:13

    Yes. So in this case since we run inside

  290. 11:15

    a sandbox the agent first like explores

  291. 11:17

    the sandbox to really make sure hey do

  292. 11:19

    we have this GitHub CLI installed and

  293. 11:22

    then tries to run it. It did not find it

  294. 11:24

    on the first turn. So it installs it and

  295. 11:26

    then we can see the agent doing its

  296. 11:28

    work. And in this case it's not using

  297. 11:30

    the predefined function calls. It's

  298. 11:31

    using the GitHub CLI and it's already

  299. 11:34

    existing knowledge about how it works. I

  300. 11:36

    have a bash tool. I have like access to

  301. 11:38

    the file system and I do all of that

  302. 11:40

    work to see or to like review the the

  303. 11:43

    pull request. Let's wait a little bit.

  304. 11:47

    Okay. And I think the the amazing part

  305. 11:50

    here is like if we ask the same question

  306. 11:52

    as before, what's the weather in San

  307. 11:57

    Francisco?

  308. 11:59

    We should hopefully see that the agent

  309. 12:02

    tries to use ah it uses Google search in

  310. 12:04

    this case on 2nd of July. Let me quickly

  311. 12:07

    check. Yeah, that's today. And we have

  312. 12:09

    around 20° Celsius and it works. So the

  313. 12:13

    agent became more of a general purpose

  314. 12:15

    agent and we don't need to like specify

  315. 12:17

    all of the tools. We basically trust the

  316. 12:19

    model on understanding hey I have a

  317. 12:21

    specific set of very atomic general

  318. 12:23

    purpose tools to solve my task or the

  319. 12:26

    task for the user. And if we look at the

  320. 12:28

    the code uh for like the the input or

  321. 12:32

    like the the sorry the the interface we

  322. 12:35

    have our sources here. So we have the

  323. 12:38

    the bash script which install the GitHub

  324. 12:40

    CLI. We have the agents MD file and then

  325. 12:42

    we say hey you can use the GitHub API

  326. 12:45

    with credentials. So I want to access or

  327. 12:48

    use GitHub credentials in a secure way.

  328. 12:50

    So I created a token for the API and

  329. 12:53

    also for github.com since you need both

  330. 12:55

    URLs. one uses is used for the git uh

  331. 12:57

    commands. The other one is used for HTT

  332. 12:59

    commands and then domain all is

  333. 13:00

    basically hey in addition to the GitHub

  334. 13:02

    URLs you can use all of the web but you

  335. 13:05

    don't have credentials for it and then

  336. 13:07

    it's a it's a simple single API call to

  337. 13:10

    the anti-gravity agent with your or user

  338. 13:12

    input with the environment and then also

  339. 13:14

    with the previous interaction ID that we

  340. 13:16

    keep the multi-turn going and that

  341. 13:18

    that's all it takes and it's a single

  342. 13:20

    API call on the backend side we start

  343. 13:22

    that cloud sandbox we load the agents MD

  344. 13:25

    file and the skills from the environment

  345. 13:27

    provided to the model and then the model

  346. 13:30

    between the API and the sandbox does all

  347. 13:32

    of the the looping calling the function

  348. 13:34

    returning the function results calling

  349. 13:36

    the function returning the function

  350. 13:37

    results and that is all it takes. So

  351. 13:40

    where does it leave us? We no longer

  352. 13:43

    need to execute loops. We no longer need

  353. 13:46

    to do two routing. We have a serverside

  354. 13:48

    conversation and session state. So we

  355. 13:50

    only need to provide new inputs. The

  356. 13:52

    context window and the compaction is

  357. 13:54

    also automatically managed by the agent.

  358. 13:56

    So if we continue our conversation at a

  359. 13:58

    certain point the context is compacted

  360. 14:00

    and we can continue without the need to

  361. 14:02

    manage anything and we also get an

  362. 14:04

    isolated remote Linux sandbox which we

  363. 14:06

    can use to run our code. So what is

  364. 14:09

    still left for us? We need to define

  365. 14:11

    instructions. We need to define rules

  366. 14:14

    behaviors in an agent MD file. We need

  367. 14:16

    to provide capabilities or context and

  368. 14:18

    skills MD and we need to own the evils.

  369. 14:20

    So all of the heavy lifting, the

  370. 14:23

    infrastructure management, all of the

  371. 14:24

    same code which probably every one of us

  372. 14:26

    has written of us here like 20 times is

  373. 14:29

    no longer needed. And you can start

  374. 14:30

    really building your product instead of

  375. 14:32

    like needing to rewrite the same code

  376. 14:34

    over and over again. And very important

  377. 14:37

    is like, hey, that's great, but what

  378. 14:39

    about extending? And I think looking

  379. 14:41

    into how extending previous agents to

  380. 14:44

    like those new agents work. It's very

  381. 14:47

    obvious that previously if we want to do

  382. 14:50

    like some kind of security scanning on a

  383. 14:52

    pull request, we would need to define or

  384. 14:53

    write a Python function. We would need

  385. 14:55

    to understand okay which CLI tools do we

  386. 14:57

    need to use? We need to define a new

  387. 14:59

    function schema and then we needed to

  388. 15:01

    add it to our tools need to run it and

  389. 15:03

    then so there's a lot of things we need

  390. 15:05

    to do on on agents powered by files. We

  391. 15:08

    write a skills MD file maybe with some

  392. 15:10

    additional information on which CLI tool

  393. 15:11

    to use or maybe provide the CLI tool

  394. 15:13

    inside the environment and then we

  395. 15:15

    extended the capabilities. we don't need

  396. 15:16

    to change our code. We just provide more

  397. 15:18

    files to the agent and the agent decides

  398. 15:20

    on what we want to do. And I like to

  399. 15:23

    bring up some very good examples. So at

  400. 15:25

    a engineer in Europe, Cursor did a great

  401. 15:27

    talk on how they replaced uh roughly

  402. 15:30

    12,000 lines of TypeScript code with a

  403. 15:32

    200 lines agent files to create

  404. 15:35

    something similar. So they had a very

  405. 15:37

    hard-coded code um orchestration for

  406. 15:40

    doing git work trees and they were m

  407. 15:42

    able to replace it with just a skill and

  408. 15:44

    markdown files and there are more I

  409. 15:47

    would say bitter lessons of ancient

  410. 15:48

    engineering manos has refactored their

  411. 15:51

    harness five times in six months last

  412. 15:53

    year langen has rearchitected their open

  413. 15:56

    deep research three times a year and

  414. 15:57

    then also worsel has removed 80% of

  415. 16:00

    their tools to achieve fewer steps

  416. 16:02

    faster responses and better accuracy so

  417. 16:04

    there's an obvious trend that with

  418. 16:07

    better model capabilities, we can remove

  419. 16:09

    orchestration code. But if your harness

  420. 16:12

    is getting more complex as the model

  421. 16:14

    improves, you are most likely

  422. 16:16

    overengineering your harness. So if you

  423. 16:18

    struggle with model improvements and

  424. 16:20

    adding new capabilities which lead to

  425. 16:22

    more complexity and more code, you might

  426. 16:24

    need to rethink a little bit on how your

  427. 16:26

    agent harness looks. And so where does

  428. 16:30

    it end up? Agents are just files. We

  429. 16:33

    write markdown files to extend

  430. 16:34

    capabilities. Agents can learn from

  431. 16:37

    those um can create their own files. So

  432. 16:40

    if you have a session and tell the agent

  433. 16:42

    to remember something to take notes of

  434. 16:44

    rules of preferences, the agent just

  435. 16:46

    writes it to this and then can reuse it

  436. 16:48

    in the later session and you can also

  437. 16:51

    externalize context. So if you have a

  438. 16:52

    very long running session and during

  439. 16:54

    that session you notice hey maybe I want

  440. 16:56

    to additionally work on another feature

  441. 16:58

    you can like just write that information

  442. 17:00

    that hand off to a file and like tell

  443. 17:02

    the agent to later pick it up. Uh so

  444. 17:05

    what are the takeaways? We should not

  445. 17:07

    fight the model like we should stop

  446. 17:09

    micromanaging the execution paths

  447. 17:11

    provide general tools to the agent and

  448. 17:12

    let the model explore reason and

  449. 17:14

    discover the right solution. Own what is

  450. 17:17

    yours meaning focus on your domain

  451. 17:19

    instructions. Focus on the workflows.

  452. 17:21

    Focus especially on the evals, define

  453. 17:24

    clean tools and verify the outcomes and

  454. 17:26

    really build to delete. Like we have

  455. 17:28

    seen in the past many many times, the

  456. 17:30

    better the model get, the more code we

  457. 17:32

    can remove and the more things we need

  458. 17:33

    to change and obviously we all want to

  459. 17:35

    benefit from better models. So what the

  460. 17:39

    things for you to get to do on Monday,

  461. 17:41

    you can scan that QR code which brings

  462. 17:43

    you directly to EI studio where you can

  463. 17:45

    immediately try out the anti-gravity

  464. 17:47

    harness. So you can already start

  465. 17:49

    prompting it. it will start your own

  466. 17:51

    custom sandbox. If not, um, start or

  467. 17:54

    create your API key. We are currently

  468. 17:56

    working on a free tier for the API. So

  469. 17:59

    hopefully you can start exploring faster

  470. 18:01

    soon and then definitely start building

  471. 18:03

    files and skills. And that's it. Thank

  472. 18:06

    you for for coming.

  473. 18:09

    [applause]

  474. 18:24

    >> [music]