smol-ai / developer

the first library to let you embed a developer agent in your own app!
https://twitter.com/SmolModels
MIT License
11.81k stars 1.03k forks source link

Having a ` character in the markdown prompt breaks smol #27

Closed LukasMeine closed 1 year ago

LukasMeine commented 1 year ago

This is the error I get back in that case

 - `serverless.yml`   
SyntaxError: invalid syntax
terrafying commented 1 year ago

Same. For hacking, I replaced the ast.literal_eval line on 135 with

for line in filepaths_string.split('\n'):
    list_actual.append(line.split(' ')[1].replace('`',''))
swyxio commented 1 year ago

this is very strange. i definitely use backticks everywhere in my prompt: https://github.com/smol-ai/developer/blob/main/prompt.md

can you report the exact line of code that errors and what the input is? if like @terrafying is reporting, it is https://github.com/smol-ai/developer/blob/00a3366ac4411de102725d1115e045635b055394/main.py#L135 then i will try to work on a direct solution via smolai itself (i want it to just always return valid json)

jdan commented 1 year ago

Same issue here. I'm using gpt-3.5-turbo

modal run main.py --prompt test-webapp/prompt.md --file package.json

prompt.md

a nodejs webapp that displays hello :name at the route /:name. include a package.json so I can run it with "npm start"

for the homepage, display a tutorial on how to use the webapp
I'd like an "npm run dev" command as well which reloads the server using nodemon.

## debugging notes

- sh: nodemon: command not found

output

modal run main.py --prompt test-webapp/prompt.md --file package.json
✓ Initialized. View app at https://modal.com/apps/ap-XXXXXXXXX
✓ Created objects.
├── 🔨 Created generate_response.
├── 🔨 Created mount /Users/jdan/Projects/smol-developer/main.py
└── 🔨 Created generate_file.
hi its me, 🐣the smol developer🐣! you said you wanted:
a nodejs webapp that displays hello :name at the route /:name. include a package.json so I can run it with "npm start"

for the homepage, display a tutorial on how to use the webapp
I'd like an "npm run dev" command as well which reloads the server using nodemon.

## debugging notes

- sh: nodemon: command not found
86 tokens in prompt: You are an AI developer who is trying to write a p
80 tokens in prompt: a nodejs webapp that displays hello :name at the r
- `./package.json`
- `./src/index.js`
- `./views/index.html`
- `./views/tutorial.html`

Here is the list of filepaths:

"./package.json" "./src/index.js" "./views/index.html" "./views/tutorial.html"

╭─────────────────────────────── Traceback (most recent call last) ────────────────────────────────╮
│ /opt/homebrew/Caskroom/miniforge/base/bin/modal:8 in <module>                                    │
│                                                                                                  │
│   7 │   sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])                         │
│ ❱ 8 │   sys.exit(main())                                                                         │
│   9                                                                                              │
│                                                                                                  │
│ /opt/homebrew/Caskroom/miniforge/base/lib/python3.10/site-packages/modal/__main__.py:6 in main   │
│                                                                                                  │
│    5 def main():                                                                                 │
│ ❱  6 │   entrypoint_cli()                                                                        │
│    7                                                                                             │
│                                                                                                  │
│ /opt/homebrew/Caskroom/miniforge/base/lib/python3.10/site-packages/click/core.py:1130 in         │
│ __call__                                                                                         │
│                                                                                                  │
│   1129 │   │   """Alias for :meth:`main`."""                                                     │
│ ❱ 1130 │   │   return self.main(*args, **kwargs)                                                 │
│   1131                                                                                           │
│                                                                                                  │
│ /opt/homebrew/Caskroom/miniforge/base/lib/python3.10/site-packages/typer/core.py:778 in main     │
│                                                                                                  │
│   777 │   ) -> Any:                                                                              │
│ ❱ 778 │   │   return _main(                                                                      │
│   779 │   │   │   self,                                                                          │
│                                                                                                  │
│ /opt/homebrew/Caskroom/miniforge/base/lib/python3.10/site-packages/typer/core.py:216 in _main    │
│                                                                                                  │
│   215 │   │   │   with self.make_context(prog_name, args, **extra) as ctx:                       │
│ ❱ 216 │   │   │   │   rv = self.invoke(ctx)                                                      │
│   217 │   │   │   │   if not standalone_mode:                                                    │
│                                                                                                  │
│ /opt/homebrew/Caskroom/miniforge/base/lib/python3.10/site-packages/click/core.py:1657 in invoke  │
│                                                                                                  │
│   1656 │   │   │   │   with sub_ctx:                                                             │
│ ❱ 1657 │   │   │   │   │   return _process_result(sub_ctx.command.invoke(sub_ctx))               │
│   1658                                                                                           │
│                                                                                                  │
│ /opt/homebrew/Caskroom/miniforge/base/lib/python3.10/site-packages/click/core.py:1657 in invoke  │
│                                                                                                  │
│   1656 │   │   │   │   with sub_ctx:                                                             │
│ ❱ 1657 │   │   │   │   │   return _process_result(sub_ctx.command.invoke(sub_ctx))               │
│   1658                                                                                           │
│                                                                                                  │
│ /opt/homebrew/Caskroom/miniforge/base/lib/python3.10/site-packages/click/core.py:1404 in invoke  │
│                                                                                                  │
│   1403 │   │   if self.callback is not None:                                                     │
│ ❱ 1404 │   │   │   return ctx.invoke(self.callback, **ctx.params)                                │
│   1405                                                                                           │
│                                                                                                  │
│ /opt/homebrew/Caskroom/miniforge/base/lib/python3.10/site-packages/click/core.py:760 in invoke   │
│                                                                                                  │
│    759 │   │   │   with ctx:                                                                     │
│ ❱  760 │   │   │   │   return __callback(*args, **kwargs)                                        │
│    761                                                                                           │
│                                                                                                  │
│ /opt/homebrew/Caskroom/miniforge/base/lib/python3.10/site-packages/click/decorators.py:26 in     │
│ new_func                                                                                         │
│                                                                                                  │
│    25 │   def new_func(*args, **kwargs):  # type: ignore                                         │
│ ❱  26 │   │   return f(get_current_context(), *args, **kwargs)                                   │
│    27                                                                                            │
│                                                                                                  │
│ /opt/homebrew/Caskroom/miniforge/base/lib/python3.10/site-packages/modal/cli/run.py:116 in f     │
│                                                                                                  │
│   115 │   │   │   else:                                                                          │
│ ❱ 116 │   │   │   │   func(*args, **kwargs)                                                      │
│   117 │   │   │   if app.function_invocations == 0:                                              │
│                                                                                                  │
│ /Users/jdan/Projects/smol-developer/main.py:135 in main                                          │
│                                                                                                  │
│   134 │   try:                                                                                   │
│ ❱ 135 │   │   list_actual = ast.literal_eval(filepaths_string)                                   │
│   136                                                                                            │
│                                                                                                  │
│ /opt/homebrew/Caskroom/miniforge/base/lib/python3.10/ast.py:64 in literal_eval                   │
│                                                                                                  │
│     63 │   if isinstance(node_or_string, str):                                                   │
│ ❱   64 │   │   node_or_string = parse(node_or_string.lstrip(" \t"), mode='eval')                 │
│     65 │   if isinstance(node_or_string, Expression):                                            │
│                                                                                                  │
│ /opt/homebrew/Caskroom/miniforge/base/lib/python3.10/ast.py:50 in parse                          │
│                                                                                                  │
│     49 │   # Else it should be an int giving the minor version for 3.x.                          │
│ ❱   50 │   return compile(source, filename, mode, flags,                                         │
│     51 │   │   │   │      _feature_version=feature_version)                                      │
╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
╭──────────────────────────────────────────────────────────────────────────────────────────────────╮
│ - `./package.json`                                                                               │
│   ▲                                                                                              │
╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
SyntaxError: invalid syntax
jdan commented 1 year ago

Printing filepaths_string shows:

- `./package.json`
- `./src/index.js`
- `./views/index.html`
- `./public/styles.css`

Here is the list of filepaths:

"./package.json", "./src/index.js", "./views/index.html", "./public/styles.css"

swyxio commented 1 year ago

hey jdan! yeah ok this is another "doesnt return json" issue. short fix is to improve the prompt to not give us backticks like that. actual fix is to fix it at source... which i plan to do for smol.ai

clbarrell commented 1 year ago

Suggest you just add the following to the prompt as another way to increase likelihood of proper output

Example output:
["index.html", "style.css", "script.js"]