-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathopenai_example.py
More file actions
executable file
·113 lines (92 loc) · 3.82 KB
/
openai_example.py
File metadata and controls
executable file
·113 lines (92 loc) · 3.82 KB
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
import os
import logging
from dotenv import load_dotenv
import ldclient
from ldclient import Context
from ldclient.config import Config
from ldai import LDAIClient
from ldai_openai import get_ai_metrics_from_response
from ldobserve import ObservabilityConfig, ObservabilityPlugin
from openai import OpenAI
load_dotenv()
logging.basicConfig()
logging.getLogger('ldclient').setLevel(logging.WARNING)
openai_client = OpenAI()
# Set sdk_key to your LaunchDarkly SDK key.
sdk_key = os.getenv('LAUNCHDARKLY_SDK_KEY')
# Set config_key to the AI Config key you want to evaluate.
ai_config_key = os.getenv('LAUNCHDARKLY_COMPLETION_KEY', 'sample-completion')
def main():
if not sdk_key:
print("*** Please set the LAUNCHDARKLY_SDK_KEY env first")
exit()
if not ai_config_key:
print("*** Please set the LAUNCHDARKLY_COMPLETION_KEY env first")
exit()
ldclient.set_config(Config(sdk_key, plugins=[
ObservabilityPlugin(ObservabilityConfig(
service_name='hello-python-ai-openai',
))
]))
aiclient = LDAIClient(ldclient.get())
if not ldclient.get().is_initialized():
print("*** SDK failed to initialize. Please check your internet connection and SDK credential for any typo.")
exit()
print("*** SDK successfully initialized")
# Set up the evaluation context. This context should appear on your
# LaunchDarkly contexts dashboard soon after you run the demo.
context = (
Context
.builder('example-user-key')
.kind('user')
.name('Sandy')
.build()
)
# Pass a default for improved resiliency when the AI config is unavailable
# or LaunchDarkly is unreachable; omit for a disabled default.
# Example:
# default = AIConfig(
# enabled=True,
# model=ModelConfig(name='gpt-4'),
# provider=ProviderConfig(name='openai'),
# messages=[LDMessage(role='system', content='You are a helpful assistant.')],
# )
# config_value = aiclient.completion_config(ai_config_key, context, default, {'myUserVariable': "Testing Variable"})
config_value = aiclient.completion_config(
ai_config_key,
context,
variables={'myUserVariable': "Testing Variable"}
)
if not config_value.enabled:
print(f"AI config '{ai_config_key}' is disabled. Verify the config key exists in your LaunchDarkly project and is not targeting a disabled variation.")
return
tracker = config_value.create_tracker()
messages = [message.to_dict() for message in (config_value.messages or [])]
SAMPLE_QUESTION = "What can you help me with?"
messages.append({'role': 'user', 'content': SAMPLE_QUESTION})
print(f'\nSending sample question to {config_value.model.name}: "{SAMPLE_QUESTION}"')
print("Waiting for response...")
completion = tracker.track_metrics_of(
get_ai_metrics_from_response,
lambda:
openai_client.chat.completions.create(
model=config_value.model.name,
messages=messages,
),
)
ai_response = completion.choices[0].message.content
messages.append({'role': 'assistant', 'content': ai_response})
print(f"\nModel response:\n{ai_response}")
summary = tracker.get_summary()
print("\nDone! The AI config was evaluated and the following metrics were tracked:")
print(f" Duration: {summary.duration_ms}ms")
print(f" Success: {summary.success}")
if summary.tokens:
print(f" Input tokens: {summary.tokens.input}")
print(f" Output tokens: {summary.tokens.output}")
print(f" Total tokens: {summary.tokens.total}")
if summary.tool_calls:
print(f" Tool calls: {', '.join(summary.tool_calls)}")
# Flush pending events and close the client.
ldclient.get().flush()
ldclient.get().close()