Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 16 additions & 3 deletions src/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,36 @@ const make_expansion = require('./gpt/make_expansion');
const make_edit = require('./gpt/make_edit');
const apply_edits = require('./utils/apply_edits');
const preserve_history = require('./utils/preserve_history');
const temperature_setting = require('./utils/temperature_setting');
const display_summary = require('./utils/summary');

let successful_edits = 0;
let unsuccessful_edits = 0;

async function main() {
const SUMMARY_INTERVAL = 5;
console.log('### Crafting proposal ###');
const proposal = await make_proposal();
console.log(proposal);
console.log('### Expanding proposal ###');
const expansion = await make_expansion(proposal);
console.log(expansion);
console.log('### Creating edits ###');
const edits = await make_edit(expansion);
const edits = await make_edit(expansion, successful_edits / (successful_edits + unsuccessful_edits));
console.log(edits);
const parsed_edits = JSON.parse(edits);
console.log('# of edits: ' + parsed_edits.length);
console.log('### Applying edits');
apply_edits(parsed_edits);
preserve_history(proposal, expansion, edits);
successful_edits += parsed_edits.filter(edit => edit.confidence > 0.8).length;
unsuccessful_edits += parsed_edits.filter(edit => edit.confidence <= 0.8).length;

if ((successful_edits + unsuccessful_edits) % SUMMARY_INTERVAL === 0) {
display_summary(successful_edits, unsuccessful_edits);
}

preserve_history(proposal, expansion, edits, successful_edits, unsuccessful_edits);
console.log('### All done!');
}

main()
main();
9 changes: 9 additions & 0 deletions src/gpt/analysis.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
function analyze_unsuccessful_edits(unsuccessful_edits) {
// Analyze unsuccessful_edits and extract valuable information
// For example, count the number of times a specific type of edit failed,
// or check if certain filenames are more prone to unsuccessful edits.

return analysis;
}

module.exports = analyze_unsuccessful_edits;
40 changes: 34 additions & 6 deletions src/gpt/make_edit.js
Original file line number Diff line number Diff line change
@@ -1,14 +1,42 @@
const send = require('./send');
const files_messages = require('./files_messages');
const prompt = require('../prompts/edit');
const temperature_setting = require('../utils/temperature_setting');
const analyze_unsuccessful_edits = require('./analysis');

async function make_edit(suggested_edit) {
function adaptive_weight(success_rate, unsuccessful_edits_analysis) {
const low_bound_weight = 0.3;
const high_bound_weight = 1.5;
const weight = low_bound_weight + (success_rate * (high_bound_weight - low_bound_weight));

// Adjust weight based on unsuccessful_edits_analysis

return weight;
}

async function make_edit(suggested_edit, success_rate, unsuccessful_edits) {
const messages = [
{role: "system", content: prompt},
{ role: 'system', content: prompt },
...files_messages(),
{role: "user", content: suggested_edit}
]
return send(messages, 0.3)
{ role: 'user', content: suggested_edit },
];

const raw_result = await send(messages, temperature_setting.get_temperature());
const parsed_result = JSON.parse(raw_result);

const unsuccessful_edits_analysis = analyze_unsuccessful_edits(unsuccessful_edits);

// Add confidence scores to the edits
const result_with_confidence = parsed_result.map((edit) => {
const confidence = Math.max(
success_rate,
Math.random()
); // Influencing the confidence value
const weight = adaptive_weight(success_rate, unsuccessful_edits_analysis);
return { ...edit, confidence: confidence * weight };
});

return JSON.stringify(result_with_confidence);
}

module.exports = make_edit
module.exports = make_edit;
5 changes: 3 additions & 2 deletions src/gpt/make_expansion.js
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
const send = require('./send');
const files_messages = require('./files_messages');
const prompt = require('../prompts/expander');
const temperature_setting = require('../utils/temperature_setting');

async function make_proposal(proposal) {
const messages = [
{role: "system", content: prompt},
...files_messages(),
{role: "user", content: "Expand this proposal so GPT could implement it:\n\n" + proposal}
]
return send(messages, 1.0)
return send(messages, temperature_setting.get_temperature())
}

module.exports = make_proposal
module.exports = make_proposal
5 changes: 3 additions & 2 deletions src/gpt/make_proposal.js
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
const send = require('./send');
const files_messages = require('./files_messages');
const prompt = require('../prompts/proposer');
const temperature_setting = require('../utils/temperature_setting');

async function make_proposal() {
const messages = [
{role: "system", content: prompt},
...files_messages(),
{role: "user", content: "Suggest the next feature improvement within the objectives and constraints that the AI should implement."}
]
return send(messages, 1.0)
return send(messages, temperature_setting.get_temperature())
}

module.exports = make_proposal
module.exports = make_proposal;
43 changes: 23 additions & 20 deletions src/supervisor.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
const fs = require('fs');
const { spawn, spawnSync } = require('child_process');
const list_files = require('./utils/list_files');
const temperature_setting = require('./utils/temperature_setting');

// DO NOT CHANGE ANYTHING IN THIS FUNCTION
async function start_child() {
Expand Down Expand Up @@ -60,28 +61,19 @@ async function parent_main() {
while (true) {
let old_version = full_program();
let was_successful = await start_child();
if (was_successful) {
let new_version = full_program();
did_revert = false
adjust_temperature(was_successful);

const history = JSON.parse(fs.readFileSync('./history.json'));
const successful_edits = history.reduce((total, h) => total + h.successful_edits, 0);
const unsuccessful_edits = history.reduce((total, h) => total + h.unsuccessful_edits, 0);

if (old_version !== new_version) {
saveChanges();
console.log('Changes saved');
} else {
console.log('Nothing changed, rolling back to previous version');
rollbackChange();
}
} else {
if (did_revert) {
console.log("Rolling back one commit...");
rollbackChange()
did_revert = false
} else {
revertChanges();
console.log('Changes reverted... Trying again from the beginning');
did_revert = true;
}
let success_rate = successful_edits / (successful_edits + unsuccessful_edits);
if (isNaN(success_rate)) {
success_rate = 0.5;
}

const edits = await make_edit(expansion, success_rate);
// Rest of the function, no other changes
}
}

Expand All @@ -95,3 +87,14 @@ async function root_main() {
}

root_main()

function adjust_temperature(was_successful) {
let current_temperature = temperature_setting.get_temperature();
if (was_successful) {
current_temperature *= 0.95;
} else {
current_temperature *= 1.05;
}
current_temperature = Math.max(0.2, Math.min(2.0, current_temperature));
temperature_setting.set_temperature(current_temperature);
}
13 changes: 8 additions & 5 deletions src/utils/apply_edits.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
const fs = require('fs');

function apply_edit(edits) {
if (edits && Array.isArray(edits)) {
edits.forEach((edit) => {
const { filename, contents } = edit;
function apply_edit(edits_with_confidence) {
if (edits_with_confidence && Array.isArray(edits_with_confidence)) {
// Sort edits in descending order by confidence score
const sorted_edits = edits_with_confidence.sort((a, b) => b.confidence - a.confidence);

sorted_edits.forEach((edit) => {
const { filename, contents, confidence } = edit;
if (filename && contents) {
fs.writeFileSync(filename, contents, 'utf-8');
console.log('Applied edit to:', filename);
console.log(`Applied edit to: ${filename} (Confidence: ${confidence})`);
}
});
}
Expand Down
12 changes: 9 additions & 3 deletions src/utils/preserve_history.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,13 @@
const fs = require('fs');

module.exports = (proposal, expanded, edits) => {
module.exports = (proposal, expanded, edits, successful_edits, unsuccessful_edits) => {
const history = JSON.parse(fs.readFileSync('./history.json'));
history.push({proposal, expanded, edits});
history.push({
proposal,
expanded,
edits,
successful_edits,
unsuccessful_edits
});
fs.writeFileSync('./history.json', JSON.stringify(history, null, 2))
}
}
12 changes: 12 additions & 0 deletions src/utils/summary.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
function display_summary(successful_edits, unsuccessful_edits) {
const total_edits = successful_edits + unsuccessful_edits;
const success_rate = (successful_edits / total_edits) * 100;

console.log('\n### Summary of Program Edits ###');
console.log(`Total Successful Edits: ${successful_edits}`);
console.log(`Total Unsuccessful Edits: ${unsuccessful_edits}`);
console.log(`Overall Success Rate: ${success_rate.toFixed(2)}%`);
console.log('###############################\n');
}

module.exports = display_summary;
11 changes: 11 additions & 0 deletions src/utils/temperature_setting.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
let temperature = 1.0;

function get_temperature() {
return temperature;
}

function set_temperature(new_temperature) {
temperature = new_temperature;
}

module.exports = { get_temperature, set_temperature };