WEBVTT captioned by jay_bird NOTE Introduction 00:00:00.000 --> 00:00:07.119 Hey, everyone. This talk is on this tradition, 00:00:07.120 --> 00:00:10.639 intelligent agents in Emacs 00:00:10.640 --> 00:00:13.799 using my Leonardo software individuals, 00:00:13.800 --> 00:00:16.919 which I've mistyped as I just wrote here, I see. 00:00:16.920 --> 00:00:20.159 Thank you to Sacha and everyone 00:00:20.160 --> 00:00:25.239 at EmacsConf and Emacs, I guess. 00:00:25.240 --> 00:00:26.599 Sorry that I was running late. 00:00:26.600 --> 00:00:29.759 I'm screwlisp.small-web.org. 00:00:29.760 --> 00:00:33.999 I run those one or two weekly shows for a long time, 00:00:34.000 --> 00:00:35.599 the Lispy Gopher Climate. 00:00:35.600 --> 00:00:42.199 I'm active on the Mastodon at @screwlisp@gamerplus.org. 00:00:42.200 --> 00:00:46.719 I'm screwtape on lambda.moo.mud.org. 00:00:46.720 --> 00:00:50.474 And I ported, over the last kind of year, 00:00:50.475 --> 00:00:58.499 years, to some extent, I ported Eric Sandewall's system 00:00:58.500 --> 00:01:01.519 for developing intelligent software agents, 00:01:01.520 --> 00:01:04.879 which he finished working on in 2014. 00:01:04.880 --> 00:01:10.119 I got it working again around 2025. 00:01:10.120 --> 00:01:14.199 First, we're going to take a long arc. 00:01:14.200 --> 00:01:16.759 We're going to motivate... This is the idea. 00:01:16.760 --> 00:01:18.119 You can see I'm using Org Mode, 00:01:18.120 --> 00:01:19.959 which I hope provides a good example 00:01:19.960 --> 00:01:25.359 for all the Org-Mode-oriented talks this conference. 00:01:25.360 --> 00:01:26.399 But you can also see 00:01:26.400 --> 00:01:33.107 that I'm using Eduardo Ochs's eev minor mode with Org. 00:01:33.108 --> 00:01:35.640 But we can see a little bit of the difference 00:01:35.641 --> 00:01:39.207 between these two, and that will kind of evolve into 00:01:39.208 --> 00:01:45.259 my style with the agent communication in Emacs. 00:01:45.260 --> 00:01:52.999 So you can see I used eev anchors as my Emacs headings. 00:01:53.000 --> 00:01:56.839 In eev, you just evaluate Elisp expressions 00:01:56.840 --> 00:01:58.679 as links to places. 00:01:58.680 --> 00:02:01.679 An anchor will link you somewhere else in the document. 00:02:01.680 --> 00:02:04.807 So my table of contents links to my talk, I guess. 00:02:04.808 --> 00:02:07.507 Anchors come in two halves, 00:02:07.508 --> 00:02:12.940 so that's why I built that unique table of contents 00:02:12.941 --> 00:02:21.479 experience there. What else am I going to say? NOTE Totally normal computing 00:02:21.480 --> 00:02:24.174 So first, let's just do some totally normal computing 00:02:24.175 --> 00:02:27.140 because intelligence is going to be difficult to describe. 00:02:27.141 --> 00:02:31.100 Let's just try and compute normally in Emacs in Org Mode 00:02:31.101 --> 00:02:34.359 and then segue more so into eev, 00:02:34.360 --> 00:02:38.359 and then maybe I would like if an agent was intelligent, 00:02:38.360 --> 00:02:40.839 I would think that an intelligent agent 00:02:40.840 --> 00:02:43.319 would do something like what I'm doing. 00:02:43.320 --> 00:02:47.239 It should be recognizably similar to what I do myself. 00:02:47.240 --> 00:02:52.399 I don't think the word intelligence is relevant 00:02:52.400 --> 00:02:55.679 if it's not related to something I'm not familiar with. NOTE Using Emacs as a human 00:02:55.680 --> 00:03:00.999 Using Emacs as a human, reading headings from my article, 00:03:01.000 --> 00:03:03.919 using Common Lisp. Right, my friend jeremy_list 00:03:03.920 --> 00:03:06.879 wrote actually a big project, 00:03:06.880 --> 00:03:09.799 but part of it was base64 encoding, 00:03:09.800 --> 00:03:17.439 and I just yoinked his C code for base64 encoding, I think. 00:03:17.440 --> 00:03:20.759 This is just clearly some C-based 64 encoding. 00:03:20.760 --> 00:03:24.279 If you go to my blog, his project is actually a C++ project 00:03:24.280 --> 00:03:29.579 and you can see me doing this with C++ rather than C. 00:03:29.580 --> 00:03:33.319 But basically, you can go to my blog articles 00:03:33.320 --> 00:03:40.299 if you want more detail to read something instead. 00:03:40.300 --> 00:03:42.433 And then here's some embeddable Common Lisp, 00:03:42.434 --> 00:03:48.439 Jack Daniel's ECL ANSI Common Lisp compiler I guess. 00:03:48.440 --> 00:03:49.639 This is just what it looks like. 00:03:49.640 --> 00:03:52.239 You can see I'm using Org Mode trickily, 00:03:52.240 --> 00:03:56.119 using noweb to put the lines of the C source block 00:03:56.120 --> 00:04:00.279 in this one. We're tangling it to this file 00:04:00.280 --> 00:04:01.919 rather than evaluating it. 00:04:01.920 --> 00:04:05.279 So, you know, literate programming, tangle and weave. 00:04:05.280 --> 00:04:06.999 We're just using Org Mode 00:04:07.000 --> 00:04:09.197 like the other Org Mode people 00:04:09.198 --> 00:04:12.079 are all showing us this conference, I guess. 00:04:12.080 --> 00:04:13.399 Then we have to compile it. 00:04:13.400 --> 00:04:16.039 It's always hard to remember these invocations for me. 00:04:16.040 --> 00:04:20.159 Results file. The file is my .fas file, 00:04:20.160 --> 00:04:24.559 because the way ECL's C and C++ integration works 00:04:24.560 --> 00:04:30.519 is that it just has to be seen by compile-file in Lisp. 00:04:30.520 --> 00:04:32.119 I cached this earlier. 00:04:32.120 --> 00:04:36.199 Oh, I should actually start Lisp, actually, shouldn't I? 00:04:36.200 --> 00:04:39.639 How are we going to do this? 00:04:39.640 --> 00:04:47.099 (setq inferior-lisp-program "ecl"). We could M-x slime. 00:04:47.100 --> 00:04:48.919 Because... we better actually load this. 00:04:48.920 --> 00:04:54.119 I did a dry run before. 00:04:54.120 --> 00:04:58.259 I think we can just load this, because I already did it. 00:04:58.260 --> 00:05:04.079 But I cached it. Let's nuke the cache. 00:05:04.080 --> 00:05:06.599 Okay, I'm going to say that that probably worked. 00:05:06.600 --> 00:05:09.319 Now, as you saw, that base64 encoding 00:05:09.320 --> 00:05:13.619 was just, I guess, number to character code 00:05:13.620 --> 00:05:19.140 to other character code. So I wrote this higher-level Lisp one, 00:05:19.141 --> 00:05:20.599 but that's not really the point. 00:05:20.600 --> 00:05:26.199 Obviously, Emacs also has Base64 encoding. 00:05:26.200 --> 00:05:27.979 It's just a point that we might have 00:05:27.980 --> 00:05:29.959 C++ and C external programs 00:05:29.960 --> 00:05:31.239 that we'd like to be integrating 00:05:31.240 --> 00:05:37.139 into our Emacs agents capabilities. 00:05:37.140 --> 00:05:46.474 Here we can see a normal named Org Mode source block. 00:05:46.475 --> 00:05:50.474 that calls that function, then an Org Mode source block 00:05:50.475 --> 00:05:56.299 that calls Emacs's base64-decode-string as a way of 00:05:56.300 --> 00:05:57.940 validating it, I guess. 00:05:57.941 --> 00:06:00.140 We go to Org, so we can see... 00:06:00.141 --> 00:06:04.407 I have a named call to that function calling the Lisp function 00:06:04.408 --> 00:06:07.040 Org is just kind of like this. 00:06:07.041 --> 00:06:11.559 It's cached but I don't seem to have run it before. 00:06:11.560 --> 00:06:13.574 Then I do the Emacs decode. 00:06:13.575 --> 00:06:15.974 So if we just run this using C-c C-c, 00:06:15.975 --> 00:06:17.240 and we can kind of see 00:06:17.241 --> 00:06:22.179 what Org Mode is like a little bit here. 00:06:22.180 --> 00:06:24.319 All right, yes, so as we can see, 00:06:24.320 --> 00:06:27.659 oh hang on, let's run this as well actually. 00:06:27.660 --> 00:06:32.193 So the C embeddable Common Lisp 00:06:32.194 --> 00:06:35.199 base64 encoding gets us this. 00:06:35.200 --> 00:06:38.079 And then Emacs is decoding and gets us back, 00:06:38.080 --> 00:06:40.319 kind of validates it. I think I'm missing some things. 00:06:40.320 --> 00:06:43.079 I don't pad characters out to the correct byte lengths, 00:06:43.080 --> 00:06:45.399 that kind of thing, but it's fine. NOTE using this via eev as a human 00:06:45.400 --> 00:06:48.719 And then I kind of contrast that to, 00:06:48.720 --> 00:06:53.179 I really like what my friend mdhughes.tech, 00:06:53.180 --> 00:06:57.319 game dev of the ages, calls REPL-driven development, 00:06:57.320 --> 00:07:06.139 which he says is kind of the opposite of literate coding. 00:07:06.140 --> 00:07:08.940 I think eev, at least for me, 00:07:08.941 --> 00:07:11.079 is kind of like REPL-driven development. 00:07:11.080 --> 00:07:16.159 So in eev, if you just press F8, the thing happens. 00:07:16.160 --> 00:07:17.479 And if it's a red star line, 00:07:17.480 --> 00:07:19.439 the thing is an Emacs Lisp thing, 00:07:19.440 --> 00:07:22.999 and otherwise it goes to the eepitch target. 00:07:23.000 --> 00:07:26.719 So if I do this, great, now I'm pitching to that slime 00:07:26.720 --> 00:07:32.759 REPL ECL I made. And then I pressed F8. Press F8 again. 00:07:32.760 --> 00:07:34.480 The string got coerced to a list. 00:07:34.481 --> 00:07:38.359 F8. Now it's car codified. 00:07:38.360 --> 00:07:41.319 I quite like this, because this looks like something I can do 00:07:41.320 --> 00:07:44.239 and understand doing and reason about doing. 00:07:44.240 --> 00:07:49.519 Then I form a command to send from Lisp to Emacs. 00:07:49.520 --> 00:07:52.599 Then I do it and I recover the string from the beginning. 00:07:52.600 --> 00:07:56.119 I guess I had one of these here. Oh, by the way, look at 00:07:56.120 --> 00:07:59.159 What Org Mode did with an eev source block. 00:07:59.160 --> 00:08:00.999 And then when I close the source block 00:08:01.000 --> 00:08:02.679 using C-c ', 00:08:02.680 --> 00:08:05.319 it brings me back to the Org doc, 00:08:05.320 --> 00:08:09.159 which was a cool synergy between the eev minor mode 00:08:09.160 --> 00:08:16.019 and eev source blocks in Org Mode that I noticed. 00:08:16.020 --> 00:08:22.599 And so I kind of want my agents to be like this eev usage. 00:08:22.600 --> 00:08:25.159 Clearly, Org is super powerful, 00:08:25.160 --> 00:08:28.159 but I don't even like writing calls like this, 00:08:28.160 --> 00:08:32.079 where you write the function that will happen last first, 00:08:32.080 --> 00:08:39.039 so you're kind of writing right to left, first to last. 00:08:39.040 --> 00:08:41.239 Whereas in REPL-driven development, 00:08:41.240 --> 00:08:43.199 I guess I'm writing top to bottom, 00:08:43.200 --> 00:08:46.979 and eev, I guess, executable logs 00:08:46.980 --> 00:08:48.599 are logs that are like that. 00:08:48.600 --> 00:08:52.378 So I kind of like eev's view for reasoning 00:08:52.379 --> 00:08:54.399 more than Org's Tangle. 00:08:54.400 --> 00:08:57.319 Obviously, Tangle is trying to do tricky things, 00:08:57.320 --> 00:09:01.359 but maybe they have different specializations, 00:09:01.360 --> 00:09:04.879 and eev's one is more close 00:09:04.880 --> 00:09:07.799 to my own version of intelligence, maybe. NOTE Software individuals using eev in Emacs like a human 00:09:07.800 --> 00:09:13.539 Software individuals using eev in Emacs like a human. 00:09:13.540 --> 00:09:17.279 Yeah, you can always visit my blog post for more detail. 00:09:17.280 --> 00:09:20.039 Right, I made a CLOS object 00:09:20.040 --> 00:09:22.519 in Common Lisp to wrap doing this. 00:09:22.520 --> 00:09:23.639 It's not really the topic. 00:09:23.640 --> 00:09:27.959 It's in the appendix somewhere if you need it. 00:09:27.960 --> 00:09:29.559 So I've just executed that. 00:09:29.560 --> 00:09:32.079 You can look at the appendix in your own time. NOTE Sandewall's leonardo system 00:09:32.080 --> 00:09:33.959 Jumping over to actually starting 00:09:33.960 --> 00:09:36.319 our hypothetical intelligent agent. 00:09:36.320 --> 00:09:38.239 I guess we're doing eev here. 00:09:38.240 --> 00:09:46.759 So if we open this, press F8 a bunch of times. 00:09:46.760 --> 00:09:49.199 Oh, and if you were cloning it yourself, 00:09:49.200 --> 00:09:56.719 I guess that's what you would do. setq eepitch-buffer-name. 00:09:56.720 --> 00:10:00.319 Oh yeah, if you went to an eepitch shell and then came back. 00:10:00.320 --> 00:10:01.679 You would have had to do that, but I didn't. 00:10:01.680 --> 00:10:04.239 I didn't, so I didn't need to. 00:10:04.240 --> 00:10:07.279 Sandewall's style is to use relative paths 00:10:07.280 --> 00:10:11.974 to tell which agent is acting inside a software individual. 00:10:11.975 --> 00:10:13.359 Remembering a software individual 00:10:13.360 --> 00:10:15.239 is potentially a bunch of agents. 00:10:15.240 --> 00:10:18.479 And we load... So one individual, 00:10:18.480 --> 00:10:21.919 all the agents in each individual share a kernel. 00:10:21.920 --> 00:10:25.599 So only one agent in one software individual 00:10:25.600 --> 00:10:28.279 is active at any given time, but the agents are separate. 00:10:28.280 --> 00:10:31.279 They just all have to share the kernel resource, 00:10:31.280 --> 00:10:38.319 which is the Remus agent. Oh, I got rid of this. 00:10:38.320 --> 00:10:43.279 And start the CLE is the thing. 00:10:43.280 --> 00:10:46.119 Oh, I did need to have an EmacsConf knowledge base. 00:10:46.120 --> 00:10:48.959 Well, let's just keep eepitching for a little bit. 00:10:48.960 --> 00:10:55.259 So I think I made... I'm going to call it emacsconf-kb. 00:10:55.260 --> 00:10:59.679 Right, that looks likely. And I think that the agent... 00:10:59.680 --> 00:11:03.479 I can check this. I could have checked that. 00:11:03.480 --> 00:11:12.699 I could have done something like (get emacsconf-kb contents). 00:11:12.700 --> 00:11:13.479 Yeah, and you can see 00:11:13.480 --> 00:11:15.879 there's a location inside it which is agent1, 00:11:15.880 --> 00:11:17.519 which I assume is an entity file 00:11:17.520 --> 00:11:20.599 that I was working with before. 00:11:20.600 --> 00:11:21.919 And then what were we going to do? 00:11:21.920 --> 00:11:28.279 Oh yeah, back to the embeddable Common Lisp image. 00:11:28.280 --> 00:11:36.099 So if I just press our button back to there... NOTE Start a loop for one leonardo software individual 00:11:36.100 --> 00:11:41.119 And so my idea is that for an Emacs agent, 00:11:41.120 --> 00:11:46.999 basically, I'd like to have an Emacs Lisp list. 00:11:47.000 --> 00:11:49.640 And just when stuff gets into that list, 00:11:49.641 --> 00:11:53.239 the agent which is always running, but running slowly, 00:11:53.240 --> 00:11:58.359 will incrementally just do the stuff it finds in that list. 00:11:58.360 --> 00:12:00.759 Populating that list probably gets into stuff 00:12:00.760 --> 00:12:03.199 like your Beliefs, Desires, Intents framework 00:12:03.200 --> 00:12:06.159 and those kind of well-known and well-studied algorithms. 00:12:06.160 --> 00:12:07.799 That's not the point here. 00:12:07.800 --> 00:12:14.259 I just want to have a list in Emacs that my ECL... 00:12:14.260 --> 00:12:16.079 I'm just going to run a loop in ECL, 00:12:16.080 --> 00:12:18.319 and the ECL is going to keep sending 00:12:18.320 --> 00:12:22.399 anything it finds in that Emacs Lisp list 00:12:22.400 --> 00:12:25.399 to the software agent. The agent is also in Emacs, 00:12:25.400 --> 00:12:28.759 so it would be able to populate its own list itself 00:12:28.760 --> 00:12:36.159 if it had an idea of evaluating desires and chances to improve 00:12:36.160 --> 00:12:37.559 whatever it wants to improve 00:12:37.560 --> 00:12:39.999 and chances to avoid whatever it wants to avoid. 00:12:40.000 --> 00:12:47.599 We talked a little bit too much. Let's just start this. 00:12:47.600 --> 00:12:51.539 Sorry that I'm manually setting up my screen. 00:12:51.540 --> 00:12:55.499 Then let's put CLisp over here. 00:12:55.500 --> 00:12:58.679 Right, we could work with this, right? 00:12:58.680 --> 00:13:00.099 This loop isn't very important. 00:13:00.100 --> 00:13:04.919 It's just a Common Lisp loop. I copy my friend jmbr's style 00:13:04.920 --> 00:13:08.199 of using Lisp machine-style keyword arguments 00:13:08.200 --> 00:13:12.119 instead of symbols like cl-loop, 00:13:12.120 --> 00:13:16.719 the compatibility thing in Emacs Lisp does. 00:13:16.720 --> 00:13:28.139 I'd never initialized that. Well, let's do that. 00:13:28.140 --> 00:13:30.679 Okay, now we have the list. 00:13:30.680 --> 00:13:35.019 And just every 30, let's turn it down to every 20 seconds. 00:13:35.020 --> 00:13:37.159 Hypothetically, it's going to put 00:13:37.160 --> 00:13:39.999 whatever it finds in there, into there. 00:13:40.000 --> 00:13:46.239 And so, I think, yeah, and now... Great. 00:13:46.240 --> 00:13:50.099 So here I'm just going to fill it with stuff. 00:13:50.100 --> 00:13:54.839 And this is quite interesting, I think. 00:13:54.840 --> 00:13:58.479 It just shows I can put a whole bunch of stuff into that list. 00:13:58.480 --> 00:14:01.199 Ideally, the agent would populate it itself 00:14:01.200 --> 00:14:03.359 with a BDI algorithm or something. 00:14:03.360 --> 00:14:04.919 But if we just put some stuff in there, 00:14:04.920 --> 00:14:07.799 we'll see that it will all get sent 00:14:07.800 --> 00:14:14.799 basically using Eduardo's eepitch internal machinery, at least. 00:14:14.800 --> 00:14:17.479 And hence, it meets my requirement 00:14:17.480 --> 00:14:20.779 that it works exactly like I work. 00:14:20.780 --> 00:14:25.859 And then in eev, I just have to press M-e. 00:14:25.860 --> 00:14:31.479 Oh, it works via Emacs server, and I didn't start that, 00:14:31.480 --> 00:14:39.719 so if we server-start, hopefully... 00:14:39.720 --> 00:14:42.799 And then, ideally, things will just begin happening 00:14:42.800 --> 00:14:53.119 in this slime-repl C/Lisp agent. 00:14:53.120 --> 00:15:05.419 Oh, if this was still running. 00:15:05.420 --> 00:15:07.199 Okay, well we got at least one, 00:15:07.200 --> 00:15:09.639 but hypothetically lots of these will happen. 00:15:09.640 --> 00:15:13.699 So, show agent, I guess, 00:15:13.700 --> 00:15:17.039 happened over here. I put a whole bunch of "sleep-for"s in, 00:15:17.040 --> 00:15:19.719 because I thought that going slowly 00:15:19.720 --> 00:15:21.319 would make it seem more human. 00:15:21.320 --> 00:15:24.639 Like I saw in Eduardo's talk last year 00:15:24.640 --> 00:15:29.099 which is where I learned about eev. 00:15:29.100 --> 00:15:32.319 The system is a little fragile. 00:15:32.320 --> 00:15:41.079 Hypothetically, we have a whole bunch of agents. 00:15:41.080 --> 00:15:43.039 I guess every time it gets sent, 00:15:43.040 --> 00:15:44.999 it checks that we're in the right agent. 00:15:45.000 --> 00:15:46.999 And it's not actually just sending a string, 00:15:47.000 --> 00:15:52.799 it's sending a sequence of string actions over there. 00:15:52.800 --> 00:15:57.479 And so we see Emacs Lisp hypothetically put, 00:15:57.480 --> 00:16:06.859 I guess it put this "foo bar baz!" into an entity, message-1, 00:16:06.860 --> 00:16:11.899 which should be of type message, I guess, conceivably. 00:16:11.900 --> 00:16:13.319 I forget if I set that up earlier. 00:16:13.320 --> 00:16:14.719 It's in the appendix somewhere. 00:16:14.720 --> 00:16:17.999 And then it just called, it did a sequence of actions 00:16:18.000 --> 00:16:21.319 which was really just one action of showing that. 00:16:21.320 --> 00:16:26.399 And then I called b64-encode on message1, 00:16:26.400 --> 00:16:30.599 which I believe will have set message-1 encoded. 00:16:30.600 --> 00:16:37.242 Can I check that manually while it's happening? 00:16:37.243 --> 00:16:51.499 Disaster. Well that's what it should have been. 00:16:51.500 --> 00:16:54.940 Well, I did mention it was a little bit fragile. 00:16:54.941 --> 00:17:03.279 What if we put... Can we kind of rescue this? 00:17:03.280 --> 00:17:07.239 I don't want to try redoing this. It's slightly fragile. 00:17:07.240 --> 00:17:12.639 What it would do, we can see the actions are kind of getting there, 00:17:12.640 --> 00:17:16.719 but somehow my message didn't end up getting encoded 00:17:16.720 --> 00:17:18.119 by that sequence of actions. 00:17:18.120 --> 00:17:23.279 So this decode will have also made the decoded one be null. NOTE Let's do it manually 00:17:23.280 --> 00:17:26.239 Let's just do it manually. Should have worked. 00:17:26.240 --> 00:17:30.559 b64-encode, which calls out to Emacs 00:17:30.560 --> 00:17:37.299 to get everything actually done. 00:17:37.300 --> 00:17:41.519 Oh, I got interrupted by the agent. 00:17:41.520 --> 00:17:43.320 Well, if I do it manually, it worked. 00:17:43.321 --> 00:17:53.519 Hypothetically, the queue thing should have worked. Great. 00:17:53.520 --> 00:17:56.840 Well, you can see it's kind of working. 00:17:56.841 --> 00:17:57.440 Could be more robust. 00:17:57.441 --> 00:18:03.640 The reason is that I think what I did is a bit fragile, 00:18:03.641 --> 00:18:07.107 but the intent is that FIPA, 00:18:07.108 --> 00:18:09.307 Foundation for Intelligent Physical Agents's 00:18:09.308 --> 00:18:15.639 SL standard has tools for reliability 00:18:15.640 --> 00:18:19.919 through repetition and checking outcomes and that kind of thing. 00:18:19.920 --> 00:18:22.959 So I would use those. I'm not putting too much work 00:18:22.960 --> 00:18:26.679 into being ultra-reliable right now, but it kind of worked. 00:18:26.680 --> 00:18:29.759 We saw, I guess, at least Embeddable Common Lisp 00:18:29.760 --> 00:18:35.599 believed it used emacsclient externally, asynchronously, 00:18:35.600 --> 00:18:38.359 to send these to Emacs within Emacs. 00:18:38.360 --> 00:18:41.599 I put a whole bunch of sleeps into its thing 00:18:41.600 --> 00:18:44.999 to make it look slow and human-like, kind of happened 00:18:45.000 --> 00:18:52.719 because Emacs' model is that it's kind of single-threaded. 00:18:52.720 --> 00:18:59.639 Can I just... I bet if we run this again 00:18:59.640 --> 00:19:02.119 It'll at least look like it's succeeding 00:19:02.120 --> 00:19:05.039 because I fixed the base64 encoding 00:19:05.040 --> 00:19:11.399 and so forth in the background. I wonder if it will. NOTE Wrapping up 00:19:11.400 --> 00:19:15.559 In the meantime, let's wrap up this talk to some extent. 00:19:15.560 --> 00:19:18.799 Then I'm just kind of saying what I'm expecting to happen. 00:19:18.800 --> 00:19:20.479 I took out next action. 00:19:20.480 --> 00:19:25.279 Originally, I was keeping the list inside of the agent. 00:19:25.280 --> 00:19:27.879 Then I decided to keep the list inside Emacs 00:19:27.880 --> 00:19:31.679 because I have kind of first class Emacs is my IDE, 00:19:31.680 --> 00:19:37.607 so I have better access to what's going on in my IDE. NOTE Intelligence 00:19:37.608 --> 00:19:39.559 Then I wanted to talk about intelligence a little bit 00:19:39.560 --> 00:19:41.199 in whatever my remaining time is. 00:19:41.200 --> 00:19:43.039 I just have these great bullet points 00:19:43.040 --> 00:19:45.559 of nosrednA yduJ and Eric Sandewall. 00:19:45.560 --> 00:19:50.039 So nosrednA yduJ, when she was on the show quite a long time ago, 00:19:50.040 --> 00:19:55.559 she... I keep describing things as expert systems 00:19:55.560 --> 00:19:57.039 and she wanted to know what I meant 00:19:57.040 --> 00:19:58.359 when I said expert systems, 00:19:58.360 --> 00:20:00.199 and I gave her a Lisp software example 00:20:00.200 --> 00:20:02.618 and she said she personally wrote 00:20:02.619 --> 00:20:06.279 that software in the 80s that I was referring to 00:20:06.280 --> 00:20:08.239 and she wanted to know how it was an expert system. 00:20:08.240 --> 00:20:10.039 What I mean when I say expert system 00:20:10.040 --> 00:20:19.839 is a system that works kind of like I do and eev's eepitch does. 00:20:19.840 --> 00:20:21.999 It's where we can really reason 00:20:22.000 --> 00:20:24.199 in a very human-relatable way 00:20:24.200 --> 00:20:26.479 about what the inputs to the program is. 00:20:26.480 --> 00:20:31.399 And also a program should be exposed to other programs 00:20:31.400 --> 00:20:36.559 in terms of like a well-structured transfer of knowledge as inputs, 00:20:36.560 --> 00:20:38.010 and it should have a well-structured 00:20:38.011 --> 00:20:41.939 transfer of knowledge kind of outputs. 00:20:41.940 --> 00:20:47.159 I don't know why this b64-encode message wasn't working. 00:20:47.160 --> 00:20:49.999 Then we kind of faked it into working. 00:20:50.000 --> 00:20:52.399 It's going to be embarrassing for me 00:20:52.400 --> 00:20:58.739 if anybody watches this. But yeah, so yduJ's thing... 00:20:58.740 --> 00:20:59.959 And then I was going to also build 00:20:59.960 --> 00:21:02.679 that into Eric Sandewall's one. 00:21:02.680 --> 00:21:05.639 So this is my vision of expert systems 00:21:05.640 --> 00:21:07.779 as kind of maybe this is an important 00:21:07.780 --> 00:21:11.679 general style loosely associated with Lisp. 00:21:11.680 --> 00:21:14.399 Same as the Lisp editor Emacs. 00:21:14.400 --> 00:21:17.665 So Eric Sandewall's description of intelligence 00:21:17.666 --> 00:21:21.159 was that his grandchildren were intelligent. 00:21:21.160 --> 00:21:26.439 So if we had software agents that were intelligent, 00:21:26.440 --> 00:21:32.439 this would be true if and maybe only if they were similar 00:21:32.440 --> 00:21:33.719 to his grandchildren 00:21:33.720 --> 00:21:36.319 who were a good reference for intelligence. 00:21:36.320 --> 00:21:39.199 And grandchildren live for a really long time. 00:21:39.200 --> 00:21:42.879 They kind of learn gradually. 00:21:42.880 --> 00:21:46.879 They don't run on GPUs for a few minutes 00:21:46.880 --> 00:21:51.879 and then get thrown out forever, something like that. 00:21:51.880 --> 00:21:54.959 And so this is the kind of vision of, I guess, 00:21:54.960 --> 00:21:57.919 the Leonardo system software individual stuff. 00:21:57.920 --> 00:22:03.946 You can see we kind of faked it into... 00:22:03.947 --> 00:22:06.320 at least the show get message one decoded bits were working. 00:22:06.321 --> 00:22:07.300 I'm not sure what was happening 00:22:07.301 --> 00:22:12.674 with the Elisp ones that worked interactively, 00:22:12.675 --> 00:22:18.607 but then they didn't work in my loopy thing. 00:22:18.608 --> 00:22:21.307 Oh yeah, and then so I mentioned 00:22:21.308 --> 00:22:24.640 thank you to Sacha at the start of this talk. 00:22:24.641 --> 00:22:26.974 And so Eric Sandewall's emphasis 00:22:26.975 --> 00:22:31.340 that you'd really like intelligent software agents, 00:22:31.341 --> 00:22:34.174 Leonardo system agents, to be like your grandchildren. 00:22:34.175 --> 00:22:40.659 And I was talking to somebody, maybe to Ramin Honary 00:22:40.660 --> 00:22:44.959 who's doing the schemacs talk this year 00:22:44.960 --> 00:22:46.874 about Sacha's writing. 00:22:46.875 --> 00:22:48.840 A lot of Sacha's writing is about 00:22:48.841 --> 00:22:51.774 her experiences of life and technology, 00:22:51.775 --> 00:22:54.374 and especially raising A* 00:22:54.375 --> 00:22:59.740 and her observations of her progeny A*'s 00:22:59.741 --> 00:23:05.319 experiences of life and technology, 00:23:05.320 --> 00:23:07.874 I would say as well as being 00:23:07.875 --> 00:23:18.039 the Emacs News and Emacs conf doer that she is. 00:23:18.040 --> 00:23:22.740 Yeah, and so I think a lot of what Sacha is seen doing 00:23:22.741 --> 00:23:25.840 and concerned with are specifically what Eric Sandewall 00:23:25.841 --> 00:23:31.207 identifies as the study of intelligence as such, 00:23:31.208 --> 00:23:36.479 as should apply to computing as well. That was my thought 00:23:36.480 --> 00:23:42.979 on Sacha, Eric Sandewall, intelligence, and yduJ. 00:23:42.980 --> 00:23:44.240 I have this note from pizzapal... 00:23:44.241 --> 00:23:46.274 I didn't realize that Microsoft had announced 00:23:46.275 --> 00:23:49.679 that 2025 was going to be the year of the software agent. 00:23:49.680 --> 00:23:51.199 I only found this out in hindsight 00:23:51.200 --> 00:23:54.199 when I saw people crowing on the Mastodon 00:23:54.200 --> 00:23:58.079 about how Microsoft had basically declared 00:23:58.080 --> 00:24:00.779 that their Year of the Agent marketing campaign 00:24:00.780 --> 00:24:04.459 was a failure 00:24:04.460 --> 00:24:09.279 where basically people didn't like the same old web services 00:24:09.280 --> 00:24:11.359 but now while you're accessing, 00:24:11.360 --> 00:24:15.239 while you're formally kind of accessing a web service, 00:24:15.240 --> 00:24:16.959 the kind of web service that used to be called 00:24:16.960 --> 00:24:19.279 serverless web services, this kind of thing, 00:24:19.280 --> 00:24:23.879 but you're just being gibbered at by Microsoft Copilot 00:24:23.880 --> 00:24:27.119 while you're trying to use regular services. 00:24:27.120 --> 00:24:29.279 And people turned out not to like this. 00:24:29.280 --> 00:24:32.399 I think that, as we can see in this agent, 00:24:32.400 --> 00:24:36.374 the agent really needs to be running on its own clock 00:24:36.375 --> 00:24:37.907 and independently of you. 00:24:37.908 --> 00:24:42.279 Like if you imagine your body is getting 00:24:42.280 --> 00:24:46.074 novel, slightly speculative instructions from your brain 00:24:46.075 --> 00:24:50.680 constantly throughout your entire waking day, quite slowly, 00:24:50.681 --> 00:24:54.974 this is what an agent should be like. 00:24:54.975 --> 00:24:59.540 And it should be... Sandewall wrote about this. 00:24:59.541 --> 00:25:01.540 Basically, computer programs 00:25:01.541 --> 00:25:04.840 aren't going to want to use human natural language with each other. 00:25:04.841 --> 00:25:06.674 There's nothing desirable about that, 00:25:06.675 --> 00:25:10.674 so you wouldn't have two hypothetical Microsoft agents, 00:25:10.675 --> 00:25:13.399 which are just regular web services with 00:25:13.400 --> 00:25:16.340 a GPT model gibbering at you 00:25:16.341 --> 00:25:19.839 while you're trying to use the web service. 00:25:19.840 --> 00:25:22.539 I think we can see... 00:25:22.540 --> 00:25:26.740 Microsoft did the wrong thing with the word agent, 00:25:26.741 --> 00:25:30.707 allowing that agent is an overloaded term like static. 00:25:30.708 --> 00:25:34.256 I'm going to stop this. I'm not going to try and fix this. 00:25:34.257 --> 00:25:36.313 Sorry, everybody. Thank you. Talk to you on the Mastodon. 00:25:36.314 --> 00:25:37.919 Hopefully, see you on the show. 00:25:37.920 --> 00:25:40.399 See you at your conference talks. 00:25:40.400 --> 00:25:45.599 My blog has writing and examples of this with multi-agents, 00:25:45.600 --> 00:25:50.819 more C and C++ stuff, Lisp things. 00:25:50.820 --> 00:25:53.439 You're welcome to come on my show to be interviewed, 00:25:53.440 --> 00:25:56.640 however formally we do that. See everybody next time.