diff --git a/sdk-api/logging/galileo-context.mdx b/sdk-api/logging/galileo-context.mdx
index 0d4442aa9..b8e6652d6 100644
--- a/sdk-api/logging/galileo-context.mdx
+++ b/sdk-api/logging/galileo-context.mdx
@@ -17,6 +17,7 @@ import SnippetSdkLoggingContextSimpleWithLogPythonBeta from "/snippets/code/pyth
import SnippetSdkLoggingContextSimpleWithOpenAIPython from "/snippets/code/python/sdk/logging/context-simple-with-openai.mdx";
import SnippetSdkLoggingContextSimpleWithOpenAIPythonBeta from "/snippets/code/python-beta/sdk/logging/context-simple-with-openai.mdx";
import SnippetSdkLoggingNestingScopesPython from "/snippets/code/python/sdk/logging/nesting-scopes.mdx";
+import SnippetSdkLoggingNestingScopesPythonBeta from "/snippets/code/python-beta/sdk/logging/nesting-scopes.mdx";
import SnippetSdkLoggingContextNewSessionPython from "/snippets/code/python/sdk/logging/context-new-session.mdx";
import SnippetSdkLoggingContextNewSessionExternalIdPython from "/snippets/code/python/sdk/logging/context-new-session-external-id.mdx";
import SnippetSdkLoggingContextContinueSessionPython from "/snippets/code/python/sdk/logging/context-continue-session.mdx";
@@ -83,6 +84,7 @@ You can nest `galileo_context` calls to temporarily override the project or Log
+
## Get the current logger
diff --git a/sdk-api/logging/galileo-logger.mdx b/sdk-api/logging/galileo-logger.mdx
index 81314146d..10979bd6e 100644
--- a/sdk-api/logging/galileo-logger.mdx
+++ b/sdk-api/logging/galileo-logger.mdx
@@ -9,6 +9,7 @@ import SnippetSdkLoggingGetLoggerPython from "/snippets/code/python/sdk/logging/
import SnippetSdkLoggingGetLoggerDecoratorPython from "/snippets/code/python/sdk/logging/logger-from-context-log-decorator.mdx";
import SnippetSdkLoggingBasicLoggingPython from "/snippets/code/python/sdk/logging/basic-logging.mdx";
import SnippetSdkLoggingCreateLoggerPython from "/snippets/code/python/sdk/logging/create-logger.mdx";
+import SnippetSdkLoggingCreateLoggerPythonBeta from "/snippets/code/python-beta/sdk/logging/create-logger.mdx";
import SnippetSdkLoggingStartLoggerSessionPython from "/snippets/code/python/sdk/logging/start-logger-session.mdx";
import SnippetSdkLoggingStartLoggerSessionMetadataPython from "/snippets/code/python/sdk/logging/start-logger-session-metadata.mdx";
import SnippetSdkLoggingStartLoggerSessionMetadataTypeScript from "/snippets/code/typescript/sdk/logging/start-logger-session-metadata.mdx";
@@ -109,6 +110,7 @@ This example:
+
diff --git a/sdk-api/logging/log-decorator/log-decorator.mdx b/sdk-api/logging/log-decorator/log-decorator.mdx
index 803b37d2d..cd0b3f198 100644
--- a/sdk-api/logging/log-decorator/log-decorator.mdx
+++ b/sdk-api/logging/log-decorator/log-decorator.mdx
@@ -10,6 +10,7 @@ import SnippetLogDecoratorBasicUsagePython from "/snippets/code/python/sdk/decor
import SnippetLogDecoratorAdditionalParamsPython from "/snippets/code/python/sdk/decorators/log-decorator-additional-params.mdx";
import SnippetLogDecoratorMetadataTagsPython from "/snippets/code/python/sdk/decorators/log-decorator-metadata-tags.mdx";
import SnippetLogDecoratorContextManagementPython from "/snippets/code/python/sdk/decorators/log-decorator-context-management.mdx";
+import SnippetLogDecoratorContextManagementPythonBeta from "/snippets/code/python-beta/sdk/decorators/log-decorator-context-management.mdx";
import SnippetLogDecoratorGeneratorsPython from "/snippets/code/python/sdk/decorators/log-decorator-generators.mdx";
import SnippetSdkWrappersOpenAILogDecoratorPython from "/snippets/code/python/sdk/wrappers/openai-log-decorator.mdx";
@@ -130,6 +131,7 @@ In Python, you can use the `galileo_context` to set the project and Log stream f
+
## Handling generators (Python)
diff --git a/sdk-api/logging/logging-basics.mdx b/sdk-api/logging/logging-basics.mdx
index dce0c844f..cd731334a 100644
--- a/sdk-api/logging/logging-basics.mdx
+++ b/sdk-api/logging/logging-basics.mdx
@@ -8,7 +8,9 @@ description: Learn the basics of instrumenting your application with Galileo usi
import SnippetSdkLoggingContextInitPython from "/snippets/code/python/sdk/logging/context-init.mdx";
import SnippetSdkLoggingContextInitPythonBeta from "/snippets/code/python-beta/sdk/logging/context-init.mdx";
import SnippetSdkLoggingCreateLoggerWithProjectPython from "/snippets/code/python/sdk/logging/create-logger-with-project.mdx";
+import SnippetSdkLoggingCreateLoggerWithProjectPythonBeta from "/snippets/code/python-beta/sdk/logging/create-logger-with-project.mdx";
import SnippetSdkLoggingContextGetLoggerPython from "/snippets/code/python/sdk/logging/context-get-logger.mdx";
+import SnippetSdkLoggingContextGetLoggerPythonBeta from "/snippets/code/python-beta/sdk/logging/context-get-logger.mdx";
import SnippetSdkLoggingContextInitTypeScript from "/snippets/code/typescript/sdk/logging/context-init.mdx";
import SnippetSdkLoggingCreateLoggerWithProjectTypeScript from "/snippets/code/typescript/sdk/logging/create-logger-with-project.mdx";
@@ -96,6 +98,7 @@ To set the project and Log stream for a single logger, you can pass it to the lo
+
@@ -103,6 +106,7 @@ You can also use the current context to get a logger for a particular project an
+
diff --git a/sdk-api/logging/tags-and-metadata.mdx b/sdk-api/logging/tags-and-metadata.mdx
index 661b3589e..c98fa6340 100644
--- a/sdk-api/logging/tags-and-metadata.mdx
+++ b/sdk-api/logging/tags-and-metadata.mdx
@@ -7,12 +7,14 @@ description: Learn to use tags and metadata in Galileo logging and monitoring
import SnippetTagsAndMetadataPython1 from '/snippets/code/python/tags-and-metadata/tags-and-metadata-py-1.mdx';
+import SnippetTagsAndMetadataPythonBeta1 from '/snippets/code/python-beta/tags-and-metadata/tags-and-metadata-py-1.mdx';
import SnippetTagsAndMetadataPython2 from '/snippets/code/python/tags-and-metadata/tags-and-metadata-py-2.mdx';
import SnippetTagsAndMetadataPython3 from '/snippets/code/python/tags-and-metadata/tags-and-metadata-py-3.mdx';
import SnippetTagsAndMetadataPython4 from '/snippets/code/python/tags-and-metadata/tags-and-metadata-py-4.mdx';
import SnippetTagsAndMetadataPython5 from '/snippets/code/python/tags-and-metadata/tags-and-metadata-py-5.mdx';
import SnippetTagsAndMetadataPython6 from '/snippets/code/python/tags-and-metadata/tags-and-metadata-py-6.mdx';
import SnippetTagsAndMetadataPython7 from '/snippets/code/python/tags-and-metadata/tags-and-metadata-py-7.mdx';
+import SnippetTagsAndMetadataPythonBeta7 from '/snippets/code/python-beta/tags-and-metadata/tags-and-metadata-py-7.mdx';
import SnippetTagsAndMetadataPython8 from '/snippets/code/python/tags-and-metadata/tags-and-metadata-py-8.mdx';
import SnippetTagsAndMetadataTypeScript1 from '/snippets/code/typescript/tags-and-metadata/tags-and-metadata-ts-1.mdx';
@@ -78,6 +80,7 @@ In this guide, we are building on top of the **finished demo application** from
[Log Your First Trace](/getting-started/quickstart) guide.
+
@@ -156,6 +159,7 @@ Below is the **final combined application code** for the
with our tags and metadata added to logged Traces and Spans.
+
diff --git a/snippets/code/python-beta/sdk/decorators/log-decorator-context-management.mdx b/snippets/code/python-beta/sdk/decorators/log-decorator-context-management.mdx
new file mode 100644
index 000000000..2f1c3c5da
--- /dev/null
+++ b/snippets/code/python-beta/sdk/decorators/log-decorator-context-management.mdx
@@ -0,0 +1,14 @@
+```python Python (Beta)
+from galileo import LogStream, log
+
+@log
+def my_function(input):
+ return f"Processed: {input}"
+
+log_stream = LogStream.get(name="my-log-stream", project_name="my-project")
+
+# This will log to the specified project and Log stream
+with log_stream.context():
+ result = my_function("test input")
+ print(result)
+```
diff --git a/snippets/code/python-beta/sdk/logging/context-get-logger.mdx b/snippets/code/python-beta/sdk/logging/context-get-logger.mdx
new file mode 100644
index 000000000..b0891fa16
--- /dev/null
+++ b/snippets/code/python-beta/sdk/logging/context-get-logger.mdx
@@ -0,0 +1,9 @@
+```python Python (Beta)
+from galileo import LogStream, galileo_context
+
+log_stream = LogStream.get(name="my-log-stream", project_name="my-project")
+
+with log_stream.context():
+ # The logger picks up the project / Log stream from the active context
+ logger = galileo_context.get_logger_instance()
+```
diff --git a/snippets/code/python-beta/sdk/logging/create-logger-with-project.mdx b/snippets/code/python-beta/sdk/logging/create-logger-with-project.mdx
new file mode 100644
index 000000000..8e6fc2d49
--- /dev/null
+++ b/snippets/code/python-beta/sdk/logging/create-logger-with-project.mdx
@@ -0,0 +1,10 @@
+```python Python (Beta)
+from galileo import GalileoLogger, LogStream
+
+# Resolve (or create) the Log stream up front
+log_stream = LogStream.get(name="my-log-stream", project_name="my-project")
+
+# Route every logger created in this scope to that Log stream
+with log_stream.context():
+ logger = GalileoLogger()
+```
diff --git a/snippets/code/python-beta/sdk/logging/create-logger.mdx b/snippets/code/python-beta/sdk/logging/create-logger.mdx
new file mode 100644
index 000000000..0fe1619e9
--- /dev/null
+++ b/snippets/code/python-beta/sdk/logging/create-logger.mdx
@@ -0,0 +1,15 @@
+```python Python (Beta)
+from galileo import GalileoLogger, LogStream
+
+# Initialize with default settings (uses environment variables)
+logger = GalileoLogger()
+
+# Or resolve a Log stream first and run logging inside its context
+log_stream = LogStream.get(
+ name="my-log-stream",
+ project_name="my-project",
+)
+
+with log_stream.context():
+ logger = GalileoLogger()
+```
diff --git a/snippets/code/python-beta/sdk/logging/nesting-scopes.mdx b/snippets/code/python-beta/sdk/logging/nesting-scopes.mdx
new file mode 100644
index 000000000..31447e992
--- /dev/null
+++ b/snippets/code/python-beta/sdk/logging/nesting-scopes.mdx
@@ -0,0 +1,17 @@
+```python Python (Beta)
+from galileo import LogStream
+
+main_stream = LogStream.get(name="my-log-stream", project_name="my-project")
+sub_stream = LogStream.get(name="sub-stream", project_name="my-project")
+
+with main_stream.context():
+ # This will log to my-project/my-log-stream
+ operation_1()
+
+ with sub_stream.context():
+ # This will log to my-project/sub-stream
+ operation_2()
+
+ # Back to logging to my-project/my-log-stream
+ operation_3()
+```
diff --git a/snippets/code/python-beta/tags-and-metadata/tags-and-metadata-py-1.mdx b/snippets/code/python-beta/tags-and-metadata/tags-and-metadata-py-1.mdx
new file mode 100644
index 000000000..8201ce4ad
--- /dev/null
+++ b/snippets/code/python-beta/tags-and-metadata/tags-and-metadata-py-1.mdx
@@ -0,0 +1,23 @@
+```python Python (Beta)
+from datetime import datetime
+from galileo import galileo_context
+from galileo import GalileoLogger, LogStream
+from galileo.config import GalileoPythonConfig
+import openai
+from dotenv import load_dotenv
+
+# Load environment variables from the .env file
+load_dotenv()
+
+# Resolve (or create) the Log stream — every logger created in this
+# scope is routed to MyFirstTagandMetadata / MyFirstTagandMetatdata.
+log_stream = LogStream.get(
+ name="MyFirstTagandMetatdata",
+ project_name="MyFirstTagandMetadata",
+)
+# Or create it if it does not exist:
+# log_stream = LogStream(
+# name="MyFirstTagandMetatdata",
+# project_name="MyFirstTagandMetadata",
+# ).create()
+```
diff --git a/snippets/code/python-beta/tags-and-metadata/tags-and-metadata-py-7.mdx b/snippets/code/python-beta/tags-and-metadata/tags-and-metadata-py-7.mdx
new file mode 100644
index 000000000..1a283ec2d
--- /dev/null
+++ b/snippets/code/python-beta/tags-and-metadata/tags-and-metadata-py-7.mdx
@@ -0,0 +1,89 @@
+```python Python (Beta)
+from datetime import datetime
+from galileo import galileo_context
+from galileo import GalileoLogger, LogStream
+from galileo.config import GalileoPythonConfig
+import openai
+from dotenv import load_dotenv
+
+# Load environment variables from the .env file
+load_dotenv()
+
+# Resolve (or create) the Log stream up front
+log_stream = LogStream.get(
+ name="MyFirstTagandMetatdata",
+ project_name="MyFirstTagandMetadata",
+)
+
+# All traces inside this block are routed to the Log stream above
+with log_stream.context():
+ # Get the Galileo logger instance
+ logger = galileo_context.get_logger_instance()
+
+ # Start a Galileo session
+ logger.start_session()
+
+ # Initialize the OpenAI client
+ client = openai.OpenAI()
+
+ # Define a system prompt with guidance
+ system_prompt = f"""
+ You are a helpful assistant that wants to provide a user as much
+ information as possible. Avoid saying I don't know.
+ """
+
+ # Define a user prompt with a question
+ user_prompt = f"Explain the following topic succinctly: Newton's First Law"
+
+ # Send a request to the LLM
+ response = client.chat.completions.create(
+ model="gpt-4o-mini",
+ messages=[
+ {"role": "system", "content": system_prompt},
+ {"role": "user", "content": user_prompt},
+ ],
+ )
+
+ # Print the response
+ print(response.choices[0].message.content.strip())
+
+ answer = response.choices[0].message.content.strip()
+
+ # Define tags and metadata
+ tags = ["newton", "test", "new-version"]
+ metadata = {
+ "experimentNumber": "1",
+ "promptVersion": "0.0.1",
+ "field": "physics",
+ }
+
+ # Initialize a new Trace and start listening for logs to add to it
+ trace = logger.start_trace(
+ input=user_prompt,
+ tags=tags,
+ metadata=metadata,
+ )
+
+ # Create a span to log LLM outputs. This is captured by the Trace.
+ logger.add_llm_span(
+ input=[{"role": "system", "content": user_prompt}],
+ output=response.choices[0].message.content,
+ model="gpt-4o",
+ tags=tags,
+ metadata=metadata,
+ )
+
+ # Close the Trace and push captured logs to it
+ logger.conclude(answer)
+ logger.flush()
+
+ # Show Galileo information after the response
+ config = GalileoPythonConfig.get()
+ project_url = f"{config.console_url}project/{logger.project_id}"
+ log_stream_url = f"{project_url}/log-streams/{logger.log_stream_id}"
+
+ print()
+ print("🚀 GALILEO LOG INFORMATION:")
+ print(f"🔗 Project : {project_url}")
+ print(f"📝 Log Stream: {log_stream_url}")
+```