|
|
|
|
|
|
|
import os |
|
from openai import AsyncOpenAI |
|
import chainlit as cl |
|
from chainlit.prompt import Prompt, PromptMessage |
|
from chainlit.playground.providers import ChatOpenAI |
|
from dotenv import load_dotenv |
|
|
|
load_dotenv() |
|
|
|
|
|
system_template = """ |
|
You are an expert in React development with a deep understanding of form rendering from JSON data. Your knowledge extends to advanced state management techniques and user experience design. You provide clear, practical, and detailed guidance on dynamically creating forms, monitoring form state changes, and implementing mechanisms to prevent user navigation when forms are actively edited. Your focus is on delivering actionable instructions and best practices that can be easily implemented in a real-world project. |
|
Key Traits: |
|
Highly knowledgeable in React and JavaScript. |
|
Expert in dynamic form rendering using JSON data. |
|
Proficient in state management techniques in React. |
|
Skilled in user experience design, particularly in preventing data loss during form edits. |
|
Clear, concise, and practical in communication. |
|
Responsibilities: |
|
Provide detailed, step-by-step instructions on rendering forms from JSON data using React. |
|
Offer best practices and code examples for tracking form state changes. |
|
Explain and demonstrate strategies to prevent users from navigating away from forms with unsaved changes. |
|
Deliver advice and solutions in a clear, practical, and easily implementable manner. |
|
""" |
|
|
|
user_template = """ |
|
Considering the following context: {input}, provide a comprehensive and accurate response, breaking down the information into actionable steps where applicable. |
|
|
|
When providing an answer, follow this structure: |
|
|
|
### Summary |
|
Provide a brief summary of the key points in 2-3 sentences. |
|
|
|
### Instructions |
|
1. Render a numbered list with specific steps or actions. |
|
2. Each step should be clear and concise. |
|
|
|
### Conclusion |
|
Write a paragraph summarizing the instructions and the outcome. This should wrap up the response and provide any final thoughts. |
|
|
|
Ensure that each component of your answer has the corresponding headers as shown above. |
|
""" |
|
|
|
@cl.on_chat_start |
|
async def start_chat(): |
|
settings = { |
|
"model": "gpt-4o", |
|
"temperature": 0, |
|
"max_tokens": 500, |
|
"top_p": 1, |
|
"frequency_penalty": 0, |
|
"presence_penalty": 0, |
|
} |
|
|
|
cl.user_session.set("settings", settings) |
|
|
|
|
|
@cl.on_message |
|
async def main(message: cl.Message): |
|
settings = cl.user_session.get("settings") |
|
|
|
client = AsyncOpenAI() |
|
|
|
print(message.content) |
|
|
|
prompt = Prompt( |
|
provider=ChatOpenAI.id, |
|
messages=[ |
|
PromptMessage( |
|
role="system", |
|
template=system_template, |
|
formatted=system_template, |
|
), |
|
PromptMessage( |
|
role="user", |
|
template=user_template, |
|
formatted=user_template.format(input=message.content), |
|
), |
|
], |
|
inputs={"input": message.content}, |
|
settings=settings, |
|
) |
|
|
|
print([m.to_openai() for m in prompt.messages]) |
|
|
|
msg = cl.Message(content="") |
|
|
|
|
|
async for stream_resp in await client.chat.completions.create( |
|
messages=[m.to_openai() for m in prompt.messages], stream=True, **settings |
|
): |
|
token = stream_resp.choices[0].delta.content |
|
if not token: |
|
token = "" |
|
await msg.stream_token(token) |
|
|
|
|
|
prompt.completion = msg.content |
|
msg.prompt = prompt |
|
|
|
|
|
await msg.send() |
|
|