Spaces:
Runtime error
Runtime error
docstrings in prompts!
Browse files
app.py
CHANGED
@@ -49,7 +49,7 @@ canvas {
|
|
49 |
<canvas id="canvas"></canvas>
|
50 |
<div class="playpause">▶</div>
|
51 |
</div>
|
52 |
-
|
53 |
</body>
|
54 |
<!--
|
55 |
for most samples webgl-utils only provides shader compiling/linking and
|
@@ -227,7 +227,7 @@ main();
|
|
227 |
|
228 |
def make_iframe(shader_code): #keep a single function?
|
229 |
script = make_script(shader_code)
|
230 |
-
return f"""<iframe width="640" height="
|
231 |
|
232 |
|
233 |
intro_text = """
|
@@ -266,10 +266,11 @@ outro_text ="""
|
|
266 |
- [x] generate whole functions (seems to work quite well)
|
267 |
- [] dropdown for model selection (from curated list or all supported models?)
|
268 |
- [] generation history stating which function and orig/generated returns. (use State ??). do it as comments in the code?
|
269 |
-
- [] display errros/issues to the user (raise gr.Error could be one idea, but highlighting in the code would be awesome)
|
270 |
- [] generate whole shaders (via prompts guidance, recursive from errors)
|
271 |
- [] accordion with generation parameters (as pipeline_kwargs?) look up starcoder playround and take "inspiration" from there
|
272 |
- [] support FIM task for better model context
|
|
|
273 |
- [] gradio examples
|
274 |
|
275 |
### Notes:
|
@@ -310,10 +311,11 @@ def grab_sample(sample_idx):
|
|
310 |
def _parse_functions(in_code):
|
311 |
"""
|
312 |
returns all functions in the code as their actual nodes.
|
313 |
-
|
314 |
"""
|
315 |
tree = parser.parse(bytes(in_code, "utf8"))
|
316 |
funcs = [n for n in tree.root_node.children if n.type == "function_definition"]
|
|
|
317 |
return funcs
|
318 |
|
319 |
PIPE = None
|
@@ -411,12 +413,18 @@ def alter_body(old_code, func_id: str, funcs_list: list, pipeline=PIPE):
|
|
411 |
pipeline = _make_pipeline("Vipitis/santacoder-finetuned-Shadertoys-fine")
|
412 |
|
413 |
func_start_idx = _line_chr2char(old_code, func_node.start_point[0], func_node.start_point[1])
|
414 |
-
identifier_str = func_node.child_by_field_name("type").text.decode() + " " + func_node.child_by_field_name("declarator").text.decode()
|
415 |
body_node = func_node.child_by_field_name("body")
|
416 |
body_start_idx = _line_chr2char(old_code, body_node.start_point[0], body_node.start_point[1])
|
417 |
body_end_idx = _line_chr2char(old_code, body_node.end_point[0], body_node.end_point[1])
|
418 |
print(f"{old_code[body_start_idx:body_end_idx]=}")
|
419 |
-
model_context = identifier_str #
|
|
|
|
|
|
|
|
|
|
|
|
|
420 |
num_new_tokens = max(160,(body_end_idx - body_start_idx) + 10) #TODO: approximation, we do have early stopping? maybe also use a number instead? HARD MAX for performance limits.
|
421 |
|
422 |
print(f"generating up to {num_new_tokens} after {model_context!r}")
|
@@ -429,13 +437,13 @@ def alter_body(old_code, func_id: str, funcs_list: list, pipeline=PIPE):
|
|
429 |
first_gened_func = _parse_functions(id_with_generation)[0] # truncate generation to a single function?
|
430 |
except IndexError:
|
431 |
print("generation wasn't a full function.")
|
432 |
-
altered_code = old_code[:
|
433 |
return altered_code, pipeline
|
434 |
# raise gr.Error(f"didn't generate a full function: {generation!r}]")
|
435 |
print(f"{first_gened_func=}")
|
436 |
generated_body = first_gened_func.child_by_field_name("body").text.decode()
|
437 |
print(f"{generated_body=}")
|
438 |
-
altered_code = old_code[:
|
439 |
return altered_code, pipeline
|
440 |
|
441 |
def add_history(func_id, orig_rtn, gened_rtn, history):
|
|
|
49 |
<canvas id="canvas"></canvas>
|
50 |
<div class="playpause">▶</div>
|
51 |
</div>
|
52 |
+
\nblank canvas here indicates that some of the shadertoy specific functions are not yet supported with this implementation (like #define I believe). you can always copy and paste the code into a shadertoy.com window to try.
|
53 |
</body>
|
54 |
<!--
|
55 |
for most samples webgl-utils only provides shader compiling/linking and
|
|
|
227 |
|
228 |
def make_iframe(shader_code): #keep a single function?
|
229 |
script = make_script(shader_code)
|
230 |
+
return f"""<iframe width="640" height="420" srcdoc=\'{script}\' allowfullscreen></iframe>"""
|
231 |
|
232 |
|
233 |
intro_text = """
|
|
|
266 |
- [x] generate whole functions (seems to work quite well)
|
267 |
- [] dropdown for model selection (from curated list or all supported models?)
|
268 |
- [] generation history stating which function and orig/generated returns. (use State ??). do it as comments in the code?
|
269 |
+
- [~] display errros/issues to the user (raise gr.Error could be one idea, but highlighting in the code would be awesome) currently adds a comment to the code.
|
270 |
- [] generate whole shaders (via prompts guidance, recursive from errors)
|
271 |
- [] accordion with generation parameters (as pipeline_kwargs?) look up starcoder playround and take "inspiration" from there
|
272 |
- [] support FIM task for better model context
|
273 |
+
- [~] include some context for prompt (title, comments before a functions) - now works with the first comment inside a function body (has to be first)
|
274 |
- [] gradio examples
|
275 |
|
276 |
### Notes:
|
|
|
311 |
def _parse_functions(in_code):
|
312 |
"""
|
313 |
returns all functions in the code as their actual nodes.
|
314 |
+
includes any comment made directly after the function definition or diretly after #copilot trigger
|
315 |
"""
|
316 |
tree = parser.parse(bytes(in_code, "utf8"))
|
317 |
funcs = [n for n in tree.root_node.children if n.type == "function_definition"]
|
318 |
+
|
319 |
return funcs
|
320 |
|
321 |
PIPE = None
|
|
|
413 |
pipeline = _make_pipeline("Vipitis/santacoder-finetuned-Shadertoys-fine")
|
414 |
|
415 |
func_start_idx = _line_chr2char(old_code, func_node.start_point[0], func_node.start_point[1])
|
416 |
+
identifier_str = func_node.child_by_field_name("type").text.decode() + " " + func_node.child_by_field_name("declarator").text.decode() #func_start_idx:body_start_idx?
|
417 |
body_node = func_node.child_by_field_name("body")
|
418 |
body_start_idx = _line_chr2char(old_code, body_node.start_point[0], body_node.start_point[1])
|
419 |
body_end_idx = _line_chr2char(old_code, body_node.end_point[0], body_node.end_point[1])
|
420 |
print(f"{old_code[body_start_idx:body_end_idx]=}")
|
421 |
+
model_context = identifier_str # base case
|
422 |
+
# add any comments at the beginning of the function to the model_context
|
423 |
+
second_child = func_node.child_by_field_name("body").children[1] #might error out?
|
424 |
+
if second_child.type == "comment":
|
425 |
+
# print(second_child.text.decode())
|
426 |
+
model_context += second_child.text.decode()
|
427 |
+
print(f"{model_context=}")
|
428 |
num_new_tokens = max(160,(body_end_idx - body_start_idx) + 10) #TODO: approximation, we do have early stopping? maybe also use a number instead? HARD MAX for performance limits.
|
429 |
|
430 |
print(f"generating up to {num_new_tokens} after {model_context!r}")
|
|
|
437 |
first_gened_func = _parse_functions(id_with_generation)[0] # truncate generation to a single function?
|
438 |
except IndexError:
|
439 |
print("generation wasn't a full function.")
|
440 |
+
altered_code = old_code[:func_start_idx] + model_context + generation + "//the generation didn't complete the function!\n" + old_code[body_end_idx:] #needs a newline to break out of the comment.
|
441 |
return altered_code, pipeline
|
442 |
# raise gr.Error(f"didn't generate a full function: {generation!r}]")
|
443 |
print(f"{first_gened_func=}")
|
444 |
generated_body = first_gened_func.child_by_field_name("body").text.decode()
|
445 |
print(f"{generated_body=}")
|
446 |
+
altered_code = old_code[:func_start_idx] + model_context + generated_body + old_code[body_end_idx:]
|
447 |
return altered_code, pipeline
|
448 |
|
449 |
def add_history(func_id, orig_rtn, gened_rtn, history):
|