subu4444/code-generation
3
1import json2import os3import shutil4import requests5 6import gradio as gr7from huggingface_hub import Repository8from text_generation import Client9 10HF_TOKEN = "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"11 12API_URL = "https://api-inference.huggingface.co/models/bigcode/starcoder"13API_URL_BASE ="https://api-inference.huggingface.co/models/bigcode/starcoderbase"14API_URL_PLUS = "https://api-inference.huggingface.co/models/bigcode/starcoderplus"15 16FIM_PREFIX = "<fim_prefix>"17FIM_MIDDLE = "<fim_middle>"18FIM_SUFFIX = "<fim_suffix>"19 20FIM_INDICATOR = "<FILL_HERE>"21 22FORMATS = """## Model Formats23 24The model is pretrained on code and is formatted with special tokens in addition to the pure code data,\25such as prefixes specifying the source of the file or tokens separating code from a commit message.\26Use these templates to explore the model's capacities:27 28### 1. Prefixes 🏷️29For pure code files, use any combination of the following prefixes:30 31```32<reponame>REPONAME<filename>FILENAME<gh_stars>STARS\ncode<|endoftext|>33```34STARS can be one of: 0, 1-10, 10-100, 100-1000, 1000+35 36### 2. Commits 💾37The commits data is formatted as follows:38 39```40<commit_before>code<commit_msg>text<commit_after>code<|endoftext|>41```42 43### 3. Jupyter Notebooks 📓44The model is trained on Jupyter notebooks as Python scripts and structured formats like:45 46```47<start_jupyter><jupyter_text>text<jupyter_code>code<jupyter_output>output<jupyter_text>48```49 50### 4. Issues 🐛51We also trained on GitHub issues using the following formatting:52```53<issue_start><issue_comment>text<issue_comment>...<issue_closed>54```55 56### 5. Fill-in-the-middle 🧩57Fill in the middle requires rearranging the model inputs. The playground handles this for you - all you need is to specify where to fill:58```59code before<FILL_HERE>code after60```61"""62 63theme = gr.themes.Monochrome(64 primary_hue="indigo",65 secondary_hue="blue",66 neutral_hue="slate",67 radius_size=gr.themes.sizes.radius_sm,68 font=[69 gr.themes.GoogleFont("Open Sans"),70 "ui-sans-serif",71 "system-ui",72 "sans-serif",73 ],74)75 76client = Client(77 API_URL,78 headers={"Authorization": f"Bearer {HF_TOKEN}"},79)80client_base = Client(81 API_URL_BASE, headers={"Authorization": f"Bearer {HF_TOKEN}"},82)83client_plus = Client(84 API_URL_PLUS, headers={"Authorization": f"Bearer {HF_TOKEN}"},85)86 87def generate(88 prompt, temperature=0.9, max_new_tokens=256, top_p=0.95, repetition_penalty=1.0, version="StarCoder",89):90 91 temperature = float(temperature)92 if temperature < 1e-2:93 temperature = 1e-294 top_p = float(top_p)95 fim_mode = False96 97 generate_kwargs = dict(98 temperature=temperature,99 max_new_tokens=max_new_tokens,100 top_p=top_p,101 repetition_penalty=repetition_penalty,102 do_sample=True,103 seed=42,104 )105 106 if FIM_INDICATOR in prompt:107 fim_mode = True108 try:109 prefix, suffix = prompt.split(FIM_INDICATOR)110 except:111 raise ValueError(f"Only one {FIM_INDICATOR} allowed in prompt!")112 prompt = f"{FIM_PREFIX}{prefix}{FIM_SUFFIX}{suffix}{FIM_MIDDLE}"113 114 if version == "StarCoder":115 stream = client.generate_stream(prompt, **generate_kwargs)116 elif version == "StarCoderPlus":117 stream = client_plus.generate_stream(prompt, **generate_kwargs)118 else:119 stream = client_base.generate_stream(prompt, **generate_kwargs)120 121 if fim_mode:122 output = prefix123 else:124 output = prompt125 126 previous_token = ""127 for response in stream:128 if response.token.text == "<|endoftext|>":129 if fim_mode:130 output += suffix131 else:132 return output133 else:134 output += response.token.text135 previous_token = response.token.text136 yield output137 return output138 139 140examples = [141 "X_train, y_train, X_test, y_test = train_test_split(X, y, test_size=0.1)\n\n# Train a logistic regression model, predict the labels on the test set and compute the accuracy score",142 "// Returns every other value in the array as a new array.\nfunction everyOther(arr) {",143 "Poor English: She no went to the market. Corrected English:",144 "def alternating(list1, list2):\n results = []\n for i in range(min(len(list1), len(list2))):\n results.append(list1[i])\n results.append(list2[i])\n if len(list1) > len(list2):\n <FILL_HERE>\n else:\n results.extend(list2[i+1:])\n return results",145]146 147 148def process_example(args):149 for x in generate(args):150 pass151 return x152 153 154css = ".generating {visibility: hidden}"155 156monospace_css = """157#q-input textarea {158 font-family: monospace, 'Consolas', Courier, monospace;159}160"""161 162 163css += monospace_css + ".gradio-container {color: black}"164 165 166description = """167<div style="text-align: center;">168 <h1> ⭐ StarCoder <span style='color: #e6b800;'>Models</span> Playground</h1>169</div>170<div style="text-align: left;">171 <p>This is a demo to generate text and code with the following StarCoder models:</p>172 <ul>173 <li><a href="https://huggingface.co/bigcode/starcoderplus" style='color: #e6b800;'>StarCoderPlus</a>: A finetuned version of StarCoderBase on English web data, making it strong in both English text and code generation.</li>174 <li><a href="https://huggingface.co/bigcode/starcoderbase" style='color: #e6b800;'>StarCoderBase</a>: A code generation model trained on 80+ programming languages, providing broad language coverage for code generation tasks.</li>175 <li><a href="https://huggingface.co/bigcode/starcoder" style='color: #e6b800;'>StarCoder</a>: A finetuned version of StarCoderBase specifically focused on Python, while also maintaining strong performance on other programming languages.</li>176 </ul>177 <p><b>Please note:</b> These models are not designed for instruction purposes. If you're looking for instruction or want to chat with a fine-tuned model, you can visit the <a href="https://huggingface.co/spaces/HuggingFaceH4/starchat-playground">StarChat Playground</a>.</p>178</div>179"""180disclaimer = """⚠️<b>Any use or sharing of this demo constitues your acceptance of the BigCode [OpenRAIL-M](https://huggingface.co/spaces/bigcode/bigcode-model-license-agreement) License Agreement and the use restrictions included within.</b>\181 <br>**Intended Use**: this app and its [supporting model](https://huggingface.co/bigcode) are provided for demonstration purposes; not to serve as replacement for human expertise. For more details on the model's limitations in terms of factuality and biases, see the [model card.](hf.co/bigcode)"""182 183with gr.Blocks(theme=theme, analytics_enabled=False, css=css) as demo:184 with gr.Column():185 gr.Markdown(description)186 with gr.Row():187 version = gr.Dropdown(188 ["StarCoderPlus", "StarCoderBase", "StarCoder"],189 value="StarCoder",190 label="Model",191 info="Choose a model from the list",192 )193 with gr.Row():194 with gr.Column():195 instruction = gr.Textbox(196 placeholder="Enter your code here",197 lines=5,198 label="Input",199 elem_id="q-input",200 )201 submit = gr.Button("Generate", variant="primary")202 output = gr.Code(elem_id="q-output", lines=30, label="Output")203 with gr.Row():204 with gr.Column():205 with gr.Accordion("Advanced settings", open=False):206 with gr.Row():207 column_1, column_2 = gr.Column(), gr.Column()208 with column_1:209 temperature = gr.Slider(210 label="Temperature",211 value=0.2,212 minimum=0.0,213 maximum=1.0,214 step=0.05,215 interactive=True,216 info="Higher values produce more diverse outputs",217 )218 max_new_tokens = gr.Slider(219 label="Max new tokens",220 value=256,221 minimum=0,222 maximum=8192,223 step=64,224 interactive=True,225 info="The maximum numbers of new tokens",226 )227 with column_2:228 top_p = gr.Slider(229 label="Top-p (nucleus sampling)",230 value=0.90,231 minimum=0.0,232 maximum=1,233 step=0.05,234 interactive=True,235 info="Higher values sample more low-probability tokens",236 )237 repetition_penalty = gr.Slider(238 label="Repetition penalty",239 value=1.2,240 minimum=1.0,241 maximum=2.0,242 step=0.05,243 interactive=True,244 info="Penalize repeated tokens",245 )246 247 gr.Markdown(disclaimer)248 with gr.Group(elem_id="share-btn-container"):249 share_button = gr.Button(250 "Share to community", elem_id="share-btn", visible=True251 )252 gr.Examples(253 examples=examples,254 inputs=[instruction],255 cache_examples=False,256 fn=process_example,257 outputs=[output],258 )259 gr.Markdown(FORMATS)260 261 submit.click(262 generate,263 inputs=[instruction, temperature, max_new_tokens, top_p, repetition_penalty, version],264 outputs=[output],265 )266demo.queue(concurrency_count=16).launch(debug=True)