Skip to content

feat(mvp): Spring AI 제어·알림·관측 회계 흐름을 통합한다 - #71

Merged
HuitaePark merged 1 commit into
mainfrom
feat/issues-39-40-48-integration
Aug 25, 2026
Merged

feat(mvp): Spring AI 제어·알림·관측 회계 흐름을 통합한다#71
HuitaePark merged 1 commit into
mainfrom
feat/issues-39-40-48-integration

Conversation

@HuitaePark

Copy link
Copy Markdown
Member

요약

#68, #69, #70의 변경을 하나의 검증 가능한 MVP 흐름으로 통합합니다.

검증

  • ./gradlew check --no-daemon
  • ./gradlew publishToMavenLocal --no-daemon
  • ./gradlew verifyCompatibilityMatrix verifyCoreConsumer verifyMicrometerConsumer verifyPublishedIntegrationConsumer --no-daemon

기존 #68, #69, #70을 대체하는 합동 PR입니다. 원본 PR은 이 PR의 CI 확인 후 닫습니다.

@coderabbitai

coderabbitai Bot commented Aug 25, 2026

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 112 files, which is 12 over the limit of 100.

To get a review, reduce the PR to 100 files or fewer by splitting it into smaller PRs or changing its base branch.

Upgrade to a paid plan to raise the limit.

This review couldn't start because sufficient usage credits or metered capacity aren't available. Add credits or update usage-based reviews in the billing tab, then retry.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 953139c7-62a7-482f-a8d6-d0aee9464665

📥 Commits

Reviewing files that changed from the base of the PR and between 0c74ee7 and 09980a2.

📒 Files selected for processing (112)
  • AGENTS.md
  • README.md
  • build.gradle
  • token-pilot-autoconfigure/src/main/java/io/tokenpilot/autoconfigure/TokenPilotAutoConfiguration.java
  • token-pilot-autoconfigure/src/main/java/io/tokenpilot/autoconfigure/TokenPilotBudgetAutoConfiguration.java
  • token-pilot-autoconfigure/src/main/java/io/tokenpilot/autoconfigure/TokenPilotBudgetMetricsAutoConfiguration.java
  • token-pilot-autoconfigure/src/main/java/io/tokenpilot/autoconfigure/TokenPilotBudgetPolicyFactory.java
  • token-pilot-autoconfigure/src/main/java/io/tokenpilot/autoconfigure/TokenPilotCoreMetricsAutoConfiguration.java
  • token-pilot-autoconfigure/src/main/java/io/tokenpilot/autoconfigure/TokenPilotNotificationAutoConfiguration.java
  • token-pilot-autoconfigure/src/main/java/io/tokenpilot/autoconfigure/TokenPilotNotificationMetricsAutoConfiguration.java
  • token-pilot-autoconfigure/src/main/java/io/tokenpilot/autoconfigure/TokenPilotProperties.java
  • token-pilot-autoconfigure/src/main/java/io/tokenpilot/autoconfigure/TokenPilotSpringAiAutoConfiguration.java
  • token-pilot-autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
  • token-pilot-autoconfigure/src/test/java/io/tokenpilot/autoconfigure/ChatClientBuilderCustomizerTest.java
  • token-pilot-autoconfigure/src/test/java/io/tokenpilot/autoconfigure/TokenPilotAutoConfigurationTest.java
  • token-pilot-budget/src/main/java/io/tokenpilot/budget/AtomicBudgetStateStore.java
  • token-pilot-budget/src/main/java/io/tokenpilot/budget/BudgetReservation.java
  • token-pilot-budget/src/main/java/io/tokenpilot/budget/ReservationAccounting.java
  • token-pilot-budget/src/main/java/io/tokenpilot/budget/ReservationAccountingListener.java
  • token-pilot-budget/src/main/java/io/tokenpilot/budget/ReservationAccountingListenerErrorHandler.java
  • token-pilot-budget/src/main/java/io/tokenpilot/budget/ReservationAccountingListenerFailureEvent.java
  • token-pilot-budget/src/main/java/io/tokenpilot/budget/ReservationAccountingListenerPhase.java
  • token-pilot-budget/src/main/java/io/tokenpilot/budget/ReservationAccountingListenerType.java
  • token-pilot-budget/src/main/java/io/tokenpilot/budget/ReservationAccountingReason.java
  • token-pilot-budget/src/main/java/io/tokenpilot/budget/ReservationReconciliation.java
  • token-pilot-budget/src/main/java/io/tokenpilot/budget/ReservationReconciliationRequiredEvent.java
  • token-pilot-budget/src/main/java/io/tokenpilot/budget/internal/ActualUsageFingerprint.java
  • token-pilot-budget/src/main/java/io/tokenpilot/budget/internal/DefaultBudgetEvaluator.java
  • token-pilot-budget/src/main/java/io/tokenpilot/budget/internal/InMemoryBudgetStateStore.java
  • token-pilot-budget/src/main/java/io/tokenpilot/budget/internal/LedgerBudgetComponents.java
  • token-pilot-budget/src/test/java/io/tokenpilot/budget/internal/BudgetReservationStoreTest.java
  • token-pilot-budget/src/test/java/io/tokenpilot/budget/internal/ReservationAccountingListenerLifecycleTest.java
  • token-pilot-budget/src/test/java/io/tokenpilot/budget/internal/ReservationReconciliationTest.java
  • token-pilot-core/src/main/java/io/tokenpilot/core/CoreComponents.java
  • token-pilot-core/src/main/java/io/tokenpilot/core/PreflightDecisionListener.java
  • token-pilot-core/src/main/java/io/tokenpilot/core/PricingMissingListener.java
  • token-pilot-core/src/main/java/io/tokenpilot/core/domain/PreflightDecisionEvent.java
  • token-pilot-core/src/main/java/io/tokenpilot/core/domain/PricingMissingEvent.java
  • token-pilot-core/src/main/java/io/tokenpilot/core/domain/PricingResolution.java
  • token-pilot-core/src/main/java/io/tokenpilot/core/domain/PricingSnapshot.java
  • token-pilot-core/src/main/java/io/tokenpilot/core/internal/DefaultLedgerManager.java
  • token-pilot-core/src/main/java/io/tokenpilot/core/internal/DefaultTokenBudget.java
  • token-pilot-core/src/main/java/io/tokenpilot/core/internal/LedgerComponents.java
  • token-pilot-core/src/test/java/io/tokenpilot/core/domain/PricingMissingEventTest.java
  • token-pilot-core/src/test/java/io/tokenpilot/core/domain/PricingSnapshotTest.java
  • token-pilot-core/src/test/java/io/tokenpilot/core/internal/DefaultLedgerManagerTest.java
  • token-pilot-core/src/test/java/io/tokenpilot/core/internal/DefaultTokenBudgetTest.java
  • token-pilot-micrometer/build.gradle
  • token-pilot-micrometer/src/main/java/io/tokenpilot/micrometer/MetricsOptions.java
  • token-pilot-micrometer/src/main/java/io/tokenpilot/micrometer/internal/BudgetMetricsPublisher.java
  • token-pilot-micrometer/src/main/java/io/tokenpilot/micrometer/internal/BudgetMicrometerComponents.java
  • token-pilot-micrometer/src/main/java/io/tokenpilot/micrometer/internal/CoreMetricsPublisher.java
  • token-pilot-micrometer/src/main/java/io/tokenpilot/micrometer/internal/LedgerMicrometerComponents.java
  • token-pilot-micrometer/src/main/java/io/tokenpilot/micrometer/internal/MicroCostMetricsPublisher.java
  • token-pilot-micrometer/src/main/java/io/tokenpilot/micrometer/internal/NotificationMetricsPublisher.java
  • token-pilot-micrometer/src/main/java/io/tokenpilot/micrometer/internal/NotificationMicrometerComponents.java
  • token-pilot-micrometer/src/main/java/io/tokenpilot/micrometer/internal/TokenPilotMeterMetadata.java
  • token-pilot-micrometer/src/test/java/io/tokenpilot/micrometer/internal/BudgetMetricsPublisherTest.java
  • token-pilot-micrometer/src/test/java/io/tokenpilot/micrometer/internal/CoreMetricsPublisherTest.java
  • token-pilot-micrometer/src/test/java/io/tokenpilot/micrometer/internal/LedgerMicrometerComponentsTest.java
  • token-pilot-micrometer/src/test/java/io/tokenpilot/micrometer/internal/MicroCostMetricsPublisherTest.java
  • token-pilot-micrometer/src/test/java/io/tokenpilot/micrometer/internal/NotificationMetricsPublisherTest.java
  • token-pilot-notification/src/main/java/io/tokenpilot/notification/AtomicNotificationStateStore.java
  • token-pilot-notification/src/main/java/io/tokenpilot/notification/BudgetNotificationError.java
  • token-pilot-notification/src/main/java/io/tokenpilot/notification/BudgetNotificationErrorHook.java
  • token-pilot-notification/src/main/java/io/tokenpilot/notification/BudgetNotificationEvent.java
  • token-pilot-notification/src/main/java/io/tokenpilot/notification/BudgetNotificationLifecycleEvent.java
  • token-pilot-notification/src/main/java/io/tokenpilot/notification/BudgetNotificationLifecycleListener.java
  • token-pilot-notification/src/main/java/io/tokenpilot/notification/BudgetNotificationOutcome.java
  • token-pilot-notification/src/main/java/io/tokenpilot/notification/BudgetNotificationService.java
  • token-pilot-notification/src/main/java/io/tokenpilot/notification/BudgetNotificationSource.java
  • token-pilot-notification/src/main/java/io/tokenpilot/notification/InMemoryNotificationStateStore.java
  • token-pilot-notification/src/main/java/io/tokenpilot/notification/NotificationStateStore.java
  • token-pilot-notification/src/test/java/io/tokenpilot/notification/AccountingBudgetNotificationTest.java
  • token-pilot-notification/src/test/java/io/tokenpilot/notification/BudgetNotificationLifecycleEventTest.java
  • token-pilot-notification/src/test/java/io/tokenpilot/notification/BudgetNotificationServiceTest.java
  • token-pilot-sample-app/src/main/java/io/tokenpilot/sample/SampleController.java
  • token-pilot-sample-app/src/main/resources/application.yml
  • token-pilot-sample-app/src/test/java/io/tokenpilot/sample/SampleApplicationChatClientE2ETest.java
  • token-pilot-sample-app/src/test/java/io/tokenpilot/sample/SampleApplicationE2ETest.java
  • token-pilot-sample-app/src/test/java/io/tokenpilot/sample/SampleApplicationLedgerOnlyStreamingE2ETest.java
  • token-pilot-sample-app/src/test/java/io/tokenpilot/sample/SampleApplicationSpringAiFallbackE2ETest.java
  • token-pilot-spring-ai/build.gradle
  • token-pilot-spring-ai/src/main/java/io/tokenpilot/springai/LedgerAdvisor.java
  • token-pilot-spring-ai/src/main/java/io/tokenpilot/springai/ReservedOutputTokensResolver.java
  • token-pilot-spring-ai/src/main/java/io/tokenpilot/springai/internal/AdaptedMessage.java
  • token-pilot-spring-ai/src/main/java/io/tokenpilot/springai/internal/AdaptedRequest.java
  • token-pilot-spring-ai/src/main/java/io/tokenpilot/springai/internal/DefaultLedgerAdvisor.java
  • token-pilot-spring-ai/src/main/java/io/tokenpilot/springai/internal/DefaultRequestAdapter.java
  • token-pilot-spring-ai/src/main/java/io/tokenpilot/springai/internal/IdempotencyKeyResolver.java
  • token-pilot-spring-ai/src/main/java/io/tokenpilot/springai/internal/LedgerSpringAiComponents.java
  • token-pilot-spring-ai/src/main/java/io/tokenpilot/springai/internal/ModelResolver.java
  • token-pilot-spring-ai/src/main/java/io/tokenpilot/springai/internal/RequestContextAccessor.java
  • token-pilot-spring-ai/src/main/java/io/tokenpilot/springai/internal/RequestFramingPolicy.java
  • token-pilot-spring-ai/src/main/java/io/tokenpilot/springai/internal/RequestMessageRole.java
  • token-pilot-spring-ai/src/main/java/io/tokenpilot/springai/internal/RequestPreflight.java
  • token-pilot-spring-ai/src/main/java/io/tokenpilot/springai/internal/RequestScopeResolver.java
  • token-pilot-spring-ai/src/main/java/io/tokenpilot/springai/internal/RequestScopeResult.java
  • token-pilot-spring-ai/src/main/java/io/tokenpilot/springai/internal/ReservedOutputResolver.java
  • token-pilot-spring-ai/src/main/java/io/tokenpilot/springai/internal/StreamingRequestPolicy.java
  • token-pilot-spring-ai/src/main/java/io/tokenpilot/springai/internal/UnsupportedRequestScopeReason.java
  • token-pilot-spring-ai/src/test/java/io/tokenpilot/springai/internal/DefaultLedgerAdvisorLifecycleTest.java
  • token-pilot-spring-ai/src/test/java/io/tokenpilot/springai/internal/DefaultLedgerAdvisorTest.java
  • token-pilot-spring-ai/src/test/java/io/tokenpilot/springai/internal/DefaultRequestAdapterTest.java
  • token-pilot-spring-ai/src/test/java/io/tokenpilot/springai/internal/IdempotencyKeyResolverTest.java
  • token-pilot-spring-ai/src/test/java/io/tokenpilot/springai/internal/LedgerSpringAiComponentsAccountingTest.java
  • token-pilot-spring-ai/src/test/java/io/tokenpilot/springai/internal/ModelResolverTest.java
  • token-pilot-spring-ai/src/test/java/io/tokenpilot/springai/internal/RequestContextAccessorTest.java
  • token-pilot-spring-ai/src/test/java/io/tokenpilot/springai/internal/RequestFramingPolicyTest.java
  • token-pilot-spring-ai/src/test/java/io/tokenpilot/springai/internal/RequestPreflightIdempotencyTest.java
  • token-pilot-spring-ai/src/test/java/io/tokenpilot/springai/internal/RequestScopeResolverTest.java
  • token-pilot-spring-ai/src/test/java/io/tokenpilot/springai/internal/ReservedOutputResolverTest.java

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.


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.

@HuitaePark
HuitaePark merged commit e0e9bcf into main Aug 25, 2026
2 checks passed
@HuitaePark
HuitaePark deleted the feat/issues-39-40-48-integration branch August 25, 2026 05:40
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.

1 participant