From 63a6bf04693a76f5348ee25f98df3e9573a29e57 Mon Sep 17 00:00:00 2001 From: "rlamb@launchdarkly.com" Date: Mon, 16 Mar 2026 09:20:22 +0000 Subject: [PATCH 1/2] chore: update launchdarkly-server-sdk-ai-openai from ^0.1.0 to ^0.2.0 Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 30cb7c9..db30c86 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -22,7 +22,7 @@ direct-judge-example = 'examples.direct_judge_example:main' python = "^3.10" launchdarkly-server-sdk-ai = "^0.16.0" launchdarkly-server-sdk-ai-langchain = "^0.3.0" -launchdarkly-server-sdk-ai-openai = "^0.1.0" +launchdarkly-server-sdk-ai-openai = "^0.2.0" launchdarkly-observability = { version = ">=0.1.0", optional = true } boto3 = { version = ">=0.2.0", optional = true } From 63578ac337108dac51b475c98937ac86963bacee Mon Sep 17 00:00:00 2001 From: "rlamb@launchdarkly.com" Date: Mon, 16 Mar 2026 15:54:57 +0000 Subject: [PATCH 2/2] fix: update example code for sdk-ai 0.2.0 API changes - AIConfig renamed to AICompletionConfigDefault for defaults - config() now returns AICompletionConfig directly instead of tuple - Access tracker via config_value.tracker instead of tuple unpacking - Updated openai, langchain, bedrock, and gemini examples Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- examples/bedrock_example.py | 10 +++++----- examples/gemini_example.py | 10 +++++----- examples/langchain_example.py | 10 +++++----- examples/openai_example.py | 10 +++++----- 4 files changed, 20 insertions(+), 20 deletions(-) diff --git a/examples/bedrock_example.py b/examples/bedrock_example.py index de1a69d..16ceb9e 100755 --- a/examples/bedrock_example.py +++ b/examples/bedrock_example.py @@ -2,7 +2,7 @@ import ldclient from ldclient import Context from ldclient.config import Config -from ldai.client import LDAIClient, AIConfig, ModelConfig, ProviderConfig, LDMessage +from ldai.client import LDAIClient, AICompletionConfigDefault, ModelConfig, ProviderConfig, LDMessage import boto3 client = boto3.client("bedrock-runtime", region_name="us-east-1") @@ -43,14 +43,14 @@ def main(): # Pass a default for improved resiliency when the AI config is unavailable # or LaunchDarkly is unreachable; omit for a disabled default. # Example: - # default = AIConfig( + # default = AICompletionConfigDefault( # enabled=True, # model=ModelConfig(name='my-default-model'), # provider=ProviderConfig(name='bedrock'), # messages=[LDMessage(role='system', content='You are a helpful assistant.')], # ) - # config_value, tracker = aiclient.config(ai_config_key, context, default, {'myUserVariable': "Testing Variable"}) - config_value, tracker = aiclient.config( + # config_value = aiclient.config(ai_config_key, context, default, {'myUserVariable': "Testing Variable"}) + config_value = aiclient.config( ai_config_key, context, variables={'myUserVariable': "Testing Variable"} @@ -69,7 +69,7 @@ def main(): print("User Input:\n", USER_INPUT) chat_messages.append({'role': 'user', 'content': [{'text': USER_INPUT}]}) - converse = tracker.track_bedrock_converse_metrics( + converse = config_value.tracker.track_bedrock_converse_metrics( client.converse( modelId=config_value.model.name, messages=chat_messages, diff --git a/examples/gemini_example.py b/examples/gemini_example.py index 4099db7..a7e7ded 100644 --- a/examples/gemini_example.py +++ b/examples/gemini_example.py @@ -2,7 +2,7 @@ import ldclient from ldclient import Context from ldclient.config import Config -from ldai.client import LDAIClient, AIConfig, ModelConfig, ProviderConfig, LDMessage +from ldai.client import LDAIClient, AICompletionConfigDefault, ModelConfig, ProviderConfig, LDMessage from ldai.tracker import TokenUsage from google import genai from google.genai import types @@ -113,14 +113,14 @@ def main(): # Pass a default for improved resiliency when the AI config is unavailable # or LaunchDarkly is unreachable; omit for a disabled default. # Example: - # default = AIConfig( + # default = AICompletionConfigDefault( # enabled=True, # model=ModelConfig(name='gemini-pro'), # provider=ProviderConfig(name='google'), # messages=[LDMessage(role='system', content='You are a helpful assistant.')], # ) - # config_value, tracker = aiclient.config(ai_config_key, context, default, {'myUserVariable': "Testing Variable"}) - config_value, tracker = aiclient.config( + # config_value = aiclient.config(ai_config_key, context, default, {'myUserVariable': "Testing Variable"}) + config_value = aiclient.config( ai_config_key, context, variables={'myUserVariable': "Testing Variable"} @@ -144,7 +144,7 @@ def main(): user_message = types.Content(role="user", parts=[types.Part(text=USER_INPUT)]) messages.append(user_message) - completion = track_genai_metrics(tracker, lambda: client.models.generate_content( + completion = track_genai_metrics(config_value.tracker, lambda: client.models.generate_content( model=config_value.model.name, contents=messages, config=types.GenerateContentConfig( diff --git a/examples/langchain_example.py b/examples/langchain_example.py index e626626..f814ef6 100644 --- a/examples/langchain_example.py +++ b/examples/langchain_example.py @@ -2,7 +2,7 @@ import ldclient from ldclient import Context from ldclient.config import Config -from ldai.client import LDAIClient, AIConfig, ModelConfig, ProviderConfig, LDMessage +from ldai.client import LDAIClient, AICompletionConfigDefault, ModelConfig, ProviderConfig, LDMessage from ldai.tracker import TokenUsage from langchain.chat_models import init_chat_model @@ -86,14 +86,14 @@ def main(): # Pass a default for improved resiliency when the AI config is unavailable # or LaunchDarkly is unreachable; omit for a disabled default. # Example: - # default = AIConfig( + # default = AICompletionConfigDefault( # enabled=True, # model=ModelConfig(name='gpt-4'), # provider=ProviderConfig(name='openai'), # messages=[LDMessage(role='system', content='You are a helpful assistant.')], # ) - # config_value, tracker = aiclient.config(ai_config_key, context, default, {'myUserVariable': "Testing Variable"}) - config_value, tracker = aiclient.config( + # config_value = aiclient.config(ai_config_key, context, default, {'myUserVariable': "Testing Variable"}) + config_value = aiclient.config( ai_config_key, context, variables={'myUserVariable': "Testing Variable"} @@ -121,7 +121,7 @@ def main(): messages.append({'role': 'user', 'content': USER_INPUT}) # Track the LangChain completion with LaunchDarkly metrics - completion = track_langchain_metrics(tracker, lambda: llm.invoke(messages)) + completion = track_langchain_metrics(config_value.tracker, lambda: llm.invoke(messages)) ai_response = completion.content # Add the AI response to the conversation history. diff --git a/examples/openai_example.py b/examples/openai_example.py index f86672f..aefbc82 100755 --- a/examples/openai_example.py +++ b/examples/openai_example.py @@ -2,7 +2,7 @@ import ldclient from ldclient import Context from ldclient.config import Config -from ldai.client import LDAIClient, AIConfig, ModelConfig, ProviderConfig, LDMessage +from ldai.client import LDAIClient, AICompletionConfigDefault, ModelConfig, ProviderConfig, LDMessage from openai import OpenAI openai_client = OpenAI() @@ -44,14 +44,14 @@ def main(): # Pass a default for improved resiliency when the AI config is unavailable # or LaunchDarkly is unreachable; omit for a disabled default. # Example: - # default = AIConfig( + # default = AICompletionConfigDefault( # enabled=True, # model=ModelConfig(name='gpt-4'), # provider=ProviderConfig(name='openai'), # messages=[LDMessage(role='system', content='You are a helpful assistant.')], # ) - # config_value, tracker = aiclient.config(ai_config_key, context, default, {'myUserVariable': "Testing Variable"}) - config_value, tracker = aiclient.config( + # config_value = aiclient.config(ai_config_key, context, default, {'myUserVariable': "Testing Variable"}) + config_value = aiclient.config( ai_config_key, context, variables={'myUserVariable': "Testing Variable"} @@ -69,7 +69,7 @@ def main(): messages.append({'role': 'user', 'content': USER_INPUT}) # Track the OpenAI completion with LaunchDarkly metrics - completion = tracker.track_openai_metrics( + completion = config_value.tracker.track_openai_metrics( lambda: openai_client.chat.completions.create( model=config_value.model.name,