Skip to content

Release: merge develop into master with LinkedIn org posting, AI provider orchestration, and OpenAI configuration hardening - #101

Merged
artcava merged 24 commits into
masterfrom
develop
May 30, 2026
Merged

Release: merge develop into master with LinkedIn org posting, AI provider orchestration, and OpenAI configuration hardening#101
artcava merged 24 commits into
masterfrom
develop

Conversation

@artcava

@artcava artcava commented May 30, 2026

Copy link
Copy Markdown
Owner

Context

This PR promotes to master the changes already integrated in develop and labeled ready for master, including both issue scope and implementation-level alignments found in the codebase.

Closes #71
Closes #85
Closes #87
Closes #88
Closes #89
Closes #90

What Changed

1. LinkedIn sender: organization page support

  • InSender now resolves author URN with IN_ORG_ID priority (company page) and IN_OWNER fallback (personal profile).
  • Fail-fast handling when both IN_ORG_ID and IN_OWNER are missing.
  • LinkedIn image flow aligned with resolved author URN for both person and organization posting.
  • Configuration and docs updated for IN_ORG_ID.

2. AI service refactor: provider-specific naming

  • AI implementation is now explicitly provider-specific via OpenAiService behind IAiService.
  • Dependency injection registration updated accordingly for clearer provider boundaries.

3. OpenAI parameters externalized via options

  • Introduced OpenAiOptions bound from configuration (OpenAI__*), removing hardcoded endpoints/models/technical parameters from runtime logic.
  • Externalized settings include chat/image endpoints, models, temperatures, token budgets, image size/count, and related knobs.
  • Added startup validation with OpenAiOptionsValidator for safer configuration behavior.

4. Prompt templates moved to configuration

  • Summary and image-prompt templates are now configuration-driven.
  • Runtime placeholder support added ({MaxChars}, {Text}, {Summary}) with validation rules.
  • Prompt tuning now possible without code changes or redeploys.

5. IAiServiceFactory and provider orchestration

  • Added IAiServiceFactory and AiServiceFactory for centralized AI provider resolution.
  • Added provider enum (AiProvider) and generator orchestration integration through scheduled profiles.
  • Architecture now supports future provider extensions with minimal caller impact.

6. Project housekeeping

  • Removed unused System.ServiceModel.Syndication dependency.
  • Documentation technology references aligned with actual dependencies.
  • Infra folder and related Bicep artifacts added to solution structure for improved discoverability.

Testing and Quality

  • Unit tests extended/updated for:
    • AI factory behavior
    • generator/provider orchestration
    • options validation
    • LinkedIn sender org/person/failure branches
    • OpenAI service configuration behavior
  • Regression-sensitive paths around DI, configuration, and provider selection are covered.

Operational Notes

  • Ensure production settings include:
    • IN_ACCESS_TOKEN
    • at least one of IN_OWNER or IN_ORG_ID (IN_ORG_ID takes precedence)
  • Verify OpenAI configuration via OpenAI__* keys, including required prompt placeholders.
  • Timer-trigger execution model and scheduling semantics remain unchanged.

Change Type

  • Feature
  • Refactor
  • Config/Infrastructure
  • Test/Quality
  • Documentation

Checklist

  • Changes aligned with ready-for-master issues
  • Configuration and documentation updated
  • Tests updated for impacted areas
  • No hardcoded secrets introduced

artcava and others added 24 commits April 10, 2026 17:32
…a-solution-folder

chore: remove unused Syndication dependency, fix README and add infra/docs to Solution Items
chore: align XPoster agents/skills and clean up lscache artifacts
- Rename src/Services/AiService.cs to OpenAiService.cs
- Update class name, constructor, and ILogger generic parameter
- Update IAiService DI registration in Program.cs
- Rename tests/Services/AiServiceTests.cs to OpenAiServiceTests.cs
- Update all type references in test file
…enaiservice

refactor: rename AiService to OpenAiService (#87)
- Add ResolveAuthorUrn() helper: returns urn:li:organization:{IN_ORG_ID}
  when IN_ORG_ID is set, falls back to urn:li:person:{IN_OWNER}
- Refactor SendAsync to use ResolveAuthorUrn() instead of reading IN_OWNER directly
- Update generatePayLoad: accept pre-built authorUrn, remove internal URN construction
- Add IN_ORG_ID to local.settings.json.example
- Update docs/configuration.md LinkedIn table (IN_OWNER now optional when IN_ORG_ID set)
- Add 3 tests covering org URN, person URN, and missing-both-vars paths
…nder

feat(insender): add LinkedIn organization page support (#71)
…o OpenAiOptions (#88)

- Add OpenAiOptions sealed class with defaults for all provider parameters
  (ApiKey, ChatEndpoint, ChatModel, SummaryTemperature, SummaryMaxTokensPerChar,
  SummarySafetyMarginChars, ImageEndpoint, ImageModel, ImageSize, ImageCount)
- Refactor OpenAiService: inject IOptions<OpenAiOptions>, remove all hard-coded literals
  and redundant OPENAI_API_KEY env-var guards in GetSummaryAsync/GetImagePromptAsync
- Register Configure<OpenAiOptions> from 'OpenAI' section in Program.cs
- Replace OPENAI_API_KEY flat var with OpenAI__* double-underscore keys in local.settings.json.example
- Update docs/configuration.md AI section with full OpenAiOptions parameter table
- Update OpenAiServiceTests: BuildService now accepts IOptions<OpenAiOptions>
…ions

feat(openai): externalise OpenAI endpoints, models and parameters into OpenAiOptions (#88)
…plates

feat(openai): externalise prompt templates into OpenAiOptions (#89)
chore: add NuGet.Config to pin restore to nuget.org only
…r orchestration in GeneratorFactory

- Add IAiServiceFactory and AiServiceFactory for provider-based IAiService resolution
- Add AiProvider enum (OpenAi, Perplexity placeholders)
- Add ScheduledGenerationProfile to model hour/sender/generator/provider slots
- Refactor GeneratorFactory to resolve sender and AI service via profiles and IAiServiceFactory
- Update FeedGenerator to accept nullable IAiService with null-safety guards
- Update Program.cs DI registrations for AiServiceFactory and new abstractions
- Add global.json to pin SDK to .NET 8.0.421 and resolve MSB4011 warnings
- Fix CS1998 in IgSender.UploadImageToPublicUrl
- Fix duplicate Content items in XPoster.csproj after SDK alignment
- Add XML docs for all new public types and members
- Add unit tests: AiServiceFactoryTests, missing FeedGenerator null-safety cases,
  GeneratorFactory IAiServiceFactory interaction tests
…stration

feat: add multi-AI-provider support via IAiServiceFactory and ScheduledGenerationProfile
@artcava
artcava merged commit edeee86 into master May 30, 2026
9 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment