Skip to content

feat: Langfuse LLM observability — generation tracing with token usage reporting#693

Open
phuongvm wants to merge 4 commits into
plastic-labs:mainfrom
phuongvm:feat/langfuse-llm-observability
Open

feat: Langfuse LLM observability — generation tracing with token usage reporting#693
phuongvm wants to merge 4 commits into
plastic-labs:mainfrom
phuongvm:feat/langfuse-llm-observability

Conversation

@phuongvm
Copy link
Copy Markdown

@phuongvm phuongvm commented May 15, 2026

Summary

Integrates Langfuse as an observability layer for Honcho's LLM calls. Every LLM generation is automatically traced as a Langfuse generation span with model name, provider, input/output tokens, and reasoning effort metadata — enabling cost tracking, latency analysis, and debugging across all Honcho agents.

Problem

Honcho's LLM calls (Deriver, Dialectic, Dreamer, MCP agents) had no centralized observability. Teams could not:

  • Track which models/providers were called and how often
  • Monitor per-call latency and token usage
  • Debug failed or slow LLM interactions in production
  • Measure cost attribution per agent or workspace

Solution

Automatic Generation Tracing

Every call through honcho_llm_call() is automatically traced as a Langfuse generation span via the @conditional_observe decorator. The span is updated with runtime metadata: model name, provider, input/output tokens, and is_fallback status.

Token Usage Reporting

Token counts are reported on the generation span after each call completes, working for both standard providers (Anthropic, OpenAI) and custom model configurations.

Refactored Summarizer Telemetry

Outer summarizer span decorators were replaced with direct track_name passing to honcho_llm_call(), enabling properly nested traces under correct parent traces and eliminating orphaned/duplicate generation spans.

Configuration

Langfuse is configured via environment variables:

  • LANGFUSE_PUBLIC_KEY
  • LANGFUSE_SECRET_KEY
  • LANGFUSE_HOST

The @conditional_observe decorator is a no-op with zero overhead when Langfuse is not configured.

Architecture

flowchart TD
    A[honcho_llm_call] --> B[@conditional_observe]
    B --> C[Create Langfuse generation span]
    C --> D[resolve_runtime_model_config]
    D --> E[plan_attempt / select provider+model]
    E --> F[honcho_llm_call_inner]
    F --> G[update_current_generation with tokens]
Loading

Trace Flow

Trace: "smart-summarizer"
  Generation: "LLM Call"
    model: claude-sonnet-4-20250514
    provider: anthropic
    usage.input: 2048
    usage.output: 512

Files Changed

File Change
src/llm/api.py Added @conditional_observe decorator, post-call Langfuse token usage reporting
src/llm/runtime.py Added update_current_langfuse_observation() for span metadata updates
src/llm/tool_loop.py Added is_fallback + reasoning params to Langfuse observation calls in tool loop
src/llm/executor.py Refactored summarizer telemetry: track_name via params instead of decorator
src/utils/summarizer/main.py Removed outer span decorator
src/utils/summarizer/paper.py Removed outer span decorator
src/utils/summarizer/summarization.py Removed outer span decorator
src/telemetry/validation.py Added is_fallback field validation to reasoning traces
openspec/specs/observability-langfuse/spec.md OpenSpec specification

Notes for Reviewers

  • This PR focuses on Langfuse LLM observability only. Provider support (Nous, LMStudio) is submitted separately.
  • Summarizer telemetry refactoring is included because the old decorator pattern produced orphaned/duplicate spans.
  • No new external dependencies — Langfuse Python SDK is already a project dependency.

Summary by CodeRabbit

  • Refactor
    • Enhanced telemetry system to improve LLM token usage tracking and reporting
    • Updated observation tracking to better categorize and report generation metrics

Review Change Stack

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 15, 2026

Walkthrough

This PR upgrades Langfuse observability for LLM calls by adding generation-typed observation support with explicit token reporting. The conditional_observe decorator gains an as_type parameter, honcho_llm_call emits generation observations and reports input/output token counts in both execution paths, and the generation observation update mechanism switches to a dedicated API with model attribution.

Changes

Langfuse Generation Tracing Implementation

Layer / File(s) Summary
Observability decorator as_type support
src/telemetry/logging.py
conditional_observe decorator-factory overload and implementation extended to accept optional as_type parameter and forward it to Langfuse observe() via keyword arguments. Any type imported for type hints.
Honcho LLM call generation tracing
src/llm/api.py
honcho_llm_call decorated with as_type="generation" and settings.LANGFUSE_PUBLIC_KEY imported. Token usage (input_tokens, output_tokens) from LLM responses conditionally updates current Langfuse generation in both tool-less path (lines 417–430) and tool-loop path (lines 470–482) with debug logging on error.
Generation observation updates with model attribution
src/llm/runtime.py
update_current_langfuse_observation switches from update_current_span() to update_current_generation(), passing model at top level and operational metadata (namespace, provider) in a metadata dictionary.
Test assertion updates
tests/utils/test_clients.py
test_track_name_updates_langfuse_span_name assertion updated to verify update_current_generation() called with name, top-level model, and metadata containing namespace and provider.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Poem

🐰 Langfuse now knows what tokens flew,
Generations traced, from start to through,
Models named with models true,
Observations shine in Honcho's view!

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 50.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the main change: integrating Langfuse observability for LLM calls with generation tracing and token usage reporting, which matches the core objective of the PR.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (3)
openspec/workspace/sessions/agent_share.md (1)

1-133: ⚡ Quick win

Avoid maintaining two near-identical coordination docs as active sources.

openspec/workspace/sessions/agent_share.md and openspec/workspace/journal/2026-05-05/agent_share_afternoon.md currently duplicate the same operational content. Please keep one canonical live doc and make the other a pointer/snapshot note to reduce drift risk during active coordination.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@openspec/workspace/sessions/agent_share.md` around lines 1 - 133, Two
near-identical coordination docs (openspec/workspace/sessions/agent_share.md and
openspec/workspace/journal/2026-05-05/agent_share_afternoon.md) must be
deduplicated: choose one as the canonical live document (update its header and
Ground Rules to declare it canonical), convert the other into a snapshot/pointer
that contains a short note linking to the canonical file and the snapshot
timestamp, merge any unique entries from Updates Log or Shared Notes into the
canonical file (referencing the unique markers like "Updates Log" and "Shared
Notes") before archiving the snapshot, update the File Ownership table to
reflect the single live file, and ensure all agents and any automation reference
only the canonical path going forward.
src/llm/api.py (1)

311-323: ⚡ Quick win

Consolidate duplicate Langfuse usage reporting into a helper function.

The Langfuse usage update logic is duplicated in both the tool-less path (lines 312-323) and tool-loop path (lines 363-374). Extracting this to a helper function improves maintainability and reduces the risk of inconsistent updates.

♻️ Proposed refactor

Add a helper function at module level:

def _update_langfuse_generation_usage(result: HonchoLLMCallResponse[Any]) -> None:
    """Update Langfuse generation with token usage from the response."""
    if not settings.LANGFUSE_PUBLIC_KEY:
        return
    
    try:
        from langfuse import get_client
        usage = {}
        if result.input_tokens is not None:
            usage["input"] = result.input_tokens
        if result.output_tokens is not None:
            usage["output"] = result.output_tokens
        if usage:
            get_client().update_current_generation(usage_details=usage)
    except Exception as exc:
        logger.debug("Failed to update Langfuse usage: %s", exc)

Then replace both blocks with:

     result: (
         HonchoLLMCallResponse[Any] | AsyncIterator[HonchoLLMCallStreamChunk]
     ) = await decorated()
-    
-    if isinstance(result, HonchoLLMCallResponse) and settings.LANGFUSE_PUBLIC_KEY:
-        try:
-            from langfuse import get_client
-            usage = {}
-            if result.input_tokens is not None:
-                usage["input"] = result.input_tokens
-            if result.output_tokens is not None:
-                usage["output"] = result.output_tokens
-            if usage:
-                get_client().update_current_generation(usage_details=usage)
-        except Exception as exc:
-            logger.debug("Failed to update Langfuse usage: %s", exc)
-
+    if isinstance(result, HonchoLLMCallResponse):
+        _update_langfuse_generation_usage(result)

     if trace_name and isinstance(result, HonchoLLMCallResponse):

And similarly for the tool-loop path around line 363.

Also applies to: 363-374

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/llm/api.py` around lines 311 - 323, Extract the duplicated Langfuse usage
reporting into a module-level helper function (e.g., def
_update_langfuse_generation_usage(result: HonchoLLMCallResponse[Any]) -> None)
that checks settings.LANGFUSE_PUBLIC_KEY, imports get_client from langfuse,
builds the usage dict from result.input_tokens and result.output_tokens, calls
get_client().update_current_generation(usage_details=usage) when non-empty, and
logs exceptions via logger.debug; then replace the two duplicated blocks in the
tool-less path and the tool-loop path (the existing code handling
HonchoLLMCallResponse around the current if blocks) with calls to this new
_update_langfuse_generation_usage(result).
openspec/specs/observability-langfuse/spec.md (1)

4-4: 💤 Low value

Consider completing the TBD placeholder.

The Purpose section contains "TBD: Core capabilities for integrating Langfuse LLM observability and tracing telemetry within Honcho." Since the requirements below are well-defined, the purpose statement could be finalized to better introduce the specification.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@openspec/specs/observability-langfuse/spec.md` at line 4, Replace the "TBD:
Core capabilities for integrating Langfuse LLM observability and tracing
telemetry within Honcho." placeholder in the Purpose section with a concise
finalized purpose statement that describes the spec's scope—e.g., that it
defines core capabilities for integrating Langfuse LLM observability and tracing
into Honcho, including telemetry collection (metrics, traces, logs), integration
points (SDK hooks, middleware), configuration options, data retention and
sampling rules, and supported user-facing features (dashboards, alerting, trace
correlation). Update the Purpose paragraph to mention the intended audience and
high-level goals so it clearly introduces the rest of the document.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@openspec/changes/archive/2026-05-05-honcho-langfuse-generation-traces/explorations/2026-05-05-langfuse-generation-observations-openspec-gap.md`:
- Line 126: Replace the misspelled word "approplies" with "applies" in the
sentence "**Next command**: **`/opsx-propose`** (or workspace equivalent) when
Commander approplies change name and scope boundaries." so it reads "...when
Commander applies change name and scope boundaries." — update the phrase
containing "approplies" accordingly.

---

Nitpick comments:
In `@openspec/specs/observability-langfuse/spec.md`:
- Line 4: Replace the "TBD: Core capabilities for integrating Langfuse LLM
observability and tracing telemetry within Honcho." placeholder in the Purpose
section with a concise finalized purpose statement that describes the spec's
scope—e.g., that it defines core capabilities for integrating Langfuse LLM
observability and tracing into Honcho, including telemetry collection (metrics,
traces, logs), integration points (SDK hooks, middleware), configuration
options, data retention and sampling rules, and supported user-facing features
(dashboards, alerting, trace correlation). Update the Purpose paragraph to
mention the intended audience and high-level goals so it clearly introduces the
rest of the document.

In `@openspec/workspace/sessions/agent_share.md`:
- Around line 1-133: Two near-identical coordination docs
(openspec/workspace/sessions/agent_share.md and
openspec/workspace/journal/2026-05-05/agent_share_afternoon.md) must be
deduplicated: choose one as the canonical live document (update its header and
Ground Rules to declare it canonical), convert the other into a snapshot/pointer
that contains a short note linking to the canonical file and the snapshot
timestamp, merge any unique entries from Updates Log or Shared Notes into the
canonical file (referencing the unique markers like "Updates Log" and "Shared
Notes") before archiving the snapshot, update the File Ownership table to
reflect the single live file, and ensure all agents and any automation reference
only the canonical path going forward.

In `@src/llm/api.py`:
- Around line 311-323: Extract the duplicated Langfuse usage reporting into a
module-level helper function (e.g., def
_update_langfuse_generation_usage(result: HonchoLLMCallResponse[Any]) -> None)
that checks settings.LANGFUSE_PUBLIC_KEY, imports get_client from langfuse,
builds the usage dict from result.input_tokens and result.output_tokens, calls
get_client().update_current_generation(usage_details=usage) when non-empty, and
logs exceptions via logger.debug; then replace the two duplicated blocks in the
tool-less path and the tool-loop path (the existing code handling
HonchoLLMCallResponse around the current if blocks) with calls to this new
_update_langfuse_generation_usage(result).
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 83d13b2b-ab24-4032-a295-42a680b7350d

📥 Commits

Reviewing files that changed from the base of the PR and between 8fcbb54 and df9a14a.

📒 Files selected for processing (24)
  • openspec/changes/archive/2026-05-05-fix-summarizer-telemetry-spans/.openspec.yaml
  • openspec/changes/archive/2026-05-05-fix-summarizer-telemetry-spans/design.md
  • openspec/changes/archive/2026-05-05-fix-summarizer-telemetry-spans/explorations/2026-05-05-nested-langfuse-spans.md
  • openspec/changes/archive/2026-05-05-fix-summarizer-telemetry-spans/proposal.md
  • openspec/changes/archive/2026-05-05-fix-summarizer-telemetry-spans/specs/.gitkeep
  • openspec/changes/archive/2026-05-05-fix-summarizer-telemetry-spans/specs/observability-langfuse/spec.md
  • openspec/changes/archive/2026-05-05-fix-summarizer-telemetry-spans/tasks.md
  • openspec/changes/archive/2026-05-05-honcho-langfuse-generation-traces/.openspec.yaml
  • openspec/changes/archive/2026-05-05-honcho-langfuse-generation-traces/design.md
  • openspec/changes/archive/2026-05-05-honcho-langfuse-generation-traces/explorations/2026-05-05-langfuse-generation-observations-openspec-gap.md
  • openspec/changes/archive/2026-05-05-honcho-langfuse-generation-traces/proposal.md
  • openspec/changes/archive/2026-05-05-honcho-langfuse-generation-traces/specs/observability-langfuse/spec.md
  • openspec/changes/archive/2026-05-05-honcho-langfuse-generation-traces/tasks.md
  • openspec/specs/observability-langfuse/spec.md
  • openspec/workspace/journal/2026-05-05/agent_share_afternoon.md
  • openspec/workspace/memories/leader/2026-05-05/archive_01.md
  • openspec/workspace/memories/leader/2026-05-05/current.md
  • openspec/workspace/memories/leader/lesson_learnt/L-001-langfuse-custom-model-tokens.md
  • openspec/workspace/sessions/agent_share.md
  • src/llm/api.py
  • src/llm/runtime.py
  • src/telemetry/logging.py
  • src/utils/summarizer.py
  • tests/utils/test_clients.py

## 10. Status

**Exploration**: Closed with **decision to formalize via OpenSpec proposal** (recommended Option A).
**Next command**: **`/opsx-propose`** (or workspace equivalent) when Commander approplies change name and scope boundaries.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Fix typo in documentation.

"approplies" should be "applies".

📝 Proposed fix
-**Next command**: **`/opsx-propose`** (or workspace equivalent) when Commander approplies change name and scope boundaries.
+**Next command**: **`/opsx-propose`** (or workspace equivalent) when Commander applies change name and scope boundaries.
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
**Next command**: **`/opsx-propose`** (or workspace equivalent) when Commander approplies change name and scope boundaries.
**Next command**: **`/opsx-propose`** (or workspace equivalent) when Commander applies change name and scope boundaries.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@openspec/changes/archive/2026-05-05-honcho-langfuse-generation-traces/explorations/2026-05-05-langfuse-generation-observations-openspec-gap.md`
at line 126, Replace the misspelled word "approplies" with "applies" in the
sentence "**Next command**: **`/opsx-propose`** (or workspace equivalent) when
Commander approplies change name and scope boundaries." so it reads "...when
Commander applies change name and scope boundaries." — update the phrase
containing "approplies" accordingly.

@VVoruganti
Copy link
Copy Markdown
Collaborator

The actual langfuse updates seem directionally good, but please clean up all of the openspec files and remove from the PR

@phuongvm
Copy link
Copy Markdown
Author

Openspec files have been removed per request. PR is now clean and ready for re-review.

phuongvm added 4 commits May 21, 2026 20:22
- Introduced new capability for tracing LLM calls as Langfuse generation observations.
- Updated `honcho_llm_call` to use `@conditional_observe` with `as_type="generation"`.
- Modified `update_current_langfuse_observation` to set the `model` field and preserve metadata.
- Added comprehensive documentation and tasks for verification and future enhancements.
- Created exploration and proposal documents to formalize the integration process.
…custom models and initialize project documentation
…name passing to honcho_llm_call for improved Langfuse telemetry aggregation.
@phuongvm phuongvm force-pushed the feat/langfuse-llm-observability branch from 9a4ea1c to 4bd10a7 Compare May 21, 2026 14:02
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (2)
src/llm/api.py (2)

418-429: ⚡ Quick win

Consider extracting token usage reporting to a helper function.

The token usage reporting logic appears twice (lines 418-429 and 470-481) with identical implementation. Since this is best-effort telemetry with specific exception handling, extracting it to a helper would improve maintainability.

♻️ Proposed refactor

Add a helper function:

def _report_langfuse_token_usage(
    result: HonchoLLMCallResponse[Any],
) -> None:
    """Report token usage to Langfuse for the current generation span."""
    if not settings.LANGFUSE_PUBLIC_KEY:
        return
    
    try:
        from langfuse import get_client
        usage = {}
        if result.input_tokens is not None:
            usage["input"] = result.input_tokens
        if result.output_tokens is not None:
            usage["output"] = result.output_tokens
        if usage:
            get_client().update_current_generation(usage_details=usage)
    except Exception as exc:
        logger.debug("Failed to update Langfuse usage: %s", exc)

Then replace both occurrences with:

if isinstance(result, HonchoLLMCallResponse):
    _report_langfuse_token_usage(result)

Note: The bare Exception catch is appropriate here for best-effort telemetry and should not be changed.

Also applies to: 470-481

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/llm/api.py` around lines 418 - 429, Extract the duplicated Langfuse
token-usage reporting into a helper function (e.g.,
_report_langfuse_token_usage(result: HonchoLLMCallResponse)) that checks
settings.LANGFUSE_PUBLIC_KEY, imports get_client from langfuse, builds the usage
dict from result.input_tokens/result.output_tokens, calls
get_client().update_current_generation(usage_details=usage) when non-empty, and
catches/ logs exceptions with logger.debug as currently done; then replace both
duplicated blocks that test isinstance(result, HonchoLLMCallResponse) with a
single call to _report_langfuse_token_usage(result) (leaving the bare Exception
catch behavior unchanged).

318-412: 💤 Low value

Consider extracting the truncation logic for reusability.

The max_input_tokens enforcement logic is well-implemented and the token-based cap detection correctly handles the single-oversized-message edge case. The new toolless path provides clear separation from the tool-enabled flow.

However, this creates a parallel code path with significant duplication of the honcho_llm_call_inner invocation logic (lines 356-397 vs 227-266). Consider whether a shared helper or parameter flag could reduce this duplication in a future refactor.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/llm/api.py` around lines 318 - 412, The truncation and cap-detection code
duplicated for the toolless path should be extracted into a small reusable
helper (e.g., compute_truncated_messages_or_original) that encapsulates use of
count_message_tokens and truncate_messages_to_fit and returns (messages,
hit_input_token_cap); replace references to
toolless_messages/toolless_hit_input_token_cap with that helper in the toolless
branch and update calls to honcho_llm_call_inner to use the returned messages so
the same invocation logic (currently in _toolless_call / wrapped) can be shared
with the tool-enabled path, reducing duplicate honcho_llm_call_inner invocation
code and keeping existing behavior (including stream, track_name, enable_retry,
and decorated() fallthrough).
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@src/llm/api.py`:
- Around line 418-429: Extract the duplicated Langfuse token-usage reporting
into a helper function (e.g., _report_langfuse_token_usage(result:
HonchoLLMCallResponse)) that checks settings.LANGFUSE_PUBLIC_KEY, imports
get_client from langfuse, builds the usage dict from
result.input_tokens/result.output_tokens, calls
get_client().update_current_generation(usage_details=usage) when non-empty, and
catches/ logs exceptions with logger.debug as currently done; then replace both
duplicated blocks that test isinstance(result, HonchoLLMCallResponse) with a
single call to _report_langfuse_token_usage(result) (leaving the bare Exception
catch behavior unchanged).
- Around line 318-412: The truncation and cap-detection code duplicated for the
toolless path should be extracted into a small reusable helper (e.g.,
compute_truncated_messages_or_original) that encapsulates use of
count_message_tokens and truncate_messages_to_fit and returns (messages,
hit_input_token_cap); replace references to
toolless_messages/toolless_hit_input_token_cap with that helper in the toolless
branch and update calls to honcho_llm_call_inner to use the returned messages so
the same invocation logic (currently in _toolless_call / wrapped) can be shared
with the tool-enabled path, reducing duplicate honcho_llm_call_inner invocation
code and keeping existing behavior (including stream, track_name, enable_retry,
and decorated() fallthrough).

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: f4025465-1eea-4c44-a06b-63af2d0e0028

📥 Commits

Reviewing files that changed from the base of the PR and between df9a14a and 4bd10a7.

📒 Files selected for processing (5)
  • src/llm/api.py
  • src/llm/runtime.py
  • src/telemetry/logging.py
  • src/utils/summarizer.py
  • tests/utils/test_clients.py

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants