Files
pulse/internal/ai/cost_persistence.go
T
rcourtman ee8a24e14a backend and governance: MCP contract, agent capabilities, API, and release-control
Manifest-backed MCP tools, prompts, and resources with surface affordance contracts; agent capability manifest and governance projection; API contract tests and capability route projection; operations-loop and intelligence-funnel telemetry; release-control subsystem documentation, registry, and tooling; licensing and configuration.
2026-06-23 17:26:15 +01:00

74 lines
2.2 KiB
Go

package ai
import (
"fmt"
"github.com/rcourtman/pulse-go-rewrite/internal/ai/cost"
"github.com/rcourtman/pulse-go-rewrite/internal/config"
)
// CostPersistenceAdapter bridges ConfigPersistence to cost.Persistence.
type CostPersistenceAdapter struct {
config *config.ConfigPersistence
}
// NewCostPersistenceAdapter creates a new adapter.
func NewCostPersistenceAdapter(cfg *config.ConfigPersistence) *CostPersistenceAdapter {
return &CostPersistenceAdapter{config: cfg}
}
// SaveUsageHistory saves usage events to disk via ConfigPersistence.
func (a *CostPersistenceAdapter) SaveUsageHistory(events []cost.UsageEvent) error {
if a == nil || a.config == nil {
return fmt.Errorf("cost persistence adapter is not configured")
}
records := make([]config.AIUsageEventRecord, len(events))
for i, e := range events {
records[i] = config.AIUsageEventRecord{
Timestamp: e.Timestamp,
Provider: e.Provider,
RequestModel: e.RequestModel,
ResponseModel: e.ResponseModel,
UseCase: e.UseCase,
ContextScope: e.ContextScope,
ToolCallCount: e.ToolCallCount,
InputTokens: e.InputTokens,
OutputTokens: e.OutputTokens,
TargetType: e.TargetType,
TargetID: e.TargetID,
FindingID: e.FindingID,
}
}
return a.config.SaveAIUsageHistory(records)
}
// LoadUsageHistory loads usage events from disk via ConfigPersistence.
func (a *CostPersistenceAdapter) LoadUsageHistory() ([]cost.UsageEvent, error) {
if a == nil || a.config == nil {
return []cost.UsageEvent{}, fmt.Errorf("cost persistence adapter is not configured")
}
data, err := a.config.LoadAIUsageHistory()
if err != nil {
return nil, err
}
events := make([]cost.UsageEvent, len(data.Events))
for i, r := range data.Events {
events[i] = cost.UsageEvent{
Timestamp: r.Timestamp,
Provider: r.Provider,
RequestModel: r.RequestModel,
ResponseModel: r.ResponseModel,
UseCase: r.UseCase,
ContextScope: r.ContextScope,
ToolCallCount: r.ToolCallCount,
InputTokens: r.InputTokens,
OutputTokens: r.OutputTokens,
TargetType: r.TargetType,
TargetID: r.TargetID,
FindingID: r.FindingID,
}
}
return events, nil
}