Provider Dependencies
RFC 0011 Brick 3, item 1: an explicit, checked-in table of which services depend on which external provider — replacing tribal knowledge with something anyone can read before assuming a service is safe to call. Generated 2026-08-10 by grepping every
src/Prose.Core/Services/*.csconstructor forILlmService/EmbeddingServiceparameters. Update this file when a service's provider dependency changes; it is hand-maintained, not regenerated.
Two provider classes exist in this engine:
- Anthropic (Claude API) — via
ILlmService(ClaudeService, routed throughLlmRouter). Used for prose generation and most LLM-judged checks. - OpenAI — via
EmbeddingService(text-embedding-3-small). Used for semantic-similarity checks (declared-purpose alignment, near-duplicate detection, canon retrieval).
As of this writing, Anthropic credit is exhausted ([[feedback_leaked_api_keys_critical]]) — every row in the Anthropic-only and Both tables below is currently blocked. OpenAI embeddings are still reachable, so OpenAI-only services are currently unaffected.
Anthropic-only (ILlmService)
Every row required unless marked Optional. (Mechanical/deterministic checks inside a listed service are unaffected even when its LLM-dependent checks are blocked — see each service's own code for which parts are which.)
AgendaEngine · AltitudeAuditService · ArcTrackerService · AmmunitionLinkerService ·
Audit/AuditRunner · BeatChecklistGateService · BeatDuelService · BeatEventSummaryService ·
BeatFactExtractionService · BeatLensServices (CausalityService, AffectBehaviorService,
InterpersonalDynamicsService) · BeatRebuildService · BeatStateExtractor · BlueprintSyncService ·
BehavioralInvariantEnforcer · BibleSyncService · BookStateLedgerService ·
CanonContradictionService · CanonGroundingService · ChapterCloseProcessorService ·
ChapterSummaryService · ChekhovAuditService · CombatSceneWriter · ComprehensionProbeService ·
ContextAnalyzerService · ContinuityValidatorService · ContractGenerator ·
CoWriterService · DateBackfillService · DynamicPlaceGenerator · EmotionalLedgerService ·
EmotionalDepthService · EntityRamificationService · EventLogService · GripePassService ·
LibertyReportService · MeaningBackfillService · NarrativeForkService · NarrativeScienceService ·
NarrativeSummaryService · NodeOutlineService · NodeBibleService · OpenThreadsService ·
OutlineReviewService · OutlineAdherenceService · OutlineService · PremiseToOutlineService ·
ProseReflowService · ReaderKnowledgeService · RandomEncounterService · SceneCollisionService ·
StoryDirectorService · StoryScopeAuditService · StoryStateService · StructuralDiagnosticService ·
SynopsisExportService · TextAnalysisService · ThemeCoherenceService · TtsEnhancementService ·
ValidationService (also uses MultiLlmService separately) · VoiceHarvestService
Optional: AudiblePackageService (LLM only for optional touch-ups on an otherwise-mechanical package).
OpenAI-only (EmbeddingService)
| Service | Optional? | What it does |
|---|---|---|
| CanonRetrievalService | Required | Universal canon reach — most-relevant entities via embedding similarity |
| DocContextService | Required | Assembles rotating canon-doc context using embedding-based topic matching |
| RelationshipDiscoveryService | Required | Auto-discovers graph edges and suggests semantic entity links |
| BeatDuplicateService | Required | Corpus-wide near-duplicate-beat detector via embedding similarity |
| DialogueService | Optional | Per-character dialogue constraints; pulls semantically-similar voice anchors |
| BeatVerificationService | Optional | Mechanical checks (EventType/SubplotCarrier/EscalationFloor/BannedPattern) need no provider; only DeclaredPurpose is embedding-gated |
| BookReviewService | Optional | Embeddings optionally augment continuity/motif detection (LLM judging itself routes through LlmVotingService, not ILlmService) |
Both (Anthropic + OpenAI)
| Service | Optional? | What it does |
|---|---|---|
| AskService | Both required | Cloud RAG over the canon corpus |
| BeatGeneratorService | Both required | Core prose-beat generator — the main story-writing engine |
| ContinuousQualityService | Both required | Autonomous monitor: scoped contradiction + cliché checks on saved chapters |
| EntityContextService | Both required | Self-referential entity context stack |
| EntityHarvestService | Both required | Harvests canon from open text, resolves/creates entities |
| FactInterpreterService | Both required | Prose→relational-graph compiler |
| NpcGenerator | Both required | Generates full, permanent NPC characters |
| SceneContextAssembler | Both required | X-Ray scene assembly for prompt context |
| StructuralBlueprintService | Both required | Pre-prose structural blueprint (StoryScope countermeasures) |
| ConversationalWriterService | LLM required, embed optional | "You, Me, and the Page" conversational writing brain |
| EntityExtractionService | LLM required, embed optional | Extracts entities/relationships from story text |
| StoryStarterService | LLM required, embed optional | Zero-input/continuation prose generation |
| SuggestionEngineService | LLM required, embed optional | Proposes 2-3 candidate next beats |
None — sounds provider-dependent, isn't (worth knowing so nobody assumes it's blocked)
| Service | Actual dependency |
|---|---|
| InferenceService | Pure computation (transitive/shared-property graph inference) |
| SemanticIndexService | TF-IDF keyword search — no embedding call despite "Semantic" in the name |
| EmbeddingHealthService | Reads already-embedded vectors via SQL VECTOR_DISTANCE; zero new API calls |
| WritingQualityService | Explicitly heuristic/regex-based; no model call |
| NodeReviewService | MindAttic.Legion (ReviewLlmTransport/CloudReviewLlm) — still Claude-dependent, different transport |
| MultiLlmService | LegionClient fan-out to Claude/GPT/Gemini for majority-vote consensus |
| ExpertPersonaService | LlmVotingService — a small voting panel, not ILlmService directly |
| ClaudeCliService | Spawns the local Claude Code CLI subprocess — not the hosted API |
| DallEService | LegionClient (OpenAI images) — a separate OpenAI dependency from EmbeddingService |
Using this table
Before assuming a service is safe to call during a known provider outage, check which bucket it's
in. BeatVerificationService's mechanical checks are a good example of the value here: the
service as a whole is "OpenAI-only, optional" per this table, but that optionality is coarse —
BannedPattern/EventType/SubplotCarrier/EscalationFloor run with zero provider dependency even
when OpenAI is also down; only DeclaredPurpose needs it. Read the service's own code for
check-level granularity this table doesn't capture — it answers "does this service ever touch a
provider," not "does every code path in it."