# ========= Copyright 2026 @ Strukto.AI All Rights Reserved. ========= # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # ========= Copyright 2026 @ Strukto.AI All Rights Reserved. ========= import os import time from dotenv import load_dotenv from langfuse import Langfuse, propagate_attributes load_dotenv("/Users/zecheng/strukto/mirage/.env.development") langfuse = Langfuse( public_key=os.environ["LANGFUSE_PUBLIC_KEY"], secret_key=os.environ["LANGFUSE_SECRET_KEY"], host=os.environ["LANGFUSE_HOST"], ) print("Auth check:", langfuse.auth_check()) print("\n=== Creating prompts ===") for name, prompt_text, cfg, label in [ ("summarize", "Summarize the following text in {{style}} style:\n\n{{text}}", { "model": "gpt-4o", "temperature": 0.3 }, "production"), ("summarize", "You are an expert summarizer. Summarize in {{style}} style:\n\n{{text}}", { "model": "gpt-4o", "temperature": 0.2 }, "staging"), ("classify", "Classify the sentiment as positive, negative, or neutral:\n\n{{text}}", { "model": "gpt-4o-mini", "temperature": 0 }, "production"), ("extract-entities", "Extract all named entities. Return as JSON.\n\n{{text}}", { "model": "gpt-4o", "temperature": 0 }, "production"), ]: langfuse.create_prompt( name=name, type="text", prompt=prompt_text, config=cfg, labels=[label], ) print(f" created: {name} [{label}]") print("\n=== Creating traces ===") traces_data = [ { "trace_name": "chat-completion", "session_id": "chat-session-001", "user_id": "user-alice", "tags": ["chat", "geography"], "input": { "messages": [{ "role": "user", "content": "What is the capital of France?" }] }, "output": { "response": "The capital of France is Paris." }, "model": "gpt-4o", }, { "trace_name": "chat-completion", "session_id": "chat-session-001", "user_id": "user-alice", "tags": ["chat", "geography"], "input": { "messages": [{ "role": "user", "content": "Tell me more about Paris" }] }, "output": { "response": "Paris is known for the Eiffel Tower and Louvre Museum." }, "model": "gpt-4o", }, { "trace_name": "chat-completion", "session_id": "chat-session-002", "user_id": "user-bob", "tags": ["chat", "science"], "input": { "messages": [{ "role": "user", "content": "Explain quantum computing" }] }, "output": { "response": "Quantum computing uses qubits that can be in superposition..." }, "model": "gpt-4o", }, { "trace_name": "summarize-document", "session_id": "chat-session-002", "user_id": "user-bob", "tags": ["summarization", "science"], "input": { "text": "A long research paper about quantum computing..." }, "output": { "summary": "This paper introduces a novel approach to error correction..." }, "model": "gpt-4o", }, { "trace_name": "support-classify", "session_id": "support-ticket-101", "user_id": "user-charlie", "tags": ["support", "classification"], "input": { "text": "I can't log in, keeps showing error 403" }, "output": { "category": "authentication", "priority": "high" }, "model": "gpt-4o-mini", }, { "trace_name": "support-respond", "session_id": "support-ticket-101", "user_id": "user-charlie", "tags": ["support", "response"], "input": { "ticket": "Can't log in, error 403" }, "output": { "response": "Please try clearing your browser cookies..." }, "model": "gpt-4o", }, { "trace_name": "entity-extraction", "user_id": "user-alice", "tags": ["extraction", "ner"], "input": { "text": "Apple CEO Tim Cook announced new products in Cupertino." }, "output": { "entities": [{ "name": "Apple", "type": "ORG" }, { "name": "Tim Cook", "type": "PERSON" }] }, "model": "gpt-4o", }, { "trace_name": "chat-completion", "user_id": "user-dave", "tags": ["chat", "creative"], "input": { "messages": [{ "role": "user", "content": "Write a haiku about programming" }] }, "output": { "response": "Code flows like water\n" "Bugs swim in the logic stream\n" "Debug, compile, run", }, "model": "gpt-4o", }, ] for td in traces_data: with propagate_attributes( trace_name=td["trace_name"], session_id=td.get("session_id"), user_id=td.get("user_id"), tags=td.get("tags"), metadata={"env": "production"}, ): with langfuse.start_as_current_observation( name=td["trace_name"], as_type="span", input=td["input"], output=td["output"], ): with langfuse.start_as_current_observation( name=f"{td['trace_name']}-llm", as_type="generation", model=td["model"], input=td["input"], output=td["output"], usage_details={ "input_tokens": 50 + len(str(td["input"])), "output_tokens": 30 + len(str(td["output"])), }, ): pass print(f" created: {td['trace_name']} " f"(session={td.get('session_id', '-')})") print(f"\n total: {len(traces_data)} traces") print("\n=== Creating datasets ===") langfuse.create_dataset(name="qa-eval", description="QA evaluation") qa_items = [ ({ "question": "What is the capital of France?" }, { "answer": "Paris" }), ({ "question": "Who wrote Romeo and Juliet?" }, { "answer": "Shakespeare" }), ({ "question": "What is the speed of light?" }, { "answer": "299,792,458 m/s" }), ({ "question": "What is the largest planet?" }, { "answer": "Jupiter" }), ({ "question": "Who painted the Mona Lisa?" }, { "answer": "da Vinci" }), ] for inp, exp in qa_items: langfuse.create_dataset_item( dataset_name="qa-eval", input=inp, expected_output=exp, ) print(f" qa-eval: {len(qa_items)} items") langfuse.create_dataset(name="sentiment-eval", description="Sentiment classification") sent_items = [ ({ "text": "I love this product!" }, { "sentiment": "positive" }), ({ "text": "Terrible experience" }, { "sentiment": "negative" }), ({ "text": "It was okay" }, { "sentiment": "neutral" }), ({ "text": "Best purchase ever" }, { "sentiment": "positive" }), ({ "text": "Completely broken" }, { "sentiment": "negative" }), ] for inp, exp in sent_items: langfuse.create_dataset_item( dataset_name="sentiment-eval", input=inp, expected_output=exp, ) print(f" sentiment-eval: {len(sent_items)} items") print("\n=== Flushing ===") langfuse.flush() time.sleep(3) print("\n=== Verifying ===") traces = langfuse.fetch_traces(limit=5) print(f" traces: {len(traces.data)} found") for t in traces.data[:3]: print(f" {t.name} (session={t.session_id})") prompt = langfuse.get_prompt("summarize") print(f" summarize prompt: v{prompt.version}") print("\nDone!")