File size: 4,726 Bytes
46cb2c1 89a989f 03605b7 89a989f 6c1b1ab 03605b7 11f3d81 89a989f 11f3d81 3a5876b 009b166 3a5876b ac5a5f0 9007b86 bae1ef6 deb4c46 bae1ef6 c23dbb3 bae1ef6 0adf31a a8dbfbb 3a5876b 0adf31a deb4c46 6ef4c7e 0adf31a ac5a5f0 c5acf4e 11f3d81 4d16357 329c810 89a989f 4d16357 c5acf4e 4d16357 c5acf4e 411b5ed 3c4f927 c8a3a1d 4d16357 89a989f e189cc3 c5acf4e 89a989f eb922b4 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 |
from fasthtml.common import *
from openai import OpenAI # openai==1.2.0
from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv())
upstage_token = os.getenv('UPSTAGE_TOKEN')
# Set up the app, including daisyui and tailwind for the chat component
hdrs = (picolink, Script(src="https://cdn.tailwindcss.com"),
Link(rel="stylesheet", href="https://cdn.jsdelivr.net/npm/daisyui@4.11.1/dist/full.min.css"))
app = FastHTML(hdrs=hdrs, cls="p-4 max-w-lg mx-auto")
#app = FastHTML()
rt = app.route
style="""
#mapid { height: 480px; }
"""
js = """
function load()
{
var map = L.map('mapid').setView([ 37.5158, 127.0991], 13);
L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', {
maxZoom: 19,
attribution: '© <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>'
}).addTo(map);
//alert('loading...');
$( "#chat_form" ).on( "submit", function( event ) {
//alert( "Handler for `submit` called." );
//event.preventDefault();
setTimeout(handle_post, 10000);
});
//messages_input = $("#chat_form :input[name='messages']");
//alert(messages_input);
//console.log(messages_input);
//messages_input.change(function(){
//alert("The text has been changed.");
//});
}
function handle_post() {
//messages_input = $("#chat_form :input[name='messages']").value;
messages_input = $( "input" ).last().val()
alert(messages_input);
console.log(messages_input);
}
setTimeout(load, 1000);
"""
# @rt('/')
# def get():
# return Titled("MinorityMap",
# Link(rel="stylesheet", href="https://unpkg.com/leaflet@1.4.0/dist/leaflet.css"),
# Style(style),
# Script(src="https://unpkg.com/leaflet@1.4.0/dist/leaflet.js"),
# #Body(onload='load()'),
# Div(id='mapid'),
# Script(js)
# )
client = OpenAI(
api_key=upstage_token,
base_url="https://api.upstage.ai/v1/solar"
)
sp = "You are a helpful and concise assistant."
def get_completion(prompt, model="solar-1-mini-chat"):
messages = [{"role": "user", "content": prompt}]
response = client.chat.completions.create(
model=model,
messages=messages,
temperature=0, # this is the degree of randomness of the model's output
)
return response.choices[0].message.content
def get_completion_from_messages(messages, model="solar-1-mini-chat", temperature=0):
response = client.chat.completions.create(
model=model,
messages=messages,
temperature=temperature, # this is the degree of randomness of the model's output
)
return response.choices[0].message.content
# Chat message component (renders a chat bubble)
def ChatMessage(msg, user):
bubble_class = "chat-bubble-primary" if user else 'chat-bubble-secondary'
chat_class = "chat-end" if user else 'chat-start'
return Div(cls=f"chat {chat_class}")(
Div('user' if user else 'assistant', cls="chat-header"),
Div(msg, cls=f"chat-bubble {bubble_class}"),
Hidden(msg, name="messages")
)
# The input field for the user message. Also used to clear the
# input field after sending a message via an OOB swap
def ChatInput():
return Input(name='msg', id='msg-input', placeholder="Type a message",
cls="input input-bordered w-full", hx_swap_oob='true')
# The main screen
@app.get
def index():
return Titled("MinorityMap",
Link(rel="stylesheet", href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.9.2/themes/ui-darkness/jquery-ui.css"),
Script(src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"),
Script(src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.9.2/jquery-ui.min.js"),
Link(rel="stylesheet", href="https://unpkg.com/leaflet@1.4.0/dist/leaflet.css"),
Style(style),
Script(src="https://unpkg.com/leaflet@1.4.0/dist/leaflet.js"),
#Body(onload='load()'),
Form(id="chat_form", hx_post=send, hx_target="#chatlist", hx_swap="beforeend")(
Div(id='mapid'),
Div(cls="flex space-x-2 mt-2")(
Group(ChatInput(), Button("Send", cls="btn btn-primary"))
)
),
Div(id="chatlist", cls="chat-box h-[73vh] overflow-y-auto"),
Script(js)
)
# Handle the form submission
@app.post
def send(msg:str, messages:list[str]=None):
if not messages: messages = []
messages.append(msg.rstrip())
print(messages[0])
post_append_str = ' Return as a JSON response with GeoLocation'
r = get_completion(messages[0] + post_append_str) # get response from chat model
return (ChatMessage(msg, True), # The user's message
ChatMessage(r.rstrip(), False), # The chatbot's response
ChatInput()) # And clear the input field via an OOB swap
serve()
|