APP下载

AI | Developer: 探索gpt-pilot项目(一)

原创

AI

生活中90%的局面,实际上是由我们怎样回应那「10%不可控事件」所决定的! —— 费斯丁格效应的核心

gpt-pilot - The first real AI developer

github(stars: 32k): https://github.com/Pythagora-io/gpt-pilot?tab=readme-ov-file#-requirements 

FIRST TRY

1. Conclusion: Failed

1.1 errors are as follows:

               
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
### Testing Instructions A human can test this by attempting to access the `/api/auth/protected` route with and without a valid JWT token. Access should be granted with a valid token and denied without it. [Developer] [Pythagora] Stopping Pythagora due to error: File `core/cli/main.py`, line 38, in run_project success = await orca.run() File `core/agents/orchestrator.py`, line 78, in run response = await agent.run() File `core/agents/developer.py`, line 88, in run return await self.breakdown_current_task() File `core/agents/developer.py`, line 215, in breakdown_current_task await self.get_relevant_files(None, response) File `core/agents/mixins.py`, line 113, in get_relevant_files read_files = [file for file in self.current_state.files if file.path in getattr(action, "read_files", [])] File `core/agents/mixins.py`, line 113, in <listcomp> read_files = [file for file in self.current_state.files if file.path in getattr(action, "read_files", [])] TypeError: argument of type 'NoneType' is not iterable COPY

1.2 Replay(Only portion)


Human Intervention

To verify the implementation, a human can test this by registering a new user and then checking the database to confirm that the password is stored as a hashed value, not in plain text.

Now, you can proceed with these steps to implement the password hashing functionality in the registration endpoint. [Developer] [Developer] Breaking down the task into steps ...

[Executor] Can I run command: npm install bcryptjs with 60s timeout? [yes]: Yes (default) [no]: No

up to date in 311ms

14 packages are looking for funding run npm fund for details [Troubleshooter] Determining how to test the app ...

[Troubleshooter] Here are instructions on how to test the app:

Step 1

Action: Start the server using npm start Expected result: You should see the message "Connected to database" or similar, and "Server running on http://localhost:3000" 

Step 2

Action: Open your web browser and visit http://localhost:3000/  Expected result: The web page opens, though it may show a default or empty page since the frontend isn't fully implemented yet.

Step 3

Action: Open a terminal and run the following cURL command to register a new user:

               
  • 1
curl -X POST http://localhost:3000/api/auth/register -H "Content-Type: application/json" -d '{"email": "test@example.com", "password": "password123"}' COPY

Expected result: You should see a JSON response indicating that the user was registered successfully:

               
  • 1
  • 2
  • 3
{ "msg": "User registered successfully" } COPY

Step 4

Action: Open your MongoDB client (e.g., MongoDB Compass or another GUI tool) and connect to your MongoDB instance. Expected result: You should be able to connect to the database without issues.

Step 5

Action: Navigate to the cogito database and open the users collection. Expected result: You should see a document for the newly registered user with the email test@example.com.

Step 6

Action: Inspect the password field of the user document. Expected result: The password should be stored as a hashed value, not in plain text. The hashed value will look something like this:

               
  • 1
$2a$10$EixZaYVK1fsbw1ZfbX3OXePaWxn96p36V4J5t2kPzJ1y1w6X3U5K6 COPY

If all the expected results are met, the task is completed successfully.

[Troubleshooter] Please check if the app is working [continue]: Everything works (default) [change]: I want to make a change [bug]: There is an issue

[Developer] Starting new task with description:

Create the login endpoint to allow users to log in with their email and password.

[Developer] Do you want to execute the above task? [yes]: Yes (default) [edit]: Edit Task [skip]: Skip Task

[Developer] Thinking about how to implement this task ...

To implement task #8, which is to create the login endpoint to allow users to log in with their email and password, we need to follow these steps:

  1. Add a new route for login in routes/auth.js: This will handle POST requests to the /login endpoint, validate the input, check if the user exists, compare the password, and return a response.

  2. Install necessary dependencies: We need jsonwebtoken to generate JWT tokens.

  3. Update index.js: No updates needed here since the auth routes are already included.

Here are the detailed steps and code:

Step 1: Install jsonwebtoken

First, we need to install the jsonwebtoken package.

               
  • 1
npm install jsonwebtoken COPY

Step 2: Update routes/auth.js

We need to add a new route to handle user login. This will involve validating the user input, checking if the user exists, comparing the password, and generating a JWT token upon successful login.

File: routes/auth.js

               
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
const express = require('express'); const { check, validationResult } = require('express-validator'); const bcrypt = require('bcryptjs'); const jwt = require('jsonwebtoken'); const User = require('../models/user'); const router = express.Router(); // Registration endpoint router.post( '/register', [ check('email', 'Please include a valid email').isEmail(), check('password', 'Password must be 6 or more characters').isLength({ min: 6 }), ], async (req, res) => { const errors = validationResult(req); if (!errors.isEmpty()) { return res.status(400).json({ errors: errors.array() }); } const { email, password } = req.body; try { let user = await User.findOne({ email }); if (user) { return res.status(400).json({ msg: 'User already exists' }); } user = new User({ email, password, }); // Hash the password before saving const salt = await bcrypt.genSalt(10); user.password = await bcrypt.hash(password, salt); await user.save(); res.status(201).json({ msg: 'User registered successfully' }); } catch (err) { console.error(`Error: ${err.message}`); console.error(err.stack); res.status(500).send('Server error'); } } ); // Login endpoint router.post( '/login', [ check('email', 'Please include a valid email').isEmail(), check('password', 'Password is required').exists(), ], async (req, res) => { const errors = validationResult(req); if (!errors.isEmpty()) { return res.status(400).json({ errors: errors.array() }); } const { email, password } = req.body; try { let user = await User.findOne({ email }); if (!user) { return res.status(400).json({ msg: 'Invalid Credentials' }); } const isMatch = await bcrypt.compare(password, user.password); if (!isMatch) { return res.status(400).json({ msg: 'Invalid Credentials' }); } const payload = { user: { id: user.id, }, }; jwt.sign( payload, 'yourJWTSecret', // Replace this with your secret key { expiresIn: '1h' }, (err, token) => { if (err) throw err; res.json({ token }); } ); } catch (err) { console.error(`Error: ${err.message}`); console.error(err.stack); res.status(500).send('Server error'); } } ); module.exports = router; COPY

Summary of Changes

  1. Install jsonwebtoken: This is required to generate JWT tokens.
  2. Update routes/auth.js: Add a new route to handle user login.

Testing the Implementation

To test the login endpoint, a human can send a POST request to /api/auth/login with the registered email and password. The response should indicate successful login and return a JWT token.

Example request body:

               
  • 1
  • 2
  • 3
  • 4
{ "email": "user@example.com", "password": "password123" } COPY

Example response:

               
  • 1
  • 2
  • 3
{ "token": "yourJWTToken" } COPY

This concludes the implementation of task #8. [Developer] [Developer] Breaking down the task into steps ...

[Executor] Can I run command: npm install jsonwebtoken with 60s timeout? [yes]: Yes (default) [no]: No

added 14 packages in 922ms

14 packages are looking for funding run npm fund for details [Troubleshooter] Determining how to test the app ...

[Troubleshooter] Here are instructions on how to test the app:

Step 1

Action: Start the server using npm start Expected result: You should see the message "Connected to database" followed by "Server running on http://localhost:3000" 

Step 2

Action: Register a new user by sending a POST request using the following cURL command. Replace user@example.com and password123 with the desired email and password.

               
  • 1
curl -X POST http://localhost:3000/api/auth/register -H "Content-Type: application/json" -d '{"email": "user@example.com", "password": "password123"}' COPY

Expected result: You should see a JSON response indicating successful registration:

               
  • 1
  • 2
  • 3
{ "msg": "User registered successfully" } COPY

Step 3

Action: Log in with the registered user by sending a POST request using the following cURL command. Replace user@example.com and password123 with the email and password you used in Step 2.

               
  • 1
curl -X POST http://localhost:3000/api/auth/login -H "Content-Type: application/json" -d '{"email": "user@example.com", "password": "password123"}' COPY

Expected result: You should see a JSON response containing a JWT token:

               
  • 1
  • 2
  • 3
{ "token": "yourJWTToken" } COPY

Step 4

Action: Verify the JWT token by decoding it using any JWT decoder tool, such as jwt.io . Copy the token from the response in Step 3 and paste it into the decoder. Expected result: The decoded token should contain the user ID in the payload, similar to:

               
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
{ "user": { "id": "userId" }, "iat": 1616589277, "exp": 1616592877 } COPY

If all the expected results are met, the task is successfully completed.

[Troubleshooter] Please check if the app is working [continue]: Everything works (default) [change]: I want to make a change [bug]: There is an issue

[Developer] Starting new task with description:

Implement JWT generation upon successful login.

[Developer] Do you want to execute the above task? [yes]: Yes (default) [edit]: Edit Task [skip]: Skip Task

[Developer] Thinking about how to implement this task ...

To implement JWT generation upon successful login, we need to modify the routes/auth.js file to include the logic for generating a JWT token. Here are the steps to achieve this:

  1. Update the routes/auth.js file:

    • Modify the login endpoint to generate a JWT token upon successful login.
    • Use the jsonwebtoken library to sign the token.
    • Ensure the token is included in the response.
  2. Install the jsonwebtoken library:

    • Run the command to install the jsonwebtoken library.

Steps to Implement Task #9

...


Appendix

  1. What we learned in 6 months of working on a CodeGen dev tool GPT Pilot - https://blog.pythagora.ai/2024/02/19/gpt-pilot-what-did-we-learn-in-6-months-of-working-on-a-codegen-pair-programmer/ 
  2. wiki - https://github.com/Pythagora-io/gpt-pilot/wiki/ 

Continuously update... :)

评论区

写评论

登录

所以,就随便说点什么吧...

这里什么都没有,快来评论吧...