Spaces:
Running
Running
| <html> | |
| <head> | |
| <meta charset="utf-8"/> | |
| <meta name="viewport" contents="width=device-width, initial-scale=1.0" /> | |
| <title>InCoder</title> | |
| <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script> | |
| <script src="https://cdn.jsdelivr.net/npm/js-base64@3.7.2/base64.min.js"></script> | |
| <script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.4.14/ace.min.js"></script> | |
| <script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.4.14/mode-plain_text.min.js"></script> | |
| <script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.4.14/mode-c_cpp.min.js"></script> | |
| <script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.4.14/mode-csharp.min.js"></script> | |
| <script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.4.14/mode-clojure.min.js"></script> | |
| <script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.4.14/mode-coffee.min.js"></script> | |
| <script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.4.14/mode-golang.min.js"></script> | |
| <script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.4.14/mode-haskell.min.js"></script> | |
| <script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.4.14/mode-python.min.js"></script> | |
| <script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.4.14/mode-java.min.js"></script> | |
| <script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.4.14/mode-javascript.min.js"></script> | |
| <script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.4.14/mode-lua.min.js"></script> | |
| <script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.4.14/mode-objectivec.min.js"></script> | |
| <script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.4.14/mode-perl.min.js"></script> | |
| <script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.4.14/mode-php.min.js"></script> | |
| <script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.4.14/mode-python.min.js"></script> | |
| <script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.4.14/mode-ruby.min.js"></script> | |
| <script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.4.14/mode-rust.min.js"></script> | |
| <script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.4.14/mode-scala.min.js"></script> | |
| <script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.4.14/mode-sh.min.js"></script> | |
| <script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.4.14/mode-swift.min.js"></script> | |
| <script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.4.14/mode-typescript.min.js"></script> | |
| <link rel="stylesheet" href="static/style.css"> | |
| </head> | |
| <style type="text/css"> | |
| /* body { | |
| font-family: sans-serif; | |
| } */ | |
| /* .leftside { | |
| } */ | |
| main { | |
| max-width: 80rem; | |
| } | |
| .rightside { | |
| width: 30em; | |
| } | |
| .submit-holder { | |
| margin-top: 2em; | |
| } | |
| .submit input { | |
| font-size: 16pt; | |
| } | |
| .slider { | |
| width: 20em; | |
| } | |
| #faq { | |
| max-width: 60em; | |
| } | |
| #result { | |
| font-family: monospace; | |
| white-space: pre-wrap; | |
| word-wrap: break-word; | |
| font-size: 12pt; | |
| clear: both; | |
| margin-top: 1em; | |
| border: 1px solid black; | |
| padding: 1em; | |
| width: 60em; | |
| min-height: 12em; | |
| } | |
| #prompt { | |
| font-weight: bold; | |
| } | |
| .loader { | |
| border: 4px solid #f3f3f3; | |
| border-radius: 50%; | |
| border-top: 4px solid #3498db; | |
| width: 30px; | |
| height: 30px; | |
| animation: spin 2s linear infinite; | |
| margin-right: 1em; | |
| } | |
| @keyframes spin { | |
| 0% { transform: rotate(0deg); } | |
| 100% { transform: rotate(360deg); } | |
| } | |
| #loader_holder { | |
| visibility: hidden; | |
| display: flex; | |
| align-items: center; | |
| } | |
| label { | |
| margin-top: 1em; | |
| display: inline-elock; | |
| width: 10em; | |
| text-align: right; | |
| font-size: 80%; | |
| } | |
| #loader_holder_super { | |
| } | |
| #error { | |
| color: red; | |
| width: 100%; | |
| } | |
| #warning { | |
| color: darkorange; | |
| width: 100%; | |
| } | |
| #examples span { | |
| margin-right: 1em; | |
| } | |
| #editor { | |
| position: relative; | |
| width: 100%; | |
| height: 400px; | |
| } | |
| #editor-holder { | |
| position: relative; | |
| width: 100%; | |
| height: 400px; | |
| } | |
| .ace_infill { | |
| color: red; | |
| } | |
| </style> | |
| <body> | |
| <main> | |
| <div class="card" id="about"> | |
| <div class="header"> <h1>StarCoder Playground</h1> </div> | |
| <p>Select one of the examples below, or input your own code into the editor. You can type <infill> to mark a location you want the model to insert code at.</p> | |
| <p>Click "Extend" to append text at the end of the editor. Click "Infill" to replace all <infill> masks. (Click "Add <infill> mask" to add a mask at the cursor or replace the current selection.) </p> | |
| </div> | |
| <div class="card" id="examples"> | |
| <div id="examples-extend"> | |
| <span class="softspan">Extend Examples:</span> | |
| <br> | |
| <span class="softspan"><a href='javascript:select_example("hello-world");'>Hello World</a></span> | |
| <span class="softspan"><a href='javascript:select_example("fibonacci");'>Fibonacci</a></span> | |
| <span class="softspan"><a href='javascript:select_example("typing");'>Typing</a></span> | |
| <span class="softspan"><a href='javascript:select_example("complex-numbers");'>Complex Numbers</a></span> | |
| </div> | |
| <div id="examples-infill"> | |
| <span class="softspan">Infill Examples:</span> | |
| <br> | |
| <span class="softspan"><a href='javascript:select_example("type-pred");'>Type Prediction</a></span> | |
| <span class="softspan"><a href='javascript:select_example("docstring-1");'>Docstring 1</a></span> | |
| <span class="softspan"><a href='javascript:select_example("docstring-2");'>Docstring 1</a></span> | |
| </div> | |
| </div> | |
| <div class="card" id="controls"> | |
| <div> | |
| <label>Num Tokens:</label> | |
| <input type="range" value="64" min="16" max="256" step="16" class="slider" | |
| oninput="this.nextElementSibling.value = this.value" name="length" id='length_slider'> | |
| <output class='a' id="length_slider_output">64</output> | |
| </div> | |
| <div> | |
| <label>Temperature:</label> | |
| <input type="range" value="0.6" min="0.1" max="1.0" step="0.10" class="slider" | |
| oninput="this.nextElementSibling.value = this.value" name="temp" id='temp_slider'> | |
| <output class='a' id="temp_slider_output">0.6</output> | |
| </div> | |
| <div id="buttons"> | |
| <br> | |
| <input type="button" value="Extend" id="extend-form-button" /> | |
| <input type="button" value="Infill" id="infill-form-button" /> | |
| <br> | |
| <br> | |
| <input type="button" value="Add <infill> mask" id="insert-mask-button" title="add the infill marker at cursor or selection" /> | |
| </div> | |
| </div> | |
| <div id="edit-container" class="card"> | |
| <div id="syntax"> | |
| <span class="softspan">Syntax:</span> | |
| <select name="mode" id="mode"> | |
| <option value="text">Text</option> | |
| <option value="c_cpp">C/C++</option> | |
| <option value="csharp">C#</option> | |
| <option value="clojure">Clojure</option> | |
| <option value="coffee">CoffeeScript</option> | |
| <option value="golang">Go</option> | |
| <option value="haskell">Haskell</option> | |
| <option value="java">Java</option> | |
| <option value="javascript">JavaScript</option> | |
| <option value="lua">Lua</option> | |
| <option value="objectivec">Objective C</option> | |
| <option value="perl">Perl</option> | |
| <option value="php">PHP</option> | |
| <option value="python">Python</option> | |
| <option value="ruby">Ruby</option> | |
| <option value="rust">Rust</option> | |
| <option value="scala">Scala</option> | |
| <option value="sh">Shell</option> | |
| <option value="swift">Swift</option> | |
| <option value="typescript">Typescript</option> | |
| </select> | |
| </div> | |
| <div id="editor"></div> | |
| </div> | |
| <div id="loader_holder_super" class="card"> | |
| <h1>Messages</h1> | |
| <div id="error"></div> | |
| <div id="warning"></div> | |
| <div id="loader_holder"> | |
| <div class="loader"></div> | |
| <div> | |
| Generation queued, please wait... | |
| </div> | |
| </div> | |
| </div> | |
| <div id="info" class="card"> | |
| <h1 id="debug-info">More Info</h3> | |
| </div> | |
| </main> | |
| <script type="text/javascript"> | |
| // these constants are only used for providing user expectations. | |
| var OVERHEAD = 3; | |
| var PER_TOKEN = 0.12; | |
| var SPLIT_TOKEN = "<infill>" | |
| var Range = require("ace/range").Range; | |
| // examples for the user | |
| var EXAMPLES = { | |
| "type-pred": { | |
| "prompt": | |
| `def count_words(filename: str) -> <infill> | |
| """Count the number of occurrences of each word in the file.""" | |
| with open(filename, 'r') as f: | |
| word_counts = {} | |
| for line in f: | |
| for word in line.split(): | |
| if word in word_counts: | |
| word_counts[word] = 1 | |
| else: | |
| word_counts[word] = 1 | |
| return word_counts | |
| `, | |
| "length": 4, | |
| "temperature": 0.2, | |
| "mode": "python" | |
| }, | |
| "docstring-1": { | |
| "prompt": | |
| `def _minimize_in_graph(build_loss_fn, num_steps=200, optimizer=None): | |
| """ | |
| <infill> | |
| """ | |
| optimizer = tf.compat.v1.train.AdamOptimizer( | |
| 0.1) if optimizer is None else optimizer | |
| def train_loop_body(step): | |
| train_op = optimizer.minimize( | |
| build_loss_fn if tf.executing_eagerly() else build_loss_fn()) | |
| return tf.tuple(tensors=[tf.add(step, 1)], control_inputs=[train_op]) | |
| minimize_op = tf.compat.v1.while_loop( | |
| cond=lambda step: step < num_steps, | |
| body=train_loop_body, | |
| loop_vars=[tf.constant(0)], | |
| return_same_structure=True)[0] | |
| return minimize_op`, | |
| "length": 64, | |
| "temperature": 0.3, | |
| "mode": "python", | |
| }, | |
| "docstring-2": { | |
| "prompt": | |
| `def count_words(filename: str) -> Dict[str, int]: | |
| """<infill> | |
| """ | |
| with open(filename, 'r') as f: | |
| word_counts = {} | |
| for line in f: | |
| for word in line.split(): | |
| if word in word_counts: | |
| word_counts[word] = 1 | |
| else: | |
| word_counts[word] = 1 | |
| return word_counts | |
| `, | |
| "length": 32, | |
| "temperature": 0.2, | |
| "mode": "python" | |
| }, | |
| // extend examples | |
| "hello-world": { | |
| "prompt": "def print_hello_world():", | |
| "length": 64, | |
| "temperature": 0.2, | |
| "mode": "python" | |
| }, | |
| "fibonacci": { | |
| "prompt": | |
| `def fibonacci(n: int) -> int: | |
| """ Compute the n-th Fibonacci number. """`, | |
| "temperature": 0.2, | |
| "length": 64, | |
| "mode": "python" | |
| }, | |
| "typing": { | |
| "prompt": | |
| `from typing import List, Tuple | |
| def sum_and_product(numbers: List[int]) -> Tuple[int, int]: | |
| """ Return the sum and the product of the integers in the list as a tuple. Here is the answer of the exercise"""`, | |
| "temperature": 0.2, | |
| "length": 64, | |
| "mode": "python" | |
| }, | |
| "complex-numbers": { | |
| "prompt": | |
| `class ComplexNumbers:`, | |
| "temperature": 0.2, | |
| "length": 128, | |
| "mode": "python" | |
| } | |
| }; | |
| var editor = ace.edit("editor"); | |
| editor.setOption("wrap", true); | |
| //var editor = null; | |
| function set_editor_mode(mode) { | |
| session = editor.session | |
| session.setMode("ace/mode/" + mode, function() { | |
| var rules = session.$mode.$highlightRules.getRules(); | |
| for (var stateName in rules) { | |
| if (Object.prototype.hasOwnProperty.call(rules, stateName)) { | |
| rules[stateName].unshift({ | |
| token: 'infill', | |
| regex: SPLIT_TOKEN | |
| }); | |
| } | |
| } | |
| // force recreation of tokenizer | |
| session.$mode.$tokenizer = null; | |
| session.bgTokenizer.setTokenizer(session.$mode.getTokenizer()); | |
| // force re-highlight whole document | |
| session.bgTokenizer.start(0); | |
| }); | |
| } | |
| /* | |
| var textarea = $('textarea[name="prompt"]').hide(); | |
| var prefix_textarea = $('textarea[name="prefix"]').hide(); | |
| var suffix_textarea = $('textarea[name="suffix"]').hide(); | |
| editor.getSession().on('change', function () { | |
| textarea.val(editor.getSession().getValue()); | |
| }); | |
| */ | |
| function set_text(text) { | |
| editor.getSession().setValue(text); | |
| // textarea.val(text); | |
| } | |
| function set_selection(data) { | |
| var lines = editor.getSession().doc.$lines; | |
| var lines_flat = join_lines(lines); | |
| if (data['type'] == 'generate') { | |
| doc_length = lines_flat.length; | |
| var start = convert_string_index_to_location(data['prompt'].length, lines); | |
| var end = convert_string_index_to_location(doc_length, lines); | |
| // reverse this so that we can shift select to shorten and delete extra stuff | |
| editor.selection.setRange(new Range(end.row, end.column, start.row, start.column)); | |
| } else if (data['type'] == 'infill') { | |
| var length_so_far = 0; | |
| for (var i = 0; i < data['infills'].length; i++) { | |
| var prefix = data['parts'][i]; | |
| var suffix = data['parts'][i+1]; | |
| var infilled = data['infills'][i]; | |
| var start = convert_string_index_to_location(length_so_far + prefix.length, lines); | |
| var end = convert_string_index_to_location(length_so_far + (prefix + infilled).length, lines); | |
| var range = null; | |
| if (data['infills'].length == 1) { | |
| range = new Range(end.row, end.column, start.row, start.column) | |
| } else { | |
| range = new Range(start.row, start.column, end.row, end.column) | |
| } | |
| if (i == 0) { | |
| editor.selection.setRange(range); | |
| } else { | |
| editor.selection.addRange(range); | |
| } | |
| length_so_far += (prefix + infilled).length; | |
| } | |
| } | |
| editor.focus(); | |
| } | |
| function select_example(name) { | |
| $("#length_slider").val(EXAMPLES[name]["length"]); | |
| $("#length_slider_output").text(EXAMPLES[name]["length"]); | |
| $("#temp_slider").val(EXAMPLES[name]["temperature"]); | |
| $("#temp_slider_output").text(EXAMPLES[name]["temperature"]); | |
| set_text(EXAMPLES[name]["prompt"]) | |
| var mode = EXAMPLES[name]["mode"]; | |
| set_editor_mode(mode); | |
| $("#mode").val(mode).change(); | |
| } | |
| function newline_character() { | |
| return editor.getSession().doc.getNewLineCharacter(); | |
| } | |
| function join_lines(lines) { | |
| return lines.join(newline_character()); | |
| } | |
| function get_prefix(location, lines) { | |
| if (!(location.hasOwnProperty('row') && location.hasOwnProperty('column'))) { | |
| console.error("invalid location " + location); | |
| } | |
| if (location.row == 0) { | |
| return lines[location.row].substring(0, location.column); | |
| } else { | |
| return join_lines(lines.slice(0, location.row)) + newline_character() + lines[location.row].substring(0, location.column); | |
| } | |
| } | |
| function convert_location_to_string_index(location, lines) { | |
| return get_prefix(location, lines).length; | |
| } | |
| function convert_string_index_to_location(string_index, lines) { | |
| var column = 0; | |
| var row = 0; | |
| var char_count = 0; | |
| var line_sep_length = editor.getSession().doc.getNewLineCharacter().length; | |
| for (var i = 0; i < lines.length; i++) { | |
| var line = lines[i]; | |
| var new_char_count = char_count + line.length + line_sep_length; | |
| if (string_index < new_char_count) { | |
| return { | |
| 'row': i, | |
| 'column': string_index - char_count, | |
| } | |
| } | |
| char_count = new_char_count; | |
| } | |
| console.error("did not find index " + string_index + " in lines " + lines); | |
| return null; | |
| } | |
| function get_infill_parts(warn_on_single) { | |
| var lines = editor.getSession().doc.$lines; | |
| var lines_flat = join_lines(lines); | |
| parts = lines_flat.split(SPLIT_TOKEN) | |
| if (warn_on_single && parts.length == 1) { | |
| window.alert('There are no infill masks, add some <infill> masks before requesting an infill') | |
| } | |
| return parts | |
| } | |
| function insert_mask() { | |
| if (editor.selection.ranges.length > 1) { | |
| for (var i = 0; i < editor.selection.ranges.length; i++) { | |
| console.log('range is', editor.selection.ranges[i]) | |
| editor.session.replace(editor.selection.ranges[i], SPLIT_TOKEN) | |
| } | |
| } else { | |
| editor.session.replace(editor.selection.getRange(), SPLIT_TOKEN) | |
| } | |
| } | |
| function make_generate_listener(url) { | |
| return async function(event) { | |
| var length = $("#length_slider").val(); | |
| var eta = PER_TOKEN * length + OVERHEAD; | |
| // $("#eta").text(eta); | |
| // $("#infill-form-button").click(function (event) { console.log(editor.selection.getCursor()); }); | |
| // get temperature and response length parameters | |
| var send_data = { | |
| length: $("#length_slider").val(), | |
| temperature: $("#temp_slider").val(), | |
| extra_sentinel: $('#extra_sentinel_checkbox').is(":checked"), | |
| max_retries: $('#max_retries_slider').val(), | |
| parts: get_infill_parts(url == "infill"), | |
| prompt: editor.getSession().getValue(), | |
| } | |
| console.log("send_data:"); | |
| console.log(send_data); | |
| $("#loader_holder").css("visibility", "visible"); | |
| $("#extend-form-button").prop("disabled", true); | |
| $("#infill-form-button").prop("disabled", true); | |
| $("#error").text(""); | |
| function complete() { | |
| $("#loader_holder").css("visibility", "hidden"); | |
| $("#extend-form-button").prop("disabled", false); | |
| $("#infill-form-button").prop("disabled", false); | |
| } | |
| function success(receive_data) { | |
| console.log("Response:"); | |
| console.log(receive_data); | |
| if (receive_data["result"] == "success") { | |
| console.log("success"); | |
| // $("#prompt").text(data["prompt"]); | |
| // $("#response").text(data["text"]); | |
| set_text(receive_data["text"]); | |
| set_selection(receive_data); | |
| $("#error").text(""); | |
| if (receive_data["message"] != "") { | |
| $("#warning").text(receive_data["message"]); | |
| } else { | |
| $("#warning").text(""); | |
| } | |
| } else { | |
| console.log("error"); | |
| set_text(receive_data["text"]) | |
| $("#error").text(receive_data["message"]); | |
| } | |
| } | |
| function error(err) { | |
| console.log(err); | |
| $("#error").text(err); | |
| } | |
| try { | |
| var stringified = JSON.stringify(send_data); | |
| // var encoded_data = encodeURIComponent(btoa(stringified)); | |
| var encoded_data = Base64.encodeURI(stringified); | |
| const response = await fetch(`${url}?info=${encoded_data}`); | |
| // const response = await fetch(`${url}` { | |
| // method: 'GET', | |
| // body: encoded_data, | |
| // }); | |
| if (response.status >= 400) { | |
| error(response.statusText); | |
| console.log("here"); | |
| console.log(response.status); | |
| } else { | |
| response.json().then(success).catch(error).finally(complete); | |
| } | |
| } catch (e) { | |
| error(e); | |
| } finally { | |
| complete(); | |
| } | |
| } | |
| } | |
| // actual logic | |
| $(document).ready(function() { | |
| $("#insert-mask-button").click(insert_mask); | |
| $("#extend-form-button").click(make_generate_listener("generate")); | |
| $("#infill-form-button").click(make_generate_listener("infill")); | |
| $("#mode").change(function (e) { | |
| var mode = $("#mode").val(); | |
| set_editor_mode(mode); | |
| }); | |
| select_example("python") | |
| // set_editor_mode("python"); | |
| }); | |
| </script> | |
| <script src="https://cdnjs.cloudflare.com/ajax/libs/iframe-resizer/4.3.2/iframeResizer.contentWindow.min.js"></script> | |
| </body> | |
| </html> | |