-
Notifications
You must be signed in to change notification settings - Fork 9.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
SimpleChat: a simple and dumb web front end for testing /chat/completions and /completions end points and try chat #7350
SimpleChat: a simple and dumb web front end for testing /chat/completions and /completions end points and try chat #7350
Conversation
Contains a div placeholder for showing chat messages till now a text-input for allowing user to enter next chat message/query to the model. a submit button to allow sending of the user entered message and chat till now to the model.
Allows maintaining an array of chat message. Allows adding chat message (from any of the roles be it system, user, assistant, ...) Allows showing chat messages till now, in a given div element.
Define Role class with static members corresponding to the roles. Update startme to * Get hold of the ui elements. * Attach a click handler to submit button, which adds the user input to xchats array and shows the chat messages till now in chat div element. Trap DOMContentLoaded to trigger startme
Also show a default message to user Also add some metas
So one needs to run the llm server locally then run this script and access it using a local browser
So user can either press submit button or press enter key
Also make chat the default selection wrt mode
Try read the assistance response from appropriate field in the response got. Also examples/server seems to return the response in a slightly different field, so try account for that also.
Have added support for system prompt. |
Also allow to switch chat session optionally, wrt some of the related helpers. setup for two chat sessions by default.
Re-enable user-input, only after response to a user query has been updated to the chat-div. This ensures that if user tries to switch chat session, it wont be allowed till chat-request-response flow is done.
Helper to get the latest system prompt and inturn use same to set the system prompt ui, when switching. Ensure that system prompt is set if and when enter key is pressed.
Also have a general helper for setting class of children.
Show system prompt in chat space, when it is set by pressing enter, as a feedback to user. Alert user, if they try to switch chat session in the middle of waiting for a response from the ai model.
Also a general create button helper.
Also fix a oversight wrt using stale data wrt the list of chat sessions.
Skip NewChat if user cancels or if one waiting for response from the ai model. Dont show a chat with newly got ai model response, if current chat session has changed, some how. Chat session shouldnt be allowed to change, if there is a pending response, but still as a additional sanity check.
I have further structured the code and also added support for multiple independent chats, it is ready for merging now. It implements a responsive design to adapt to laptop/mobile/tablet and their different screen resolutions and orientations implicitly by simply being structured around basic html+css's flex-column of flex-rows. It uses a scrolled view/div in normal usage, while parallely allowing unrolled multi page printing, by implicitly changing the document to have auto height (thus bypassing the overflow-scroll style entry) in print mode. The whole idea of this is to keep things simple with out using any modules/frameworks/etal, and instead build on what is already available with basic html/js/css, which is good enough with current standards and browsers. Currently this is placed independent of the existing web-frontend, in its own folder under examples/server/public_simplechat. We can either retain this there itself or move into public/chatui. Lets keep this as it is with its simple and straight forward html/js/css use, without changing/refactoring it to use other modules like preact etal. Which should also keep it simple for anyone to modify it if required in future, indepedent of any framework conventions or changes or replacements to them. However in future, if ngxson or anyone else wants to refactor it wrt preact/xyz etal, I would suggest that then parallely keep this pure html/css/js based version also, as is, in a seperate folder, like the current examples/server/public_simplechat. NOTE: Input for anyone looking at refactoring, a copy, in future
|
CI failing noted features/results.feature:75 consistent results with same seed and varying batch size -- @1.3 Replication attempt
I'm suppose to put something in system line? |
If the CI issue is more due to what's happening in the main branch and not within this PR, then I'll merge it after the CI in main branch is stable. |
Fair enough, well I guess I was a bit confused by the statement that the system prompt must be filled in. Something like an input placeholder attribute with the text you suggested above could help. @hanishkvc e.g. "Optional system prompt. e.g. you are a drunk poet" https://www.w3schools.com/TAGS/att_input_placeholder.asp Thanks for confirming that the PR is most likely decoupled from main branch CI issue, will keep it in mind |
Hi @mofosyne @ngxson @ggerganov possible issue wit CI testIf the phi2 line which mofosyne mentioned above is the one related to the CI issue Then because currently llama.cpp's chat-apply-template doesnt have support for phi2 directly, so server and inturn its oaicompat_completion_params_parse will generate wrongly templated chat message which will be tokenized and sent to the ai llm model, this is independent of this PR. Rather any code be it server or some 3rd party program which uses llama.cpp's chat-apply-template will have same issue. So also potentially the phi2 model will generate response which depending on the query may either be within sane limits beyond the required text completion/chatting, or it may even get into a runaway mode or so and get stuck for sometime or ... Also given that this specific model is a base model and not a chat or instruct model, it eitherway will be unhinged wrt generating text beyond what is asked, which also can create problem. ideal solution, independent of this CI issueSo either one will have to hard code phi2 chat template standard into chat-apply-template in current llama.cpp OR implement a new jinja template based flow OR if one is using my other PR #6834 , they will be able to specify phi2's chat template info in chaton_meta.json file and inturn get things working as needed. Even this in itself may not be enough, wrt expecting a non-run-away answers, as this specific model is a base model and not chat/instruct model. solution for CI issue at handIndependent of anything else, rather if any CI code is currently using Phi2 to test llama.cpp's chat-templating, then it is invalid and needs to be fixed (unless it is a negative test or so), as it stands now. That is the test needs to be changed so that it doesnt use chat-templating-unsupported phi2 models.
|
Hi @mofosyne @ngxson @ggerganov update / a correctionI need to correct myself partly, wrt my previous comment. I assume mofosyne was using phi-2 to test server in general, while the actual CI test was potentially using a different model. And inturn it seems to be testing both /chat/completions and /completions endpoints. So my comment wrt phi-2 and ci-testing if wrt /chat/completions doesnt hold. HOWEVER my original comment that this specific CI failure issue has nothing to do with this PR and more of some issue between server in general and the test code around it still holds. So we can safely merge this PR with the main/master branch. Also this PR doesnt touch server code in any way and sits in its own subdirectory. local direct checkAlso wrt server on its own, I have tried testing the configuration which seems to be used by the ci-test which is failing. cmake .. \ cmake --build . --config RelWithDebInfo -j 4 --target server Inturn testing the server against a bunch of models (llama3, phi-3, phi-2, mistral), things seem to be fine wrt server and this PR in general wrt chat and completion mode.
|
Merged in now as @hanishkvc shown that this is unlikely to be an issue. Any further changes could be in a new PR @hanishkvc but fingers crossed everyone understands it enough to not need to adjust the UI further (e.g. adding placeholder text to system input) Thanks for your contribution. You may want to also consider adding a general guide/tutorial to the wiki if you so choose to do so (which is a bit more freeform than the readme in the codebase). |
I had mentioned in the note shown to user that they can set the system prompt above. However I had avoided adding a placeholder, as sometimes it is not dull enough to distinguish that it is not something already entered. However now I have added the placeholder system prompt with e.g. As well as changed the behaviour wrt Completion mode, such that the code doesnt automatically add the user: prefix, so that user has full flexibility wrt adding any role related prefix that they may want. As well as optionally insert a assistant related prefix even in the completion mode. Shall I push these additions to this PR itself? |
Already merged so best as a new PR. Also those kinds of changes are smaller quality of life changes so best as a separate PR now. |
Thanks @mofosyne, Will create a new PR. Wanted to be sure that I hadnt missed out something and inturn once I found a small difference compared to what I had commented, wanted to cross check things are fine or not and inturn inform you all. So missed out on pushing these earlier.
|
Continuation of minor changes and improvements #7480 |
…ions and /completions end points and try chat (ggerganov#7350) * SimpleChat: Add a skeletal html page Contains a div placeholder for showing chat messages till now a text-input for allowing user to enter next chat message/query to the model. a submit button to allow sending of the user entered message and chat till now to the model. * SimpleChat: A js skeleton with SimpleChat class Allows maintaining an array of chat message. Allows adding chat message (from any of the roles be it system, user, assistant, ...) Allows showing chat messages till now, in a given div element. * SimpleChat: request_json, globals, startme * SimpleChatJS: Roles Class, submitClick Define Role class with static members corresponding to the roles. Update startme to * Get hold of the ui elements. * Attach a click handler to submit button, which adds the user input to xchats array and shows the chat messages till now in chat div element. Trap DOMContentLoaded to trigger startme * SimpleChat:HTML: Bring in the js file * SimpleChat: Rather value wrt input text element * SimpleChat: Also add completions related prompt * SimpleChat: Use common helper logic wrt json data * SimpleChat: Move handling of submit request into its own func * SimpleChat: Try handshake with llm over its web service endpoint * SimpleChat:JS: Extract model response and show to user * SimpleChat:JS: Messages/Prompt, indicate working to end user * SimpleChat: Try keep input element in view * SimpleChat: Diff user/assistant msgs, Make input wider Also show a default message to user Also add some metas * SimpleChat: Move into its own sub directory to avoid confusion * SimpleChat:sh: Add simple shell script to run python3 http.server So one needs to run the llm server locally then run this script and access it using a local browser * SimpleChat:JS: Try trap enter key press wrt input text field So user can either press submit button or press enter key * SimpleChat: Allow user to select chat or completion mode * SimpleChat: Dont submit if already submitted and waiting Also make chat the default selection wrt mode * SimpleChat:JS: Handle difference in response Try read the assistance response from appropriate field in the response got. Also examples/server seems to return the response in a slightly different field, so try account for that also. * SimpleChat:JS: Force completion mode be single message by default * SimpleChat: Add a simple readme file * SimpleChat:HTML: Cleanup/structure UI a bit, Add input for system * SimpleChat:Allow system prompt to be set, if provided before user * SimpleChat: Ignore empty user input, without trimming * SimpleChat:Alert user if they provide sysprompt late or change it * SimpleChat: Move handling systemprompt into its own func * SimpleChat:HTML: Add a style for system role message * SimpleChat: Update the readme file * SimpleChat:CSS: Move style info into its own css file To keep it simple, clean and seperate so that things are not unnecessarily cluttered. * SimpleChat:CSS: Allow for chat div to be scrollable * SimpleChat:JS: Try ensure the last entry in chat is visible Needed because now only the chat div is scrollable and not the full page. In last commit the chat div size was fixed to 75% vertical height, so the full page no longer scrolls, so the old bring user-input element to view wont work, instead now the last element in the chat div should be brought into view. * SimpleChat:JS: bottom of element visible, Set focus to user input As the generated text could be multiple lines and occupy more space that the full scrollable div's vertical space, make the bottom of the last element (which can be such a generated text) in the div visible by scrolling. Ensure that the user input box has focus * SimpleChat: Update notes a bit. Try keep browser happy Avoid browser quirk mode with DOCTYPE. Help with accessibility a bit by specifying the language explicitly. Specify the char encoding explicitly, inturn utf-8 is a safe bet, even with intermixing of languages if reqd in future. Add a cache-control http-equiv meta tag, which in all probability will be ignored. Defer js loading and execution, just for fun and future, not that critical here as it stands now. * SimpleChat:HTML:Group user input+btn together; Note about multichat * SimpleChat:JS: Allow for changing system prompt anytime for future * SimpleChat:Readme: Note about handle_systemprompt begin/anytime * SimpleChat:HTML: Add viewport meta for better mobile friendliness Without this the page content may look too small. * SimpleChat:HtmlCss: Cleanup UI flow set margin wrt vmin rather than vw or vh so portrait/landscape ok. Use flex and flex-grow to put things on the same line as well as distribute available space as needed. Given two main elements/line so it remains simple. In each line have one element with grows and one sits with a basic comfortably fixed size. * SimpleChat: textarea for multiline user chat, inturn shift+enter 4 enter * SimpleChat: Make vertical layout better responsive (flex based) Also needed to make things cleaner and properly usable whether landscape or portrait, after changing to multiline textarea rather than single line user input. Avoid hardcoding the chat-till-now display area height, instead make it a flex-growable within a flex column of ui elements within a fixed vertical area. * SimpleChat: Rename simplechat.html to index.html, update readme Instead of providing a seperate shell script, update the readme wrt how to run/use this web front end. * SimpleChat: Screen fixed view and scrolling, Printing full * SimpleChat:JS:CI: Avoid space at end of jsdoc param line * SimpleChat:JS: MultiChat initial skeleton Will help maintain multiple independent chats in future * SimpleChat:JS: Move system prompt begin/anytime into SimpleChat * SimpleChat:JS:Keep MultiChatUI simple for now Worry about different chats with different servers for later. * SimpleChat:JS: Move handle submit into MultiChat, build on same Create an instance of MultiChatUI and inturn a instance of chat session, which is what the UI will inturn work on. * SimpleChat:JS: Move to dictionary of SimpleChat, instead of array * SimpleChat: Move ui elements into MultiChatUI, Update el IDs Move ui elements into MultiChatUI, so that current handleUserSubmit doesnt need to take the element arguments. Also in future, when user is allowed to switch between different chat sessions, the UI can be updated as needed by using the elements in UI already known to MultiChatUI instance. Rename the element ids' so that they follow a common convention, as well as one can identify what the element represents in a more consistant manner. * SimpleChat:MCUI:Show available chat sessions, try switch btw them Previous commits brought in / consolidated existing logic into MultiChatUI class. Now start adding logic towards multichat support * show buttons indicating available chat sessions * on sessin button click, try switch to that session * SimpleChat:MCUI: Store and use current chat session id Also allow to switch chat session optionally, wrt some of the related helpers. setup for two chat sessions by default. * SimpleChat:MCUI: Delay enabling user-input to avoid race Re-enable user-input, only after response to a user query has been updated to the chat-div. This ensures that if user tries to switch chat session, it wont be allowed till chat-request-response flow is done. * SimpleChat: Take care of system prompt Helper to get the latest system prompt and inturn use same to set the system prompt ui, when switching. Ensure that system prompt is set if and when enter key is pressed. * SimpleChat:GetSystemLatest, fix a oversight. * SimpleChat:MCUI: Allow selected chat-session btn to be highlighted Also have a general helper for setting class of children. * SimpleChat:Cleanup corners Show system prompt in chat space, when it is set by pressing enter, as a feedback to user. Alert user, if they try to switch chat session in the middle of waiting for a response from the ai model. * SimpleChat:MCUI: Ensure req-resp failure doesnt lock up things * SimpleChat:MCUI: Support for new chat sessions Also a general create button helper. * SimpleChat:MCUI: CreateSessionBtn helper, use wrt NewChat Also fix a oversight wrt using stale data wrt the list of chat sessions. * SimpleChat:MCUI: NewChat btn first before existing chat sessions * SimpleChat:MCUI:CornerCases:Skip new chat, show only if current Skip NewChat if user cancels or if one waiting for response from the ai model. Dont show a chat with newly got ai model response, if current chat session has changed, some how. Chat session shouldnt be allowed to change, if there is a pending response, but still as a additional sanity check. * SimpleChat: Update readme, title, show usage if no chat to show * SimpleChat: Cleanup the log/dialog messages a bit
Hi @ggerganov, @ngxson, @mofosyne
As mentioned in my other PR #6834 comment section, the web front end available with examples/server doesnt currently use the /chat/completions endpoint. It only generates requests for /completions endpoint. Also the web front end code is more involved/complicated for minimal testing.
This simple web frontend, allows triggering/testing the server's /completions or /chat/completions endpoints in a simple way with minimal code from a common code base. And also allows trying to maintain a basic back and forth chatting to an extent.
NOTE: Given that the idea is for basic minimal testing, it doesnt bother with any model context length and culling of old messages from the chat. Also currently I havent added input for a system prompt, but may add it [update: system prompt support added].
usage
first run examples/server
next run this web front end in examples/server/public_simplechat
Open this simple web front end from your local browser as noted in the message printed when simplechat.sh is run