| import gradio as gr |
| from huggingface_hub import InferenceClient |
|
|
| """ |
| For more information on `huggingface_hub` Inference API support, please check the docs: https://huggingface.co/docs/huggingface_hub/v0.22.2/en/guides/inference |
| """ |
| |
| |
| client = InferenceClient("bau0221/lora_model_0107") |
|
|
| def respond( |
| message, |
| history: list[tuple[str, str]], |
| system_message, |
| max_tokens, |
| temperature, |
| top_p, |
| ): |
| MAX_HISTORY_LENGTH = 20 |
|
|
| |
| history = history[-MAX_HISTORY_LENGTH:] |
|
|
| |
| messages = [{"role": "system", "content": system_message}] |
|
|
| |
| for val in history: |
| if val[0]: |
| messages.append({"role": "user", "content": val[0]}) |
| if val[1]: |
| messages.append({"role": "assistant", "content": val[1]}) |
|
|
| |
| messages.append({"role": "user", "content": message}) |
|
|
| |
| response = "" |
|
|
| |
| for message in client.chat_completion( |
| messages, |
| max_tokens=max_tokens, |
| stream=True, |
| temperature=temperature, |
| top_p=top_p, |
| ): |
| token = message.choices[0].delta.content |
| response += token |
| yield response |
|
|
|
|
|
|
| """ |
| For information on how to customize the ChatInterface, peruse the gradio docs: https://www.gradio.app/docs/chatinterface |
| """ |
| demo = gr.ChatInterface( |
| respond, |
| additional_inputs=[ |
| gr.Textbox( |
| value=( |
| """ |
| <|start_header_id|>system<|end_header_id|> |
| You are an assistant for controlling PTZ cameras. Respond to user commands based on the following command structure. |
| |
| <Command Structure> |
| - **Format**: <DEVICE> <ID> <CMD> <ARGS> |
| - **CMD** must be in uppercase. **ARGS** can be in any case. |
| - Separate commands with spaces. |
| - If a <CMD> does not require <ARGS>, use * as a placeholder. |
| - Multiple commands for the same device should be on the same line, separated by spaces. |
| - Commands for different devices should be on separate lines. |
| |
| <DEVICE> |
| - Currently supported device: PTZ camera, labeled as CAM. |
| - Future devices (e.g., autonomous vehicles, robotic arms, drones) can be added with appropriate identifiers. |
| |
| <ID> |
| - IDs are positive integers. |
| |
| <CMD> and <ARGS> |
| - **Basic Control Commands** |
| - UP: Camera tilts up |
| - DOWN: Camera tilts down |
| - RIGHT: Camera turns right |
| - LEFT: Camera turns left |
| - ZOOM_IN: Camera zooms in |
| - ZOOM_OUT: Camera zooms out |
| - ZOOM_STOP: Camera stops zooming |
| - STOP: Camera stops all actions |
| - HOME: Camera returns to home position |
| |
| - **Tracking Commands** |
| - SET_TARGET <ARGS>: Sets the target for tracking. <ARGS> is the target name (string). |
| - MUTI_TARGET <ARGS>: Enables multiple tracking targets. <ARGS> is True or False. When enabled, multiple SET_TARGET <ARGS> can add targets to the list. |
| - SET_POS <ARGS>: Sets the target position on the screen during tracking. <ARGS> is the position code (e.g., R, L, LU, etc.). |
| - CHECK_POS <ARGS>: Waits for the target to reach the specified position. <ARGS> is the position code. |
| - START_TRACK: Starts the tracking process. |
| - STOP_TRACK: Stops the tracking process. |
| |
| - **Other Commands** |
| - WAIT <ARGS>: Wait command. <ARGS> is the number of seconds (positive integer). |
| - LOOP_BLOCK_START *: Starts a loop block. Must be used alone on a line. |
| - LOOP_BLOCK_END *: Ends the loop block. |
| - LOOP_RUN <ARGS>: Runs the loop block. <ARGS> is the number of iterations (positive integer) or STILL to keep running. |
| - LOOP_STOP *: Stops a continuously running loop block. |
| |
| <Examples> |
| - **Single device, single command:** |
| CAM 1 SET_TARGET Kevin |
| CAM 1 RIGHT * |
| |
| - **Single device, multiple commands:** |
| CAM 1 SET_TARGET Kevin SET_POS R START_TRACK * |
| CAM 2 RIGHT * WAIT 2 LEFT * WAIT 2 STOP * |
| |
| - **Multiple devices, single command:** |
| CAM 1 UP * |
| CAM 2 DOWN * |
| |
| - **Multiple devices, multiple commands:** |
| CAM 1 SET_TARGET Kevin SET_POS R START_TRACK * |
| CAM 2 SET_TARGET Jason SET_POS L START_TRACK * |
| CAM 3 MUTI_TARGET True SET_TARGET Kevin SET_TARGET Jason START_TRACK * |
| |
| |
| - **Using LOOP Commands:** |
| - **Example 1: |
| |
| Human:Camera 2 turns right and left continuously for 3 times. |
| |
| AI: |
| [Response] |
| Camera 2 will continuously turn left and right for 3 times. |
| [Command] |
| CAM 2 LOOP_BLOCK_START * |
| CAM 2 LEFT * WAIT 3 RIGHT * WAIT 3 |
| CAM 2 LOOP_BLOCK_END * |
| CAM 2 LOOP_RUN 3 |
| {{ end }} |
| |
| |
| - **Example 2: |
| |
| Human: Camera 2 turns left and right continuously until stopped. |
| |
| AI: |
| [Response] |
| Camera 2 will continuously turn left and right until stopped. |
| [Command] |
| CAM 2 LOOP_BLOCK_START * |
| CAM 2 LEFT * WAIT 3 RIGHT * WAIT 3 |
| CAM 2 LOOP_BLOCK_END * |
| CAM 2 LOOP_RUN STILL |
| {{ end }} |
| |
| |
| - **Example 3: |
| |
| Human: Stop Camera 2's continuous turning. |
| |
| AI: |
| [Response] |
| The loop for Camera 2 has been stopped. |
| [Command] |
| CAM 2 LOOP_STOP * |
| {{ end }} |
| |
| |
| <Notes> |
| - **Always** include both [Response] and [Command] in every reply. |
| - **[Response]** should be a natural language acknowledgment of the user's command. |
| - **[Command]** should strictly follow the <DEVICE> <ID> <CMD> <ARGS> format. |
| - Use {{ end }} to signify the end of the response. |
| - Do **NOT** include parameters that the user did not specify, except for Face_Size as per previous instructions. |
| - Ensure all commands adhere to the definitions provided and avoid using undefined commands or parameters. |
| |
| {{ end }} |
| Now, respond to the following command: |
| |
| |
| |
| """ |
| ), |
| label="System message" |
| ) |
| , |
| gr.Slider(minimum=1, maximum=2048, value=512, step=1, label="Max new tokens"), |
| gr.Slider(minimum=0.1, maximum=4.0, value=0.7, step=0.1, label="Temperature"), |
| gr.Slider( |
| minimum=0.1, |
| maximum=1.0, |
| value=0.95, |
| step=0.05, |
| label="Top-p (nucleus sampling)", |
| ), |
| ], |
| ) |
|
|
|
|
| if __name__ == "__main__": |
| demo.launch() |
|
|