{
  "@context": "https://schema.org",
  "@id": "https://aggr.aymericbeaumet.com/items/ampcode-com/2025-04-15-how-to-build-an-agent/#webpage",
  "@type": [
    "WebPage",
    "ArchiveComponent"
  ],
  "articleBody": "Thorsten Ball//April 15, 2025\n\nor: The Emperor Has No Clothes\n\nIt’s not that hard to build a fully functioning, code-editing agent.\n\nIt seems like it would be. When you look at an agent editing files, running commands, wriggling itself out of errors, retrying different strategies - it seems like there has to be a secret behind it.\n\nThere isn’t. It’s an LLM, a loop, and enough tokens. It’s what we’ve been saying on the [podcast](https://ampcode.com/podcast) from the start. The rest, the stuff that makes [Amp](https://ampcode.com/) so addictive and impressive? Elbow grease.\n\nBut building a small and yet highly impressive agent doesn’t even require that. You can do it in less than 400 lines of code, most of which is boilerplate.\n\nI’m going to show you how, right now. We’re going to write some code together and go from zero lines of code to “oh wow, this is… a game changer.”\n\nI *urge* you to follow along. No, really. You might think you can just read this and that you don’t have to type out the code, but it’s less than 400 lines of code. I need you to *feel* how little code it is and I want you to see this with your own eyes in your own terminal in your own folders.\n\nHere’s what we need:\n\n- [Go](https://go.dev/)\n- [Anthropic API key](https://console.anthropic.com/settings/keys) that you set as an environment variable, `ANTHROPIC_API_KEY`\n\n## Pencils out!\n\nLet’s dive right in and get ourselves a new Go project set up in four easy commands:\n\n```shell\nmkdir code-editing-agent\ncd code-editing-agent\ngo mod init agent\ntouch main.go\n```\n\nNow, let’s open `main.go` and, as a first step, put a skeleton of things we need in it:\n\n```go\npackage main\n\nimport (\n\t\"bufio\"\n\t\"context\"\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/anthropics/anthropic-sdk-go\"\n)\n\nfunc main() {\n\tclient := anthropic.NewClient()\n\n\tscanner := bufio.NewScanner(os.Stdin)\n\tgetUserMessage := func() (string, bool) {\n\t\tif !scanner.Scan() {\n\t\t\treturn \"\", false\n\t\t}\n\t\treturn scanner.Text(), true\n\t}\n\n\tagent := NewAgent(&client, getUserMessage)\n\terr := agent.Run(context.TODO())\n\tif err != nil {\n\t\tfmt.Printf(\"Error: %s\\n\", err.Error())\n\t}\n}\n\nfunc NewAgent(client *anthropic.Client, getUserMessage func() (string, bool)) *Agent {\n\treturn &Agent{\n\t\tclient:         client,\n\t\tgetUserMessage: getUserMessage,\n\t}\n}\n\ntype Agent struct {\n\tclient         *anthropic.Client\n\tgetUserMessage func() (string, bool)\n}\n```\n\nYes, this doesn’t compile yet. But what we have here is an `Agent` that has access to an `anthropic.Client` (which, by default, looks for `ANTHROPIC_API_KEY`) and that can get a user message by reading from stdin on the terminal.\n\nNow let’s add the missing `Run()` method:\n\n```go\n// main.go\n\nfunc (a *Agent) Run(ctx context.Context) error {\n\tconversation := []anthropic.MessageParam{}\n\n\tfmt.Println(\"Chat with Claude (use 'ctrl-c' to quit)\")\n\n\tfor {\n\t\tfmt.Print(\"\\\\u001b[94mYou\\\\u001b[0m: \")\n\t\tuserInput, ok := a.getUserMessage()\n\t\tif !ok {\n\t\t\tbreak\n\t\t}\n\n\t\tuserMessage := anthropic.NewUserMessage(anthropic.NewTextBlock(userInput))\n\t\tconversation = append(conversation, userMessage)\n\n\t\tmessage, err := a.runInference(ctx, conversation)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tconversation = append(conversation, message.ToParam())\n\n\t\tfor _, content := range message.Content {\n\t\t\tswitch content.Type {\n\t\t\tcase \"text\":\n\t\t\t\tfmt.Printf(\"\\\\u001b[93mClaude\\\\u001b[0m: %s\\n\", content.Text)\n\t\t\t}\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc (a *Agent) runInference(ctx context.Context, conversation []anthropic.MessageParam) (*anthropic.Message, error) {\n\tmessage, err := a.client.Messages.New(ctx, anthropic.MessageNewParams{\n\t\tModel:     anthropic.ModelClaude3_7SonnetLatest,\n\t\tMaxTokens: int64(1024),\n\t\tMessages:  conversation,\n\t})\n\treturn message, err\n}\n```\n\nIt’s not a lot, is it? 90 lines and the most important thing in them is this loop in `Run()` that lets us talk to Claude. But that’s already the heartbeat of this program.\n\nAnd for a heartbeat, it’s pretty straightforward: we first print a prompt, ask the user to type something, add it to the conversation, send it to Claude, add Claude’s response to the conversation, print the response, and around we go.\n\nThis is every AI chat application you’ve ever used, except it’s in the terminal.\n\nLet’s run it:\n\n```shell\nexport ANTHROPIC_API_KEY=\"this is the last time i will tell you to set this\"\n\n# Download the dependencies\ngo mod tidy\n# Run it\ngo run main.go\n```\n\nThen you can just talk to Claude, like this:\n\n$ go run main.go\n\nChat with Claude (use 'ctrl-c' to quit)\n\nYou: Hey! I'm Thorsten! How are you?\n\nClaude: Hi Thorsten! I'm doing well, thanks for asking. It's nice to meet you. How are you doing today? Is there something I can help you with?\n\nYou: Can you come up with any horse-related nicknames that make fun of my first name?\n\nClaude: I can try to come up with some playful horse-related nicknames based on \"Thorsten\": \\* Thorough-bred Thorsten \\* Trotsten \\* Thorsten the Stallion \\* Neighsten \\* Horseten \\* Thorsten the Galloper \\* Saddle-sten \\* Thorsten of the Mane \\* Canter-sten \\* Thorsteed These are meant to be lighthearted - I hope they give you a chuckle!\n\nYou:\n\nNotice how we kept the same conversation going over multiple turns. It remembers my name from the first message. The `conversation` grows longer with every turn and we send the whole conversation every time. The server — Anthropic’s server — is stateless. It only sees what’s in the `conversation` slice. It’s up to us to maintain that.\n\nOkay, let’s move on, because the nicknames suck and this is not an agent yet. What’s an agent? Here’s [my definition](https://youtu.be/J1-W9O3n7j8?t=72): an LLM with *access to tools*, giving it the ability to modify something outside the context window.\n\n## A First Tool\n\nAn LLM with *access to tools*? What’s a tool? The basic idea is this: you send a prompt to the model that says it should reply in a certain way if it wants to use “a tool”. Then you, as the receiver of that message, “use the tool” by executing it and replying with the result. That’s it. Everything else we’ll see is just abstraction on top of it.\n\nImagine you’re talking to a friend and you tell them: “in the following conversation, wink if you want me to raise my arm”. Weird thing to say, but an easy concept to grasp.\n\nWe can already try it without changing any of our code.\n\n$ go run main.go\n\nChat with Claude (use 'ctrl-c' to quit)\n\nYou: You are a weather expert. When I ask you about the weather in a given location, I want you to reply with \\`get\\_weather(\\<location\\_name>)\\`. I will then tell you what the weather in that location is. Understood?\n\nClaude: I understand your instructions. When you ask me about the weather in a specific location, I will reply with \\`get\\_weather(\\<location\\_name>)\\`. Then you'll provide me with the weather information for that location, and I can discuss it further with you. I'm ready whenever you'd like to ask about the weather somewhere.\n\nYou: Hey, what's the weather in Munich?\n\nClaude: get\\_weather(Munich)\n\nWe told Claude to wink with `get_weather` when it wants to know about the weather. The next step is to raise our arm and reply with “result of the tool”:\n\nYou: hot and humid, 28 degrees celcius\n\nClaude: Thank you for providing that information. The current weather in Munich is hot and humid at 28 degrees Celsius (about 82 degrees Fahrenheit). These are fairly warm conditions for Munich, especially with the added humidity which can make it feel even warmer than the temperature indicates. If you're in Munich or planning to visit, it would be good to stay hydrated, wear light clothing, and perhaps plan indoor activities during the hottest parts of the day. The combination of heat and humidity can be quite uncomfortable, particularly if you're not accustomed to such weather. Would you like to know about the weather in any other location?\n\nThat worked very well, on first try, didn’t it?\n\nThese models are trained and fine-tuned to use “tools” and they’re very eager to do so. By now, 2025, they kinda “know” that they don’t know everything and can use tools to get more information. (Of course that’s not precisely what’s going on, but it’s good enough an explanation for now.)\n\nTo summarize, all there is to tools and tool use are two things:\n\n1. You tell the model what tools are available\n2. When the model wants to execute the tool, it tells you, you execute the tool and send the response up\n\nTo make (1) easier, the big model providers have built-in APIs to send tool definitions along.\n\nOkay, now let’s build our first tool: `read_file`\n\n## The `read_file` tool\n\nIn order to define the `read_file` tool, we’re going to use the types that the Anthropic SDK suggests, but keep in mind: under the hood, this will all end up as strings that are sent to the model. It’s all “wink if you want me to use `read_file`“.\n\nEach tool we’re going to add will require the following:\n\n- A name\n- A description to tell the model what the tool does, when to use it, when to not use it, what it returns and so on\n- An input schema that describes, as a JSON schema, what inputs this tool expects and in which form\n- A function that actually executes the tool with the input the model sends to us and returns the result\n\nSo let’s add that to our code:\n\n```go\n// main.go\n\ntype ToolDefinition struct {\n\tName        string                         `json:\"name\"`\n\tDescription string                         `json:\"description\"`\n\tInputSchema anthropic.ToolInputSchemaParam `json:\"input_schema\"`\n\tFunction    func(input json.RawMessage) (string, error)\n}\n```\n\nNow we give our `Agent` tool definitions:\n\n```go\n// main.go\n\n// `tools` is added here:\ntype Agent struct {\n\tclient         *anthropic.Client\n\tgetUserMessage func() (string, bool)\n\ttools          []ToolDefinition\n}\n\n// And here:\nfunc NewAgent(\n\tclient *anthropic.Client,\n\tgetUserMessage func() (string, bool),\n\ttools []ToolDefinition,\n) *Agent {\n\treturn &Agent{\n\t\tclient:         client,\n\t\tgetUserMessage: getUserMessage,\n\t\ttools:          tools,\n\t}\n}\n\n// And here:\nfunc main() {\n    // [... previous code ...]\n\ttools := []ToolDefinition{}\n\tagent := NewAgent(&client, getUserMessage, tools)\n\n    // [... previous code ...]\n}\n```\n\nAnd send them along to the model in `runInference`:\n\n```go\n// main.go\n\nfunc (a *Agent) runInference(ctx context.Context, conversation []anthropic.MessageParam) (*anthropic.Message, error) {\n\tanthropicTools := []anthropic.ToolUnionParam{}\n\tfor _, tool := range a.tools {\n\t\tanthropicTools = append(anthropicTools, anthropic.ToolUnionParam{\n\t\t\tOfTool: &anthropic.ToolParam{\n\t\t\t\tName:        tool.Name,\n\t\t\t\tDescription: anthropic.String(tool.Description),\n\t\t\t\tInputSchema: tool.InputSchema,\n\t\t\t},\n\t\t})\n\t}\n\n\tmessage, err := a.client.Messages.New(ctx, anthropic.MessageNewParams{\n\t\tModel:     anthropic.ModelClaude3_7SonnetLatest,\n\t\tMaxTokens: int64(1024),\n\t\tMessages:  conversation,\n\t\tTools:     anthropicTools,\n\t})\n\treturn message, err\n}\n```\n\nThere’s a bunch of type shenanigans going on and I’m not too good in Go-with-generics yet so I’m not going to try to explain `anthropic.String` and `ToolUnionParam` to you. But, really, I swear, it’s very simple:\n\nWe send along our tool definitions, on the server Anthropic then wraps these definitions in [this system prompt](https://docs.anthropic.com/en/docs/build-with-claude/tool-use/overview#tool-use-system-prompt) (which isn’t much), which it adds to our `conversation`, and the model then replies in a specific way if it wants to use that tool.\n\nAlright, so tool definitions are being sent along, but we haven’t defined a tool yet. Let’s do that and define `read_file`:\n\n```go\n// main.go\n\nvar ReadFileDefinition = ToolDefinition{\n\tName:        \"read_file\",\n\tDescription: \"Read the contents of a given relative file path. Use this when you want to see what's inside a file. Do not use this with directory names.\",\n\tInputSchema: ReadFileInputSchema,\n\tFunction:    ReadFile,\n}\n\ntype ReadFileInput struct {\n\tPath string `json:\"path\" jsonschema_description:\"The relative path of a file in the working directory.\"`\n}\n\nvar ReadFileInputSchema = GenerateSchema[ReadFileInput]()\n\nfunc ReadFile(input json.RawMessage) (string, error) {\n\treadFileInput := ReadFileInput{}\n\terr := json.Unmarshal(input, &readFileInput)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tcontent, err := os.ReadFile(readFileInput.Path)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\treturn string(content), nil\n}\n\nfunc GenerateSchema[T any]() anthropic.ToolInputSchemaParam {\n\treflector := jsonschema.Reflector{\n\t\tAllowAdditionalProperties: false,\n\t\tDoNotReference:            true,\n\t}\n\tvar v T\n\n\tschema := reflector.Reflect(v)\n\n\treturn anthropic.ToolInputSchemaParam{\n\t\tProperties: schema.Properties,\n\t}\n}\n```\n\nThat’s not much, is it? It’s a single function, `ReadFile`, and two descriptions the model will see: our `Description` that describes the tool itself (`\"Read the contents of a given relative file path. ...\"`) and a description of the single input parameter this tool has (`\"The relative path of a ...\"`).\n\nThe `ReadFileInputSchema` and `GenerateSchema` stuff? We need that so that we can generate a JSON schema for our tool definition which we send to the model. To do that, we use the `jsonschema` package, which we need to import and download:\n\n```go\n// main.go\n\npackage main\n\nimport (\n\t\"bufio\"\n\t\"context\"\n    // Add this:\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/anthropics/anthropic-sdk-go\"\n    // Add this:\n\t\"github.com/invopop/jsonschema\"\n)\n```\n\nThen run the following:\n\n```text\ngo mod tidy\n```\n\nThen, in the `main` function, we need to make sure that we use the definition:\n\n```go\nfunc main() {\n    // [... previous code ...]\n\ttools := []ToolDefinition{ReadFileDefinition}\n    // [... previous code ...]\n}\n```\n\nTime to try it!\n\n$ go run main.go\n\nChat with Claude (use 'ctrl-c' to quit)\n\nYou: what's in main.go?\n\nClaude: I'll help you check what's in the main.go file. Let me read it for you.\n\nYou:\n\nWait, what? Ho, ho, ho, it wants to use the tool! Obviously the output will be slightly different for you, but it certainly sounds like Claude knows that it can read files, right?\n\nThe problem is that we don’t listen! When Claude winks, we ignore it. We need to fix that.\n\nHere, let me show you how to do that in a single, quick, surprisingly-agile-for-my-age move by replacing our `Agent`’s `Run` method with this:\n\n```go\n// main.go\n\nfunc (a *Agent) Run(ctx context.Context) error {\n\tconversation := []anthropic.MessageParam{}\n\n\tfmt.Println(\"Chat with Claude (use 'ctrl-c' to quit)\")\n\n\treadUserInput := true\n\tfor {\n\t\tif readUserInput {\n\t\t\tfmt.Print(\"\\\\u001b[94mYou\\\\u001b[0m: \")\n\t\t\tuserInput, ok := a.getUserMessage()\n\t\t\tif !ok {\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tuserMessage := anthropic.NewUserMessage(anthropic.NewTextBlock(userInput))\n\t\t\tconversation = append(conversation, userMessage)\n\t\t}\n\n\t\tmessage, err := a.runInference(ctx, conversation)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tconversation = append(conversation, message.ToParam())\n\n\t\ttoolResults := []anthropic.ContentBlockParamUnion{}\n\t\tfor _, content := range message.Content {\n\t\t\tswitch content.Type {\n\t\t\tcase \"text\":\n\t\t\t\tfmt.Printf(\"\\\\u001b[93mClaude\\\\u001b[0m: %s\\n\", content.Text)\n\t\t\tcase \"tool_use\":\n\t\t\t\tresult := a.executeTool(content.ID, content.Name, content.Input)\n\t\t\t\ttoolResults = append(toolResults, result)\n\t\t\t}\n\t\t}\n\t\tif len(toolResults) == 0 {\n\t\t\treadUserInput = true\n\t\t\tcontinue\n\t\t}\n\t\treadUserInput = false\n\t\tconversation = append(conversation, anthropic.NewUserMessage(toolResults...))\n\t}\n\n\treturn nil\n}\n\nfunc (a *Agent) executeTool(id, name string, input json.RawMessage) anthropic.ContentBlockParamUnion {\n\tvar toolDef ToolDefinition\n\tvar found bool\n\tfor _, tool := range a.tools {\n\t\tif tool.Name == name {\n\t\t\ttoolDef = tool\n\t\t\tfound = true\n\t\t\tbreak\n\t\t}\n\t}\n\tif !found {\n\t\treturn anthropic.NewToolResultBlock(id, \"tool not found\", true)\n\t}\n\n\tfmt.Printf(\"\\\\u001b[92mtool\\\\u001b[0m: %s(%s)\\n\", name, input)\n\tresponse, err := toolDef.Function(input)\n\tif err != nil {\n\t\treturn anthropic.NewToolResultBlock(id, err.Error(), true)\n\t}\n\treturn anthropic.NewToolResultBlock(id, response, false)\n}\n```\n\nSquint and you’ll see that it’s 90% boilerplate and 10% that matter: when we get a `message` back from Claude, we check wether Claude asked us to execute a tool by looking for `content.Type == \"tool_use\"`, if so we hand over to `executeTool`, lookup the tool by name in our local registry, unmarshal the input, execute it, return the result. If it’s an error, we flip a boolean. That’s it.\n\n(Yes, there is a loop in a loop, but it doesn’t matter.)\n\nWe execute the tool, send the result back up to Claude, and ask again for Claude’s response. Truly: that’s *it*. Let me show you.\n\nMise-en-place, run this:\n\n```shell\necho 'what animal is the most disagreeable because it always says neigh?' >> secret-file.txt\n```\n\nThat creates a `secret-file.txt` in our directory, containing a mysterious riddle.\n\nIn that very same directory, let’s run our new tool-using agent, and ask it to look at the file:\n\n$ go run main.go\n\nChat with Claude (use 'ctrl-c' to quit)\n\nYou: Claude, buddy, help me solve the riddle in the secret-file.txt file\n\nClaude: I'll help you solve the riddle in the secret-file.txt file. Let me first read the contents of this file to see what the riddle is.\n\ntool: read\\_file({\"path\":\"secret-file.txt\"})\n\nClaude: Great! I've found the riddle. The answer to the riddle is: \\*\\*A horse\\*\\* The riddle is playing on wordplay where \"neigh\" (the sound a horse makes) sounds like \"nay\" (a way to say \"no\" or disagree with something). So horses are described as disagreeable because they always say \"neigh/nay\" - implying they're always disagreeing.\n\nYou:\n\nLet’s take a deep breath and say it together. Ready? Here we go: *holy shit*. You just give it a tool and it… *uses it when it thinks it’ll help solve the task*. Remember: we didn’t say *anything* about “if a user asks you about a file, read the file”. We also didn’t say “if something looks like a filename, figure out how to read it”. No, none of that. We say “help me solve the thing in this file” and Claude realizes that it can read the file to answer that and off it goes.\n\nOf course, we *can* be specific and really nudge it towards a tool, but it basically does it all on its own:\n\n$ go run main.go\n\nChat with Claude (use 'ctrl-c' to quit)\n\nYou: What's going on in main.go? Be brief!\n\nClaude: I'll check the main.go file to see what's going on.\n\ntool: read\\_file({\"path\":\"main.go\"})\n\nClaude: Based on my review, main.go implements a Claude AI assistant agent that can use tools. Here's a brief summary: - It creates a command-line chat interface with Claude using the Anthropic Go SDK - Implements a tool system with a single \"read\\_file\" tool for reading file contents - Manages the conversation flow with Claude, handling both regular text responses and tool use requests - When Claude requests to use a tool, the agent executes it and returns the results - The program loops continuously to maintain a conversation until the user exits The code essentially builds a simple CLI-based chatbot that can interact with the file system when requested by Claude.\n\nYou:\n\nSpot on. Okay, now that we know how to make Claude use tools, let’s add a few more.\n\n## The `list_files` tool\n\nIf you’re anything like me, the first thing you do when you log into a new computer is to get your bearings by running `ls` — list files.\n\nLet’s give Claude the same ability, a tool to list files. And here’s the complete implementation of a `list_files` tool:\n\n```go\n// main.go\n\nvar ListFilesDefinition = ToolDefinition{\n\tName:        \"list_files\",\n\tDescription: \"List files and directories at a given path. If no path is provided, lists files in the current directory.\",\n\tInputSchema: ListFilesInputSchema,\n\tFunction:    ListFiles,\n}\n\ntype ListFilesInput struct {\n\tPath string `json:\"path,omitempty\" jsonschema_description:\"Optional relative path to list files from. Defaults to current directory if not provided.\"`\n}\n\nvar ListFilesInputSchema = GenerateSchema[ListFilesInput]()\n\nfunc ListFiles(input json.RawMessage) (string, error) {\n\tlistFilesInput := ListFilesInput{}\n\terr := json.Unmarshal(input, &listFilesInput)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tdir := \".\"\n\tif listFilesInput.Path != \"\" {\n\t\tdir = listFilesInput.Path\n\t}\n\n\tvar files []string\n\terr = filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\trelPath, err := filepath.Rel(dir, path)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tif relPath != \".\" {\n\t\t\tif info.IsDir() {\n\t\t\t\tfiles = append(files, relPath+\"/\")\n\t\t\t} else {\n\t\t\t\tfiles = append(files, relPath)\n\t\t\t}\n\t\t}\n\t\treturn nil\n\t})\n\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\tresult, err := json.Marshal(files)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\treturn string(result), nil\n}\n```\n\nNothing fancy here: `list_files` returns the list of files and directories in the current folder. There’s a thousand optimizations we could (and probably should) make if this were a serious effort, but since I just want to show you what’s in the wizard’s hat, this is fine.\n\nOne thing to note: we return a list of strings and we denote directories with a trailing slash. That’s not required, it’s just something I just decided to do. There’s no fixed format. Anything goes as long as Claude can make sense of it and whether it can you need to figure out by experimentation. You could also prepend each directory with `\"directory: \"` or return a Markdown document with two headers: `\"directories\"` and `\"files\"`. There’s a ton of options and which one you chose depends on what Claude can make the most sense of, how many tokens it requires, how fast it is to generate and read, and so on.\n\nHere, we just want to create a small `list_files` tool and the easiest option wins.\n\nOf course we need to tell Claude about `list_files` too:\n\n```go\n// main.go\n\nfunc main() {\n\t// [... previous code ...]\n\n\ttools := []ToolDefinition{ReadFileDefinition, ListFilesDefinition}\n\n\t// [... previous code ...]\n}\n```\n\nAnd that’s it. Let’s ask Claude what it can see in this directory.\n\n$ go run main.go\n\nChat with Claude (use 'ctrl-c' to quit)\n\nYou: what do you see in this directory?\n\nClaude: I'll help you see what's in the current directory. Let me list the files and directories for you.\n\ntool: list\\_files({})\n\nClaude: I can see several files and directories in the current directory: 1. Git-related files and directories: - \\`.git/\\` directory with various Git configuration and tracking files - \\`.gitignore\\` file 2. Go project files: - \\`main.go\\` - the main Go source code file - \\`go.mod\\` - Go module definition file - \\`go.sum\\` - Go module checksum file 3. Documentation: - \\`blogpost.md\\` - a markdown file, likely containing blog content 4. Environment configuration: - \\`.envrc\\` - likely an environment configuration file Would you like me to examine the contents of any specific file from this list?\n\nYou:\n\nWorks! It can read the directory.\n\nBut here’s the thing: Claude knows how to combine these tools. We just need to prompt it in a way that provokes it:\n\n$ go run main.go\n\nChat with Claude (use 'ctrl-c' to quit)\n\nYou: Tell me about all the Go files in here. Be brief!\n\nClaude: I'll examine the Go files in the current directory for you. Let me check what files are available first.\n\ntool: list\\_files({})\n\nClaude: I found a Go file in the current directory. Let me examine it:\n\ntool: read\\_file({\"path\":\"main.go\"})\n\ntool: read\\_file({\"path\":\"go.mod\"})\n\nClaude: Here's a brief overview of the Go files in this project: \\*\\*main.go\\*\\*: - Implements a Claude AI agent that can interact with the local filesystem - Uses the Anthropic SDK for Go to communicate with Claude AI models - Provides two tools: \\`read\\_file\\` and \\`list\\_files\\` that allow Claude to read file contents and list directory contents - Manages a conversation flow between the user and Claude, handling tool execution when Claude needs to access files \\*\\*go.mod\\*\\*: - Defines the module dependencies - Main dependencies are the Anthropic SDK for Go and a JSON schema library - Uses Go 1.24.1 This appears to be a simple terminal-based application that allows users to chat with Claude while giving the AI access to read local files and list directories.\n\nYou:\n\nFirst it used the `list_files` and then it called `read_file` twice with the Go-related files that I asked it about.\n\nJust… just like we would, right? I mean, here, what would you do if I ask you what version of Go we use in this project? Here’s what Claude does for me:\n\n$ go run main.go\n\nChat with Claude (use 'ctrl-c' to quit)\n\nYou: What go version are we using in this project?\n\nClaude: I'll help you find the Go version being used in this project. Let me check the files to locate where the Go version might be specified.\n\ntool: list\\_files({})\n\nClaude: I can see there's a Go project here with several important files like \\`go.mod\\`, \\`go.sum\\`, and \\`main.go\\`. Let me check the \\`go.mod\\` file first, as it typically contains the Go version information.\n\ntool: read\\_file({\"path\":\"go.mod\"})\n\nClaude: According to the \\`go.mod\\` file, this project is using Go version 1.24.1.\n\nClaude looks at the directory, looks at `go.mod`, and has the answer.\n\nWe’re at around 190 lines of code now. Let that sink in. Once you have, let’s add another tool.\n\n## Let it `edit_file`\n\nThe last tool we’re going to add is `edit_file` — a tool that lets Claude edit files.\n\n“Holy shit”, you’re thinking now, “this is where the rubber hits the road, this is where he pulls the rabbit out of the hat.” Well, let’s see, shall we?\n\nFirst, let’s add a definition for our new `edit_file` tool:\n\n```go\n// main.go\n\nvar EditFileDefinition = ToolDefinition{\n\tName: \"edit_file\",\n\tDescription: `Make edits to a text file.\n\nReplaces 'old_str' with 'new_str' in the given file. 'old_str' and 'new_str' MUST be different from each other.\n\nIf the file specified with path doesn't exist, it will be created.\n`,\n\tInputSchema: EditFileInputSchema,\n\tFunction:    EditFile,\n}\n\ntype EditFileInput struct {\n\tPath   string `json:\"path\" jsonschema_description:\"The path to the file\"`\n\tOldStr string `json:\"old_str\" jsonschema_description:\"Text to search for - must match exactly and must only have one match exactly\"`\n\tNewStr string `json:\"new_str\" jsonschema_description:\"Text to replace old_str with\"`\n}\n\nvar EditFileInputSchema = GenerateSchema[EditFileInput]()\n```\n\nThat’s right, I again know what you’re thinking: “string replacement to edit files?” Claude 3.7 loves replacing strings (experimentation is how you find out what they love or don’t), so we’re going to implement `edit_file` by telling Claude it can edit files by replacing existing text with new text.\n\nNow here’s the implementation of the `EditFile` function in Go:\n\n```go\nfunc EditFile(input json.RawMessage) (string, error) {\n\teditFileInput := EditFileInput{}\n\terr := json.Unmarshal(input, &editFileInput)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\tif editFileInput.Path == \"\" || editFileInput.OldStr == editFileInput.NewStr {\n\t\treturn \"\", fmt.Errorf(\"invalid input parameters\")\n\t}\n\n\tcontent, err := os.ReadFile(editFileInput.Path)\n\tif err != nil {\n\t\tif os.IsNotExist(err) && editFileInput.OldStr == \"\" {\n\t\t\treturn createNewFile(editFileInput.Path, editFileInput.NewStr)\n\t\t}\n\t\treturn \"\", err\n\t}\n\n\toldContent := string(content)\n\tnewContent := strings.Replace(oldContent, editFileInput.OldStr, editFileInput.NewStr, -1)\n\n\tif oldContent == newContent && editFileInput.OldStr != \"\" {\n\t\treturn \"\", fmt.Errorf(\"old_str not found in file\")\n\t}\n\n\terr = os.WriteFile(editFileInput.Path, []byte(newContent), 0644)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\treturn \"OK\", nil\n}\n```\n\nIt checks the input parameters, it reads the file (or creates it if it exists), and replaces the `OldStr` with `NewStr`. Then it writes the content back to disk and returns `\"OK\"`.\n\nWhat’s missing still is `createNewFile`, which is just a tiny helper function that would be 70% shorter if this wasn’t Go:\n\n```go\nfunc createNewFile(filePath, content string) (string, error) {\n\tdir := path.Dir(filePath)\n\tif dir != \".\" {\n\t\terr := os.MkdirAll(dir, 0755)\n\t\tif err != nil {\n\t\t\treturn \"\", fmt.Errorf(\"failed to create directory: %w\", err)\n\t\t}\n\t}\n\n\terr := os.WriteFile(filePath, []byte(content), 0644)\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"failed to create file: %w\", err)\n\t}\n\n\treturn fmt.Sprintf(\"Successfully created file %s\", filePath), nil\n}\n```\n\nLast step: adding it to the list of tools that we send to Claude.\n\n```go\n// main.go\n\nfunc main() {\n\t// [... previous code ...]\n\n\ttools := []ToolDefinition{ReadFileDefinition, ListFilesDefinition, EditFileDefinition}\n\n\t// [... previous code ...]\n}\n```\n\nAnd… we’re ready, but are *you*? Are you ready to let it rip?\n\nThought so, let’s do this. Let’s tell Claude to create a new FizzBuzz function in JavaScript.\n\n$ go run main.go\n\nChat with Claude (use 'ctrl-c' to quit)\n\nYou: hey claude, create fizzbuzz.js that I can run with Nodejs and that has fizzbuzz in it and executes it\n\nClaude: I'll create a fizzbuzz.js file that you can run with Node.js. First, let me check if the file already exists:\n\ntool: list\\_files({})\n\nClaude: I don't see a fizzbuzz.js file, so I'll create one with a classic FizzBuzz implementation. This program will print numbers from 1 to 100, but for multiples of 3 it will print \"Fizz\", for multiples of 5 it will print \"Buzz\", and for numbers that are multiples of both 3 and 5 it will print \"FizzBuzz\".\n\ntool: edit\\_file({\"path\":\"fizzbuzz.js\",\"old\\_str\":\"\",\"new\\_str\":\"/\\*\\*\\\\n \\* FizzBuzz implementation in JavaScript\\\\n \\* Prints numbers from 1 to 100, but:\\\\n \\* - For multiples of 3, print \\\\\"Fizz\\\\\" instead of the number\\\\n \\* - For multiples of 5, print \\\\\"Buzz\\\\\" instead of the number\\\\n \\* - For multiples of both 3 and 5, print \\\\\"FizzBuzz\\\\\"\\\\n \\*/\\\\n\\\\nfunction fizzBuzz(n) {\\\\n for (let i = 1; i <= n; i++) {\\\\n let output = '';\\\\n \\\\n if (i % 3 === 0) output += 'Fizz';\\\\n if (i % 5 === 0) output += 'Buzz';\\\\n \\\\n console.log(output || i);\\\\n }\\\\n}\\\\n\\\\n// Execute FizzBuzz for numbers 1 to 100\\\\nconsole.log('Running FizzBuzz:');\\\\nfizzBuzz(100);\"}\n\nClaude: I've created a fizzbuzz.js file that you can run with Node.js. The program: 1. Defines a function called \\`fizzBuzz\\` that takes a parameter \\`n\\` for the upper limit 2. Loops from 1 to n (set to 100 in the execution) 3. For each number: - If it's divisible by 3, it adds \"Fizz\" to the output - If it's divisible by 5, it adds \"Buzz\" to the output - If it's divisible by both, it adds both resulting in \"FizzBuzz\" - If it's not divisible by either 3 or 5, it outputs the number itself 4. The script automatically executes the function for numbers 1 to 100 You can run this script using Node.js with the following command in your terminal: node fizzbuzz.js This will output the FizzBuzz sequence from 1 to 100 to your console.\n\nRight?! It’s impressive, isn’t it? And that’s the *most basic implemenation* of `edit_file` — of an agent in general — you can probably come up with.\n\nBut, did it work? Yes, it did:\n\n```text\n$ node fizzbuzz.js\nRunning FizzBuzz:\n1\n2\nFizz\n4\nBuzz\nFizz\n7\n8\nFizz\nBuzz\n11\nFizz\n13\n14\nFizzBuzz\n16\n[...]\n```\n\nAmazing. But hey, let’s have it actually *edit* a file and not just create one.\n\nHere’s what Claude does when I ask it to “Please edit the `fizzbuzz.js` so that it only prints until 15”:\n\n$ go run main.go\n\nChat with Claude (use 'ctrl-c' to quit)\n\nYou: Please edit fizzbuzz.js so that it only prints until 15\n\nClaude: I'll edit the fizzbuzz.js file to print only until 15 instead of its current limit. First, let me check the current content of the file to understand what changes are needed.\n\ntool: read\\_file({\"path\":\"fizzbuzz.js\"})\n\nClaude: I can see that the file currently runs FizzBuzz up to 100. I'll modify it to only run up to 15 instead by changing the parameter in the fizzBuzz function call.\n\ntool: edit\\_file({\"path\":\"fizzbuzz.js\",\"old\\_str\":\"// Execute FizzBuzz for numbers 1 to 100\\\\nconsole.log('Running FizzBuzz:');\\\\nfizzBuzz(100);\",\"new\\_str\":\"// Execute FizzBuzz for numbers 1 to 15\\\\nconsole.log('Running FizzBuzz:');\\\\nfizzBuzz(15);\"})\n\nClaude: I also need to update the comment at the top of the file to reflect this change:\n\ntool: edit\\_file({\"path\":\"fizzbuzz.js\",\"old\\_str\":\"/\\*\\*\\\\n \\* FizzBuzz implementation in JavaScript\\\\n \\* Prints numbers from 1 to 100, but:\",\"new\\_str\":\"/\\*\\*\\\\n \\* FizzBuzz implementation in JavaScript\\\\n \\* Prints numbers from 1 to 15, but:\"})\n\nClaude: The changes have been successfully made to the fizzbuzz.js file. The program will now: 1. Only print FizzBuzz from 1 to 15 (instead of 1 to 100) 2. The documentation has been updated to reflect this change The function itself remains the same, as it takes a parameter to determine the upper limit, and we've simply changed that parameter from 100 to 15.\n\nIt reads the file, it edits the file to change the how long it runs, *and* then it also edits the file to update the comment at the top.\n\nAnd it still works:\n\n```text\n$ node fizzbuzz.js\nRunning FizzBuzz:\n1\n2\nFizz\n4\nBuzz\nFizz\n7\n8\nFizz\nBuzz\n11\nFizz\n13\n14\nFizzBuzz\n```\n\nOkay, let’s do one more and ask it to do the following:\n\n> Create a congrats.js script that rot13-decodes the following string ‘Pbatenghyngvbaf ba ohvyqvat n pbqr-rqvgvat ntrag!’ and prints it\n\nMaybe a tall order. Let’s see:\n\n$ go run main.go\n\nChat with Claude (use 'ctrl-c' to quit)\n\nYou: Create a congrats.js script that rot13-decodes the following string 'Pbatenghyngvbaf ba ohvyqvat n pbqr-rqvgvat ntrag!' and prints it\n\nClaude: I'll create a congrats.js script that decodes the ROT13-encoded string and prints it. ROT13 is a simple letter substitution cipher that replaces a letter with the 13th letter after it in the alphabet. Let me create this file for you:\n\ntool: edit\\_file({\"path\":\"congrats.js\",\"old\\_str\":\"\",\"new\\_str\":\"/\\*\\*\\\\n \\* A script to decode a ROT13-encoded string and print the result\\\\n \\*/\\\\n\\\\nfunction rot13Decode(encodedStr) {\\\\n return encodedStr.replace(/\\[a-zA-Z\\]/g, function(char) {\\\\n // Get the character code\\\\n const charCode = char.charCodeAt(0);\\\\n \\\\n // Handle uppercase letters\\\\n if (charCode >= 65 && charCode <= 90) {\\\\n return String.fromCharCode(((charCode - 65 + 13) % 26) + 65);\\\\n }\\\\n \\\\n // Handle lowercase letters\\\\n if (charCode >= 97 && charCode <= 122) {\\\\n return String.fromCharCode(((charCode - 97 + 13) % 26) + 97);\\\\n }\\\\n \\\\n // Return non-alphabetic characters as is\\\\n return char;\\\\n });\\\\n}\\\\n\\\\nconst encodedMessage = 'Pbatenghyngvbaf ba ohvyqvat n pbqr-rqvgvat ntrag!';\\\\nconst decodedMessage = rot13Decode(encodedMessage);\\\\n\\\\nconsole.log(decodedMessage);\"})\n\nClaude: I've created a JavaScript file called congrats.js that: 1. Defines a \\`rot13Decode\\` function that takes an encoded string and applies the ROT13 cipher to decode it 2. Takes the provided string 'Pbatenghyngvbaf ba ohvyqvat n pbqr-rqvgvat ntrag!' 3. Decodes it using the function 4. Prints the decoded message to the console You can run this script using Node.js by typing \\`node congrats.js\\` in your terminal. The script will decode and display the hidden congratulatory message!\n\nDoes it work? Let’s try it:\n\n```text\n$ node congrats.js\nCongratulations on building a code-editing agent!\n```\n\nIt does!\n\n## Isn’t this amazing?\n\nIf you’re anything like all the engineers I’ve talked to in the past few months, chances are that, while reading this, you have been waiting for the rabbit to be pulled out of the hat, for me to say “well, in reality it’s much, much harder than this.” But it’s not.\n\nThis is essentially all there is to the inner loop of a code-editing agent. Sure, integrating it into your editor, tweaking the system prompt, giving it the right feedback at the right time, a nice UI around it, better tooling around the tools, support for multiple agents, and so on — we’ve built all of that in [Amp](https://ampcode.com/), but it didn’t require moments of genius. All that was required was practical engineering and elbow grease.\n\nThese models are incredibly powerful now. 300 lines of code and three tools and now you’re to be able to talk to an alien intelligence that edits your code. If you think “well, but we didn’t really…” — go and try it! Go and see how far you can get with this. I bet it’s a lot farther than you think.\n\n*That*’s why we think everything’s changing.\n",
  "authors": [],
  "captured_at": "2026-10-04T12:50:30.804479567+00:00",
  "category": "programming",
  "content_html": "<p>Thorsten Ball//April 15, 2025</p>\n<p>or: The Emperor Has No Clothes</p>\n<p>It’s not that hard to build a fully functioning, code-editing agent.</p>\n<p>It seems like it would be. When you look at an agent editing files, running commands, wriggling itself out of errors, retrying different strategies - it seems like there has to be a secret behind it.</p>\n<p>There isn’t. It’s an LLM, a loop, and enough tokens. It’s what we’ve been saying on the <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://ampcode.com/podcast\">podcast</a> from the start. The rest, the stuff that makes <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://ampcode.com/\">Amp</a> so addictive and impressive? Elbow grease.</p>\n<p>But building a small and yet highly impressive agent doesn’t even require that. You can do it in less than 400 lines of code, most of which is boilerplate.</p>\n<p>I’m going to show you how, right now. We’re going to write some code together and go from zero lines of code to “oh wow, this is… a game changer.”</p>\n<p>I <em>urge</em> you to follow along. No, really. You might think you can just read this and that you don’t have to type out the code, but it’s less than 400 lines of code. I need you to <em>feel</em> how little code it is and I want you to see this with your own eyes in your own terminal in your own folders.</p>\n<p>Here’s what we need:</p>\n<ul>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://go.dev/\">Go</a></li>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://console.anthropic.com/settings/keys\">Anthropic API key</a> that you set as an environment variable, <code>ANTHROPIC_API_KEY</code></li>\n</ul>\n<h2>Pencils out!</h2>\n<p>Let’s dive right in and get ourselves a new Go project set up in four easy commands:</p>\n<pre><code class=\"language-shell\"><span class=\"code-snippet\" data-language=\"Shell\"><span class=\"syntax-source syntax-shell syntax-bash\"><span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">mkdir</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> code-editing-agent</span>\n<span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-support syntax-function syntax-cd syntax-shell\">cd</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> code-editing-agent</span>\n<span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">go</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> mod init agent</span>\n<span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">touch</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> main.go</span>\n</span></span></code></pre>\n<p>Now, let’s open <code>main.go</code> and, as a first step, put a skeleton of things we need in it:</p>\n<pre><code class=\"language-go\"><span class=\"code-snippet\" data-language=\"Go\"><span class=\"syntax-source syntax-go\"><span class=\"syntax-keyword syntax-control syntax-go\">package</span> main\n\n<span class=\"syntax-meta syntax-import syntax-go\"><span class=\"syntax-keyword syntax-control syntax-import syntax-go\">import</span> <span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-import syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\">\n\t<span class=\"syntax-string syntax-quoted syntax-double syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-go\">&quot;</span>bufio<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-go\">&quot;</span></span>\n\t<span class=\"syntax-string syntax-quoted syntax-double syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-go\">&quot;</span>context<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-go\">&quot;</span></span>\n\t<span class=\"syntax-string syntax-quoted syntax-double syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-go\">&quot;</span>fmt<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-go\">&quot;</span></span>\n\t<span class=\"syntax-string syntax-quoted syntax-double syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-go\">&quot;</span>os<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-go\">&quot;</span></span>\n\n\t<span class=\"syntax-string syntax-quoted syntax-double syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-go\">&quot;</span>github.com/anthropics/anthropic-sdk-go<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-go\">&quot;</span></span>\n</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span>\n\n<span class=\"syntax-meta syntax-function syntax-declaration syntax-go\"><span class=\"syntax-storage syntax-type syntax-go\">func</span> <span class=\"syntax-entity syntax-name syntax-function syntax-go\">main</span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span><span class=\"syntax-meta syntax-function syntax-go\"> </span><span class=\"syntax-meta syntax-function syntax-go\"><span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span></span></span><span class=\"syntax-meta syntax-function syntax-go\"><span class=\"syntax-meta syntax-block syntax-go\">\n\t<span class=\"syntax-meta syntax-initialization syntax-short syntax-go\"><span class=\"syntax-variable syntax-other syntax-go\">client</span> <span class=\"syntax-keyword syntax-operator syntax-initialize syntax-go\">:=</span></span> anthropic<span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-function syntax-go\">NewClient</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span>\n\n\t<span class=\"syntax-meta syntax-initialization syntax-short syntax-go\"><span class=\"syntax-variable syntax-other syntax-go\">scanner</span> <span class=\"syntax-keyword syntax-operator syntax-initialize syntax-go\">:=</span></span> bufio<span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-function syntax-go\">NewScanner</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\">os<span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-other syntax-member syntax-go\">Stdin</span></span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span>\n\t<span class=\"syntax-meta syntax-initialization syntax-short syntax-go\"><span class=\"syntax-variable syntax-other syntax-go\">getUserMessage</span> <span class=\"syntax-keyword syntax-operator syntax-initialize syntax-go\">:=</span></span> <span class=\"syntax-meta syntax-function syntax-declaration syntax-anonymous syntax-go\"><span class=\"syntax-storage syntax-type syntax-go\">func</span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span><span class=\"syntax-meta syntax-function syntax-go\"> </span><span class=\"syntax-meta syntax-function syntax-return-type syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function syntax-return-type syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-storage syntax-type syntax-go\">string</span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> <span class=\"syntax-storage syntax-type syntax-go\">bool</span><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span><span class=\"syntax-meta syntax-function syntax-go\"> </span><span class=\"syntax-meta syntax-function syntax-go\"><span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span></span></span><span class=\"syntax-meta syntax-function syntax-go\"><span class=\"syntax-meta syntax-block syntax-go\">\n\t\t<span class=\"syntax-keyword syntax-control syntax-go\">if</span> <span class=\"syntax-keyword syntax-operator syntax-go\">!</span>scanner<span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-function syntax-go\">Scan</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span> <span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span>\n\t\t\t<span class=\"syntax-keyword syntax-control syntax-go\">return</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-go\">&quot;</span><span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-go\">&quot;</span></span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> <span class=\"syntax-constant syntax-language syntax-go\">false</span>\n\t\t<span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span>\n\t\t<span class=\"syntax-keyword syntax-control syntax-go\">return</span> scanner<span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-function syntax-go\">Text</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> <span class=\"syntax-constant syntax-language syntax-go\">true</span>\n\t</span></span><span class=\"syntax-meta syntax-function syntax-go\"><span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span></span>\n\n\t<span class=\"syntax-meta syntax-initialization syntax-short syntax-go\"><span class=\"syntax-variable syntax-other syntax-go\">agent</span> <span class=\"syntax-keyword syntax-operator syntax-initialize syntax-go\">:=</span></span> <span class=\"syntax-meta syntax-function-call syntax-go\"><span class=\"syntax-variable syntax-function syntax-go\">NewAgent</span><span class=\"syntax-meta syntax-function-call syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span></span><span class=\"syntax-meta syntax-function-call syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-keyword syntax-operator syntax-go\">&amp;</span>client<span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> getUserMessage</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span>\n\t<span class=\"syntax-meta syntax-initialization syntax-short syntax-go\"><span class=\"syntax-variable syntax-other syntax-go\">err</span> <span class=\"syntax-keyword syntax-operator syntax-initialize syntax-go\">:=</span></span> agent<span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-function syntax-go\">Run</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\">context<span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-function syntax-go\">TODO</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span></span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span>\n\t<span class=\"syntax-keyword syntax-control syntax-go\">if</span> err <span class=\"syntax-keyword syntax-operator syntax-go\">!=</span> <span class=\"syntax-constant syntax-language syntax-go\">nil</span> <span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span>\n\t\tfmt<span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-function syntax-go\">Printf</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-string syntax-quoted syntax-double syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-go\">&quot;</span>Error: <span class=\"syntax-constant syntax-other syntax-placeholder syntax-go\">%s</span><span class=\"syntax-constant syntax-character syntax-escape syntax-go\">\\n</span><span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-go\">&quot;</span></span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> err<span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-function syntax-go\">Error</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span></span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span>\n\t<span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span>\n</span></span><span class=\"syntax-meta syntax-function syntax-go\"><span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span></span>\n\n<span class=\"syntax-meta syntax-function syntax-declaration syntax-go\"><span class=\"syntax-storage syntax-type syntax-go\">func</span> <span class=\"syntax-entity syntax-name syntax-function syntax-go\">NewAgent</span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-variable syntax-parameter syntax-go\">client</span></span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"> <span class=\"syntax-keyword syntax-operator syntax-go\">*</span>anthropic.Client<span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> </span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-variable syntax-parameter syntax-go\">getUserMessage</span></span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"> func(</span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span><span class=\"syntax-meta syntax-function syntax-go\"> </span><span class=\"syntax-meta syntax-function syntax-return-type syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function syntax-return-type syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-storage syntax-type syntax-go\">string</span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> <span class=\"syntax-storage syntax-type syntax-go\">bool</span><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span>) *Agent<span class=\"syntax-meta syntax-function syntax-go\"> </span><span class=\"syntax-meta syntax-function syntax-go\"><span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span></span></span><span class=\"syntax-meta syntax-function syntax-go\"><span class=\"syntax-meta syntax-block syntax-go\">\n\t<span class=\"syntax-keyword syntax-control syntax-go\">return</span> <span class=\"syntax-keyword syntax-operator syntax-go\">&amp;</span>Agent<span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span>\n\t\t<span class=\"syntax-entity syntax-name syntax-label syntax-go\">client</span><span class=\"syntax-punctuation syntax-separator syntax-go\">:</span>         client<span class=\"syntax-punctuation syntax-separator syntax-go\">,</span>\n\t\t<span class=\"syntax-entity syntax-name syntax-label syntax-go\">getUserMessage</span><span class=\"syntax-punctuation syntax-separator syntax-go\">:</span> getUserMessage<span class=\"syntax-punctuation syntax-separator syntax-go\">,</span>\n\t<span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span>\n</span></span><span class=\"syntax-meta syntax-function syntax-go\"><span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span></span>\n\n<span class=\"syntax-meta syntax-struct syntax-go\"><span class=\"syntax-storage syntax-type syntax-go\">type</span> <span class=\"syntax-entity syntax-name syntax-struct syntax-go\">Agent</span> <span class=\"syntax-storage syntax-type syntax-go\">struct</span> <span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span>\n\t<span class=\"syntax-variable syntax-other syntax-member syntax-go\">client</span>         *anthropic.Client\n\t<span class=\"syntax-variable syntax-other syntax-member syntax-go\">getUserMessage</span> <span class=\"syntax-meta syntax-function syntax-declaration syntax-anonymous syntax-go\"><span class=\"syntax-storage syntax-type syntax-go\">func</span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span><span class=\"syntax-meta syntax-function syntax-go\"> </span><span class=\"syntax-meta syntax-function syntax-return-type syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function syntax-return-type syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-storage syntax-type syntax-go\">string</span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> <span class=\"syntax-storage syntax-type syntax-go\">bool</span><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span>\n</span><span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span></span>\n</span></span></code></pre>\n<p>Yes, this doesn’t compile yet. But what we have here is an <code>Agent</code> that has access to an <code>anthropic.Client</code> (which, by default, looks for <code>ANTHROPIC_API_KEY</code>) and that can get a user message by reading from stdin on the terminal.</p>\n<p>Now let’s add the missing <code>Run()</code> method:</p>\n<pre><code class=\"language-go\"><span class=\"code-snippet\" data-language=\"Go\"><span class=\"syntax-source syntax-go\"><span class=\"syntax-comment syntax-line syntax-double-slash syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-go\">//</span> main.go\n</span>\n<span class=\"syntax-meta syntax-function syntax-declaration syntax-go\"><span class=\"syntax-storage syntax-type syntax-go\">func</span> <span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span><span class=\"syntax-variable syntax-parameter syntax-receiver syntax-go\">a</span> <span class=\"syntax-keyword syntax-operator syntax-go\">*</span>Agent<span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span> <span class=\"syntax-entity syntax-name syntax-function syntax-go\">Run</span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-variable syntax-parameter syntax-go\">ctx</span></span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"> context.Context</span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span><span class=\"syntax-meta syntax-function syntax-go\"> </span><span class=\"syntax-meta syntax-function syntax-return-type syntax-go\"><span class=\"syntax-storage syntax-type syntax-go\">error</span> </span><span class=\"syntax-meta syntax-function syntax-go\"><span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span></span></span><span class=\"syntax-meta syntax-function syntax-go\"><span class=\"syntax-meta syntax-block syntax-go\">\n\t<span class=\"syntax-meta syntax-initialization syntax-short syntax-go\"><span class=\"syntax-variable syntax-other syntax-go\">conversation</span> <span class=\"syntax-keyword syntax-operator syntax-initialize syntax-go\">:=</span></span> <span class=\"syntax-meta syntax-brackets syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-brackets syntax-begin syntax-go\">[</span><span class=\"syntax-punctuation syntax-definition syntax-brackets syntax-end syntax-go\">]</span></span>anthropic<span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-other syntax-member syntax-go\">MessageParam</span><span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span><span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span>\n\n\tfmt<span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-function syntax-go\">Println</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-string syntax-quoted syntax-double syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-go\">&quot;</span>Chat with Claude (use &#39;ctrl-c&#39; to quit)<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-go\">&quot;</span></span></span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span>\n\n\t<span class=\"syntax-keyword syntax-control syntax-go\">for</span> <span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span>\n\t\tfmt<span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-function syntax-go\">Print</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-string syntax-quoted syntax-double syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-go\">&quot;</span><span class=\"syntax-constant syntax-character syntax-escape syntax-go\">\\\\</span>u001b[94mYou<span class=\"syntax-constant syntax-character syntax-escape syntax-go\">\\\\</span>u001b[0m: <span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-go\">&quot;</span></span></span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span>\n\t\t<span class=\"syntax-meta syntax-initialization syntax-short syntax-go\"><span class=\"syntax-variable syntax-other syntax-go\">userInput</span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> <span class=\"syntax-variable syntax-other syntax-go\">ok</span> <span class=\"syntax-keyword syntax-operator syntax-initialize syntax-go\">:=</span></span> a<span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-function syntax-go\">getUserMessage</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span>\n\t\t<span class=\"syntax-keyword syntax-control syntax-go\">if</span> <span class=\"syntax-keyword syntax-operator syntax-go\">!</span>ok <span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span>\n\t\t\t<span class=\"syntax-keyword syntax-control syntax-go\">break</span>\n\t\t<span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span>\n\n\t\t<span class=\"syntax-meta syntax-initialization syntax-short syntax-go\"><span class=\"syntax-variable syntax-other syntax-go\">userMessage</span> <span class=\"syntax-keyword syntax-operator syntax-initialize syntax-go\">:=</span></span> anthropic<span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-function syntax-go\">NewUserMessage</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\">anthropic<span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-function syntax-go\">NewTextBlock</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\">userInput</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span></span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span>\n\t\tconversation <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-go\">=</span> <span class=\"syntax-meta syntax-function-call syntax-go\"><span class=\"syntax-support syntax-function syntax-builtin syntax-go\">append</span><span class=\"syntax-meta syntax-function-call syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span></span><span class=\"syntax-meta syntax-function-call syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\">conversation<span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> userMessage</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span>\n\n\t\t<span class=\"syntax-meta syntax-initialization syntax-short syntax-go\"><span class=\"syntax-variable syntax-other syntax-go\">message</span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> <span class=\"syntax-variable syntax-other syntax-go\">err</span> <span class=\"syntax-keyword syntax-operator syntax-initialize syntax-go\">:=</span></span> a<span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-function syntax-go\">runInference</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\">ctx<span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> conversation</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span>\n\t\t<span class=\"syntax-keyword syntax-control syntax-go\">if</span> err <span class=\"syntax-keyword syntax-operator syntax-go\">!=</span> <span class=\"syntax-constant syntax-language syntax-go\">nil</span> <span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span>\n\t\t\t<span class=\"syntax-keyword syntax-control syntax-go\">return</span> err\n\t\t<span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span>\n\t\tconversation <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-go\">=</span> <span class=\"syntax-meta syntax-function-call syntax-go\"><span class=\"syntax-support syntax-function syntax-builtin syntax-go\">append</span><span class=\"syntax-meta syntax-function-call syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span></span><span class=\"syntax-meta syntax-function-call syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\">conversation<span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> message<span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-function syntax-go\">ToParam</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span></span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span>\n\n\t\t<span class=\"syntax-keyword syntax-control syntax-go\">for</span> <span class=\"syntax-meta syntax-initialization syntax-short syntax-go\"><span class=\"syntax-variable syntax-other syntax-go\">_</span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> <span class=\"syntax-variable syntax-other syntax-go\">content</span> <span class=\"syntax-keyword syntax-operator syntax-initialize syntax-go\">:=</span></span> <span class=\"syntax-keyword syntax-control syntax-go\">range</span> message<span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-other syntax-member syntax-go\">Content</span> <span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span>\n\t\t\t<span class=\"syntax-keyword syntax-control syntax-go\">switch</span> content<span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-other syntax-member syntax-go\">Type</span> <span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span>\n\t\t\t<span class=\"syntax-keyword syntax-control syntax-go\">case</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-go\">&quot;</span>text<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-go\">&quot;</span></span><span class=\"syntax-punctuation syntax-separator syntax-go\">:</span>\n\t\t\t\tfmt<span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-function syntax-go\">Printf</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-string syntax-quoted syntax-double syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-go\">&quot;</span><span class=\"syntax-constant syntax-character syntax-escape syntax-go\">\\\\</span>u001b[93mClaude<span class=\"syntax-constant syntax-character syntax-escape syntax-go\">\\\\</span>u001b[0m: <span class=\"syntax-constant syntax-other syntax-placeholder syntax-go\">%s</span><span class=\"syntax-constant syntax-character syntax-escape syntax-go\">\\n</span><span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-go\">&quot;</span></span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> content<span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-other syntax-member syntax-go\">Text</span></span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span>\n\t\t\t<span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span>\n\t\t<span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span>\n\t<span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span>\n\n\t<span class=\"syntax-keyword syntax-control syntax-go\">return</span> <span class=\"syntax-constant syntax-language syntax-go\">nil</span>\n</span></span><span class=\"syntax-meta syntax-function syntax-go\"><span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span></span>\n\n<span class=\"syntax-meta syntax-function syntax-declaration syntax-go\"><span class=\"syntax-storage syntax-type syntax-go\">func</span> <span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span><span class=\"syntax-variable syntax-parameter syntax-receiver syntax-go\">a</span> <span class=\"syntax-keyword syntax-operator syntax-go\">*</span>Agent<span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span> <span class=\"syntax-entity syntax-name syntax-function syntax-go\">runInference</span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-variable syntax-parameter syntax-go\">ctx</span></span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"> context.Context<span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> </span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-variable syntax-parameter syntax-go\">conversation</span></span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"> <span class=\"syntax-meta syntax-brackets syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-brackets syntax-begin syntax-go\">[</span><span class=\"syntax-punctuation syntax-definition syntax-brackets syntax-end syntax-go\">]</span></span>anthropic.MessageParam</span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span><span class=\"syntax-meta syntax-function syntax-go\"> </span><span class=\"syntax-meta syntax-function syntax-return-type syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function syntax-return-type syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-keyword syntax-operator syntax-go\">*</span>anthropic.Message<span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> <span class=\"syntax-storage syntax-type syntax-go\">error</span><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span><span class=\"syntax-meta syntax-function syntax-go\"> </span><span class=\"syntax-meta syntax-function syntax-go\"><span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span></span></span><span class=\"syntax-meta syntax-function syntax-go\"><span class=\"syntax-meta syntax-block syntax-go\">\n\t<span class=\"syntax-meta syntax-initialization syntax-short syntax-go\"><span class=\"syntax-variable syntax-other syntax-go\">message</span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> <span class=\"syntax-variable syntax-other syntax-go\">err</span> <span class=\"syntax-keyword syntax-operator syntax-initialize syntax-go\">:=</span></span> a<span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-other syntax-member syntax-go\">client</span><span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-other syntax-member syntax-go\">Messages</span><span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-function syntax-go\">New</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\">ctx<span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> anthropic<span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-other syntax-member syntax-go\">MessageNewParams</span>{\n\t\tModel<span class=\"syntax-punctuation syntax-separator syntax-go\">:</span>     anthropic<span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-other syntax-member syntax-go\">ModelClaude3_7SonnetLatest</span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span>\n\t\tMaxTokens<span class=\"syntax-punctuation syntax-separator syntax-go\">:</span> <span class=\"syntax-storage syntax-type syntax-go\">int64</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span><span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-go\">1024</span><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span>\n\t\tMessages<span class=\"syntax-punctuation syntax-separator syntax-go\">:</span>  conversation<span class=\"syntax-punctuation syntax-separator syntax-go\">,</span>\n\t}</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span>\n\t<span class=\"syntax-keyword syntax-control syntax-go\">return</span> message<span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> err\n</span></span><span class=\"syntax-meta syntax-function syntax-go\"><span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span></span>\n</span></span></code></pre>\n<p>It’s not a lot, is it? 90 lines and the most important thing in them is this loop in <code>Run()</code> that lets us talk to Claude. But that’s already the heartbeat of this program.</p>\n<p>And for a heartbeat, it’s pretty straightforward: we first print a prompt, ask the user to type something, add it to the conversation, send it to Claude, add Claude’s response to the conversation, print the response, and around we go.</p>\n<p>This is every AI chat application you’ve ever used, except it’s in the terminal.</p>\n<p>Let’s run it:</p>\n<pre><code class=\"language-shell\"><span class=\"code-snippet\" data-language=\"Shell\"><span class=\"syntax-source syntax-shell syntax-bash\"><span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-storage syntax-modifier syntax-shell\">export</span> <span class=\"syntax-variable syntax-other syntax-readwrite syntax-assignment syntax-shell\">ANTHROPIC_API_KEY</span><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-shell\">=</span><span class=\"syntax-string syntax-unquoted syntax-shell\"><span class=\"syntax-string syntax-quoted syntax-double syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-shell\">&quot;</span>this is the last time i will tell you to set this<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-shell\">&quot;</span></span></span></span>\n\n<span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-begin syntax-shell\">#</span></span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"> Download the dependencies</span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\">\n</span><span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">go</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> mod tidy</span>\n<span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-begin syntax-shell\">#</span></span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"> Run it</span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\">\n</span><span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">go</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> run main.go</span>\n</span></span></code></pre>\n<p>Then you can just talk to Claude, like this:</p>\n<p>$ go run main.go</p>\n<p>Chat with Claude (use 'ctrl-c' to quit)</p>\n<p>You: Hey! I'm Thorsten! How are you?</p>\n<p>Claude: Hi Thorsten! I'm doing well, thanks for asking. It's nice to meet you. How are you doing today? Is there something I can help you with?</p>\n<p>You: Can you come up with any horse-related nicknames that make fun of my first name?</p>\n<p>Claude: I can try to come up with some playful horse-related nicknames based on &quot;Thorsten&quot;: * Thorough-bred Thorsten * Trotsten * Thorsten the Stallion * Neighsten * Horseten * Thorsten the Galloper * Saddle-sten * Thorsten of the Mane * Canter-sten * Thorsteed These are meant to be lighthearted - I hope they give you a chuckle!</p>\n<p>You:</p>\n<p>Notice how we kept the same conversation going over multiple turns. It remembers my name from the first message. The <code>conversation</code> grows longer with every turn and we send the whole conversation every time. The server — Anthropic’s server — is stateless. It only sees what’s in the <code>conversation</code> slice. It’s up to us to maintain that.</p>\n<p>Okay, let’s move on, because the nicknames suck and this is not an agent yet. What’s an agent? Here’s <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://youtu.be/J1-W9O3n7j8?t=72\">my definition</a>: an LLM with <em>access to tools</em>, giving it the ability to modify something outside the context window.</p>\n<h2>A First Tool</h2>\n<p>An LLM with <em>access to tools</em>? What’s a tool? The basic idea is this: you send a prompt to the model that says it should reply in a certain way if it wants to use “a tool”. Then you, as the receiver of that message, “use the tool” by executing it and replying with the result. That’s it. Everything else we’ll see is just abstraction on top of it.</p>\n<p>Imagine you’re talking to a friend and you tell them: “in the following conversation, wink if you want me to raise my arm”. Weird thing to say, but an easy concept to grasp.</p>\n<p>We can already try it without changing any of our code.</p>\n<p>$ go run main.go</p>\n<p>Chat with Claude (use 'ctrl-c' to quit)</p>\n<p>You: You are a weather expert. When I ask you about the weather in a given location, I want you to reply with `get_weather(&lt;location_name&gt;)`. I will then tell you what the weather in that location is. Understood?</p>\n<p>Claude: I understand your instructions. When you ask me about the weather in a specific location, I will reply with `get_weather(&lt;location_name&gt;)`. Then you'll provide me with the weather information for that location, and I can discuss it further with you. I'm ready whenever you'd like to ask about the weather somewhere.</p>\n<p>You: Hey, what's the weather in Munich?</p>\n<p>Claude: get_weather(Munich)</p>\n<p>We told Claude to wink with <code>get_weather</code> when it wants to know about the weather. The next step is to raise our arm and reply with “result of the tool”:</p>\n<p>You: hot and humid, 28 degrees celcius</p>\n<p>Claude: Thank you for providing that information. The current weather in Munich is hot and humid at 28 degrees Celsius (about 82 degrees Fahrenheit). These are fairly warm conditions for Munich, especially with the added humidity which can make it feel even warmer than the temperature indicates. If you're in Munich or planning to visit, it would be good to stay hydrated, wear light clothing, and perhaps plan indoor activities during the hottest parts of the day. The combination of heat and humidity can be quite uncomfortable, particularly if you're not accustomed to such weather. Would you like to know about the weather in any other location?</p>\n<p>That worked very well, on first try, didn’t it?</p>\n<p>These models are trained and fine-tuned to use “tools” and they’re very eager to do so. By now, 2025, they kinda “know” that they don’t know everything and can use tools to get more information. (Of course that’s not precisely what’s going on, but it’s good enough an explanation for now.)</p>\n<p>To summarize, all there is to tools and tool use are two things:</p>\n<ol>\n<li>You tell the model what tools are available</li>\n<li>When the model wants to execute the tool, it tells you, you execute the tool and send the response up</li>\n</ol>\n<p>To make (1) easier, the big model providers have built-in APIs to send tool definitions along.</p>\n<p>Okay, now let’s build our first tool: <code>read_file</code></p>\n<h2>The <code>read_file</code> tool</h2>\n<p>In order to define the <code>read_file</code> tool, we’re going to use the types that the Anthropic SDK suggests, but keep in mind: under the hood, this will all end up as strings that are sent to the model. It’s all “wink if you want me to use <code>read_file</code>“.</p>\n<p>Each tool we’re going to add will require the following:</p>\n<ul>\n<li>A name</li>\n<li>A description to tell the model what the tool does, when to use it, when to not use it, what it returns and so on</li>\n<li>An input schema that describes, as a JSON schema, what inputs this tool expects and in which form</li>\n<li>A function that actually executes the tool with the input the model sends to us and returns the result</li>\n</ul>\n<p>So let’s add that to our code:</p>\n<pre><code class=\"language-go\"><span class=\"code-snippet\" data-language=\"Go\"><span class=\"syntax-source syntax-go\"><span class=\"syntax-comment syntax-line syntax-double-slash syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-go\">//</span> main.go\n</span>\n<span class=\"syntax-meta syntax-struct syntax-go\"><span class=\"syntax-storage syntax-type syntax-go\">type</span> <span class=\"syntax-entity syntax-name syntax-struct syntax-go\">ToolDefinition</span> <span class=\"syntax-storage syntax-type syntax-go\">struct</span> <span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span>\n\t<span class=\"syntax-variable syntax-other syntax-member syntax-go\">Name</span>        <span class=\"syntax-storage syntax-type syntax-go\">string</span>                         <span class=\"syntax-string syntax-quoted syntax-raw syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-go\">`</span>json:&quot;name&quot;<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-go\">`</span></span>\n\t<span class=\"syntax-variable syntax-other syntax-member syntax-go\">Description</span> <span class=\"syntax-storage syntax-type syntax-go\">string</span>                         <span class=\"syntax-string syntax-quoted syntax-raw syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-go\">`</span>json:&quot;description&quot;<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-go\">`</span></span>\n\t<span class=\"syntax-variable syntax-other syntax-member syntax-go\">InputSchema</span> anthropic.ToolInputSchemaParam <span class=\"syntax-string syntax-quoted syntax-raw syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-go\">`</span>json:&quot;input_schema&quot;<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-go\">`</span></span>\n\t<span class=\"syntax-variable syntax-other syntax-member syntax-go\">Function</span>    <span class=\"syntax-meta syntax-function syntax-declaration syntax-anonymous syntax-go\"><span class=\"syntax-meta syntax-function syntax-declaration syntax-anonymous syntax-go\"><span class=\"syntax-storage syntax-type syntax-go\">func</span></span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-variable syntax-parameter syntax-go\">input</span></span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"> json.RawMessage</span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span><span class=\"syntax-meta syntax-function syntax-go\"> </span><span class=\"syntax-meta syntax-function syntax-return-type syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function syntax-return-type syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-storage syntax-type syntax-go\">string</span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> <span class=\"syntax-storage syntax-type syntax-go\">error</span><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span>\n</span><span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span></span>\n</span></span></code></pre>\n<p>Now we give our <code>Agent</code> tool definitions:</p>\n<pre><code class=\"language-go\"><span class=\"code-snippet\" data-language=\"Go\"><span class=\"syntax-source syntax-go\"><span class=\"syntax-comment syntax-line syntax-double-slash syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-go\">//</span> main.go\n</span>\n<span class=\"syntax-comment syntax-line syntax-double-slash syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-go\">//</span> `tools` is added here:\n</span><span class=\"syntax-meta syntax-struct syntax-go\"><span class=\"syntax-storage syntax-type syntax-go\">type</span> <span class=\"syntax-entity syntax-name syntax-struct syntax-go\">Agent</span> <span class=\"syntax-storage syntax-type syntax-go\">struct</span> <span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span>\n\t<span class=\"syntax-variable syntax-other syntax-member syntax-go\">client</span>         *anthropic.Client\n\t<span class=\"syntax-variable syntax-other syntax-member syntax-go\">getUserMessage</span> <span class=\"syntax-meta syntax-function syntax-declaration syntax-anonymous syntax-go\"><span class=\"syntax-storage syntax-type syntax-go\">func</span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span><span class=\"syntax-meta syntax-function syntax-go\"> </span><span class=\"syntax-meta syntax-function syntax-return-type syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function syntax-return-type syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-storage syntax-type syntax-go\">string</span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> <span class=\"syntax-storage syntax-type syntax-go\">bool</span><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span>\n\t<span class=\"syntax-variable syntax-other syntax-member syntax-go\">tools</span>          <span class=\"syntax-meta syntax-brackets syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-brackets syntax-begin syntax-go\">[</span><span class=\"syntax-punctuation syntax-definition syntax-brackets syntax-end syntax-go\">]</span></span>ToolDefinition\n</span><span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span></span>\n\n<span class=\"syntax-comment syntax-line syntax-double-slash syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-go\">//</span> And here:\n</span><span class=\"syntax-meta syntax-function syntax-declaration syntax-go\"><span class=\"syntax-storage syntax-type syntax-go\">func</span> <span class=\"syntax-entity syntax-name syntax-function syntax-go\">NewAgent</span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\">\n</span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\">\t<span class=\"syntax-variable syntax-parameter syntax-go\">client</span></span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"> <span class=\"syntax-keyword syntax-operator syntax-go\">*</span>anthropic.Client<span class=\"syntax-punctuation syntax-separator syntax-go\">,</span>\n</span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\">\t<span class=\"syntax-variable syntax-parameter syntax-go\">getUserMessage</span></span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"> func(</span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span><span class=\"syntax-meta syntax-function syntax-go\"> </span><span class=\"syntax-meta syntax-function syntax-return-type syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function syntax-return-type syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-storage syntax-type syntax-go\">string</span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> <span class=\"syntax-storage syntax-type syntax-go\">bool</span><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span>,\n\ttools <span class=\"syntax-meta syntax-brackets syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-brackets syntax-begin syntax-go\">[</span><span class=\"syntax-punctuation syntax-definition syntax-brackets syntax-end syntax-go\">]</span></span>ToolDefinition<span class=\"syntax-punctuation syntax-separator syntax-go\">,</span>\n) <span class=\"syntax-keyword syntax-operator syntax-go\">*</span>Agent <span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span>\n\t<span class=\"syntax-keyword syntax-control syntax-go\">return</span> <span class=\"syntax-keyword syntax-operator syntax-go\">&amp;</span>Agent<span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span>\n\t\t<span class=\"syntax-entity syntax-name syntax-label syntax-go\">client</span><span class=\"syntax-punctuation syntax-separator syntax-go\">:</span>         client<span class=\"syntax-punctuation syntax-separator syntax-go\">,</span>\n\t\t<span class=\"syntax-entity syntax-name syntax-label syntax-go\">getUserMessage</span><span class=\"syntax-punctuation syntax-separator syntax-go\">:</span> getUserMessage<span class=\"syntax-punctuation syntax-separator syntax-go\">,</span>\n\t\t<span class=\"syntax-entity syntax-name syntax-label syntax-go\">tools</span><span class=\"syntax-punctuation syntax-separator syntax-go\">:</span>          tools<span class=\"syntax-punctuation syntax-separator syntax-go\">,</span>\n\t<span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span>\n<span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span>\n\n<span class=\"syntax-comment syntax-line syntax-double-slash syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-go\">//</span> And here:\n</span><span class=\"syntax-meta syntax-function syntax-declaration syntax-go\"><span class=\"syntax-storage syntax-type syntax-go\">func</span> <span class=\"syntax-entity syntax-name syntax-function syntax-go\">main</span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span><span class=\"syntax-meta syntax-function syntax-go\"> </span><span class=\"syntax-meta syntax-function syntax-go\"><span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span></span></span><span class=\"syntax-meta syntax-function syntax-go\"><span class=\"syntax-meta syntax-block syntax-go\">\n    <span class=\"syntax-comment syntax-line syntax-double-slash syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-go\">//</span> [... previous code ...]\n</span>\t<span class=\"syntax-meta syntax-initialization syntax-short syntax-go\"><span class=\"syntax-variable syntax-other syntax-go\">tools</span> <span class=\"syntax-keyword syntax-operator syntax-initialize syntax-go\">:=</span></span> <span class=\"syntax-meta syntax-brackets syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-brackets syntax-begin syntax-go\">[</span><span class=\"syntax-punctuation syntax-definition syntax-brackets syntax-end syntax-go\">]</span></span>ToolDefinition<span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span><span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span>\n\t<span class=\"syntax-meta syntax-initialization syntax-short syntax-go\"><span class=\"syntax-variable syntax-other syntax-go\">agent</span> <span class=\"syntax-keyword syntax-operator syntax-initialize syntax-go\">:=</span></span> <span class=\"syntax-meta syntax-function-call syntax-go\"><span class=\"syntax-variable syntax-function syntax-go\">NewAgent</span><span class=\"syntax-meta syntax-function-call syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span></span><span class=\"syntax-meta syntax-function-call syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-keyword syntax-operator syntax-go\">&amp;</span>client<span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> getUserMessage<span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> tools</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span>\n\n    <span class=\"syntax-comment syntax-line syntax-double-slash syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-go\">//</span> [... previous code ...]\n</span></span></span><span class=\"syntax-meta syntax-function syntax-go\"><span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span></span>\n</span></span></code></pre>\n<p>And send them along to the model in <code>runInference</code>:</p>\n<pre><code class=\"language-go\"><span class=\"code-snippet\" data-language=\"Go\"><span class=\"syntax-source syntax-go\"><span class=\"syntax-comment syntax-line syntax-double-slash syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-go\">//</span> main.go\n</span>\n<span class=\"syntax-meta syntax-function syntax-declaration syntax-go\"><span class=\"syntax-storage syntax-type syntax-go\">func</span> <span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span><span class=\"syntax-variable syntax-parameter syntax-receiver syntax-go\">a</span> <span class=\"syntax-keyword syntax-operator syntax-go\">*</span>Agent<span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span> <span class=\"syntax-entity syntax-name syntax-function syntax-go\">runInference</span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-variable syntax-parameter syntax-go\">ctx</span></span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"> context.Context<span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> </span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-variable syntax-parameter syntax-go\">conversation</span></span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"> <span class=\"syntax-meta syntax-brackets syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-brackets syntax-begin syntax-go\">[</span><span class=\"syntax-punctuation syntax-definition syntax-brackets syntax-end syntax-go\">]</span></span>anthropic.MessageParam</span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span><span class=\"syntax-meta syntax-function syntax-go\"> </span><span class=\"syntax-meta syntax-function syntax-return-type syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function syntax-return-type syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-keyword syntax-operator syntax-go\">*</span>anthropic.Message<span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> <span class=\"syntax-storage syntax-type syntax-go\">error</span><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span><span class=\"syntax-meta syntax-function syntax-go\"> </span><span class=\"syntax-meta syntax-function syntax-go\"><span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span></span></span><span class=\"syntax-meta syntax-function syntax-go\"><span class=\"syntax-meta syntax-block syntax-go\">\n\t<span class=\"syntax-meta syntax-initialization syntax-short syntax-go\"><span class=\"syntax-variable syntax-other syntax-go\">anthropicTools</span> <span class=\"syntax-keyword syntax-operator syntax-initialize syntax-go\">:=</span></span> <span class=\"syntax-meta syntax-brackets syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-brackets syntax-begin syntax-go\">[</span><span class=\"syntax-punctuation syntax-definition syntax-brackets syntax-end syntax-go\">]</span></span>anthropic<span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-other syntax-member syntax-go\">ToolUnionParam</span><span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span><span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span>\n\t<span class=\"syntax-keyword syntax-control syntax-go\">for</span> <span class=\"syntax-meta syntax-initialization syntax-short syntax-go\"><span class=\"syntax-variable syntax-other syntax-go\">_</span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> <span class=\"syntax-variable syntax-other syntax-go\">tool</span> <span class=\"syntax-keyword syntax-operator syntax-initialize syntax-go\">:=</span></span> <span class=\"syntax-keyword syntax-control syntax-go\">range</span> a<span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-other syntax-member syntax-go\">tools</span> <span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span>\n\t\tanthropicTools <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-go\">=</span> <span class=\"syntax-meta syntax-function-call syntax-go\"><span class=\"syntax-support syntax-function syntax-builtin syntax-go\">append</span><span class=\"syntax-meta syntax-function-call syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span></span><span class=\"syntax-meta syntax-function-call syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\">anthropicTools<span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> anthropic<span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-other syntax-member syntax-go\">ToolUnionParam</span>{\n\t\t\tOfTool<span class=\"syntax-punctuation syntax-separator syntax-go\">:</span> <span class=\"syntax-keyword syntax-operator syntax-go\">&amp;</span>anthropic<span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-other syntax-member syntax-go\">ToolParam</span>{\n\t\t\t\tName<span class=\"syntax-punctuation syntax-separator syntax-go\">:</span>        tool<span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-other syntax-member syntax-go\">Name</span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span>\n\t\t\t\tDescription<span class=\"syntax-punctuation syntax-separator syntax-go\">:</span> anthropic<span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-function syntax-go\">String</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\">tool<span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-other syntax-member syntax-go\">Description</span></span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span>\n\t\t\t\tInputSchema<span class=\"syntax-punctuation syntax-separator syntax-go\">:</span> tool<span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-other syntax-member syntax-go\">InputSchema</span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span>\n\t\t\t}<span class=\"syntax-punctuation syntax-separator syntax-go\">,</span>\n\t\t}</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span>\n\t<span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span>\n\n\t<span class=\"syntax-meta syntax-initialization syntax-short syntax-go\"><span class=\"syntax-variable syntax-other syntax-go\">message</span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> <span class=\"syntax-variable syntax-other syntax-go\">err</span> <span class=\"syntax-keyword syntax-operator syntax-initialize syntax-go\">:=</span></span> a<span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-other syntax-member syntax-go\">client</span><span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-other syntax-member syntax-go\">Messages</span><span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-function syntax-go\">New</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\">ctx<span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> anthropic<span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-other syntax-member syntax-go\">MessageNewParams</span>{\n\t\tModel<span class=\"syntax-punctuation syntax-separator syntax-go\">:</span>     anthropic<span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-other syntax-member syntax-go\">ModelClaude3_7SonnetLatest</span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span>\n\t\tMaxTokens<span class=\"syntax-punctuation syntax-separator syntax-go\">:</span> <span class=\"syntax-storage syntax-type syntax-go\">int64</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span><span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-go\">1024</span><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span>\n\t\tMessages<span class=\"syntax-punctuation syntax-separator syntax-go\">:</span>  conversation<span class=\"syntax-punctuation syntax-separator syntax-go\">,</span>\n\t\tTools<span class=\"syntax-punctuation syntax-separator syntax-go\">:</span>     anthropicTools<span class=\"syntax-punctuation syntax-separator syntax-go\">,</span>\n\t}</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span>\n\t<span class=\"syntax-keyword syntax-control syntax-go\">return</span> message<span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> err\n</span></span><span class=\"syntax-meta syntax-function syntax-go\"><span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span></span>\n</span></span></code></pre>\n<p>There’s a bunch of type shenanigans going on and I’m not too good in Go-with-generics yet so I’m not going to try to explain <code>anthropic.String</code> and <code>ToolUnionParam</code> to you. But, really, I swear, it’s very simple:</p>\n<p>We send along our tool definitions, on the server Anthropic then wraps these definitions in <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://docs.anthropic.com/en/docs/build-with-claude/tool-use/overview#tool-use-system-prompt\">this system prompt</a> (which isn’t much), which it adds to our <code>conversation</code>, and the model then replies in a specific way if it wants to use that tool.</p>\n<p>Alright, so tool definitions are being sent along, but we haven’t defined a tool yet. Let’s do that and define <code>read_file</code>:</p>\n<pre><code class=\"language-go\"><span class=\"code-snippet\" data-language=\"Go\"><span class=\"syntax-source syntax-go\"><span class=\"syntax-comment syntax-line syntax-double-slash syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-go\">//</span> main.go\n</span>\n<span class=\"syntax-meta syntax-initialization syntax-explicit syntax-go\"><span class=\"syntax-storage syntax-type syntax-go\">var</span> <span class=\"syntax-variable syntax-other syntax-go\">ReadFileDefinition</span></span><span class=\"syntax-meta syntax-initialization syntax-explicit syntax-go\"> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-go\">=</span> ToolDefinition{</span>\n\t<span class=\"syntax-entity syntax-name syntax-label syntax-go\">Name</span><span class=\"syntax-punctuation syntax-separator syntax-go\">:</span>        <span class=\"syntax-string syntax-quoted syntax-double syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-go\">&quot;</span>read_file<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-go\">&quot;</span></span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span>\n\t<span class=\"syntax-entity syntax-name syntax-label syntax-go\">Description</span><span class=\"syntax-punctuation syntax-separator syntax-go\">:</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-go\">&quot;</span>Read the contents of a given relative file path. Use this when you want to see what&#39;s inside a file. Do not use this with directory names.<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-go\">&quot;</span></span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span>\n\t<span class=\"syntax-entity syntax-name syntax-label syntax-go\">InputSchema</span><span class=\"syntax-punctuation syntax-separator syntax-go\">:</span> ReadFileInputSchema<span class=\"syntax-punctuation syntax-separator syntax-go\">,</span>\n\t<span class=\"syntax-entity syntax-name syntax-label syntax-go\">Function</span><span class=\"syntax-punctuation syntax-separator syntax-go\">:</span>    ReadFile<span class=\"syntax-punctuation syntax-separator syntax-go\">,</span>\n}\n\n<span class=\"syntax-meta syntax-struct syntax-go\"><span class=\"syntax-storage syntax-type syntax-go\">type</span> <span class=\"syntax-entity syntax-name syntax-struct syntax-go\">ReadFileInput</span> <span class=\"syntax-storage syntax-type syntax-go\">struct</span> <span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span>\n\t<span class=\"syntax-variable syntax-other syntax-member syntax-go\">Path</span> <span class=\"syntax-storage syntax-type syntax-go\">string</span> <span class=\"syntax-string syntax-quoted syntax-raw syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-go\">`</span>json:&quot;path&quot; jsonschema_description:&quot;The relative path of a file in the working directory.&quot;<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-go\">`</span></span>\n</span><span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span></span>\n\n<span class=\"syntax-meta syntax-initialization syntax-explicit syntax-go\"><span class=\"syntax-storage syntax-type syntax-go\">var</span> <span class=\"syntax-variable syntax-other syntax-go\">ReadFileInputSchema</span></span><span class=\"syntax-meta syntax-initialization syntax-explicit syntax-go\"> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-go\">=</span> GenerateSchema<span class=\"syntax-meta syntax-brackets syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-brackets syntax-begin syntax-go\">[</span>ReadFileInput<span class=\"syntax-punctuation syntax-definition syntax-brackets syntax-end syntax-go\">]</span></span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span>\n\n<span class=\"syntax-meta syntax-function syntax-declaration syntax-go\"><span class=\"syntax-storage syntax-type syntax-go\">func</span> <span class=\"syntax-entity syntax-name syntax-function syntax-go\">ReadFile</span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-variable syntax-parameter syntax-go\">input</span></span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"> json.RawMessage</span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span><span class=\"syntax-meta syntax-function syntax-go\"> </span><span class=\"syntax-meta syntax-function syntax-return-type syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function syntax-return-type syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-storage syntax-type syntax-go\">string</span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> <span class=\"syntax-storage syntax-type syntax-go\">error</span><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span><span class=\"syntax-meta syntax-function syntax-go\"> </span><span class=\"syntax-meta syntax-function syntax-go\"><span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span></span></span><span class=\"syntax-meta syntax-function syntax-go\"><span class=\"syntax-meta syntax-block syntax-go\">\n\t<span class=\"syntax-meta syntax-initialization syntax-short syntax-go\"><span class=\"syntax-variable syntax-other syntax-go\">readFileInput</span> <span class=\"syntax-keyword syntax-operator syntax-initialize syntax-go\">:=</span></span> ReadFileInput<span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span><span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span>\n\t<span class=\"syntax-meta syntax-initialization syntax-short syntax-go\"><span class=\"syntax-variable syntax-other syntax-go\">err</span> <span class=\"syntax-keyword syntax-operator syntax-initialize syntax-go\">:=</span></span> json<span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-function syntax-go\">Unmarshal</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\">input<span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> <span class=\"syntax-keyword syntax-operator syntax-go\">&amp;</span>readFileInput</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span>\n\t<span class=\"syntax-keyword syntax-control syntax-go\">if</span> err <span class=\"syntax-keyword syntax-operator syntax-go\">!=</span> <span class=\"syntax-constant syntax-language syntax-go\">nil</span> <span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span>\n\t\t<span class=\"syntax-meta syntax-function-call syntax-go\"><span class=\"syntax-support syntax-function syntax-builtin syntax-go\">panic</span><span class=\"syntax-meta syntax-function-call syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span></span><span class=\"syntax-meta syntax-function-call syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\">err</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span>\n\t<span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span>\n\n\t<span class=\"syntax-meta syntax-initialization syntax-short syntax-go\"><span class=\"syntax-variable syntax-other syntax-go\">content</span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> <span class=\"syntax-variable syntax-other syntax-go\">err</span> <span class=\"syntax-keyword syntax-operator syntax-initialize syntax-go\">:=</span></span> os<span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-function syntax-go\">ReadFile</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\">readFileInput<span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-other syntax-member syntax-go\">Path</span></span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span>\n\t<span class=\"syntax-keyword syntax-control syntax-go\">if</span> err <span class=\"syntax-keyword syntax-operator syntax-go\">!=</span> <span class=\"syntax-constant syntax-language syntax-go\">nil</span> <span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span>\n\t\t<span class=\"syntax-keyword syntax-control syntax-go\">return</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-go\">&quot;</span><span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-go\">&quot;</span></span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> err\n\t<span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span>\n\t<span class=\"syntax-keyword syntax-control syntax-go\">return</span> <span class=\"syntax-storage syntax-type syntax-go\">string</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span>content<span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> <span class=\"syntax-constant syntax-language syntax-go\">nil</span>\n</span></span><span class=\"syntax-meta syntax-function syntax-go\"><span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span></span>\n\n<span class=\"syntax-storage syntax-type syntax-go\">func</span> <span class=\"syntax-entity syntax-name syntax-function syntax-go\">GenerateSchema</span><span class=\"syntax-meta syntax-brackets syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-brackets syntax-begin syntax-go\">[</span>T any<span class=\"syntax-punctuation syntax-definition syntax-brackets syntax-end syntax-go\">]</span></span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span> anthropic<span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-other syntax-member syntax-go\">ToolInputSchemaParam</span> <span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span>\n\t<span class=\"syntax-meta syntax-initialization syntax-short syntax-go\"><span class=\"syntax-variable syntax-other syntax-go\">reflector</span> <span class=\"syntax-keyword syntax-operator syntax-initialize syntax-go\">:=</span></span> jsonschema<span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-other syntax-member syntax-go\">Reflector</span><span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span>\n\t\t<span class=\"syntax-entity syntax-name syntax-label syntax-go\">AllowAdditionalProperties</span><span class=\"syntax-punctuation syntax-separator syntax-go\">:</span> <span class=\"syntax-constant syntax-language syntax-go\">false</span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span>\n\t\t<span class=\"syntax-entity syntax-name syntax-label syntax-go\">DoNotReference</span><span class=\"syntax-punctuation syntax-separator syntax-go\">:</span>            <span class=\"syntax-constant syntax-language syntax-go\">true</span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span>\n\t<span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span>\n<span class=\"syntax-meta syntax-initialization syntax-explicit syntax-go\">\t<span class=\"syntax-storage syntax-type syntax-go\">var</span> <span class=\"syntax-variable syntax-other syntax-go\">v</span></span><span class=\"syntax-meta syntax-initialization syntax-explicit syntax-go\"> T</span>\n\n\t<span class=\"syntax-meta syntax-initialization syntax-short syntax-go\"><span class=\"syntax-variable syntax-other syntax-go\">schema</span> <span class=\"syntax-keyword syntax-operator syntax-initialize syntax-go\">:=</span></span> reflector<span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-function syntax-go\">Reflect</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\">v</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span>\n\n\t<span class=\"syntax-keyword syntax-control syntax-go\">return</span> anthropic<span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-other syntax-member syntax-go\">ToolInputSchemaParam</span><span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span>\n\t\t<span class=\"syntax-entity syntax-name syntax-label syntax-go\">Properties</span><span class=\"syntax-punctuation syntax-separator syntax-go\">:</span> schema<span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-other syntax-member syntax-go\">Properties</span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span>\n\t<span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span>\n<span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span>\n</span></span></code></pre>\n<p>That’s not much, is it? It’s a single function, <code>ReadFile</code>, and two descriptions the model will see: our <code>Description</code> that describes the tool itself (<code>&quot;Read the contents of a given relative file path. ...&quot;</code>) and a description of the single input parameter this tool has (<code>&quot;The relative path of a ...&quot;</code>).</p>\n<p>The <code>ReadFileInputSchema</code> and <code>GenerateSchema</code> stuff? We need that so that we can generate a JSON schema for our tool definition which we send to the model. To do that, we use the <code>jsonschema</code> package, which we need to import and download:</p>\n<pre><code class=\"language-go\"><span class=\"code-snippet\" data-language=\"Go\"><span class=\"syntax-source syntax-go\"><span class=\"syntax-comment syntax-line syntax-double-slash syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-go\">//</span> main.go\n</span>\n<span class=\"syntax-keyword syntax-control syntax-go\">package</span> main\n\n<span class=\"syntax-meta syntax-import syntax-go\"><span class=\"syntax-keyword syntax-control syntax-import syntax-go\">import</span> <span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-import syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\">\n\t<span class=\"syntax-string syntax-quoted syntax-double syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-go\">&quot;</span>bufio<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-go\">&quot;</span></span>\n\t<span class=\"syntax-string syntax-quoted syntax-double syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-go\">&quot;</span>context<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-go\">&quot;</span></span>\n    <span class=\"syntax-comment syntax-line syntax-double-slash syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-go\">//</span> Add this:\n</span>\t<span class=\"syntax-string syntax-quoted syntax-double syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-go\">&quot;</span>encoding/json<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-go\">&quot;</span></span>\n\t<span class=\"syntax-string syntax-quoted syntax-double syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-go\">&quot;</span>fmt<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-go\">&quot;</span></span>\n\t<span class=\"syntax-string syntax-quoted syntax-double syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-go\">&quot;</span>os<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-go\">&quot;</span></span>\n\n\t<span class=\"syntax-string syntax-quoted syntax-double syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-go\">&quot;</span>github.com/anthropics/anthropic-sdk-go<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-go\">&quot;</span></span>\n    <span class=\"syntax-comment syntax-line syntax-double-slash syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-go\">//</span> Add this:\n</span>\t<span class=\"syntax-string syntax-quoted syntax-double syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-go\">&quot;</span>github.com/invopop/jsonschema<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-go\">&quot;</span></span>\n</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span>\n</span></span></code></pre>\n<p>Then run the following:</p>\n<pre><code class=\"language-text\"><span class=\"code-snippet\">go mod tidy\n</span></code></pre>\n<p>Then, in the <code>main</code> function, we need to make sure that we use the definition:</p>\n<pre><code class=\"language-go\"><span class=\"code-snippet\" data-language=\"Go\"><span class=\"syntax-source syntax-go\"><span class=\"syntax-meta syntax-function syntax-declaration syntax-go\"><span class=\"syntax-storage syntax-type syntax-go\">func</span> <span class=\"syntax-entity syntax-name syntax-function syntax-go\">main</span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span><span class=\"syntax-meta syntax-function syntax-go\"> </span><span class=\"syntax-meta syntax-function syntax-go\"><span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span></span></span><span class=\"syntax-meta syntax-function syntax-go\"><span class=\"syntax-meta syntax-block syntax-go\">\n    <span class=\"syntax-comment syntax-line syntax-double-slash syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-go\">//</span> [... previous code ...]\n</span>\t<span class=\"syntax-meta syntax-initialization syntax-short syntax-go\"><span class=\"syntax-variable syntax-other syntax-go\">tools</span> <span class=\"syntax-keyword syntax-operator syntax-initialize syntax-go\">:=</span></span> <span class=\"syntax-meta syntax-brackets syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-brackets syntax-begin syntax-go\">[</span><span class=\"syntax-punctuation syntax-definition syntax-brackets syntax-end syntax-go\">]</span></span>ToolDefinition<span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span>ReadFileDefinition<span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span>\n    <span class=\"syntax-comment syntax-line syntax-double-slash syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-go\">//</span> [... previous code ...]\n</span></span></span><span class=\"syntax-meta syntax-function syntax-go\"><span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span></span>\n</span></span></code></pre>\n<p>Time to try it!</p>\n<p>$ go run main.go</p>\n<p>Chat with Claude (use 'ctrl-c' to quit)</p>\n<p>You: what's in main.go?</p>\n<p>Claude: I'll help you check what's in the main.go file. Let me read it for you.</p>\n<p>You:</p>\n<p>Wait, what? Ho, ho, ho, it wants to use the tool! Obviously the output will be slightly different for you, but it certainly sounds like Claude knows that it can read files, right?</p>\n<p>The problem is that we don’t listen! When Claude winks, we ignore it. We need to fix that.</p>\n<p>Here, let me show you how to do that in a single, quick, surprisingly-agile-for-my-age move by replacing our <code>Agent</code>’s <code>Run</code> method with this:</p>\n<pre><code class=\"language-go\"><span class=\"code-snippet\" data-language=\"Go\"><span class=\"syntax-source syntax-go\"><span class=\"syntax-comment syntax-line syntax-double-slash syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-go\">//</span> main.go\n</span>\n<span class=\"syntax-meta syntax-function syntax-declaration syntax-go\"><span class=\"syntax-storage syntax-type syntax-go\">func</span> <span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span><span class=\"syntax-variable syntax-parameter syntax-receiver syntax-go\">a</span> <span class=\"syntax-keyword syntax-operator syntax-go\">*</span>Agent<span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span> <span class=\"syntax-entity syntax-name syntax-function syntax-go\">Run</span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-variable syntax-parameter syntax-go\">ctx</span></span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"> context.Context</span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span><span class=\"syntax-meta syntax-function syntax-go\"> </span><span class=\"syntax-meta syntax-function syntax-return-type syntax-go\"><span class=\"syntax-storage syntax-type syntax-go\">error</span> </span><span class=\"syntax-meta syntax-function syntax-go\"><span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span></span></span><span class=\"syntax-meta syntax-function syntax-go\"><span class=\"syntax-meta syntax-block syntax-go\">\n\t<span class=\"syntax-meta syntax-initialization syntax-short syntax-go\"><span class=\"syntax-variable syntax-other syntax-go\">conversation</span> <span class=\"syntax-keyword syntax-operator syntax-initialize syntax-go\">:=</span></span> <span class=\"syntax-meta syntax-brackets syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-brackets syntax-begin syntax-go\">[</span><span class=\"syntax-punctuation syntax-definition syntax-brackets syntax-end syntax-go\">]</span></span>anthropic<span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-other syntax-member syntax-go\">MessageParam</span><span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span><span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span>\n\n\tfmt<span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-function syntax-go\">Println</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-string syntax-quoted syntax-double syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-go\">&quot;</span>Chat with Claude (use &#39;ctrl-c&#39; to quit)<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-go\">&quot;</span></span></span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span>\n\n\t<span class=\"syntax-meta syntax-initialization syntax-short syntax-go\"><span class=\"syntax-variable syntax-other syntax-go\">readUserInput</span> <span class=\"syntax-keyword syntax-operator syntax-initialize syntax-go\">:=</span></span> <span class=\"syntax-constant syntax-language syntax-go\">true</span>\n\t<span class=\"syntax-keyword syntax-control syntax-go\">for</span> <span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span>\n\t\t<span class=\"syntax-keyword syntax-control syntax-go\">if</span> readUserInput <span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span>\n\t\t\tfmt<span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-function syntax-go\">Print</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-string syntax-quoted syntax-double syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-go\">&quot;</span><span class=\"syntax-constant syntax-character syntax-escape syntax-go\">\\\\</span>u001b[94mYou<span class=\"syntax-constant syntax-character syntax-escape syntax-go\">\\\\</span>u001b[0m: <span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-go\">&quot;</span></span></span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span>\n\t\t\t<span class=\"syntax-meta syntax-initialization syntax-short syntax-go\"><span class=\"syntax-variable syntax-other syntax-go\">userInput</span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> <span class=\"syntax-variable syntax-other syntax-go\">ok</span> <span class=\"syntax-keyword syntax-operator syntax-initialize syntax-go\">:=</span></span> a<span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-function syntax-go\">getUserMessage</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span>\n\t\t\t<span class=\"syntax-keyword syntax-control syntax-go\">if</span> <span class=\"syntax-keyword syntax-operator syntax-go\">!</span>ok <span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span>\n\t\t\t\t<span class=\"syntax-keyword syntax-control syntax-go\">break</span>\n\t\t\t<span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span>\n\n\t\t\t<span class=\"syntax-meta syntax-initialization syntax-short syntax-go\"><span class=\"syntax-variable syntax-other syntax-go\">userMessage</span> <span class=\"syntax-keyword syntax-operator syntax-initialize syntax-go\">:=</span></span> anthropic<span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-function syntax-go\">NewUserMessage</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\">anthropic<span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-function syntax-go\">NewTextBlock</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\">userInput</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span></span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span>\n\t\t\tconversation <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-go\">=</span> <span class=\"syntax-meta syntax-function-call syntax-go\"><span class=\"syntax-support syntax-function syntax-builtin syntax-go\">append</span><span class=\"syntax-meta syntax-function-call syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span></span><span class=\"syntax-meta syntax-function-call syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\">conversation<span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> userMessage</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span>\n\t\t<span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span>\n\n\t\t<span class=\"syntax-meta syntax-initialization syntax-short syntax-go\"><span class=\"syntax-variable syntax-other syntax-go\">message</span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> <span class=\"syntax-variable syntax-other syntax-go\">err</span> <span class=\"syntax-keyword syntax-operator syntax-initialize syntax-go\">:=</span></span> a<span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-function syntax-go\">runInference</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\">ctx<span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> conversation</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span>\n\t\t<span class=\"syntax-keyword syntax-control syntax-go\">if</span> err <span class=\"syntax-keyword syntax-operator syntax-go\">!=</span> <span class=\"syntax-constant syntax-language syntax-go\">nil</span> <span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span>\n\t\t\t<span class=\"syntax-keyword syntax-control syntax-go\">return</span> err\n\t\t<span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span>\n\t\tconversation <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-go\">=</span> <span class=\"syntax-meta syntax-function-call syntax-go\"><span class=\"syntax-support syntax-function syntax-builtin syntax-go\">append</span><span class=\"syntax-meta syntax-function-call syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span></span><span class=\"syntax-meta syntax-function-call syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\">conversation<span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> message<span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-function syntax-go\">ToParam</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span></span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span>\n\n\t\t<span class=\"syntax-meta syntax-initialization syntax-short syntax-go\"><span class=\"syntax-variable syntax-other syntax-go\">toolResults</span> <span class=\"syntax-keyword syntax-operator syntax-initialize syntax-go\">:=</span></span> <span class=\"syntax-meta syntax-brackets syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-brackets syntax-begin syntax-go\">[</span><span class=\"syntax-punctuation syntax-definition syntax-brackets syntax-end syntax-go\">]</span></span>anthropic<span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-other syntax-member syntax-go\">ContentBlockParamUnion</span><span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span><span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span>\n\t\t<span class=\"syntax-keyword syntax-control syntax-go\">for</span> <span class=\"syntax-meta syntax-initialization syntax-short syntax-go\"><span class=\"syntax-variable syntax-other syntax-go\">_</span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> <span class=\"syntax-variable syntax-other syntax-go\">content</span> <span class=\"syntax-keyword syntax-operator syntax-initialize syntax-go\">:=</span></span> <span class=\"syntax-keyword syntax-control syntax-go\">range</span> message<span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-other syntax-member syntax-go\">Content</span> <span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span>\n\t\t\t<span class=\"syntax-keyword syntax-control syntax-go\">switch</span> content<span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-other syntax-member syntax-go\">Type</span> <span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span>\n\t\t\t<span class=\"syntax-keyword syntax-control syntax-go\">case</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-go\">&quot;</span>text<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-go\">&quot;</span></span><span class=\"syntax-punctuation syntax-separator syntax-go\">:</span>\n\t\t\t\tfmt<span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-function syntax-go\">Printf</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-string syntax-quoted syntax-double syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-go\">&quot;</span><span class=\"syntax-constant syntax-character syntax-escape syntax-go\">\\\\</span>u001b[93mClaude<span class=\"syntax-constant syntax-character syntax-escape syntax-go\">\\\\</span>u001b[0m: <span class=\"syntax-constant syntax-other syntax-placeholder syntax-go\">%s</span><span class=\"syntax-constant syntax-character syntax-escape syntax-go\">\\n</span><span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-go\">&quot;</span></span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> content<span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-other syntax-member syntax-go\">Text</span></span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span>\n\t\t\t<span class=\"syntax-keyword syntax-control syntax-go\">case</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-go\">&quot;</span>tool_use<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-go\">&quot;</span></span><span class=\"syntax-punctuation syntax-separator syntax-go\">:</span>\n\t\t\t\t<span class=\"syntax-meta syntax-initialization syntax-short syntax-go\"><span class=\"syntax-variable syntax-other syntax-go\">result</span> <span class=\"syntax-keyword syntax-operator syntax-initialize syntax-go\">:=</span></span> a<span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-function syntax-go\">executeTool</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\">content<span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-other syntax-member syntax-go\">ID</span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> content<span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-other syntax-member syntax-go\">Name</span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> content<span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-other syntax-member syntax-go\">Input</span></span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span>\n\t\t\t\ttoolResults <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-go\">=</span> <span class=\"syntax-meta syntax-function-call syntax-go\"><span class=\"syntax-support syntax-function syntax-builtin syntax-go\">append</span><span class=\"syntax-meta syntax-function-call syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span></span><span class=\"syntax-meta syntax-function-call syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\">toolResults<span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> result</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span>\n\t\t\t<span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span>\n\t\t<span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span>\n\t\t<span class=\"syntax-keyword syntax-control syntax-go\">if</span> <span class=\"syntax-meta syntax-function-call syntax-go\"><span class=\"syntax-support syntax-function syntax-builtin syntax-go\">len</span><span class=\"syntax-meta syntax-function-call syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span></span><span class=\"syntax-meta syntax-function-call syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\">toolResults</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span> <span class=\"syntax-keyword syntax-operator syntax-go\">==</span> <span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-go\">0</span> <span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span>\n\t\t\treadUserInput <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-go\">=</span> <span class=\"syntax-constant syntax-language syntax-go\">true</span>\n\t\t\t<span class=\"syntax-keyword syntax-control syntax-go\">continue</span>\n\t\t<span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span>\n\t\treadUserInput <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-go\">=</span> <span class=\"syntax-constant syntax-language syntax-go\">false</span>\n\t\tconversation <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-go\">=</span> <span class=\"syntax-meta syntax-function-call syntax-go\"><span class=\"syntax-support syntax-function syntax-builtin syntax-go\">append</span><span class=\"syntax-meta syntax-function-call syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span></span><span class=\"syntax-meta syntax-function-call syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\">conversation<span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> anthropic<span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-function syntax-go\">NewUserMessage</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\">toolResults...</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span></span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span>\n\t<span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span>\n\n\t<span class=\"syntax-keyword syntax-control syntax-go\">return</span> <span class=\"syntax-constant syntax-language syntax-go\">nil</span>\n</span></span><span class=\"syntax-meta syntax-function syntax-go\"><span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span></span>\n\n<span class=\"syntax-meta syntax-function syntax-declaration syntax-go\"><span class=\"syntax-storage syntax-type syntax-go\">func</span> <span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span><span class=\"syntax-variable syntax-parameter syntax-receiver syntax-go\">a</span> <span class=\"syntax-keyword syntax-operator syntax-go\">*</span>Agent<span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span> <span class=\"syntax-entity syntax-name syntax-function syntax-go\">executeTool</span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-variable syntax-parameter syntax-go\">id</span></span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> <span class=\"syntax-variable syntax-parameter syntax-go\">name</span></span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"> <span class=\"syntax-storage syntax-type syntax-go\">string</span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> </span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-variable syntax-parameter syntax-go\">input</span></span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"> json.RawMessage</span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span><span class=\"syntax-meta syntax-function syntax-go\"> </span><span class=\"syntax-meta syntax-function syntax-return-type syntax-go\">anthropic</span><span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-other syntax-member syntax-go\">ContentBlockParamUnion</span> <span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span>\n<span class=\"syntax-meta syntax-initialization syntax-explicit syntax-go\">\t<span class=\"syntax-storage syntax-type syntax-go\">var</span> <span class=\"syntax-variable syntax-other syntax-go\">toolDef</span></span><span class=\"syntax-meta syntax-initialization syntax-explicit syntax-go\"> ToolDefinition</span>\n<span class=\"syntax-meta syntax-initialization syntax-explicit syntax-go\">\t<span class=\"syntax-storage syntax-type syntax-go\">var</span> <span class=\"syntax-variable syntax-other syntax-go\">found</span></span><span class=\"syntax-meta syntax-initialization syntax-explicit syntax-go\"> <span class=\"syntax-storage syntax-type syntax-go\">bool</span></span>\n\t<span class=\"syntax-keyword syntax-control syntax-go\">for</span> <span class=\"syntax-meta syntax-initialization syntax-short syntax-go\"><span class=\"syntax-variable syntax-other syntax-go\">_</span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> <span class=\"syntax-variable syntax-other syntax-go\">tool</span> <span class=\"syntax-keyword syntax-operator syntax-initialize syntax-go\">:=</span></span> <span class=\"syntax-keyword syntax-control syntax-go\">range</span> a<span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-other syntax-member syntax-go\">tools</span> <span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span>\n\t\t<span class=\"syntax-keyword syntax-control syntax-go\">if</span> tool<span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-other syntax-member syntax-go\">Name</span> <span class=\"syntax-keyword syntax-operator syntax-go\">==</span> name <span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span>\n\t\t\ttoolDef <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-go\">=</span> tool\n\t\t\tfound <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-go\">=</span> <span class=\"syntax-constant syntax-language syntax-go\">true</span>\n\t\t\t<span class=\"syntax-keyword syntax-control syntax-go\">break</span>\n\t\t<span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span>\n\t<span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span>\n\t<span class=\"syntax-keyword syntax-control syntax-go\">if</span> <span class=\"syntax-keyword syntax-operator syntax-go\">!</span>found <span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span>\n\t\t<span class=\"syntax-keyword syntax-control syntax-go\">return</span> anthropic<span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-function syntax-go\">NewToolResultBlock</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\">id<span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-go\">&quot;</span>tool not found<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-go\">&quot;</span></span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> <span class=\"syntax-constant syntax-language syntax-go\">true</span></span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span>\n\t<span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span>\n\n\tfmt<span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-function syntax-go\">Printf</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-string syntax-quoted syntax-double syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-go\">&quot;</span><span class=\"syntax-constant syntax-character syntax-escape syntax-go\">\\\\</span>u001b[92mtool<span class=\"syntax-constant syntax-character syntax-escape syntax-go\">\\\\</span>u001b[0m: <span class=\"syntax-constant syntax-other syntax-placeholder syntax-go\">%s</span>(<span class=\"syntax-constant syntax-other syntax-placeholder syntax-go\">%s</span>)<span class=\"syntax-constant syntax-character syntax-escape syntax-go\">\\n</span><span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-go\">&quot;</span></span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> name<span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> input</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span>\n\t<span class=\"syntax-meta syntax-initialization syntax-short syntax-go\"><span class=\"syntax-variable syntax-other syntax-go\">response</span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> <span class=\"syntax-variable syntax-other syntax-go\">err</span> <span class=\"syntax-keyword syntax-operator syntax-initialize syntax-go\">:=</span></span> toolDef<span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-function syntax-go\">Function</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\">input</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span>\n\t<span class=\"syntax-keyword syntax-control syntax-go\">if</span> err <span class=\"syntax-keyword syntax-operator syntax-go\">!=</span> <span class=\"syntax-constant syntax-language syntax-go\">nil</span> <span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span>\n\t\t<span class=\"syntax-keyword syntax-control syntax-go\">return</span> anthropic<span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-function syntax-go\">NewToolResultBlock</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\">id<span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> err<span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-function syntax-go\">Error</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> <span class=\"syntax-constant syntax-language syntax-go\">true</span></span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span>\n\t<span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span>\n\t<span class=\"syntax-keyword syntax-control syntax-go\">return</span> anthropic<span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-function syntax-go\">NewToolResultBlock</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\">id<span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> response<span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> <span class=\"syntax-constant syntax-language syntax-go\">false</span></span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span>\n<span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span>\n</span></span></code></pre>\n<p>Squint and you’ll see that it’s 90% boilerplate and 10% that matter: when we get a <code>message</code> back from Claude, we check wether Claude asked us to execute a tool by looking for <code>content.Type == &quot;tool_use&quot;</code>, if so we hand over to <code>executeTool</code>, lookup the tool by name in our local registry, unmarshal the input, execute it, return the result. If it’s an error, we flip a boolean. That’s it.</p>\n<p>(Yes, there is a loop in a loop, but it doesn’t matter.)</p>\n<p>We execute the tool, send the result back up to Claude, and ask again for Claude’s response. Truly: that’s <em>it</em>. Let me show you.</p>\n<p>Mise-en-place, run this:</p>\n<pre><code class=\"language-shell\"><span class=\"code-snippet\" data-language=\"Shell\"><span class=\"syntax-source syntax-shell syntax-bash\"><span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-support syntax-function syntax-echo syntax-shell\">echo</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> <span class=\"syntax-string syntax-quoted syntax-single syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-shell\">&#39;</span>what animal is the most disagreeable because it always says neigh?<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-shell\">&#39;</span></span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-redirection syntax-shell\">&gt;&gt;</span> secret-file.txt</span>\n</span></span></code></pre>\n<p>That creates a <code>secret-file.txt</code> in our directory, containing a mysterious riddle.</p>\n<p>In that very same directory, let’s run our new tool-using agent, and ask it to look at the file:</p>\n<p>$ go run main.go</p>\n<p>Chat with Claude (use 'ctrl-c' to quit)</p>\n<p>You: Claude, buddy, help me solve the riddle in the secret-file.txt file</p>\n<p>Claude: I'll help you solve the riddle in the secret-file.txt file. Let me first read the contents of this file to see what the riddle is.</p>\n<p>tool: read_file({&quot;path&quot;:&quot;secret-file.txt&quot;})</p>\n<p>Claude: Great! I've found the riddle. The answer to the riddle is: **A horse** The riddle is playing on wordplay where &quot;neigh&quot; (the sound a horse makes) sounds like &quot;nay&quot; (a way to say &quot;no&quot; or disagree with something). So horses are described as disagreeable because they always say &quot;neigh/nay&quot; - implying they're always disagreeing.</p>\n<p>You:</p>\n<p>Let’s take a deep breath and say it together. Ready? Here we go: <em>holy shit</em>. You just give it a tool and it… <em>uses it when it thinks it’ll help solve the task</em>. Remember: we didn’t say <em>anything</em> about “if a user asks you about a file, read the file”. We also didn’t say “if something looks like a filename, figure out how to read it”. No, none of that. We say “help me solve the thing in this file” and Claude realizes that it can read the file to answer that and off it goes.</p>\n<p>Of course, we <em>can</em> be specific and really nudge it towards a tool, but it basically does it all on its own:</p>\n<p>$ go run main.go</p>\n<p>Chat with Claude (use 'ctrl-c' to quit)</p>\n<p>You: What's going on in main.go? Be brief!</p>\n<p>Claude: I'll check the main.go file to see what's going on.</p>\n<p>tool: read_file({&quot;path&quot;:&quot;main.go&quot;})</p>\n<p>Claude: Based on my review, main.go implements a Claude AI assistant agent that can use tools. Here's a brief summary: - It creates a command-line chat interface with Claude using the Anthropic Go SDK - Implements a tool system with a single &quot;read_file&quot; tool for reading file contents - Manages the conversation flow with Claude, handling both regular text responses and tool use requests - When Claude requests to use a tool, the agent executes it and returns the results - The program loops continuously to maintain a conversation until the user exits The code essentially builds a simple CLI-based chatbot that can interact with the file system when requested by Claude.</p>\n<p>You:</p>\n<p>Spot on. Okay, now that we know how to make Claude use tools, let’s add a few more.</p>\n<h2>The <code>list_files</code> tool</h2>\n<p>If you’re anything like me, the first thing you do when you log into a new computer is to get your bearings by running <code>ls</code> — list files.</p>\n<p>Let’s give Claude the same ability, a tool to list files. And here’s the complete implementation of a <code>list_files</code> tool:</p>\n<pre><code class=\"language-go\"><span class=\"code-snippet\" data-language=\"Go\"><span class=\"syntax-source syntax-go\"><span class=\"syntax-comment syntax-line syntax-double-slash syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-go\">//</span> main.go\n</span>\n<span class=\"syntax-meta syntax-initialization syntax-explicit syntax-go\"><span class=\"syntax-storage syntax-type syntax-go\">var</span> <span class=\"syntax-variable syntax-other syntax-go\">ListFilesDefinition</span></span><span class=\"syntax-meta syntax-initialization syntax-explicit syntax-go\"> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-go\">=</span> ToolDefinition{</span>\n\t<span class=\"syntax-entity syntax-name syntax-label syntax-go\">Name</span><span class=\"syntax-punctuation syntax-separator syntax-go\">:</span>        <span class=\"syntax-string syntax-quoted syntax-double syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-go\">&quot;</span>list_files<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-go\">&quot;</span></span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span>\n\t<span class=\"syntax-entity syntax-name syntax-label syntax-go\">Description</span><span class=\"syntax-punctuation syntax-separator syntax-go\">:</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-go\">&quot;</span>List files and directories at a given path. If no path is provided, lists files in the current directory.<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-go\">&quot;</span></span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span>\n\t<span class=\"syntax-entity syntax-name syntax-label syntax-go\">InputSchema</span><span class=\"syntax-punctuation syntax-separator syntax-go\">:</span> ListFilesInputSchema<span class=\"syntax-punctuation syntax-separator syntax-go\">,</span>\n\t<span class=\"syntax-entity syntax-name syntax-label syntax-go\">Function</span><span class=\"syntax-punctuation syntax-separator syntax-go\">:</span>    ListFiles<span class=\"syntax-punctuation syntax-separator syntax-go\">,</span>\n}\n\n<span class=\"syntax-meta syntax-struct syntax-go\"><span class=\"syntax-storage syntax-type syntax-go\">type</span> <span class=\"syntax-entity syntax-name syntax-struct syntax-go\">ListFilesInput</span> <span class=\"syntax-storage syntax-type syntax-go\">struct</span> <span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span>\n\t<span class=\"syntax-variable syntax-other syntax-member syntax-go\">Path</span> <span class=\"syntax-storage syntax-type syntax-go\">string</span> <span class=\"syntax-string syntax-quoted syntax-raw syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-go\">`</span>json:&quot;path,omitempty&quot; jsonschema_description:&quot;Optional relative path to list files from. Defaults to current directory if not provided.&quot;<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-go\">`</span></span>\n</span><span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span></span>\n\n<span class=\"syntax-meta syntax-initialization syntax-explicit syntax-go\"><span class=\"syntax-storage syntax-type syntax-go\">var</span> <span class=\"syntax-variable syntax-other syntax-go\">ListFilesInputSchema</span></span><span class=\"syntax-meta syntax-initialization syntax-explicit syntax-go\"> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-go\">=</span> GenerateSchema<span class=\"syntax-meta syntax-brackets syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-brackets syntax-begin syntax-go\">[</span>ListFilesInput<span class=\"syntax-punctuation syntax-definition syntax-brackets syntax-end syntax-go\">]</span></span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span>\n\n<span class=\"syntax-meta syntax-function syntax-declaration syntax-go\"><span class=\"syntax-storage syntax-type syntax-go\">func</span> <span class=\"syntax-entity syntax-name syntax-function syntax-go\">ListFiles</span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-variable syntax-parameter syntax-go\">input</span></span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"> json.RawMessage</span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span><span class=\"syntax-meta syntax-function syntax-go\"> </span><span class=\"syntax-meta syntax-function syntax-return-type syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function syntax-return-type syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-storage syntax-type syntax-go\">string</span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> <span class=\"syntax-storage syntax-type syntax-go\">error</span><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span><span class=\"syntax-meta syntax-function syntax-go\"> </span><span class=\"syntax-meta syntax-function syntax-go\"><span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span></span></span><span class=\"syntax-meta syntax-function syntax-go\"><span class=\"syntax-meta syntax-block syntax-go\">\n\t<span class=\"syntax-meta syntax-initialization syntax-short syntax-go\"><span class=\"syntax-variable syntax-other syntax-go\">listFilesInput</span> <span class=\"syntax-keyword syntax-operator syntax-initialize syntax-go\">:=</span></span> ListFilesInput<span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span><span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span>\n\t<span class=\"syntax-meta syntax-initialization syntax-short syntax-go\"><span class=\"syntax-variable syntax-other syntax-go\">err</span> <span class=\"syntax-keyword syntax-operator syntax-initialize syntax-go\">:=</span></span> json<span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-function syntax-go\">Unmarshal</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\">input<span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> <span class=\"syntax-keyword syntax-operator syntax-go\">&amp;</span>listFilesInput</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span>\n\t<span class=\"syntax-keyword syntax-control syntax-go\">if</span> err <span class=\"syntax-keyword syntax-operator syntax-go\">!=</span> <span class=\"syntax-constant syntax-language syntax-go\">nil</span> <span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span>\n\t\t<span class=\"syntax-meta syntax-function-call syntax-go\"><span class=\"syntax-support syntax-function syntax-builtin syntax-go\">panic</span><span class=\"syntax-meta syntax-function-call syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span></span><span class=\"syntax-meta syntax-function-call syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\">err</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span>\n\t<span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span>\n\n\t<span class=\"syntax-meta syntax-initialization syntax-short syntax-go\"><span class=\"syntax-variable syntax-other syntax-go\">dir</span> <span class=\"syntax-keyword syntax-operator syntax-initialize syntax-go\">:=</span></span> <span class=\"syntax-string syntax-quoted syntax-double syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-go\">&quot;</span>.<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-go\">&quot;</span></span>\n\t<span class=\"syntax-keyword syntax-control syntax-go\">if</span> listFilesInput<span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-other syntax-member syntax-go\">Path</span> <span class=\"syntax-keyword syntax-operator syntax-go\">!=</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-go\">&quot;</span><span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-go\">&quot;</span></span> <span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span>\n\t\tdir <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-go\">=</span> listFilesInput<span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-other syntax-member syntax-go\">Path</span>\n\t<span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span>\n\n<span class=\"syntax-meta syntax-initialization syntax-explicit syntax-go\">\t<span class=\"syntax-storage syntax-type syntax-go\">var</span> <span class=\"syntax-variable syntax-other syntax-go\">files</span></span><span class=\"syntax-meta syntax-initialization syntax-explicit syntax-go\"> <span class=\"syntax-meta syntax-brackets syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-brackets syntax-begin syntax-go\">[</span><span class=\"syntax-punctuation syntax-definition syntax-brackets syntax-end syntax-go\">]</span></span><span class=\"syntax-storage syntax-type syntax-go\">string</span></span>\n\terr <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-go\">=</span> filepath<span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-function syntax-go\">Walk</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\">dir<span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> <span class=\"syntax-meta syntax-function syntax-declaration syntax-anonymous syntax-go\"><span class=\"syntax-meta syntax-function syntax-declaration syntax-anonymous syntax-go\"><span class=\"syntax-storage syntax-type syntax-go\">func</span></span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-variable syntax-parameter syntax-go\">path</span></span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"> <span class=\"syntax-storage syntax-type syntax-go\">string</span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> </span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-variable syntax-parameter syntax-go\">info</span></span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"> os.FileInfo<span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> </span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-variable syntax-parameter syntax-go\">err</span></span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"> <span class=\"syntax-storage syntax-type syntax-go\">error</span></span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span><span class=\"syntax-meta syntax-function syntax-go\"> </span><span class=\"syntax-meta syntax-function syntax-return-type syntax-go\"><span class=\"syntax-storage syntax-type syntax-go\">error</span> </span><span class=\"syntax-meta syntax-function syntax-go\"><span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span></span></span><span class=\"syntax-meta syntax-function syntax-go\"><span class=\"syntax-meta syntax-block syntax-go\">\n\t\t<span class=\"syntax-keyword syntax-control syntax-go\">if</span> err <span class=\"syntax-keyword syntax-operator syntax-go\">!=</span> <span class=\"syntax-constant syntax-language syntax-go\">nil</span> <span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span>\n\t\t\t<span class=\"syntax-keyword syntax-control syntax-go\">return</span> err\n\t\t<span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span>\n\n\t\t<span class=\"syntax-meta syntax-initialization syntax-short syntax-go\"><span class=\"syntax-variable syntax-other syntax-go\">relPath</span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> <span class=\"syntax-variable syntax-other syntax-go\">err</span> <span class=\"syntax-keyword syntax-operator syntax-initialize syntax-go\">:=</span></span> filepath<span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-function syntax-go\">Rel</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\">dir<span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> path</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span>\n\t\t<span class=\"syntax-keyword syntax-control syntax-go\">if</span> err <span class=\"syntax-keyword syntax-operator syntax-go\">!=</span> <span class=\"syntax-constant syntax-language syntax-go\">nil</span> <span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span>\n\t\t\t<span class=\"syntax-keyword syntax-control syntax-go\">return</span> err\n\t\t<span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span>\n\n\t\t<span class=\"syntax-keyword syntax-control syntax-go\">if</span> relPath <span class=\"syntax-keyword syntax-operator syntax-go\">!=</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-go\">&quot;</span>.<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-go\">&quot;</span></span> <span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span>\n\t\t\t<span class=\"syntax-keyword syntax-control syntax-go\">if</span> info<span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-function syntax-go\">IsDir</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span> <span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span>\n\t\t\t\tfiles <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-go\">=</span> <span class=\"syntax-meta syntax-function-call syntax-go\"><span class=\"syntax-support syntax-function syntax-builtin syntax-go\">append</span><span class=\"syntax-meta syntax-function-call syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span></span><span class=\"syntax-meta syntax-function-call syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\">files<span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> relPath<span class=\"syntax-keyword syntax-operator syntax-go\">+</span><span class=\"syntax-string syntax-quoted syntax-double syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-go\">&quot;</span>/<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-go\">&quot;</span></span></span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span>\n\t\t\t<span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span> <span class=\"syntax-keyword syntax-control syntax-go\">else</span> <span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span>\n\t\t\t\tfiles <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-go\">=</span> <span class=\"syntax-meta syntax-function-call syntax-go\"><span class=\"syntax-support syntax-function syntax-builtin syntax-go\">append</span><span class=\"syntax-meta syntax-function-call syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span></span><span class=\"syntax-meta syntax-function-call syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\">files<span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> relPath</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span>\n\t\t\t<span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span>\n\t\t<span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span>\n\t\t<span class=\"syntax-keyword syntax-control syntax-go\">return</span> <span class=\"syntax-constant syntax-language syntax-go\">nil</span>\n\t</span></span><span class=\"syntax-meta syntax-function syntax-go\"><span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span></span></span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span>\n\n\t<span class=\"syntax-keyword syntax-control syntax-go\">if</span> err <span class=\"syntax-keyword syntax-operator syntax-go\">!=</span> <span class=\"syntax-constant syntax-language syntax-go\">nil</span> <span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span>\n\t\t<span class=\"syntax-keyword syntax-control syntax-go\">return</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-go\">&quot;</span><span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-go\">&quot;</span></span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> err\n\t<span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span>\n\n\t<span class=\"syntax-meta syntax-initialization syntax-short syntax-go\"><span class=\"syntax-variable syntax-other syntax-go\">result</span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> <span class=\"syntax-variable syntax-other syntax-go\">err</span> <span class=\"syntax-keyword syntax-operator syntax-initialize syntax-go\">:=</span></span> json<span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-function syntax-go\">Marshal</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\">files</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span>\n\t<span class=\"syntax-keyword syntax-control syntax-go\">if</span> err <span class=\"syntax-keyword syntax-operator syntax-go\">!=</span> <span class=\"syntax-constant syntax-language syntax-go\">nil</span> <span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span>\n\t\t<span class=\"syntax-keyword syntax-control syntax-go\">return</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-go\">&quot;</span><span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-go\">&quot;</span></span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> err\n\t<span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span>\n\n\t<span class=\"syntax-keyword syntax-control syntax-go\">return</span> <span class=\"syntax-storage syntax-type syntax-go\">string</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span>result<span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> <span class=\"syntax-constant syntax-language syntax-go\">nil</span>\n</span></span><span class=\"syntax-meta syntax-function syntax-go\"><span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span></span>\n</span></span></code></pre>\n<p>Nothing fancy here: <code>list_files</code> returns the list of files and directories in the current folder. There’s a thousand optimizations we could (and probably should) make if this were a serious effort, but since I just want to show you what’s in the wizard’s hat, this is fine.</p>\n<p>One thing to note: we return a list of strings and we denote directories with a trailing slash. That’s not required, it’s just something I just decided to do. There’s no fixed format. Anything goes as long as Claude can make sense of it and whether it can you need to figure out by experimentation. You could also prepend each directory with <code>&quot;directory: &quot;</code> or return a Markdown document with two headers: <code>&quot;directories&quot;</code> and <code>&quot;files&quot;</code>. There’s a ton of options and which one you chose depends on what Claude can make the most sense of, how many tokens it requires, how fast it is to generate and read, and so on.</p>\n<p>Here, we just want to create a small <code>list_files</code> tool and the easiest option wins.</p>\n<p>Of course we need to tell Claude about <code>list_files</code> too:</p>\n<pre><code class=\"language-go\"><span class=\"code-snippet\" data-language=\"Go\"><span class=\"syntax-source syntax-go\"><span class=\"syntax-comment syntax-line syntax-double-slash syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-go\">//</span> main.go\n</span>\n<span class=\"syntax-meta syntax-function syntax-declaration syntax-go\"><span class=\"syntax-storage syntax-type syntax-go\">func</span> <span class=\"syntax-entity syntax-name syntax-function syntax-go\">main</span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span><span class=\"syntax-meta syntax-function syntax-go\"> </span><span class=\"syntax-meta syntax-function syntax-go\"><span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span></span></span><span class=\"syntax-meta syntax-function syntax-go\"><span class=\"syntax-meta syntax-block syntax-go\">\n\t<span class=\"syntax-comment syntax-line syntax-double-slash syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-go\">//</span> [... previous code ...]\n</span>\n\t<span class=\"syntax-meta syntax-initialization syntax-short syntax-go\"><span class=\"syntax-variable syntax-other syntax-go\">tools</span> <span class=\"syntax-keyword syntax-operator syntax-initialize syntax-go\">:=</span></span> <span class=\"syntax-meta syntax-brackets syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-brackets syntax-begin syntax-go\">[</span><span class=\"syntax-punctuation syntax-definition syntax-brackets syntax-end syntax-go\">]</span></span>ToolDefinition<span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span>ReadFileDefinition<span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> ListFilesDefinition<span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span>\n\n\t<span class=\"syntax-comment syntax-line syntax-double-slash syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-go\">//</span> [... previous code ...]\n</span></span></span><span class=\"syntax-meta syntax-function syntax-go\"><span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span></span>\n</span></span></code></pre>\n<p>And that’s it. Let’s ask Claude what it can see in this directory.</p>\n<p>$ go run main.go</p>\n<p>Chat with Claude (use 'ctrl-c' to quit)</p>\n<p>You: what do you see in this directory?</p>\n<p>Claude: I'll help you see what's in the current directory. Let me list the files and directories for you.</p>\n<p>tool: list_files({})</p>\n<p>Claude: I can see several files and directories in the current directory: 1. Git-related files and directories: - `.git/` directory with various Git configuration and tracking files - `.gitignore` file 2. Go project files: - `main.go` - the main Go source code file - `go.mod` - Go module definition file - `go.sum` - Go module checksum file 3. Documentation: - `blogpost.md` - a markdown file, likely containing blog content 4. Environment configuration: - `.envrc` - likely an environment configuration file Would you like me to examine the contents of any specific file from this list?</p>\n<p>You:</p>\n<p>Works! It can read the directory.</p>\n<p>But here’s the thing: Claude knows how to combine these tools. We just need to prompt it in a way that provokes it:</p>\n<p>$ go run main.go</p>\n<p>Chat with Claude (use 'ctrl-c' to quit)</p>\n<p>You: Tell me about all the Go files in here. Be brief!</p>\n<p>Claude: I'll examine the Go files in the current directory for you. Let me check what files are available first.</p>\n<p>tool: list_files({})</p>\n<p>Claude: I found a Go file in the current directory. Let me examine it:</p>\n<p>tool: read_file({&quot;path&quot;:&quot;main.go&quot;})</p>\n<p>tool: read_file({&quot;path&quot;:&quot;go.mod&quot;})</p>\n<p>Claude: Here's a brief overview of the Go files in this project: **main.go**: - Implements a Claude AI agent that can interact with the local filesystem - Uses the Anthropic SDK for Go to communicate with Claude AI models - Provides two tools: `read_file` and `list_files` that allow Claude to read file contents and list directory contents - Manages a conversation flow between the user and Claude, handling tool execution when Claude needs to access files **go.mod**: - Defines the module dependencies - Main dependencies are the Anthropic SDK for Go and a JSON schema library - Uses Go 1.24.1 This appears to be a simple terminal-based application that allows users to chat with Claude while giving the AI access to read local files and list directories.</p>\n<p>You:</p>\n<p>First it used the <code>list_files</code> and then it called <code>read_file</code> twice with the Go-related files that I asked it about.</p>\n<p>Just… just like we would, right? I mean, here, what would you do if I ask you what version of Go we use in this project? Here’s what Claude does for me:</p>\n<p>$ go run main.go</p>\n<p>Chat with Claude (use 'ctrl-c' to quit)</p>\n<p>You: What go version are we using in this project?</p>\n<p>Claude: I'll help you find the Go version being used in this project. Let me check the files to locate where the Go version might be specified.</p>\n<p>tool: list_files({})</p>\n<p>Claude: I can see there's a Go project here with several important files like `go.mod`, `go.sum`, and `main.go`. Let me check the `go.mod` file first, as it typically contains the Go version information.</p>\n<p>tool: read_file({&quot;path&quot;:&quot;go.mod&quot;})</p>\n<p>Claude: According to the `go.mod` file, this project is using Go version 1.24.1.</p>\n<p>Claude looks at the directory, looks at <code>go.mod</code>, and has the answer.</p>\n<p>We’re at around 190 lines of code now. Let that sink in. Once you have, let’s add another tool.</p>\n<h2>Let it <code>edit_file</code></h2>\n<p>The last tool we’re going to add is <code>edit_file</code> — a tool that lets Claude edit files.</p>\n<p>“Holy shit”, you’re thinking now, “this is where the rubber hits the road, this is where he pulls the rabbit out of the hat.” Well, let’s see, shall we?</p>\n<p>First, let’s add a definition for our new <code>edit_file</code> tool:</p>\n<pre><code class=\"language-go\"><span class=\"code-snippet\" data-language=\"Go\"><span class=\"syntax-source syntax-go\"><span class=\"syntax-comment syntax-line syntax-double-slash syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-go\">//</span> main.go\n</span>\n<span class=\"syntax-meta syntax-initialization syntax-explicit syntax-go\"><span class=\"syntax-storage syntax-type syntax-go\">var</span> <span class=\"syntax-variable syntax-other syntax-go\">EditFileDefinition</span></span><span class=\"syntax-meta syntax-initialization syntax-explicit syntax-go\"> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-go\">=</span> ToolDefinition{</span>\n\t<span class=\"syntax-entity syntax-name syntax-label syntax-go\">Name</span><span class=\"syntax-punctuation syntax-separator syntax-go\">:</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-go\">&quot;</span>edit_file<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-go\">&quot;</span></span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span>\n\t<span class=\"syntax-entity syntax-name syntax-label syntax-go\">Description</span><span class=\"syntax-punctuation syntax-separator syntax-go\">:</span> <span class=\"syntax-string syntax-quoted syntax-raw syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-go\">`</span>Make edits to a text file.\n\nReplaces &#39;old_str&#39; with &#39;new_str&#39; in the given file. &#39;old_str&#39; and &#39;new_str&#39; MUST be different from each other.\n\nIf the file specified with path doesn&#39;t exist, it will be created.\n<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-go\">`</span></span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span>\n\t<span class=\"syntax-entity syntax-name syntax-label syntax-go\">InputSchema</span><span class=\"syntax-punctuation syntax-separator syntax-go\">:</span> EditFileInputSchema<span class=\"syntax-punctuation syntax-separator syntax-go\">,</span>\n\t<span class=\"syntax-entity syntax-name syntax-label syntax-go\">Function</span><span class=\"syntax-punctuation syntax-separator syntax-go\">:</span>    EditFile<span class=\"syntax-punctuation syntax-separator syntax-go\">,</span>\n}\n\n<span class=\"syntax-meta syntax-struct syntax-go\"><span class=\"syntax-storage syntax-type syntax-go\">type</span> <span class=\"syntax-entity syntax-name syntax-struct syntax-go\">EditFileInput</span> <span class=\"syntax-storage syntax-type syntax-go\">struct</span> <span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span>\n\t<span class=\"syntax-variable syntax-other syntax-member syntax-go\">Path</span>   <span class=\"syntax-storage syntax-type syntax-go\">string</span> <span class=\"syntax-string syntax-quoted syntax-raw syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-go\">`</span>json:&quot;path&quot; jsonschema_description:&quot;The path to the file&quot;<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-go\">`</span></span>\n\t<span class=\"syntax-variable syntax-other syntax-member syntax-go\">OldStr</span> <span class=\"syntax-storage syntax-type syntax-go\">string</span> <span class=\"syntax-string syntax-quoted syntax-raw syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-go\">`</span>json:&quot;old_str&quot; jsonschema_description:&quot;Text to search for - must match exactly and must only have one match exactly&quot;<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-go\">`</span></span>\n\t<span class=\"syntax-variable syntax-other syntax-member syntax-go\">NewStr</span> <span class=\"syntax-storage syntax-type syntax-go\">string</span> <span class=\"syntax-string syntax-quoted syntax-raw syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-go\">`</span>json:&quot;new_str&quot; jsonschema_description:&quot;Text to replace old_str with&quot;<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-go\">`</span></span>\n</span><span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span></span>\n\n<span class=\"syntax-meta syntax-initialization syntax-explicit syntax-go\"><span class=\"syntax-storage syntax-type syntax-go\">var</span> <span class=\"syntax-variable syntax-other syntax-go\">EditFileInputSchema</span></span><span class=\"syntax-meta syntax-initialization syntax-explicit syntax-go\"> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-go\">=</span> GenerateSchema<span class=\"syntax-meta syntax-brackets syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-brackets syntax-begin syntax-go\">[</span>EditFileInput<span class=\"syntax-punctuation syntax-definition syntax-brackets syntax-end syntax-go\">]</span></span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span>\n</span></span></code></pre>\n<p>That’s right, I again know what you’re thinking: “string replacement to edit files?” Claude 3.7 loves replacing strings (experimentation is how you find out what they love or don’t), so we’re going to implement <code>edit_file</code> by telling Claude it can edit files by replacing existing text with new text.</p>\n<p>Now here’s the implementation of the <code>EditFile</code> function in Go:</p>\n<pre><code class=\"language-go\"><span class=\"code-snippet\" data-language=\"Go\"><span class=\"syntax-source syntax-go\"><span class=\"syntax-meta syntax-function syntax-declaration syntax-go\"><span class=\"syntax-storage syntax-type syntax-go\">func</span> <span class=\"syntax-entity syntax-name syntax-function syntax-go\">EditFile</span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-variable syntax-parameter syntax-go\">input</span></span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"> json.RawMessage</span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span><span class=\"syntax-meta syntax-function syntax-go\"> </span><span class=\"syntax-meta syntax-function syntax-return-type syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function syntax-return-type syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-storage syntax-type syntax-go\">string</span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> <span class=\"syntax-storage syntax-type syntax-go\">error</span><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span><span class=\"syntax-meta syntax-function syntax-go\"> </span><span class=\"syntax-meta syntax-function syntax-go\"><span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span></span></span><span class=\"syntax-meta syntax-function syntax-go\"><span class=\"syntax-meta syntax-block syntax-go\">\n\t<span class=\"syntax-meta syntax-initialization syntax-short syntax-go\"><span class=\"syntax-variable syntax-other syntax-go\">editFileInput</span> <span class=\"syntax-keyword syntax-operator syntax-initialize syntax-go\">:=</span></span> EditFileInput<span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span><span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span>\n\t<span class=\"syntax-meta syntax-initialization syntax-short syntax-go\"><span class=\"syntax-variable syntax-other syntax-go\">err</span> <span class=\"syntax-keyword syntax-operator syntax-initialize syntax-go\">:=</span></span> json<span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-function syntax-go\">Unmarshal</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\">input<span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> <span class=\"syntax-keyword syntax-operator syntax-go\">&amp;</span>editFileInput</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span>\n\t<span class=\"syntax-keyword syntax-control syntax-go\">if</span> err <span class=\"syntax-keyword syntax-operator syntax-go\">!=</span> <span class=\"syntax-constant syntax-language syntax-go\">nil</span> <span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span>\n\t\t<span class=\"syntax-keyword syntax-control syntax-go\">return</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-go\">&quot;</span><span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-go\">&quot;</span></span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> err\n\t<span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span>\n\n\t<span class=\"syntax-keyword syntax-control syntax-go\">if</span> editFileInput<span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-other syntax-member syntax-go\">Path</span> <span class=\"syntax-keyword syntax-operator syntax-go\">==</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-go\">&quot;</span><span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-go\">&quot;</span></span> <span class=\"syntax-keyword syntax-operator syntax-go\">||</span> editFileInput<span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-other syntax-member syntax-go\">OldStr</span> <span class=\"syntax-keyword syntax-operator syntax-go\">==</span> editFileInput<span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-other syntax-member syntax-go\">NewStr</span> <span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span>\n\t\t<span class=\"syntax-keyword syntax-control syntax-go\">return</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-go\">&quot;</span><span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-go\">&quot;</span></span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> fmt<span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-function syntax-go\">Errorf</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-string syntax-quoted syntax-double syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-go\">&quot;</span>invalid input parameters<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-go\">&quot;</span></span></span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span>\n\t<span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span>\n\n\t<span class=\"syntax-meta syntax-initialization syntax-short syntax-go\"><span class=\"syntax-variable syntax-other syntax-go\">content</span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> <span class=\"syntax-variable syntax-other syntax-go\">err</span> <span class=\"syntax-keyword syntax-operator syntax-initialize syntax-go\">:=</span></span> os<span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-function syntax-go\">ReadFile</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\">editFileInput<span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-other syntax-member syntax-go\">Path</span></span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span>\n\t<span class=\"syntax-keyword syntax-control syntax-go\">if</span> err <span class=\"syntax-keyword syntax-operator syntax-go\">!=</span> <span class=\"syntax-constant syntax-language syntax-go\">nil</span> <span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span>\n\t\t<span class=\"syntax-keyword syntax-control syntax-go\">if</span> os<span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-function syntax-go\">IsNotExist</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\">err</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span> <span class=\"syntax-keyword syntax-operator syntax-go\">&amp;&amp;</span> editFileInput<span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-other syntax-member syntax-go\">OldStr</span> <span class=\"syntax-keyword syntax-operator syntax-go\">==</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-go\">&quot;</span><span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-go\">&quot;</span></span> <span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span>\n\t\t\t<span class=\"syntax-keyword syntax-control syntax-go\">return</span> <span class=\"syntax-meta syntax-function-call syntax-go\"><span class=\"syntax-variable syntax-function syntax-go\">createNewFile</span><span class=\"syntax-meta syntax-function-call syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span></span><span class=\"syntax-meta syntax-function-call syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\">editFileInput<span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-other syntax-member syntax-go\">Path</span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> editFileInput<span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-other syntax-member syntax-go\">NewStr</span></span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span>\n\t\t<span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span>\n\t\t<span class=\"syntax-keyword syntax-control syntax-go\">return</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-go\">&quot;</span><span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-go\">&quot;</span></span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> err\n\t<span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span>\n\n\t<span class=\"syntax-meta syntax-initialization syntax-short syntax-go\"><span class=\"syntax-variable syntax-other syntax-go\">oldContent</span> <span class=\"syntax-keyword syntax-operator syntax-initialize syntax-go\">:=</span></span> <span class=\"syntax-storage syntax-type syntax-go\">string</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span>content<span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span>\n\t<span class=\"syntax-meta syntax-initialization syntax-short syntax-go\"><span class=\"syntax-variable syntax-other syntax-go\">newContent</span> <span class=\"syntax-keyword syntax-operator syntax-initialize syntax-go\">:=</span></span> strings<span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-function syntax-go\">Replace</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\">oldContent<span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> editFileInput<span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-other syntax-member syntax-go\">OldStr</span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> editFileInput<span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-other syntax-member syntax-go\">NewStr</span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> <span class=\"syntax-keyword syntax-operator syntax-go\">-</span><span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-go\">1</span></span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span>\n\n\t<span class=\"syntax-keyword syntax-control syntax-go\">if</span> oldContent <span class=\"syntax-keyword syntax-operator syntax-go\">==</span> newContent <span class=\"syntax-keyword syntax-operator syntax-go\">&amp;&amp;</span> editFileInput<span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-other syntax-member syntax-go\">OldStr</span> <span class=\"syntax-keyword syntax-operator syntax-go\">!=</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-go\">&quot;</span><span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-go\">&quot;</span></span> <span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span>\n\t\t<span class=\"syntax-keyword syntax-control syntax-go\">return</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-go\">&quot;</span><span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-go\">&quot;</span></span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> fmt<span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-function syntax-go\">Errorf</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-string syntax-quoted syntax-double syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-go\">&quot;</span>old_str not found in file<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-go\">&quot;</span></span></span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span>\n\t<span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span>\n\n\terr <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-go\">=</span> os<span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-function syntax-go\">WriteFile</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\">editFileInput<span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-other syntax-member syntax-go\">Path</span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> <span class=\"syntax-meta syntax-brackets syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-brackets syntax-begin syntax-go\">[</span><span class=\"syntax-punctuation syntax-definition syntax-brackets syntax-end syntax-go\">]</span></span><span class=\"syntax-storage syntax-type syntax-go\">byte</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span>newContent<span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> <span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-go\">0644</span></span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span>\n\t<span class=\"syntax-keyword syntax-control syntax-go\">if</span> err <span class=\"syntax-keyword syntax-operator syntax-go\">!=</span> <span class=\"syntax-constant syntax-language syntax-go\">nil</span> <span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span>\n\t\t<span class=\"syntax-keyword syntax-control syntax-go\">return</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-go\">&quot;</span><span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-go\">&quot;</span></span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> err\n\t<span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span>\n\n\t<span class=\"syntax-keyword syntax-control syntax-go\">return</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-go\">&quot;</span>OK<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-go\">&quot;</span></span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> <span class=\"syntax-constant syntax-language syntax-go\">nil</span>\n</span></span><span class=\"syntax-meta syntax-function syntax-go\"><span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span></span>\n</span></span></code></pre>\n<p>It checks the input parameters, it reads the file (or creates it if it exists), and replaces the <code>OldStr</code> with <code>NewStr</code>. Then it writes the content back to disk and returns <code>&quot;OK&quot;</code>.</p>\n<p>What’s missing still is <code>createNewFile</code>, which is just a tiny helper function that would be 70% shorter if this wasn’t Go:</p>\n<pre><code class=\"language-go\"><span class=\"code-snippet\" data-language=\"Go\"><span class=\"syntax-source syntax-go\"><span class=\"syntax-meta syntax-function syntax-declaration syntax-go\"><span class=\"syntax-storage syntax-type syntax-go\">func</span> <span class=\"syntax-entity syntax-name syntax-function syntax-go\">createNewFile</span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-variable syntax-parameter syntax-go\">filePath</span></span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> <span class=\"syntax-variable syntax-parameter syntax-go\">content</span></span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"> <span class=\"syntax-storage syntax-type syntax-go\">string</span></span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span><span class=\"syntax-meta syntax-function syntax-go\"> </span><span class=\"syntax-meta syntax-function syntax-return-type syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function syntax-return-type syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-storage syntax-type syntax-go\">string</span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> <span class=\"syntax-storage syntax-type syntax-go\">error</span><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span><span class=\"syntax-meta syntax-function syntax-go\"> </span><span class=\"syntax-meta syntax-function syntax-go\"><span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span></span></span><span class=\"syntax-meta syntax-function syntax-go\"><span class=\"syntax-meta syntax-block syntax-go\">\n\t<span class=\"syntax-meta syntax-initialization syntax-short syntax-go\"><span class=\"syntax-variable syntax-other syntax-go\">dir</span> <span class=\"syntax-keyword syntax-operator syntax-initialize syntax-go\">:=</span></span> path<span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-function syntax-go\">Dir</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\">filePath</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span>\n\t<span class=\"syntax-keyword syntax-control syntax-go\">if</span> dir <span class=\"syntax-keyword syntax-operator syntax-go\">!=</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-go\">&quot;</span>.<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-go\">&quot;</span></span> <span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span>\n\t\t<span class=\"syntax-meta syntax-initialization syntax-short syntax-go\"><span class=\"syntax-variable syntax-other syntax-go\">err</span> <span class=\"syntax-keyword syntax-operator syntax-initialize syntax-go\">:=</span></span> os<span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-function syntax-go\">MkdirAll</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\">dir<span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> <span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-go\">0755</span></span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span>\n\t\t<span class=\"syntax-keyword syntax-control syntax-go\">if</span> err <span class=\"syntax-keyword syntax-operator syntax-go\">!=</span> <span class=\"syntax-constant syntax-language syntax-go\">nil</span> <span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span>\n\t\t\t<span class=\"syntax-keyword syntax-control syntax-go\">return</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-go\">&quot;</span><span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-go\">&quot;</span></span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> fmt<span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-function syntax-go\">Errorf</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-string syntax-quoted syntax-double syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-go\">&quot;</span>failed to create directory: <span class=\"syntax-invalid syntax-illegal syntax-placeholder syntax-go\">%</span>w<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-go\">&quot;</span></span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> err</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span>\n\t\t<span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span>\n\t<span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span>\n\n\t<span class=\"syntax-meta syntax-initialization syntax-short syntax-go\"><span class=\"syntax-variable syntax-other syntax-go\">err</span> <span class=\"syntax-keyword syntax-operator syntax-initialize syntax-go\">:=</span></span> os<span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-function syntax-go\">WriteFile</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\">filePath<span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> <span class=\"syntax-meta syntax-brackets syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-brackets syntax-begin syntax-go\">[</span><span class=\"syntax-punctuation syntax-definition syntax-brackets syntax-end syntax-go\">]</span></span><span class=\"syntax-storage syntax-type syntax-go\">byte</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span>content<span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> <span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-go\">0644</span></span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span>\n\t<span class=\"syntax-keyword syntax-control syntax-go\">if</span> err <span class=\"syntax-keyword syntax-operator syntax-go\">!=</span> <span class=\"syntax-constant syntax-language syntax-go\">nil</span> <span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span>\n\t\t<span class=\"syntax-keyword syntax-control syntax-go\">return</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-go\">&quot;</span><span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-go\">&quot;</span></span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> fmt<span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-function syntax-go\">Errorf</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-string syntax-quoted syntax-double syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-go\">&quot;</span>failed to create file: <span class=\"syntax-invalid syntax-illegal syntax-placeholder syntax-go\">%</span>w<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-go\">&quot;</span></span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> err</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span>\n\t<span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span>\n\n\t<span class=\"syntax-keyword syntax-control syntax-go\">return</span> fmt<span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-punctuation syntax-accessor syntax-go\">.</span><span class=\"syntax-variable syntax-function syntax-go\">Sprintf</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-method syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-string syntax-quoted syntax-double syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-go\">&quot;</span>Successfully created file <span class=\"syntax-constant syntax-other syntax-placeholder syntax-go\">%s</span><span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-go\">&quot;</span></span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> filePath</span><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> <span class=\"syntax-constant syntax-language syntax-go\">nil</span>\n</span></span><span class=\"syntax-meta syntax-function syntax-go\"><span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span></span>\n</span></span></code></pre>\n<p>Last step: adding it to the list of tools that we send to Claude.</p>\n<pre><code class=\"language-go\"><span class=\"code-snippet\" data-language=\"Go\"><span class=\"syntax-source syntax-go\"><span class=\"syntax-comment syntax-line syntax-double-slash syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-go\">//</span> main.go\n</span>\n<span class=\"syntax-meta syntax-function syntax-declaration syntax-go\"><span class=\"syntax-storage syntax-type syntax-go\">func</span> <span class=\"syntax-entity syntax-name syntax-function syntax-go\">main</span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-begin syntax-go\">(</span></span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-go\"><span class=\"syntax-meta syntax-group syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-group syntax-end syntax-go\">)</span></span></span><span class=\"syntax-meta syntax-function syntax-go\"> </span><span class=\"syntax-meta syntax-function syntax-go\"><span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span></span></span><span class=\"syntax-meta syntax-function syntax-go\"><span class=\"syntax-meta syntax-block syntax-go\">\n\t<span class=\"syntax-comment syntax-line syntax-double-slash syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-go\">//</span> [... previous code ...]\n</span>\n\t<span class=\"syntax-meta syntax-initialization syntax-short syntax-go\"><span class=\"syntax-variable syntax-other syntax-go\">tools</span> <span class=\"syntax-keyword syntax-operator syntax-initialize syntax-go\">:=</span></span> <span class=\"syntax-meta syntax-brackets syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-brackets syntax-begin syntax-go\">[</span><span class=\"syntax-punctuation syntax-definition syntax-brackets syntax-end syntax-go\">]</span></span>ToolDefinition<span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-begin syntax-go\">{</span>ReadFileDefinition<span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> ListFilesDefinition<span class=\"syntax-punctuation syntax-separator syntax-go\">,</span> EditFileDefinition<span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span>\n\n\t<span class=\"syntax-comment syntax-line syntax-double-slash syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-go\">//</span> [... previous code ...]\n</span></span></span><span class=\"syntax-meta syntax-function syntax-go\"><span class=\"syntax-meta syntax-block syntax-go\"><span class=\"syntax-punctuation syntax-definition syntax-block syntax-end syntax-go\">}</span></span></span>\n</span></span></code></pre>\n<p>And… we’re ready, but are <em>you</em>? Are you ready to let it rip?</p>\n<p>Thought so, let’s do this. Let’s tell Claude to create a new FizzBuzz function in JavaScript.</p>\n<p>$ go run main.go</p>\n<p>Chat with Claude (use 'ctrl-c' to quit)</p>\n<p>You: hey claude, create fizzbuzz.js that I can run with Nodejs and that has fizzbuzz in it and executes it</p>\n<p>Claude: I'll create a fizzbuzz.js file that you can run with Node.js. First, let me check if the file already exists:</p>\n<p>tool: list_files({})</p>\n<p>Claude: I don't see a fizzbuzz.js file, so I'll create one with a classic FizzBuzz implementation. This program will print numbers from 1 to 100, but for multiples of 3 it will print &quot;Fizz&quot;, for multiples of 5 it will print &quot;Buzz&quot;, and for numbers that are multiples of both 3 and 5 it will print &quot;FizzBuzz&quot;.</p>\n<p>tool: edit_file({&quot;path&quot;:&quot;fizzbuzz.js&quot;,&quot;old_str&quot;:&quot;&quot;,&quot;new_str&quot;:&quot;/**\\n * FizzBuzz implementation in JavaScript\\n * Prints numbers from 1 to 100, but:\\n * - For multiples of 3, print \\&quot;Fizz\\&quot; instead of the number\\n * - For multiples of 5, print \\&quot;Buzz\\&quot; instead of the number\\n * - For multiples of both 3 and 5, print \\&quot;FizzBuzz\\&quot;\\n */\\n\\nfunction fizzBuzz(n) {\\n for (let i = 1; i &lt;= n; i++) {\\n let output = '';\\n \\n if (i % 3 === 0) output += 'Fizz';\\n if (i % 5 === 0) output += 'Buzz';\\n \\n console.log(output || i);\\n }\\n}\\n\\n// Execute FizzBuzz for numbers 1 to 100\\nconsole.log('Running FizzBuzz:');\\nfizzBuzz(100);&quot;}</p>\n<p>Claude: I've created a fizzbuzz.js file that you can run with Node.js. The program: 1. Defines a function called `fizzBuzz` that takes a parameter `n` for the upper limit 2. Loops from 1 to n (set to 100 in the execution) 3. For each number: - If it's divisible by 3, it adds &quot;Fizz&quot; to the output - If it's divisible by 5, it adds &quot;Buzz&quot; to the output - If it's divisible by both, it adds both resulting in &quot;FizzBuzz&quot; - If it's not divisible by either 3 or 5, it outputs the number itself 4. The script automatically executes the function for numbers 1 to 100 You can run this script using Node.js with the following command in your terminal: node fizzbuzz.js This will output the FizzBuzz sequence from 1 to 100 to your console.</p>\n<p>Right?! It’s impressive, isn’t it? And that’s the <em>most basic implemenation</em> of <code>edit_file</code> — of an agent in general — you can probably come up with.</p>\n<p>But, did it work? Yes, it did:</p>\n<pre><code class=\"language-text\"><span class=\"code-snippet\">$ node fizzbuzz.js\nRunning FizzBuzz:\n1\n2\nFizz\n4\nBuzz\nFizz\n7\n8\nFizz\nBuzz\n11\nFizz\n13\n14\nFizzBuzz\n16\n[...]\n</span></code></pre>\n<p>Amazing. But hey, let’s have it actually <em>edit</em> a file and not just create one.</p>\n<p>Here’s what Claude does when I ask it to “Please edit the <code>fizzbuzz.js</code> so that it only prints until 15”:</p>\n<p>$ go run main.go</p>\n<p>Chat with Claude (use 'ctrl-c' to quit)</p>\n<p>You: Please edit fizzbuzz.js so that it only prints until 15</p>\n<p>Claude: I'll edit the fizzbuzz.js file to print only until 15 instead of its current limit. First, let me check the current content of the file to understand what changes are needed.</p>\n<p>tool: read_file({&quot;path&quot;:&quot;fizzbuzz.js&quot;})</p>\n<p>Claude: I can see that the file currently runs FizzBuzz up to 100. I'll modify it to only run up to 15 instead by changing the parameter in the fizzBuzz function call.</p>\n<p>tool: edit_file({&quot;path&quot;:&quot;fizzbuzz.js&quot;,&quot;old_str&quot;:&quot;// Execute FizzBuzz for numbers 1 to 100\\nconsole.log('Running FizzBuzz:');\\nfizzBuzz(100);&quot;,&quot;new_str&quot;:&quot;// Execute FizzBuzz for numbers 1 to 15\\nconsole.log('Running FizzBuzz:');\\nfizzBuzz(15);&quot;})</p>\n<p>Claude: I also need to update the comment at the top of the file to reflect this change:</p>\n<p>tool: edit_file({&quot;path&quot;:&quot;fizzbuzz.js&quot;,&quot;old_str&quot;:&quot;/**\\n * FizzBuzz implementation in JavaScript\\n * Prints numbers from 1 to 100, but:&quot;,&quot;new_str&quot;:&quot;/**\\n * FizzBuzz implementation in JavaScript\\n * Prints numbers from 1 to 15, but:&quot;})</p>\n<p>Claude: The changes have been successfully made to the fizzbuzz.js file. The program will now: 1. Only print FizzBuzz from 1 to 15 (instead of 1 to 100) 2. The documentation has been updated to reflect this change The function itself remains the same, as it takes a parameter to determine the upper limit, and we've simply changed that parameter from 100 to 15.</p>\n<p>It reads the file, it edits the file to change the how long it runs, <em>and</em> then it also edits the file to update the comment at the top.</p>\n<p>And it still works:</p>\n<pre><code class=\"language-text\"><span class=\"code-snippet\">$ node fizzbuzz.js\nRunning FizzBuzz:\n1\n2\nFizz\n4\nBuzz\nFizz\n7\n8\nFizz\nBuzz\n11\nFizz\n13\n14\nFizzBuzz\n</span></code></pre>\n<p>Okay, let’s do one more and ask it to do the following:</p>\n<blockquote>\n<p>Create a congrats.js script that rot13-decodes the following string ‘Pbatenghyngvbaf ba ohvyqvat n pbqr-rqvgvat ntrag!’ and prints it</p>\n</blockquote>\n<p>Maybe a tall order. Let’s see:</p>\n<p>$ go run main.go</p>\n<p>Chat with Claude (use 'ctrl-c' to quit)</p>\n<p>You: Create a congrats.js script that rot13-decodes the following string 'Pbatenghyngvbaf ba ohvyqvat n pbqr-rqvgvat ntrag!' and prints it</p>\n<p>Claude: I'll create a congrats.js script that decodes the ROT13-encoded string and prints it. ROT13 is a simple letter substitution cipher that replaces a letter with the 13th letter after it in the alphabet. Let me create this file for you:</p>\n<p>tool: edit_file({&quot;path&quot;:&quot;congrats.js&quot;,&quot;old_str&quot;:&quot;&quot;,&quot;new_str&quot;:&quot;/**\\n * A script to decode a ROT13-encoded string and print the result\\n */\\n\\nfunction rot13Decode(encodedStr) {\\n return encodedStr.replace(/[a-zA-Z]/g, function(char) {\\n // Get the character code\\n const charCode = char.charCodeAt(0);\\n \\n // Handle uppercase letters\\n if (charCode &gt;= 65 &amp;&amp; charCode &lt;= 90) {\\n return String.fromCharCode(((charCode - 65 + 13) % 26) + 65);\\n }\\n \\n // Handle lowercase letters\\n if (charCode &gt;= 97 &amp;&amp; charCode &lt;= 122) {\\n return String.fromCharCode(((charCode - 97 + 13) % 26) + 97);\\n }\\n \\n // Return non-alphabetic characters as is\\n return char;\\n });\\n}\\n\\nconst encodedMessage = 'Pbatenghyngvbaf ba ohvyqvat n pbqr-rqvgvat ntrag!';\\nconst decodedMessage = rot13Decode(encodedMessage);\\n\\nconsole.log(decodedMessage);&quot;})</p>\n<p>Claude: I've created a JavaScript file called congrats.js that: 1. Defines a `rot13Decode` function that takes an encoded string and applies the ROT13 cipher to decode it 2. Takes the provided string 'Pbatenghyngvbaf ba ohvyqvat n pbqr-rqvgvat ntrag!' 3. Decodes it using the function 4. Prints the decoded message to the console You can run this script using Node.js by typing `node congrats.js` in your terminal. The script will decode and display the hidden congratulatory message!</p>\n<p>Does it work? Let’s try it:</p>\n<pre><code class=\"language-text\"><span class=\"code-snippet\">$ node congrats.js\nCongratulations on building a code-editing agent!\n</span></code></pre>\n<p>It does!</p>\n<h2>Isn’t this amazing?</h2>\n<p>If you’re anything like all the engineers I’ve talked to in the past few months, chances are that, while reading this, you have been waiting for the rabbit to be pulled out of the hat, for me to say “well, in reality it’s much, much harder than this.” But it’s not.</p>\n<p>This is essentially all there is to the inner loop of a code-editing agent. Sure, integrating it into your editor, tweaking the system prompt, giving it the right feedback at the right time, a nice UI around it, better tooling around the tools, support for multiple agents, and so on — we’ve built all of that in <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://ampcode.com/\">Amp</a>, but it didn’t require moments of genius. All that was required was practical engineering and elbow grease.</p>\n<p>These models are incredibly powerful now. 300 lines of code and three tools and now you’re to be able to talk to an alien intelligence that edits your code. If you think “well, but we didn’t really…” — go and try it! Go and see how far you can get with this. I bet it’s a lot farther than you think.</p>\n<p><em>That</em>’s why we think everything’s changing.</p>\n",
  "content_markdown": "Thorsten Ball//April 15, 2025\n\nor: The Emperor Has No Clothes\n\nIt’s not that hard to build a fully functioning, code-editing agent.\n\nIt seems like it would be. When you look at an agent editing files, running commands, wriggling itself out of errors, retrying different strategies - it seems like there has to be a secret behind it.\n\nThere isn’t. It’s an LLM, a loop, and enough tokens. It’s what we’ve been saying on the [podcast](https://ampcode.com/podcast) from the start. The rest, the stuff that makes [Amp](https://ampcode.com/) so addictive and impressive? Elbow grease.\n\nBut building a small and yet highly impressive agent doesn’t even require that. You can do it in less than 400 lines of code, most of which is boilerplate.\n\nI’m going to show you how, right now. We’re going to write some code together and go from zero lines of code to “oh wow, this is… a game changer.”\n\nI *urge* you to follow along. No, really. You might think you can just read this and that you don’t have to type out the code, but it’s less than 400 lines of code. I need you to *feel* how little code it is and I want you to see this with your own eyes in your own terminal in your own folders.\n\nHere’s what we need:\n\n- [Go](https://go.dev/)\n- [Anthropic API key](https://console.anthropic.com/settings/keys) that you set as an environment variable, `ANTHROPIC_API_KEY`\n\n## Pencils out!\n\nLet’s dive right in and get ourselves a new Go project set up in four easy commands:\n\n```shell\nmkdir code-editing-agent\ncd code-editing-agent\ngo mod init agent\ntouch main.go\n```\n\nNow, let’s open `main.go` and, as a first step, put a skeleton of things we need in it:\n\n```go\npackage main\n\nimport (\n\t\"bufio\"\n\t\"context\"\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/anthropics/anthropic-sdk-go\"\n)\n\nfunc main() {\n\tclient := anthropic.NewClient()\n\n\tscanner := bufio.NewScanner(os.Stdin)\n\tgetUserMessage := func() (string, bool) {\n\t\tif !scanner.Scan() {\n\t\t\treturn \"\", false\n\t\t}\n\t\treturn scanner.Text(), true\n\t}\n\n\tagent := NewAgent(&client, getUserMessage)\n\terr := agent.Run(context.TODO())\n\tif err != nil {\n\t\tfmt.Printf(\"Error: %s\\n\", err.Error())\n\t}\n}\n\nfunc NewAgent(client *anthropic.Client, getUserMessage func() (string, bool)) *Agent {\n\treturn &Agent{\n\t\tclient:         client,\n\t\tgetUserMessage: getUserMessage,\n\t}\n}\n\ntype Agent struct {\n\tclient         *anthropic.Client\n\tgetUserMessage func() (string, bool)\n}\n```\n\nYes, this doesn’t compile yet. But what we have here is an `Agent` that has access to an `anthropic.Client` (which, by default, looks for `ANTHROPIC_API_KEY`) and that can get a user message by reading from stdin on the terminal.\n\nNow let’s add the missing `Run()` method:\n\n```go\n// main.go\n\nfunc (a *Agent) Run(ctx context.Context) error {\n\tconversation := []anthropic.MessageParam{}\n\n\tfmt.Println(\"Chat with Claude (use 'ctrl-c' to quit)\")\n\n\tfor {\n\t\tfmt.Print(\"\\\\u001b[94mYou\\\\u001b[0m: \")\n\t\tuserInput, ok := a.getUserMessage()\n\t\tif !ok {\n\t\t\tbreak\n\t\t}\n\n\t\tuserMessage := anthropic.NewUserMessage(anthropic.NewTextBlock(userInput))\n\t\tconversation = append(conversation, userMessage)\n\n\t\tmessage, err := a.runInference(ctx, conversation)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tconversation = append(conversation, message.ToParam())\n\n\t\tfor _, content := range message.Content {\n\t\t\tswitch content.Type {\n\t\t\tcase \"text\":\n\t\t\t\tfmt.Printf(\"\\\\u001b[93mClaude\\\\u001b[0m: %s\\n\", content.Text)\n\t\t\t}\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc (a *Agent) runInference(ctx context.Context, conversation []anthropic.MessageParam) (*anthropic.Message, error) {\n\tmessage, err := a.client.Messages.New(ctx, anthropic.MessageNewParams{\n\t\tModel:     anthropic.ModelClaude3_7SonnetLatest,\n\t\tMaxTokens: int64(1024),\n\t\tMessages:  conversation,\n\t})\n\treturn message, err\n}\n```\n\nIt’s not a lot, is it? 90 lines and the most important thing in them is this loop in `Run()` that lets us talk to Claude. But that’s already the heartbeat of this program.\n\nAnd for a heartbeat, it’s pretty straightforward: we first print a prompt, ask the user to type something, add it to the conversation, send it to Claude, add Claude’s response to the conversation, print the response, and around we go.\n\nThis is every AI chat application you’ve ever used, except it’s in the terminal.\n\nLet’s run it:\n\n```shell\nexport ANTHROPIC_API_KEY=\"this is the last time i will tell you to set this\"\n\n# Download the dependencies\ngo mod tidy\n# Run it\ngo run main.go\n```\n\nThen you can just talk to Claude, like this:\n\n$ go run main.go\n\nChat with Claude (use 'ctrl-c' to quit)\n\nYou: Hey! I'm Thorsten! How are you?\n\nClaude: Hi Thorsten! I'm doing well, thanks for asking. It's nice to meet you. How are you doing today? Is there something I can help you with?\n\nYou: Can you come up with any horse-related nicknames that make fun of my first name?\n\nClaude: I can try to come up with some playful horse-related nicknames based on \"Thorsten\": \\* Thorough-bred Thorsten \\* Trotsten \\* Thorsten the Stallion \\* Neighsten \\* Horseten \\* Thorsten the Galloper \\* Saddle-sten \\* Thorsten of the Mane \\* Canter-sten \\* Thorsteed These are meant to be lighthearted - I hope they give you a chuckle!\n\nYou:\n\nNotice how we kept the same conversation going over multiple turns. It remembers my name from the first message. The `conversation` grows longer with every turn and we send the whole conversation every time. The server — Anthropic’s server — is stateless. It only sees what’s in the `conversation` slice. It’s up to us to maintain that.\n\nOkay, let’s move on, because the nicknames suck and this is not an agent yet. What’s an agent? Here’s [my definition](https://youtu.be/J1-W9O3n7j8?t=72): an LLM with *access to tools*, giving it the ability to modify something outside the context window.\n\n## A First Tool\n\nAn LLM with *access to tools*? What’s a tool? The basic idea is this: you send a prompt to the model that says it should reply in a certain way if it wants to use “a tool”. Then you, as the receiver of that message, “use the tool” by executing it and replying with the result. That’s it. Everything else we’ll see is just abstraction on top of it.\n\nImagine you’re talking to a friend and you tell them: “in the following conversation, wink if you want me to raise my arm”. Weird thing to say, but an easy concept to grasp.\n\nWe can already try it without changing any of our code.\n\n$ go run main.go\n\nChat with Claude (use 'ctrl-c' to quit)\n\nYou: You are a weather expert. When I ask you about the weather in a given location, I want you to reply with \\`get\\_weather(\\<location\\_name>)\\`. I will then tell you what the weather in that location is. Understood?\n\nClaude: I understand your instructions. When you ask me about the weather in a specific location, I will reply with \\`get\\_weather(\\<location\\_name>)\\`. Then you'll provide me with the weather information for that location, and I can discuss it further with you. I'm ready whenever you'd like to ask about the weather somewhere.\n\nYou: Hey, what's the weather in Munich?\n\nClaude: get\\_weather(Munich)\n\nWe told Claude to wink with `get_weather` when it wants to know about the weather. The next step is to raise our arm and reply with “result of the tool”:\n\nYou: hot and humid, 28 degrees celcius\n\nClaude: Thank you for providing that information. The current weather in Munich is hot and humid at 28 degrees Celsius (about 82 degrees Fahrenheit). These are fairly warm conditions for Munich, especially with the added humidity which can make it feel even warmer than the temperature indicates. If you're in Munich or planning to visit, it would be good to stay hydrated, wear light clothing, and perhaps plan indoor activities during the hottest parts of the day. The combination of heat and humidity can be quite uncomfortable, particularly if you're not accustomed to such weather. Would you like to know about the weather in any other location?\n\nThat worked very well, on first try, didn’t it?\n\nThese models are trained and fine-tuned to use “tools” and they’re very eager to do so. By now, 2025, they kinda “know” that they don’t know everything and can use tools to get more information. (Of course that’s not precisely what’s going on, but it’s good enough an explanation for now.)\n\nTo summarize, all there is to tools and tool use are two things:\n\n1. You tell the model what tools are available\n2. When the model wants to execute the tool, it tells you, you execute the tool and send the response up\n\nTo make (1) easier, the big model providers have built-in APIs to send tool definitions along.\n\nOkay, now let’s build our first tool: `read_file`\n\n## The `read_file` tool\n\nIn order to define the `read_file` tool, we’re going to use the types that the Anthropic SDK suggests, but keep in mind: under the hood, this will all end up as strings that are sent to the model. It’s all “wink if you want me to use `read_file`“.\n\nEach tool we’re going to add will require the following:\n\n- A name\n- A description to tell the model what the tool does, when to use it, when to not use it, what it returns and so on\n- An input schema that describes, as a JSON schema, what inputs this tool expects and in which form\n- A function that actually executes the tool with the input the model sends to us and returns the result\n\nSo let’s add that to our code:\n\n```go\n// main.go\n\ntype ToolDefinition struct {\n\tName        string                         `json:\"name\"`\n\tDescription string                         `json:\"description\"`\n\tInputSchema anthropic.ToolInputSchemaParam `json:\"input_schema\"`\n\tFunction    func(input json.RawMessage) (string, error)\n}\n```\n\nNow we give our `Agent` tool definitions:\n\n```go\n// main.go\n\n// `tools` is added here:\ntype Agent struct {\n\tclient         *anthropic.Client\n\tgetUserMessage func() (string, bool)\n\ttools          []ToolDefinition\n}\n\n// And here:\nfunc NewAgent(\n\tclient *anthropic.Client,\n\tgetUserMessage func() (string, bool),\n\ttools []ToolDefinition,\n) *Agent {\n\treturn &Agent{\n\t\tclient:         client,\n\t\tgetUserMessage: getUserMessage,\n\t\ttools:          tools,\n\t}\n}\n\n// And here:\nfunc main() {\n    // [... previous code ...]\n\ttools := []ToolDefinition{}\n\tagent := NewAgent(&client, getUserMessage, tools)\n\n    // [... previous code ...]\n}\n```\n\nAnd send them along to the model in `runInference`:\n\n```go\n// main.go\n\nfunc (a *Agent) runInference(ctx context.Context, conversation []anthropic.MessageParam) (*anthropic.Message, error) {\n\tanthropicTools := []anthropic.ToolUnionParam{}\n\tfor _, tool := range a.tools {\n\t\tanthropicTools = append(anthropicTools, anthropic.ToolUnionParam{\n\t\t\tOfTool: &anthropic.ToolParam{\n\t\t\t\tName:        tool.Name,\n\t\t\t\tDescription: anthropic.String(tool.Description),\n\t\t\t\tInputSchema: tool.InputSchema,\n\t\t\t},\n\t\t})\n\t}\n\n\tmessage, err := a.client.Messages.New(ctx, anthropic.MessageNewParams{\n\t\tModel:     anthropic.ModelClaude3_7SonnetLatest,\n\t\tMaxTokens: int64(1024),\n\t\tMessages:  conversation,\n\t\tTools:     anthropicTools,\n\t})\n\treturn message, err\n}\n```\n\nThere’s a bunch of type shenanigans going on and I’m not too good in Go-with-generics yet so I’m not going to try to explain `anthropic.String` and `ToolUnionParam` to you. But, really, I swear, it’s very simple:\n\nWe send along our tool definitions, on the server Anthropic then wraps these definitions in [this system prompt](https://docs.anthropic.com/en/docs/build-with-claude/tool-use/overview#tool-use-system-prompt) (which isn’t much), which it adds to our `conversation`, and the model then replies in a specific way if it wants to use that tool.\n\nAlright, so tool definitions are being sent along, but we haven’t defined a tool yet. Let’s do that and define `read_file`:\n\n```go\n// main.go\n\nvar ReadFileDefinition = ToolDefinition{\n\tName:        \"read_file\",\n\tDescription: \"Read the contents of a given relative file path. Use this when you want to see what's inside a file. Do not use this with directory names.\",\n\tInputSchema: ReadFileInputSchema,\n\tFunction:    ReadFile,\n}\n\ntype ReadFileInput struct {\n\tPath string `json:\"path\" jsonschema_description:\"The relative path of a file in the working directory.\"`\n}\n\nvar ReadFileInputSchema = GenerateSchema[ReadFileInput]()\n\nfunc ReadFile(input json.RawMessage) (string, error) {\n\treadFileInput := ReadFileInput{}\n\terr := json.Unmarshal(input, &readFileInput)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tcontent, err := os.ReadFile(readFileInput.Path)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\treturn string(content), nil\n}\n\nfunc GenerateSchema[T any]() anthropic.ToolInputSchemaParam {\n\treflector := jsonschema.Reflector{\n\t\tAllowAdditionalProperties: false,\n\t\tDoNotReference:            true,\n\t}\n\tvar v T\n\n\tschema := reflector.Reflect(v)\n\n\treturn anthropic.ToolInputSchemaParam{\n\t\tProperties: schema.Properties,\n\t}\n}\n```\n\nThat’s not much, is it? It’s a single function, `ReadFile`, and two descriptions the model will see: our `Description` that describes the tool itself (`\"Read the contents of a given relative file path. ...\"`) and a description of the single input parameter this tool has (`\"The relative path of a ...\"`).\n\nThe `ReadFileInputSchema` and `GenerateSchema` stuff? We need that so that we can generate a JSON schema for our tool definition which we send to the model. To do that, we use the `jsonschema` package, which we need to import and download:\n\n```go\n// main.go\n\npackage main\n\nimport (\n\t\"bufio\"\n\t\"context\"\n    // Add this:\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/anthropics/anthropic-sdk-go\"\n    // Add this:\n\t\"github.com/invopop/jsonschema\"\n)\n```\n\nThen run the following:\n\n```text\ngo mod tidy\n```\n\nThen, in the `main` function, we need to make sure that we use the definition:\n\n```go\nfunc main() {\n    // [... previous code ...]\n\ttools := []ToolDefinition{ReadFileDefinition}\n    // [... previous code ...]\n}\n```\n\nTime to try it!\n\n$ go run main.go\n\nChat with Claude (use 'ctrl-c' to quit)\n\nYou: what's in main.go?\n\nClaude: I'll help you check what's in the main.go file. Let me read it for you.\n\nYou:\n\nWait, what? Ho, ho, ho, it wants to use the tool! Obviously the output will be slightly different for you, but it certainly sounds like Claude knows that it can read files, right?\n\nThe problem is that we don’t listen! When Claude winks, we ignore it. We need to fix that.\n\nHere, let me show you how to do that in a single, quick, surprisingly-agile-for-my-age move by replacing our `Agent`’s `Run` method with this:\n\n```go\n// main.go\n\nfunc (a *Agent) Run(ctx context.Context) error {\n\tconversation := []anthropic.MessageParam{}\n\n\tfmt.Println(\"Chat with Claude (use 'ctrl-c' to quit)\")\n\n\treadUserInput := true\n\tfor {\n\t\tif readUserInput {\n\t\t\tfmt.Print(\"\\\\u001b[94mYou\\\\u001b[0m: \")\n\t\t\tuserInput, ok := a.getUserMessage()\n\t\t\tif !ok {\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tuserMessage := anthropic.NewUserMessage(anthropic.NewTextBlock(userInput))\n\t\t\tconversation = append(conversation, userMessage)\n\t\t}\n\n\t\tmessage, err := a.runInference(ctx, conversation)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tconversation = append(conversation, message.ToParam())\n\n\t\ttoolResults := []anthropic.ContentBlockParamUnion{}\n\t\tfor _, content := range message.Content {\n\t\t\tswitch content.Type {\n\t\t\tcase \"text\":\n\t\t\t\tfmt.Printf(\"\\\\u001b[93mClaude\\\\u001b[0m: %s\\n\", content.Text)\n\t\t\tcase \"tool_use\":\n\t\t\t\tresult := a.executeTool(content.ID, content.Name, content.Input)\n\t\t\t\ttoolResults = append(toolResults, result)\n\t\t\t}\n\t\t}\n\t\tif len(toolResults) == 0 {\n\t\t\treadUserInput = true\n\t\t\tcontinue\n\t\t}\n\t\treadUserInput = false\n\t\tconversation = append(conversation, anthropic.NewUserMessage(toolResults...))\n\t}\n\n\treturn nil\n}\n\nfunc (a *Agent) executeTool(id, name string, input json.RawMessage) anthropic.ContentBlockParamUnion {\n\tvar toolDef ToolDefinition\n\tvar found bool\n\tfor _, tool := range a.tools {\n\t\tif tool.Name == name {\n\t\t\ttoolDef = tool\n\t\t\tfound = true\n\t\t\tbreak\n\t\t}\n\t}\n\tif !found {\n\t\treturn anthropic.NewToolResultBlock(id, \"tool not found\", true)\n\t}\n\n\tfmt.Printf(\"\\\\u001b[92mtool\\\\u001b[0m: %s(%s)\\n\", name, input)\n\tresponse, err := toolDef.Function(input)\n\tif err != nil {\n\t\treturn anthropic.NewToolResultBlock(id, err.Error(), true)\n\t}\n\treturn anthropic.NewToolResultBlock(id, response, false)\n}\n```\n\nSquint and you’ll see that it’s 90% boilerplate and 10% that matter: when we get a `message` back from Claude, we check wether Claude asked us to execute a tool by looking for `content.Type == \"tool_use\"`, if so we hand over to `executeTool`, lookup the tool by name in our local registry, unmarshal the input, execute it, return the result. If it’s an error, we flip a boolean. That’s it.\n\n(Yes, there is a loop in a loop, but it doesn’t matter.)\n\nWe execute the tool, send the result back up to Claude, and ask again for Claude’s response. Truly: that’s *it*. Let me show you.\n\nMise-en-place, run this:\n\n```shell\necho 'what animal is the most disagreeable because it always says neigh?' >> secret-file.txt\n```\n\nThat creates a `secret-file.txt` in our directory, containing a mysterious riddle.\n\nIn that very same directory, let’s run our new tool-using agent, and ask it to look at the file:\n\n$ go run main.go\n\nChat with Claude (use 'ctrl-c' to quit)\n\nYou: Claude, buddy, help me solve the riddle in the secret-file.txt file\n\nClaude: I'll help you solve the riddle in the secret-file.txt file. Let me first read the contents of this file to see what the riddle is.\n\ntool: read\\_file({\"path\":\"secret-file.txt\"})\n\nClaude: Great! I've found the riddle. The answer to the riddle is: \\*\\*A horse\\*\\* The riddle is playing on wordplay where \"neigh\" (the sound a horse makes) sounds like \"nay\" (a way to say \"no\" or disagree with something). So horses are described as disagreeable because they always say \"neigh/nay\" - implying they're always disagreeing.\n\nYou:\n\nLet’s take a deep breath and say it together. Ready? Here we go: *holy shit*. You just give it a tool and it… *uses it when it thinks it’ll help solve the task*. Remember: we didn’t say *anything* about “if a user asks you about a file, read the file”. We also didn’t say “if something looks like a filename, figure out how to read it”. No, none of that. We say “help me solve the thing in this file” and Claude realizes that it can read the file to answer that and off it goes.\n\nOf course, we *can* be specific and really nudge it towards a tool, but it basically does it all on its own:\n\n$ go run main.go\n\nChat with Claude (use 'ctrl-c' to quit)\n\nYou: What's going on in main.go? Be brief!\n\nClaude: I'll check the main.go file to see what's going on.\n\ntool: read\\_file({\"path\":\"main.go\"})\n\nClaude: Based on my review, main.go implements a Claude AI assistant agent that can use tools. Here's a brief summary: - It creates a command-line chat interface with Claude using the Anthropic Go SDK - Implements a tool system with a single \"read\\_file\" tool for reading file contents - Manages the conversation flow with Claude, handling both regular text responses and tool use requests - When Claude requests to use a tool, the agent executes it and returns the results - The program loops continuously to maintain a conversation until the user exits The code essentially builds a simple CLI-based chatbot that can interact with the file system when requested by Claude.\n\nYou:\n\nSpot on. Okay, now that we know how to make Claude use tools, let’s add a few more.\n\n## The `list_files` tool\n\nIf you’re anything like me, the first thing you do when you log into a new computer is to get your bearings by running `ls` — list files.\n\nLet’s give Claude the same ability, a tool to list files. And here’s the complete implementation of a `list_files` tool:\n\n```go\n// main.go\n\nvar ListFilesDefinition = ToolDefinition{\n\tName:        \"list_files\",\n\tDescription: \"List files and directories at a given path. If no path is provided, lists files in the current directory.\",\n\tInputSchema: ListFilesInputSchema,\n\tFunction:    ListFiles,\n}\n\ntype ListFilesInput struct {\n\tPath string `json:\"path,omitempty\" jsonschema_description:\"Optional relative path to list files from. Defaults to current directory if not provided.\"`\n}\n\nvar ListFilesInputSchema = GenerateSchema[ListFilesInput]()\n\nfunc ListFiles(input json.RawMessage) (string, error) {\n\tlistFilesInput := ListFilesInput{}\n\terr := json.Unmarshal(input, &listFilesInput)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tdir := \".\"\n\tif listFilesInput.Path != \"\" {\n\t\tdir = listFilesInput.Path\n\t}\n\n\tvar files []string\n\terr = filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\trelPath, err := filepath.Rel(dir, path)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tif relPath != \".\" {\n\t\t\tif info.IsDir() {\n\t\t\t\tfiles = append(files, relPath+\"/\")\n\t\t\t} else {\n\t\t\t\tfiles = append(files, relPath)\n\t\t\t}\n\t\t}\n\t\treturn nil\n\t})\n\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\tresult, err := json.Marshal(files)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\treturn string(result), nil\n}\n```\n\nNothing fancy here: `list_files` returns the list of files and directories in the current folder. There’s a thousand optimizations we could (and probably should) make if this were a serious effort, but since I just want to show you what’s in the wizard’s hat, this is fine.\n\nOne thing to note: we return a list of strings and we denote directories with a trailing slash. That’s not required, it’s just something I just decided to do. There’s no fixed format. Anything goes as long as Claude can make sense of it and whether it can you need to figure out by experimentation. You could also prepend each directory with `\"directory: \"` or return a Markdown document with two headers: `\"directories\"` and `\"files\"`. There’s a ton of options and which one you chose depends on what Claude can make the most sense of, how many tokens it requires, how fast it is to generate and read, and so on.\n\nHere, we just want to create a small `list_files` tool and the easiest option wins.\n\nOf course we need to tell Claude about `list_files` too:\n\n```go\n// main.go\n\nfunc main() {\n\t// [... previous code ...]\n\n\ttools := []ToolDefinition{ReadFileDefinition, ListFilesDefinition}\n\n\t// [... previous code ...]\n}\n```\n\nAnd that’s it. Let’s ask Claude what it can see in this directory.\n\n$ go run main.go\n\nChat with Claude (use 'ctrl-c' to quit)\n\nYou: what do you see in this directory?\n\nClaude: I'll help you see what's in the current directory. Let me list the files and directories for you.\n\ntool: list\\_files({})\n\nClaude: I can see several files and directories in the current directory: 1. Git-related files and directories: - \\`.git/\\` directory with various Git configuration and tracking files - \\`.gitignore\\` file 2. Go project files: - \\`main.go\\` - the main Go source code file - \\`go.mod\\` - Go module definition file - \\`go.sum\\` - Go module checksum file 3. Documentation: - \\`blogpost.md\\` - a markdown file, likely containing blog content 4. Environment configuration: - \\`.envrc\\` - likely an environment configuration file Would you like me to examine the contents of any specific file from this list?\n\nYou:\n\nWorks! It can read the directory.\n\nBut here’s the thing: Claude knows how to combine these tools. We just need to prompt it in a way that provokes it:\n\n$ go run main.go\n\nChat with Claude (use 'ctrl-c' to quit)\n\nYou: Tell me about all the Go files in here. Be brief!\n\nClaude: I'll examine the Go files in the current directory for you. Let me check what files are available first.\n\ntool: list\\_files({})\n\nClaude: I found a Go file in the current directory. Let me examine it:\n\ntool: read\\_file({\"path\":\"main.go\"})\n\ntool: read\\_file({\"path\":\"go.mod\"})\n\nClaude: Here's a brief overview of the Go files in this project: \\*\\*main.go\\*\\*: - Implements a Claude AI agent that can interact with the local filesystem - Uses the Anthropic SDK for Go to communicate with Claude AI models - Provides two tools: \\`read\\_file\\` and \\`list\\_files\\` that allow Claude to read file contents and list directory contents - Manages a conversation flow between the user and Claude, handling tool execution when Claude needs to access files \\*\\*go.mod\\*\\*: - Defines the module dependencies - Main dependencies are the Anthropic SDK for Go and a JSON schema library - Uses Go 1.24.1 This appears to be a simple terminal-based application that allows users to chat with Claude while giving the AI access to read local files and list directories.\n\nYou:\n\nFirst it used the `list_files` and then it called `read_file` twice with the Go-related files that I asked it about.\n\nJust… just like we would, right? I mean, here, what would you do if I ask you what version of Go we use in this project? Here’s what Claude does for me:\n\n$ go run main.go\n\nChat with Claude (use 'ctrl-c' to quit)\n\nYou: What go version are we using in this project?\n\nClaude: I'll help you find the Go version being used in this project. Let me check the files to locate where the Go version might be specified.\n\ntool: list\\_files({})\n\nClaude: I can see there's a Go project here with several important files like \\`go.mod\\`, \\`go.sum\\`, and \\`main.go\\`. Let me check the \\`go.mod\\` file first, as it typically contains the Go version information.\n\ntool: read\\_file({\"path\":\"go.mod\"})\n\nClaude: According to the \\`go.mod\\` file, this project is using Go version 1.24.1.\n\nClaude looks at the directory, looks at `go.mod`, and has the answer.\n\nWe’re at around 190 lines of code now. Let that sink in. Once you have, let’s add another tool.\n\n## Let it `edit_file`\n\nThe last tool we’re going to add is `edit_file` — a tool that lets Claude edit files.\n\n“Holy shit”, you’re thinking now, “this is where the rubber hits the road, this is where he pulls the rabbit out of the hat.” Well, let’s see, shall we?\n\nFirst, let’s add a definition for our new `edit_file` tool:\n\n```go\n// main.go\n\nvar EditFileDefinition = ToolDefinition{\n\tName: \"edit_file\",\n\tDescription: `Make edits to a text file.\n\nReplaces 'old_str' with 'new_str' in the given file. 'old_str' and 'new_str' MUST be different from each other.\n\nIf the file specified with path doesn't exist, it will be created.\n`,\n\tInputSchema: EditFileInputSchema,\n\tFunction:    EditFile,\n}\n\ntype EditFileInput struct {\n\tPath   string `json:\"path\" jsonschema_description:\"The path to the file\"`\n\tOldStr string `json:\"old_str\" jsonschema_description:\"Text to search for - must match exactly and must only have one match exactly\"`\n\tNewStr string `json:\"new_str\" jsonschema_description:\"Text to replace old_str with\"`\n}\n\nvar EditFileInputSchema = GenerateSchema[EditFileInput]()\n```\n\nThat’s right, I again know what you’re thinking: “string replacement to edit files?” Claude 3.7 loves replacing strings (experimentation is how you find out what they love or don’t), so we’re going to implement `edit_file` by telling Claude it can edit files by replacing existing text with new text.\n\nNow here’s the implementation of the `EditFile` function in Go:\n\n```go\nfunc EditFile(input json.RawMessage) (string, error) {\n\teditFileInput := EditFileInput{}\n\terr := json.Unmarshal(input, &editFileInput)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\tif editFileInput.Path == \"\" || editFileInput.OldStr == editFileInput.NewStr {\n\t\treturn \"\", fmt.Errorf(\"invalid input parameters\")\n\t}\n\n\tcontent, err := os.ReadFile(editFileInput.Path)\n\tif err != nil {\n\t\tif os.IsNotExist(err) && editFileInput.OldStr == \"\" {\n\t\t\treturn createNewFile(editFileInput.Path, editFileInput.NewStr)\n\t\t}\n\t\treturn \"\", err\n\t}\n\n\toldContent := string(content)\n\tnewContent := strings.Replace(oldContent, editFileInput.OldStr, editFileInput.NewStr, -1)\n\n\tif oldContent == newContent && editFileInput.OldStr != \"\" {\n\t\treturn \"\", fmt.Errorf(\"old_str not found in file\")\n\t}\n\n\terr = os.WriteFile(editFileInput.Path, []byte(newContent), 0644)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\treturn \"OK\", nil\n}\n```\n\nIt checks the input parameters, it reads the file (or creates it if it exists), and replaces the `OldStr` with `NewStr`. Then it writes the content back to disk and returns `\"OK\"`.\n\nWhat’s missing still is `createNewFile`, which is just a tiny helper function that would be 70% shorter if this wasn’t Go:\n\n```go\nfunc createNewFile(filePath, content string) (string, error) {\n\tdir := path.Dir(filePath)\n\tif dir != \".\" {\n\t\terr := os.MkdirAll(dir, 0755)\n\t\tif err != nil {\n\t\t\treturn \"\", fmt.Errorf(\"failed to create directory: %w\", err)\n\t\t}\n\t}\n\n\terr := os.WriteFile(filePath, []byte(content), 0644)\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"failed to create file: %w\", err)\n\t}\n\n\treturn fmt.Sprintf(\"Successfully created file %s\", filePath), nil\n}\n```\n\nLast step: adding it to the list of tools that we send to Claude.\n\n```go\n// main.go\n\nfunc main() {\n\t// [... previous code ...]\n\n\ttools := []ToolDefinition{ReadFileDefinition, ListFilesDefinition, EditFileDefinition}\n\n\t// [... previous code ...]\n}\n```\n\nAnd… we’re ready, but are *you*? Are you ready to let it rip?\n\nThought so, let’s do this. Let’s tell Claude to create a new FizzBuzz function in JavaScript.\n\n$ go run main.go\n\nChat with Claude (use 'ctrl-c' to quit)\n\nYou: hey claude, create fizzbuzz.js that I can run with Nodejs and that has fizzbuzz in it and executes it\n\nClaude: I'll create a fizzbuzz.js file that you can run with Node.js. First, let me check if the file already exists:\n\ntool: list\\_files({})\n\nClaude: I don't see a fizzbuzz.js file, so I'll create one with a classic FizzBuzz implementation. This program will print numbers from 1 to 100, but for multiples of 3 it will print \"Fizz\", for multiples of 5 it will print \"Buzz\", and for numbers that are multiples of both 3 and 5 it will print \"FizzBuzz\".\n\ntool: edit\\_file({\"path\":\"fizzbuzz.js\",\"old\\_str\":\"\",\"new\\_str\":\"/\\*\\*\\\\n \\* FizzBuzz implementation in JavaScript\\\\n \\* Prints numbers from 1 to 100, but:\\\\n \\* - For multiples of 3, print \\\\\"Fizz\\\\\" instead of the number\\\\n \\* - For multiples of 5, print \\\\\"Buzz\\\\\" instead of the number\\\\n \\* - For multiples of both 3 and 5, print \\\\\"FizzBuzz\\\\\"\\\\n \\*/\\\\n\\\\nfunction fizzBuzz(n) {\\\\n for (let i = 1; i <= n; i++) {\\\\n let output = '';\\\\n \\\\n if (i % 3 === 0) output += 'Fizz';\\\\n if (i % 5 === 0) output += 'Buzz';\\\\n \\\\n console.log(output || i);\\\\n }\\\\n}\\\\n\\\\n// Execute FizzBuzz for numbers 1 to 100\\\\nconsole.log('Running FizzBuzz:');\\\\nfizzBuzz(100);\"}\n\nClaude: I've created a fizzbuzz.js file that you can run with Node.js. The program: 1. Defines a function called \\`fizzBuzz\\` that takes a parameter \\`n\\` for the upper limit 2. Loops from 1 to n (set to 100 in the execution) 3. For each number: - If it's divisible by 3, it adds \"Fizz\" to the output - If it's divisible by 5, it adds \"Buzz\" to the output - If it's divisible by both, it adds both resulting in \"FizzBuzz\" - If it's not divisible by either 3 or 5, it outputs the number itself 4. The script automatically executes the function for numbers 1 to 100 You can run this script using Node.js with the following command in your terminal: node fizzbuzz.js This will output the FizzBuzz sequence from 1 to 100 to your console.\n\nRight?! It’s impressive, isn’t it? And that’s the *most basic implemenation* of `edit_file` — of an agent in general — you can probably come up with.\n\nBut, did it work? Yes, it did:\n\n```text\n$ node fizzbuzz.js\nRunning FizzBuzz:\n1\n2\nFizz\n4\nBuzz\nFizz\n7\n8\nFizz\nBuzz\n11\nFizz\n13\n14\nFizzBuzz\n16\n[...]\n```\n\nAmazing. But hey, let’s have it actually *edit* a file and not just create one.\n\nHere’s what Claude does when I ask it to “Please edit the `fizzbuzz.js` so that it only prints until 15”:\n\n$ go run main.go\n\nChat with Claude (use 'ctrl-c' to quit)\n\nYou: Please edit fizzbuzz.js so that it only prints until 15\n\nClaude: I'll edit the fizzbuzz.js file to print only until 15 instead of its current limit. First, let me check the current content of the file to understand what changes are needed.\n\ntool: read\\_file({\"path\":\"fizzbuzz.js\"})\n\nClaude: I can see that the file currently runs FizzBuzz up to 100. I'll modify it to only run up to 15 instead by changing the parameter in the fizzBuzz function call.\n\ntool: edit\\_file({\"path\":\"fizzbuzz.js\",\"old\\_str\":\"// Execute FizzBuzz for numbers 1 to 100\\\\nconsole.log('Running FizzBuzz:');\\\\nfizzBuzz(100);\",\"new\\_str\":\"// Execute FizzBuzz for numbers 1 to 15\\\\nconsole.log('Running FizzBuzz:');\\\\nfizzBuzz(15);\"})\n\nClaude: I also need to update the comment at the top of the file to reflect this change:\n\ntool: edit\\_file({\"path\":\"fizzbuzz.js\",\"old\\_str\":\"/\\*\\*\\\\n \\* FizzBuzz implementation in JavaScript\\\\n \\* Prints numbers from 1 to 100, but:\",\"new\\_str\":\"/\\*\\*\\\\n \\* FizzBuzz implementation in JavaScript\\\\n \\* Prints numbers from 1 to 15, but:\"})\n\nClaude: The changes have been successfully made to the fizzbuzz.js file. The program will now: 1. Only print FizzBuzz from 1 to 15 (instead of 1 to 100) 2. The documentation has been updated to reflect this change The function itself remains the same, as it takes a parameter to determine the upper limit, and we've simply changed that parameter from 100 to 15.\n\nIt reads the file, it edits the file to change the how long it runs, *and* then it also edits the file to update the comment at the top.\n\nAnd it still works:\n\n```text\n$ node fizzbuzz.js\nRunning FizzBuzz:\n1\n2\nFizz\n4\nBuzz\nFizz\n7\n8\nFizz\nBuzz\n11\nFizz\n13\n14\nFizzBuzz\n```\n\nOkay, let’s do one more and ask it to do the following:\n\n> Create a congrats.js script that rot13-decodes the following string ‘Pbatenghyngvbaf ba ohvyqvat n pbqr-rqvgvat ntrag!’ and prints it\n\nMaybe a tall order. Let’s see:\n\n$ go run main.go\n\nChat with Claude (use 'ctrl-c' to quit)\n\nYou: Create a congrats.js script that rot13-decodes the following string 'Pbatenghyngvbaf ba ohvyqvat n pbqr-rqvgvat ntrag!' and prints it\n\nClaude: I'll create a congrats.js script that decodes the ROT13-encoded string and prints it. ROT13 is a simple letter substitution cipher that replaces a letter with the 13th letter after it in the alphabet. Let me create this file for you:\n\ntool: edit\\_file({\"path\":\"congrats.js\",\"old\\_str\":\"\",\"new\\_str\":\"/\\*\\*\\\\n \\* A script to decode a ROT13-encoded string and print the result\\\\n \\*/\\\\n\\\\nfunction rot13Decode(encodedStr) {\\\\n return encodedStr.replace(/\\[a-zA-Z\\]/g, function(char) {\\\\n // Get the character code\\\\n const charCode = char.charCodeAt(0);\\\\n \\\\n // Handle uppercase letters\\\\n if (charCode >= 65 && charCode <= 90) {\\\\n return String.fromCharCode(((charCode - 65 + 13) % 26) + 65);\\\\n }\\\\n \\\\n // Handle lowercase letters\\\\n if (charCode >= 97 && charCode <= 122) {\\\\n return String.fromCharCode(((charCode - 97 + 13) % 26) + 97);\\\\n }\\\\n \\\\n // Return non-alphabetic characters as is\\\\n return char;\\\\n });\\\\n}\\\\n\\\\nconst encodedMessage = 'Pbatenghyngvbaf ba ohvyqvat n pbqr-rqvgvat ntrag!';\\\\nconst decodedMessage = rot13Decode(encodedMessage);\\\\n\\\\nconsole.log(decodedMessage);\"})\n\nClaude: I've created a JavaScript file called congrats.js that: 1. Defines a \\`rot13Decode\\` function that takes an encoded string and applies the ROT13 cipher to decode it 2. Takes the provided string 'Pbatenghyngvbaf ba ohvyqvat n pbqr-rqvgvat ntrag!' 3. Decodes it using the function 4. Prints the decoded message to the console You can run this script using Node.js by typing \\`node congrats.js\\` in your terminal. The script will decode and display the hidden congratulatory message!\n\nDoes it work? Let’s try it:\n\n```text\n$ node congrats.js\nCongratulations on building a code-editing agent!\n```\n\nIt does!\n\n## Isn’t this amazing?\n\nIf you’re anything like all the engineers I’ve talked to in the past few months, chances are that, while reading this, you have been waiting for the rabbit to be pulled out of the hat, for me to say “well, in reality it’s much, much harder than this.” But it’s not.\n\nThis is essentially all there is to the inner loop of a code-editing agent. Sure, integrating it into your editor, tweaking the system prompt, giving it the right feedback at the right time, a nice UI around it, better tooling around the tools, support for multiple agents, and so on — we’ve built all of that in [Amp](https://ampcode.com/), but it didn’t require moments of genius. All that was required was practical engineering and elbow grease.\n\nThese models are incredibly powerful now. 300 lines of code and three tools and now you’re to be able to talk to an alien intelligence that edits your code. If you think “well, but we didn’t really…” — go and try it! Go and see how far you can get with this. I bet it’s a lot farther than you think.\n\n*That*’s why we think everything’s changing.\n",
  "dateCreated": "2026-10-04T12:50:30.804479567+00:00",
  "date_created": "2025-04-15T00:00:00+00:00",
  "date_modified": "2025-04-15T00:00:00+00:00",
  "date_published": "2025-04-15T00:00:00+00:00",
  "description": "It’s not that hard to build a fully functioning, code-editing agent.",
  "external_url": "https://ampcode.com/notes/how-to-build-an-agent",
  "git": {
    "commit": "ebb0941c5c06a2ab2377342d607535262a3e969e",
    "path": "items/ampcode-com/2025/04/2025-04-15-how-to-build-an-agent.md",
    "permalink": "https://github.com/aymericbeaumet/aggr-instance/blob/ebb0941c5c06a2ab2377342d607535262a3e969e/items/ampcode-com/2025/04/2025-04-15-how-to-build-an-agent.md"
  },
  "id": "urn:aggr:item:43f6f4064a6e47c9349e862e6132e3632348d8e3",
  "isBasedOn": {
    "@id": "https://ampcode.com/notes/how-to-build-an-agent"
  },
  "mainEntity": {
    "@id": "https://ampcode.com/notes/how-to-build-an-agent",
    "@type": "CreativeWork",
    "archivedAt": {
      "@id": "https://aggr.aymericbeaumet.com/items/ampcode-com/2025-04-15-how-to-build-an-agent/#webpage"
    },
    "dateModified": "2025-04-15T00:00:00+00:00",
    "datePublished": "2025-04-15T00:00:00+00:00",
    "headline": "How to Build an Agent",
    "timeRequired": "PT24M",
    "url": "https://ampcode.com/notes/how-to-build-an-agent",
    "wordCount": 5377
  },
  "name": "Archived snapshot: How to Build an Agent",
  "preview": null,
  "reading_minutes": 24,
  "replicated_at": null,
  "source": "ampcode-com",
  "source_name": "Amp News",
  "summary": "It’s not that hard to build a fully functioning, code-editing agent.",
  "tags": [],
  "temporalCoverage": "2026-10-04T12:50:30.804479567+00:00",
  "title": "How to Build an Agent",
  "url": "https://aggr.aymericbeaumet.com/items/ampcode-com/2025-04-15-how-to-build-an-agent/",
  "word_count": 5377
}