Module: Tracebook
- Defined in:
- lib/tracebook.rb,
lib/tracebook/config.rb,
lib/tracebook/engine.rb,
lib/tracebook/errors.rb,
lib/tracebook/result.rb,
lib/tracebook/mappers.rb,
lib/tracebook/version.rb,
lib/tracebook/mappers/base.rb,
lib/tracebook/mappers/ollama.rb,
lib/tracebook/mappers/openai.rb,
lib/tracebook/redactors/base.rb,
lib/tracebook/redactors/email.rb,
lib/tracebook/redactors/phone.rb,
lib/tracebook/adapters/ruby_llm.rb,
lib/tracebook/mappers/anthropic.rb,
lib/tracebook/pricing/calculator.rb,
lib/tracebook/redaction_pipeline.rb,
lib/tracebook/redactors/card_pan.rb,
lib/tracebook/adapters/active_agent.rb,
lib/tracebook/normalized_interaction.rb,
lib/generators/tracebook/install/install_generator.rb,
app/jobs/tracebook/export_job.rb,
app/models/tracebook/interaction.rb,
app/models/tracebook/pricing_rule.rb,
app/models/tracebook/rollup_daily.rb,
app/jobs/tracebook/application_job.rb,
app/models/tracebook/redaction_rule.rb,
app/jobs/tracebook/daily_rollups_job.rb,
app/models/tracebook/application_record.rb,
app/helpers/tracebook/application_helper.rb,
app/mailers/tracebook/application_mailer.rb,
app/helpers/tracebook/interactions_helper.rb,
app/jobs/tracebook/persist_interaction_job.rb,
app/controllers/tracebook/exports_controller.rb,
app/controllers/tracebook/application_controller.rb,
app/controllers/tracebook/interactions_controller.rb
Overview
TraceBook is a Rails engine for capturing, storing, and reviewing LLM interactions.
It provides:
- Automatic redaction of PII from request/response payloads
- Encrypted storage of sensitive data using ActiveRecord::Encryption
- Cost tracking based on token usage and configurable pricing rules
- Review workflow (approve/flag/reject) with audit trail
- Hotwire-powered dashboard UI with filtering and export
- Built-in adapters for OpenAI, Anthropic, Ollama
- Support for hierarchical agent sessions (parent-child relationships)
Defined Under Namespace
Modules: Adapters, ApplicationHelper, Generators, InteractionsHelper, Mappers, Pricing, Redactors Classes: ApplicationController, ApplicationJob, ApplicationMailer, ApplicationRecord, Config, ConfigurationError, DailyRollupsJob, Engine, Error, ExportJob, ExportsController, Interaction, InteractionsController, NormalizedInteraction, PersistInteractionJob, PricingRule, RedactionPipeline, RedactionRule, Result, RollupDaily
Constant Summary collapse
- VERSION =
"0.1.1"
Class Method Summary collapse
- .build_normalized_interaction(attributes) ⇒ Object private
-
.config ⇒ Tracebook::Config
Returns the current configuration instance.
-
.configure {|config| ... } ⇒ Tracebook::Config
Configures TraceBook with a block.
- .ensure_configurable! ⇒ Object private
- .finalize_configuration! ⇒ Object private
-
.record!(**attributes) ⇒ Tracebook::Result
Records an LLM interaction.
-
.reset_configuration! ⇒ void
Resets configuration to a clean state.
Class Method Details
.build_normalized_interaction(attributes) ⇒ Object (private)
177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 |
# File 'lib/tracebook.rb', line 177 def build_normalized_interaction(attributes) NormalizedInteraction.new( provider: attributes.fetch(:provider), model: attributes.fetch(:model), project: attributes[:project], request_payload: attributes[:request_payload], response_payload: attributes[:response_payload], request_text: attributes[:request_text], response_text: attributes[:response_text], input_tokens: attributes[:input_tokens], output_tokens: attributes[:output_tokens], latency_ms: attributes[:latency_ms], status: attributes.fetch(:status, "success"), error_class: attributes[:error_class], error_message: attributes[:error_message], tags: Array(attributes[:tags]).compact, metadata: attributes[:metadata] || {}, user: attributes[:user], parent_id: attributes[:parent_id], session_id: attributes[:session_id] ) end |
.config ⇒ Tracebook::Config
Returns the current configuration instance.
50 51 52 |
# File 'lib/tracebook.rb', line 50 def config @config ||= Config.new end |
.configure {|config| ... } ⇒ Tracebook::Config
Configures TraceBook with a block.
Configuration is frozen after the block executes. Call #reset_configuration! in tests to reset.
70 71 72 73 74 75 76 |
# File 'lib/tracebook.rb', line 70 def configure ensure_configurable! yield(config) finalize_configuration! config end |
.ensure_configurable! ⇒ Object (private)
171 172 173 174 175 |
# File 'lib/tracebook.rb', line 171 def ensure_configurable! return unless @configuration_finalized || config.finalized? raise ConfigurationError, "TraceBook configuration is already finalized" end |
.finalize_configuration! ⇒ Object (private)
166 167 168 169 |
# File 'lib/tracebook.rb', line 166 def finalize_configuration! config.finalize! @configuration_finalized = true end |
.record!(**attributes) ⇒ Tracebook::Result
Records an LLM interaction.
When config.persist_async is true, the interaction is enqueued via
PersistInteractionJob. Otherwise, it's persisted inline.
149 150 151 152 153 154 155 156 157 158 159 160 161 162 |
# File 'lib/tracebook.rb', line 149 def record!(**attributes) payload = build_normalized_interaction(attributes) result = Result.new(idempotency_key: attributes[:idempotency_key]) if config.persist_async PersistInteractionJob.perform_later(payload.to_h) result else interaction = PersistInteractionJob.perform_now(payload.to_h) Result.new(interaction: interaction, idempotency_key: attributes[:idempotency_key]) end rescue StandardError => error Result.new(error: error, idempotency_key: attributes[:idempotency_key]) end |
.reset_configuration! ⇒ void
This method returns an undefined value.
Resets configuration to a clean state.
Used in tests to start with fresh configuration between test cases.
91 92 93 94 |
# File 'lib/tracebook.rb', line 91 def reset_configuration! @config = Config.new @configuration_finalized = false end |