@@ -35,6 +35,48 @@ def _setup_langfuse_observability(*, verbose: bool = False) -> None:
3535 typer .echo (f"Warning: failed to initialize Langfuse observability: { e } " , err = True )
3636
3737
38+ def _setup_langextract_observability (* , verbose : bool = False ) -> None :
39+ """Set up Langextract observability by wiring TraceSink to action emitter."""
40+ try :
41+ import importlib .util
42+
43+ # Explicitly check if langextract is available before attempting to use it
44+ if importlib .util .find_spec ('langextract' ) is None :
45+ if verbose :
46+ typer .echo ("Warning: langextract is not installed. Install with: pip install 'praisonai[langextract]'" , err = True )
47+ return
48+
49+ from praisonai .observability .langextract import LangextractSink , LangextractSinkConfig
50+ from praisonaiagents .trace .protocol import TraceEmitter , set_default_emitter
51+ import os
52+ import atexit
53+
54+ # Build LangextractSinkConfig from env vars
55+ config = LangextractSinkConfig (
56+ output_path = os .getenv ("PRAISONAI_LANGEXTRACT_OUTPUT" , "praisonai-trace.html" ),
57+ auto_open = os .getenv ("PRAISONAI_LANGEXTRACT_AUTO_OPEN" , "false" ).lower () == "true" ,
58+ )
59+
60+ # Create LangextractSink
61+ sink = LangextractSink (config = config )
62+
63+ # Ensure sink is closed on exit to write the trace file
64+ atexit .register (sink .close )
65+
66+ # Set up action-level trace emitter
67+ emitter = TraceEmitter (sink = sink , enabled = True )
68+ set_default_emitter (emitter )
69+
70+ except ImportError :
71+ # Gracefully degrade if langextract not installed
72+ if verbose :
73+ typer .echo ("Warning: langextract is not installed. Install with: pip install 'praisonai[langextract]'" , err = True )
74+ except Exception as e :
75+ # Avoid breaking CLI if observability setup fails
76+ if verbose :
77+ typer .echo (f"Warning: failed to initialize langextract observability: { e } " , err = True )
78+
79+
3880class OutputFormat (str , Enum ):
3981 """Output format options."""
4082 text = "text"
@@ -125,7 +167,7 @@ def main_callback(
125167 None ,
126168 "--observe" ,
127169 "-O" ,
128- help = "Enable observability (langfuse, langsmith, etc. )" ,
170+ help = "Enable observability (langfuse, langextract )" ,
129171 envvar = "PRAISONAI_OBSERVE" ,
130172 ),
131173):
@@ -148,9 +190,15 @@ def main_callback(
148190
149191 # Validate and set up observability if requested
150192 if observe :
151- if observe != "langfuse" :
152- raise typer .BadParameter (f"Unsupported observe provider: { observe } " )
153- _setup_langfuse_observability (verbose = verbose )
193+ if observe == "langfuse" :
194+ _setup_langfuse_observability (verbose = verbose )
195+ elif observe == "langextract" :
196+ _setup_langextract_observability (verbose = verbose )
197+ else :
198+ raise typer .BadParameter (
199+ f"Unsupported observe provider: { observe } . "
200+ "Choose one of: langfuse, langextract."
201+ )
154202
155203 # Determine output mode
156204 if state .quiet :
@@ -278,6 +326,7 @@ def register_commands():
278326 from .commands .flow import app as flow_app
279327 from .commands .unified import app as unified_app
280328 from .commands .langfuse import app as langfuse_app
329+ from .commands .langextract import app as langextract_app
281330 from .commands .port import app as port_app
282331 from .commands .managed import app as managed_app
283332 from .commands .up import app as up_app
@@ -465,6 +514,7 @@ def app_cmd(
465514 app .add_typer (flow_app , name = "flow" , help = "Visual workflow builder (Langflow)" )
466515 app .add_typer (unified_app , name = "dashboard" , help = "🌟 Unified Dashboard (Flow + Claw + UI)" )
467516 app .add_typer (langfuse_app , name = "langfuse" , help = "🔍 Langfuse observability platform" )
517+ app .add_typer (langextract_app , name = "langextract" , help = "🧠 Langextract visual trace layer" )
468518 app .add_typer (port_app , name = "port" , help = "🔌 Manage port usage and resolve conflicts" )
469519 app .add_typer (up_app , name = "up" , help = "🚀 Start unified PraisonAI stack (Langfuse + Langflow)" )
470520
0 commit comments