Skip to content
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

Tested - telemetry change #5

Merged
merged 3 commits into from
Feb 15, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
74 changes: 59 additions & 15 deletions streamlit/app.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import os
import streamlit as st
import openai
import tiktoken
import secrets
from openai import OpenAI
from elasticsearch import Elasticsearch
import elasticapm
Expand Down Expand Up @@ -104,13 +106,28 @@ def sidebar_bg(side_bg):

######################################

# Configure OpenAI client
openai.api_key = os.environ['OPENAI_API_KEY']
openai.api_base = os.environ['OPENAI_API_BASE']
openai.default_model = os.environ['OPENAI_API_ENGINE']
openai.verify_ssl_certs = False
client = OpenAI(api_key=openai.api_key, base_url=openai.api_base)
@st.cache_resource
def initOpenAI():
#if using the Elastic AI proxy, then generate the correct API key
if os.environ['ELASTIC_PROXY'] == "True":
#generate and share "your" unique hash
os.environ['USER_HASH'] = secrets.token_hex(nbytes=6)
print(f"Your unique user hash is: {os.environ['USER_HASH']}")
#get the current API key and combine with your hash
os.environ['OPENAI_API_KEY'] = f"{os.environ['OPENAI_API_KEY']} {os.environ['USER_HASH']}"
else:
openai.api_type = os.environ['OPENAI_API_TYPE']
openai.api_version = os.environ['OPENAI_API_VERSION']

# Configure OpenAI client
openai.api_key = os.environ['OPENAI_API_KEY']
openai.api_base = os.environ['OPENAI_API_BASE']
openai.default_model = os.environ['OPENAI_API_ENGINE']
openai.verify_ssl_certs = False
client = OpenAI(api_key=openai.api_key, base_url=openai.api_base)
return client

openAIClient = initOpenAI()

# Initialize Elasticsearch and APM clients
# Configure APM and Elasticsearch clients
Expand All @@ -133,10 +150,6 @@ def initElastic():
request_timeout=30
)

if os.environ['ELASTIC_PROXY'] != "True":
openai.api_type = os.environ['OPENAI_API_TYPE']
openai.api_version = os.environ['OPENAI_API_VERSION']

return apmclient, es


Expand Down Expand Up @@ -446,6 +459,33 @@ def generate_response(query,

return es_time, chat_response

def count_tokens(messages, model="gpt-35-turbo"):
if "gpt-3.5-turbo" in model or "gpt-35-turbo" in model:
model = "gpt-3.5-turbo-0613"
elif "gpt-4" in model:
model="gpt-4-0613"

try:
encoding = tiktoken.encoding_for_model(model)
except KeyError:
print("Warning: model not found. Using gpt-3.5-turbo-0613 encoding.")
encoding = tiktoken.encoding_for_model("gpt-3.5-turbo-0613")

if isinstance(messages, str):
return len(encoding.encode(messages))
else:
tokens_per_message = 3
tokens_per_name = 1

num_tokens = 0
for message in messages:
num_tokens += tokens_per_message
for key, value in message.items():
num_tokens += len(encoding.encode(value))
if key == "name":
num_tokens += tokens_per_name
num_tokens += 3 # every reply is primed with <|start|>assistant<|message|>
return num_tokens

def chat_gpt(user_prompt, system_prompt):
"""
Expand All @@ -462,19 +502,23 @@ def chat_gpt(user_prompt, system_prompt):
messages = [{"role": "system", "content": system_prompt},
{"role": "user", "content": truncated_prompt}]

# Add APM metadata and return the response content
elasticapm.set_custom_context({'model': openai.default_model, 'prompt': user_prompt})
# return response["choices"][0]["message"]["content"]

full_response = ""
for response in client.chat.completions.create(
for response in openAIClient.chat.completions.create(
model=openai.default_model,
temperature=0,
messages=messages,
stream=True
):
full_response += (response.choices[0].delta.content or "")

# APM: add metadata labels of data we want to capture
elasticapm.label(model = openai.default_model)
elasticapm.label(prompt = user_prompt)
elasticapm.label(prompt_tokens = count_tokens(messages, model=openai.default_model))
elasticapm.label(response_tokens = count_tokens(full_response, model=openai.default_model))
elasticapm.label(total_tokens = count_tokens(messages, model=openai.default_model) + count_tokens(full_response, model=openai.default_model))
if 'USER_HASH' in os.environ: elasticapm.label(user = os.environ['USER_HASH'])

return full_response


Expand Down