File size: 4,046 Bytes
181e273
 
 
 
 
 
 
 
 
 
 
 
 
24ca624
 
 
 
 
 
 
 
 
 
 
 
 
181e273
 
24ca624
 
 
 
 
 
 
181e273
24ca624
 
 
 
 
 
 
 
 
181e273
 
 
 
24ca624
181e273
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
# You can find this code for Chainlit python streaming here (https://docs.chainlit.io/concepts/streaming/python)

# OpenAI Chat completion
import os
from openai import AsyncOpenAI  # importing openai for API usage
import chainlit as cl  # importing chainlit for our app
from chainlit.prompt import Prompt, PromptMessage  # importing prompt tools
from chainlit.playground.providers import ChatOpenAI  # importing ChatOpenAI tools
from dotenv import load_dotenv

load_dotenv()

# ChatOpenAI Templates
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  # marks a function that will be executed at the start of a user session
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  # marks a function that should be run each time the chatbot receives a message from a user
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="")

    # Call OpenAI
    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)

    # Update the prompt object with the completion
    prompt.completion = msg.content
    msg.prompt = prompt

    # Send and close the message stream
    await msg.send()