from huggingface_hub import InferenceClient, HfApi, HfFileSystem import gradio as gr import requests import random import prompts import uuid import json import re import os fs = HfFileSystem() loc_folder="chat_history" loc_file="chat_json" user_="community-pool/" repo_="test3" clients = [ {'type':'image','name':'black-forest-labs/FLUX.1-dev','rank':'op','max_tokens':16384,'schema':{'bos':'<|im_start|>','eos':'<|im_end|>'}}, {'type':'text','name':'deepseek-ai/DeepSeek-V2.5-1210','rank':'op','max_tokens':16384,'schema':{'bos':'<|im_start|>','eos':'<|im_end|>'}}, {'type':'text','name':'Qwen/Qwen2.5-Coder-32B-Instruct','rank':'op','max_tokens':32768,'schema':{'bos':'<|im_start|>','eos':'<|im_end|>'}}, {'type':'text','name':'meta-llama/Meta-Llama-3-8B','rank':'op','max_tokens':32768,'schema':{'bos':'<|im_start|>','eos':'<|im_end|>'}}, {'type':'text','name':'Snowflake/snowflake-arctic-embed-l-v2.0','rank':'op','max_tokens':4096,'schema':{'bos':'<|im_start|>','eos':'<|im_end|>'}}, {'type':'text','name':'Snowflake/snowflake-arctic-embed-m-v2.0','rank':'op','max_tokens':4096,'schema':{'bos':'<|im_start|>','eos':'<|im_end|>'}}, {'type':'text','name':'HuggingFaceTB/SmolLM2-1.7B-Instruct','rank':'op','max_tokens':4096,'schema':{'bos':'<|im_start|>','eos':'<|im_end|>'}}, {'type':'text','name':'Qwen/QwQ-32B-Preview','rank':'op','max_tokens':16384,'schema':{'bos':'<|im_start|>','eos':'<|im_end|>'}}, {'type':'text','name':'meta-llama/Llama-3.3-70B-Instruct','rank':'pro','max_tokens':16384,'schema':{'bos':'<|im_start|>','eos':'<|im_end|>'}}, {'type':'text','name':'mistralai/Mixtral-8x7B-Instruct-v0.1','rank':'op','max_tokens':40000,'schema':{'bos':'','eos':''}}, ] def file_template(inp): if "readme.md" in inp.lower(): template=prompts.README else:template="NONE" return template def format_prompt(message, mod, system): eos=f"{clients[int(mod)]['schema']['eos']}\n" bos=f"{clients[int(mod)]['schema']['bos']}\n" prompt="" prompt+=bos prompt+=system prompt+=eos prompt+=bos prompt += f"[INST] {message} [/INST]" prompt+=eos prompt+=bos return prompt def generate(prompt,history,mod=2,tok=4000,seed=1,role="ASSISTANT",data=None): #print("#####",history,"######") gen_images=False client=InferenceClient(clients[int(mod)]['name']) client_tok=clients[int(mod)]['max_tokens'] good_seed=[947385642222,7482965345792,8584806344673] if not os.path.isdir(loc_folder):os.mkdir(loc_folder) if os.path.isfile(f'{loc_folder}/{loc_file}.json'): with open(f'{loc_folder}/{loc_file}.json','r') as word_dict: lod=json.loads(word_dict.read()) word_dict.close() else: lod=[] if role == "MANAGER": system_prompt = prompts.MANAGER.replace("**TIMELINE**",data[4]).replace("**HISTORY**",str(history)) formatted_prompt = format_prompt(prompt, mod, system_prompt) elif role == "PATHMAKER": system_prompt = prompts.PATH_MAKER.replace("**FILE_LIST**",str(data[3])).replace("**CURRENT_OR_NONE**",str(data[4])).replace("**PROMPT**",json.dumps(data[0],indent=4)).replace("**HISTORY**",str(history)) formatted_prompt = format_prompt(prompt, mod, system_prompt) elif role == "CREATE_FILE": system_prompt = prompts.CREATE_FILE.replace("**FILE_LIST**",str(data[3])).replace("**TIMELINE**",data[4]).replace("**FILENAME**",str(data[1])).replace("**TEMPLATE_OR_NONE**",str(data[2])) formatted_prompt = format_prompt(prompt, mod, system_prompt) elif role == "SEARCH": system_prompt = prompts.SEARCH.replace("**DATA**",data) formatted_prompt = format_prompt(f'USER:{prompt}', mod, system_prompt) else: system_prompt = "";formatted_prompt = format_prompt(f'USER:{prompt}', mod, system_prompt) if tok==None:tok=client_tok-len(formatted_prompt)+10 print("tok",tok) generate_kwargs = dict( temperature=0.9, max_new_tokens=tok, #total tokens - input tokens top_p=0.99, repetition_penalty=1.0, do_sample=True, seed=seed, ) output = "" if role=="MANAGER": print("Running Manager") stream = client.text_generation(formatted_prompt, **generate_kwargs, stream=True, details=True, return_full_text=True) for response in stream: output += response.token.text yield output yield history yield prompt elif role=="PATHMAKER": print("Runnning ", role) stream = client.text_generation(formatted_prompt, **generate_kwargs, stream=True, details=True, return_full_text=True) #prompt=f"We just completed role:{role}, now choose the next tool to complete the task:{prompt}, or COMPLETE" for response in stream: output += response.token.text print(output) yield output yield history yield prompt elif role=="CREATE_FILE": print("Running Create File") stream = client.text_generation(formatted_prompt, **generate_kwargs, stream=True, details=True, return_full_text=True) for response in stream: output += response.token.text #print(file_content) print(output) yield 'test1' yield data[1] yield output def parse_json(inp): print("PARSE INPUT") print(inp) if type(inp)==type(""): lines="" if "```" in inp: start = inp.find("```json") + 7 end = inp.find("```", start) if start >= 0 and end >= 0: inp= inp[start:end] else: inp="NONE" print("Extracted Lines") print(inp) try: out_json=eval(inp) out1=str(out_json['filename']) out2=str(out_json['filecontent']) return out1,out2 except Exception as e: print(e) return "None","None" if type(inp)==type({}): out1=str(inp['filename']) out2=str(inp['filecontent']) return out1,out2 def build_space(repo_name,file_name,file_content,access_token=""): try: repo_path=user_+str(repo_) if not access_token: #access_token=os.environ['HF_TOKEN'] return [{'role':'assistant','content': 'ENTER A HUGGINGFACE TOKEN'}] api=HfApi(endpoint="https://huggingface.co", token=access_token) repo_url = api.create_repo( repo_id=repo_path, repo_type="space", space_sdk="gradio", exist_ok=True, private=False, ) local_file_path=str(uuid.uuid4()) with open(local_file_path, 'w') as f: f.write(str(file_content)) f.close() # Upload a local file to the Space commit_message = "Adding file test: "+ str(file_name) api.upload_file(path_or_fileobj=local_file_path, path_in_repo=file_name, repo_id=repo_path, repo_type='space', commit_message=commit_message) print("File uploaded successfully.") # Commit changes commit_message += "\nInitial commit to the repository."+ f'{repo_path}/' + f'{file_name}' #api.commit_repo(space_id, message=commit_message) return [{'role':'assistant','content': commit_message+'\nCommit Success' }] except Exception as e: print("ERROR ",e) return [{'role':'assistant','content': 'There was an Error: ' + str(e)}] def agent(prompt_in,history,mod=2,tok_in=""): print(prompt_in) print('mod ',mod) in_data=[None,None,None,None,None,] #in_data[0]=prompt_in['text'] in_data[0]=prompt_in prompt=prompt_in fn="" com="" go=True MAX_DATA=int(clients[int(mod)]['max_tokens'])*2 if not history:history=[{'role':'user','content':prompt_in['text']}] while go == True: try: file_list = fs.ls(f'spaces/{user_}{repo_}',detail=False) except Exception as e: print(e) file_list=["NO FILES YET"] print('file list\n',file_list) seed = random.randint(1,9999999999999) c=0 #history = [history[-4:]] if len(str(history)) > MAX_DATA*4: history = [history[-2:]] print('history',history) role="PATHMAKER" in_data[3]=file_list outph= list(generate(prompt,history,mod,2400,seed,role,in_data))[0] in_data[4]=outph print(outph) history.extend([{'role':'assistant','content':str(outph)}]) yield history role="MANAGER" outp=generate(prompt,history,mod,128,seed,role,in_data) outp0=list(outp)[0].split('<|im_end|>')[0] #outp0 = re.sub('[^a-zA-Z0-9\s.,?!%()]', '', outpp) history.extend([{'role':'assistant','content':str(outp0)}]) yield history for line in outp0.split("\n"): if "action:" in line: try: com_line = line.split('action:')[1] fn = com_line.split('action_input=')[0] com = com_line.split('action_input=')[1].split('<|im_end|>')[0] #com = com_line.split('action_input=')[1].replace('<|im_end|>','').replace("}","").replace("]","").replace("'","") print(com) except Exception as e: pass fn="NONE" if 'CREATE_FILE' in fn: print('CREATE_FILE called') in_data[1]=com temp1=file_template(com) in_data[2]=temp1 in_data[3]=file_list out_o =generate(prompt,history,mod=mod,tok=10000,seed=seed,role="CREATE_FILE",data=in_data) out_w=list(out_o) ret1,ret2 = parse_json(out_w[2].split('<|im_end|>')[0]) print('ret1',ret1) print('ret2',ret2) build_out = build_space(repo_,ret1,ret2,access_token=tok_in) if build_out[0]["content"]=="ENTER A HUGGINGFACE TOKEN": yield [{'role':'assistant','content':"ENTER A HUGGINGFACE TOKEN"}] go=False break history+=[{'role':'system','content':f'observation:{build_out}'}] yield history elif 'READ_FILE' in fn: try: file_read = fs.read_text(f'spaces/{user_}{repo_}/{com}',detail=False) except Exception as e: print(e) file_read="FILE HAS NO CONTENT" print('file list\n',file_read) history+=[{'role':'system','content':f'RETURNED FILE CONTENT: NAME: spaces/{user_}{repo_}/{com} CONTENT:{build_out}'}] yield history elif 'IMAGE' in fn: print('IMAGE called') #out_im=gen_im(prompt,seed) #yield [{'role':'assistant','content': out_im}] elif 'SEARCH' in fn: print('SEARCH called') elif 'COMPLETE' in fn: print('COMPLETE') go=False break elif 'NONE' in fn: print('ERROR ACTION NOT FOUND') history+=[{'role':'system','content':f'observation:The last thing we attempted resulted in an error, check formatting on the tool call'}] else:pass;seed = random.randint(1,9999999999999) with gr.Blocks() as ux: with gr.Row(): with gr.Column(): gr.HTML("""
Chatbo

This will make changes to your Huggingface File System

Use at your own risk!

""") chatbot=gr.Chatbot(type='messages',show_label=False, show_share_button=False, show_copy_button=True, layout="panel") prompt=gr.MultimodalTextbox(label="Prompt",file_count="multiple", file_types=["image"]) mod_c=gr.Dropdown(choices=[n['name'] for n in clients],value='Qwen/Qwen2.5-Coder-32B-Instruct',type='index') tok_in=gr.Textbox(label='HF TOKEN') #chat_ux=gr.ChatInterface(fn=agent,chatbot=chatbot,additional_inputs=[mod_c]).load() #chat_ux.additional_inputs=[mod_c] #chat_ux.load() with gr.Row(): submit_b = gr.Button() stop_b = gr.Button("Stop") clear = gr.ClearButton([chatbot,prompt]) with gr.Row(visible=False): stt=gr.Textbox() with gr.Column(): gr.HTML() #html_view=gr.HTML("""""") sub_b = submit_b.click(agent, [prompt,chatbot,mod_c,tok_in],chatbot) sub_p = prompt.submit(agent, [prompt,chatbot,mod_c,tok_in],chatbot) stop_b.click(None,None,None, cancels=[sub_b,sub_p]) ux.queue(default_concurrency_limit=20).launch(max_threads=40)