from h2o_wave import main, app, Q, ui, data
from gradio_client import Client
import ast
async def init_ui(q: Q) -> None:
q.page['meta'] = ui.meta_card(
box='',
layouts=[
ui.layout(breakpoint='xs', min_height='100vh', zones=[
ui.zone('main', size='1', direction=ui.ZoneDirection.ROW, zones=[
ui.zone('sidebar', size='250px'),
ui.zone('body', direction=ui.ZoneDirection.COLUMN, zones=[
ui.zone('title', size='55px'),
ui.zone('content', size='1'),
ui.zone('footer'),
]),
])
])
],
title='H2O GPT',
)
q.page['sidebar'] = ui.nav_card(
box='sidebar', color='primary', title='GPT Wave app', subtitle='Powered by H2O GPT',
value=f"#{q.args['#']}' if q.args['#'] else '#page1",
image='https://wave.h2o.ai/img/h2o-logo.svg', items=[
ui.nav_group('', items=[
ui.nav_item(name='wave-docs', label='Wave docs', path='https://wave.h2o.ai/'),
ui.nav_item(name='h2o-gpt', label='H2O GPT', path='https://github.com/h2oai/h2ogpt'),
ui.nav_item(name='fine-tune', label='LLM Studio', path='https://github.com/h2oai/h2o-llmstudio'),
ui.nav_item(name='more-models', label='More models', path='https://huggingface.co/h2oai'),
]),
],
secondary_items=[
ui.toggle(name='dark_mode', label='Dark mode', trigger=True),
ui.text('
Made with H2O Wave.')
]
)
q.page['chatbot'] = ui.chatbot_card(
box=ui.box('content'),
data=data('content from_user', t='list'),
name='chatbot'
)
q.page['title'] = ui.section_card(
box='title',
title='',
subtitle='',
items=[
ui.dropdown(name='model', trigger=True, label='', value='gpt', choices=[
ui.choice(name='gpt', label='H2O GPT'),
ui.choice(name='falcon', label='h2oai/h2ogpt-gm-oasst1-en-2048-falcon-7b-v3'),
ui.choice(name='llama', label='h2oai/h2ogpt-research-oasst1-llama-65b'),
ui.choice(name='mpt', label='mosaicml/mpt-30b-instruct'),
]),
ui.button(name='clear', label='Clear', icon='Delete'),
],
)
@app('/')
async def serve(q: Q):
if not q.client.initialized:
await init_ui(q)
q.client.model_client = Client('https://gpt.h2o.ai/')
q.client.initialized = True
# A new message arrived.
if q.args.chatbot:
# Append user message.
q.page['chatbot'].data += [q.args.chatbot, True]
# Append bot response.
kwargs = dict(instruction_nochat=q.args.chatbot)
try:
res = q.client.model_client.predict(str(dict(kwargs)), api_name='/submit_nochat_api')
bot_res = ast.literal_eval(res)['response']
q.page['chatbot'].data += [bot_res, False]
except:
q.page['meta'] = ui.meta_card(box='', notification_bar=ui.notification_bar(
text='An error occurred during prediction. Please try later or a different model.',
type='error',
))
elif q.args.clear:
# Recreate the card.
q.page['chatbot'] = ui.chatbot_card(
box=ui.box('content'),
data=data('content from_user', t='list'),
name='chatbot'
)
elif q.args.dark_mode is not None:
q.page['meta'].theme = 'h2o-dark' if q.args.dark_mode else 'light'
q.page['sidebar'].color = 'card' if q.args.dark_mode else 'primary'
elif q.args.model:
try:
q.client.model_client = Client(f'https://{q.args.model}.h2o.ai/')
q.page['meta'] = ui.meta_card(box='', notification_bar=ui.notification_bar(
text='Model changed successfully.',
type='success',
))
except:
q.page['meta'] = ui.meta_card(box='', notification_bar=ui.notification_bar(
text='An error occurred while changing the model. Please try a different one.',
type='error',
))
await q.page.save()