Release notes

PathOfAIBuilding v1.1.5

Context-recovery patch: explanatory prose around a valid request no longer leaves the AI chat in an error state.

Date
23 July 2026
Base
PoB Community dev
Tree
3.29 · standard and Ruthless
Platform
Windows · Wine/Proton
Licence
MIT · free application

Price: the application is free and open source. The user-configured AI API may have its own usage cost.

V1.1.5 — context recovery

The bridge continues when a model validly requests additional data but wraps the block in explanatory prose.

  • Recovery
    One valid <context_request> block is now accepted with prose before or after it; the prose is discarded and the question is repeated with the requested context.
  • Safety
    Any <actions> marker alongside the request still blocks the response before the build can change.
  • Boundary
    Duplicate blocks, invalid JSON, and scopes outside the catalog remain rejected.
  • Test
    Regressions cover prose-wrapped context, duplicate blocks, and mixed actions.

V1.1.4 — canonical gem actions

A minion recommendation no longer loses its whole batch because the model pluralized a gem that PoB stores in the singular.

  • Context
    Questions about skills, minions, summons, and summoners receive PoB's canonical gem catalog.
  • Contract
    The AI must use exact state.reference.gemNames strings in add_skill and set_main_skill.
  • Compatibility
    The bridge normalizes a singular/plural variation only when one canonical gem name is possible, before preflight.
  • Test
    Regressions cover a level-30 minion starter and Summon Raging Spirits normalized to Summon Raging Spirit.

V1.1.3 — resilient AI chat

The session remains usable when transport or model output leaves the expected path.

  • Transport
    The bridge detects when a request or connection test cannot start and returns an immediate error, allowing a new attempt.
  • Actions
    <actions> tags accept case and whitespace, while incomplete, invalid, duplicate, object-shaped, or trailing JSON is rejected with a visible message.
  • Stream
    An animated reply is completed before a later fast reply replaces the stream cursor, so no earlier response remains blank.
  • Coverage
    Regression cases cover startup failure, response-processing exceptions, malformed action tags and JSON, pending proposals, and immediate follow-ups.

V1.1.2 — unapplied proposal correction

A correction request does not assume the previous proposal took effect. The serialized PoB state remains the source of truth.

  • Context
    The bridge explicitly tells the AI that the previous proposal was not applied and requires a fresh <actions> block for corrections or replacements.
  • UI
    Actions from the new reply replace the earlier proposal; Apply represents only the current batch again.
  • Safety
    The build does not change during the conversation: every batch still requires explicit player Apply.
  • Test
    Regression coverage corrects a level-98 proposal to level 97 without touching the build before Apply.

V1.1.1 — generic provider options

AI configuration no longer depends on model-specific conditionals: users enter extra fields for their OpenAI-compatible endpoint directly in PoB.

  • Config
    AI Setup now exposes Extra request options (JSON), persisted in ai_config.json.
  • Bridge
    Validated options are sent for the connection test and every chat request; there is no MiniMax- or provider-specific branch.
  • Safety
    model, messages, and stream remain bridge-managed to preserve the chat contract.
  • MiniMax
    For M3 direct answers, use {"thinking":{"type":"disabled"}} in the new field.

V1.1.0 — 3.29 passive-tree support

Compatibility update for the current PoE 1 passive tree, integrated from the Path of Building Community dev branch.

  • Tree
    Added TreeData/3_29 and TreeData/3_29_ruthless, including tree.lua, sprites, textures, and passive-tree assets.
  • Default
    GameVersions.lua registers standard and Ruthless 3.29; latestTreeVersion now resolves to 3.29 for new builds.
  • Import
    Import/export mappings now recognise 3.29 and its Ruthless variant.
  • Tree UI
    Passive-tree sprite loading accepts the coordinate shape used by the 3.29 data; the UI also recognises the Luminary ascendancy while importing characters.
  • Sync
    Synced upstream commits after V1.0, including calculation, comparison, import, and SimpleGraphic runtime fixes.
  • AI
    The AI tab, local configuration, preflight, and V1.0 guards were preserved through the upstream merge.

V1.0.0 — AI integration

Technical history for the first public release. The sections below describe the architecture, validation, and limits that remain in force in V1.1.

Integration and interface

  • Added
    Classes/AIChatTab.lua as the new Build.viewMode == "AI", registered next to the Compare tab in Modules/Build.lua.
  • Added
    Global AI Setup/AI Ready button in Modules/Main.lua, opening AIConfigPanel through PoB's native popup system.
  • Added
    Chat messages with user, assistant, and system roles; multiline input; Enter to send; and three quick prompts.
  • Changed
    Requests run in a Lua subprocess through LaunchSubScript, keeping PoB's drawing thread responsive.
  • Added
    The HTTP callback receives the complete answer, then AIChatTab:UpdateStream() reveals it progressively in the UI. This is not API token streaming.
  • Note
    History is session-only: AIChatTab:Load() does not restore messages and Save() does not write chat into the build.
  • Guard
    AIBridge.pending and AIChatTab.pending restrict the integration to one concurrent request.

Build serialisation and context

  • Added
    AIBridge:SerializeBuild() produces a versioned JSON payload (version = 1) with meta, stats, items, skills, and tree.
  • Added
    Real calcsTab.mainOutput values: DPS, EHP, life, ES, mana, ward, armour, evasion, resistances, regeneration, leech, block, suppression, attributes, DoT, five Max Hits, and minion stats when present.
  • Added
    Equipped items are sent per slot with name, rarity, base, and Item:BuildRaw(); skills include group, slot, level, quality, enabled state, support flag, and skillPart.
  • Added
    The tree serialises allocated IDs, notables, keystones, sockets, jewels, masteries, and points. Optional candidates are capped at the 50 closest reachable notables/keystones by node.path.
  • Changed
    ClassifyQuestion() routes context by intent. Optional scopes are gems, uniques, tree, and config; large catalogues are not sent on every request.
  • Added
    Structured escalation through <context_request>. The model may request one context expansion; a response cannot combine a context request with <actions>.
  • Changed
    Recent history is capped by HISTORY_CHAR_BUDGET = 12000; older message pairs are removed before request assembly.
  • Guard
    State fingerprint: SHA-1(tostring(build) .. "\0" .. build:SaveDB()). Changes during a response invalidate the request, caches, and Apply.

API and HTTP transport

  • Added
    OpenAI-compatible API client. The configured endpoint has trailing slashes removed before appending /chat/completions.
  • Added
    Main payload: model, messages array, max_tokens = 2048, and temperature = 0.3.
  • Added
    Separate connection test with a minimal prompt, max_tokens = 16, and temperature = 0.
  • Changed
    launch:DownloadPage() now accepts a POST body and timeout; it uses lcurl.safe, HTTP compression, redirects, and an asynchronous callback.
  • Changed
    Total timeout is configurable from 1 to 600 seconds, default 120 seconds; connection timeout is min(timeout, 10).
  • Guard
    A response requires HTTP 200, a non-empty body, and JSON with choices[1].message.content. Transport and shape errors are returned to the panel.

Simulations and shortlists

  • Gems
    ComputeGemShortlist() tests non-legacy supports not already linked to the main group at level 20/quality 0, using ProcessSocketGroup() + BuildOutput().
  • Guard
    Every temporary support is removed even when simulation throws. The original output is rebuilt at the end; only positive gains enter the top 10.
  • Uniques
    ComputeUniqueShortlist() preselects up to 40 candidates per item type: 30 by skill/defence affinity and 10 deterministic samples from the tail.
  • Changed
    Uniques are calculated without equipping them by calling GetMiscCalculator() with repSlotName/repItem. Ranking preserves up to three objectives per slot: balanced, DPS, and EHP.
  • Added
    Gem and unique results are cached against the exact build fingerprint and invalidated on any state change or Apply.
  • Added
    Gem, unique, or passive mentions in one answer feed a detailed lookup into the next question.
  • Scope
    Shortlists are calculated samples, not exhaustive proof across every game combination.

Action protocol — 18 types

Actions are emitted as JSON inside <actions>[...]</actions>. Array order is preserved.

  • set_levelinteger from 1 to 100
  • set_classclass by name
  • set_ascendancyprimary ascendancy by name
  • set_secondary_ascendancyleague secondary ascendancy
  • set_banditNone, Oak, Kraityn, or Alira
  • set_pantheonmajor and/or minor
  • add_skillnew socket group with gems
  • remove_skillgroup by label or gem name
  • set_main_skillmain group/skill
  • set_skill_partpositive part index
  • equip_itemraw item text and optional slot
  • equip_jewelraw jewel and optional nodeId
  • alloc_nodenode ID or name; uses PoB's path
  • dealloc_nodenode ID or name
  • set_masteryeffect index or text substring
  • apply_tattoonode + exact tattoo name
  • remove_tattoonode ID or name
  • set_configexisting key + boolean/number

Validation, preflight, and Apply

  • Validate
    ParseActions() uses dkjson; the batch must be a non-empty dense array with no gaps, one of the 18 types, and a valid shape for each action.
  • Snapshot
    Before preview, build:SaveDB() captures the canonical build XML.
  • Preflight
    new("CompareEntry", snapshotXml, "AI action preflight") creates an isolated clone. Every action runs in order on that clone, allowing dependencies within the batch.
  • Changed
    A complete rebuild calls wipeGlobalCache(), increments outputRevision, runs BuildOutput(), and refreshes the stat list.
  • Diff
    Preview captures DPS (Combined/Total/Minion fallback), EHP, physical/fire/cold/lightning/chaos Max Hit, passive points, and ascendancy points before and after.
  • Guard
    The fingerprint is checked on response, before snapshot, after any rebuild, and after preflight. A stale preview cannot be applied.
  • Apply
    Only the Apply button executes the batch on the real build; it is followed by a rebuild, another metrics capture, and cache invalidation.
  • Caveat
    Preflight is all-or-nothing. Real Apply is sequential: an unexpected divergence after a valid preflight may produce partial = true; the report exposes appliedCount and the error. V1 has no automatic rollback.

Configuration and security

  • Added
    Modules/AIConfig.lua stores endpoint, API key, model, timeout, and config version in userPath/ai_config.json, outside the repository and build file.
  • Storage
    The key is masked in the EditControl but persisted as plain text in local JSON. On compatible systems the app attempts chmod 600; V1 has no keychain integration.
  • Guard
    The endpoint must start with https://. Certificate verification follows PoB's global connection setting; enabling global noSSL also affects AI requests.
  • Added
    The key appears only in Authorization: Bearer. The payload contains the question, recent history, and selected build context.
  • Guard
    GetSanitizedConfig() replaces the key with [SET]/[EMPTY]. Debug logs contain sizes, timings, scopes, and counts, not the request body or key.
  • Network
    The project has no backend, proxy, telemetry, or analytics. PoB connects directly to the user-configured endpoint.
  • Release
    ai_config.json, logs, settings, and saves are excluded from Git and release archives.

Release and verification

  • Package
    Portable Windows ZIP; extract it and run Path of Building.exe. V1 does not include an installer.
  • Linux
    The same binary was validated under Wine. There is no native Linux build.
  • CI
    387 upstream + AI integration tests passed on the release commit.
  • Audit
    1,323 ZIP entries audited: no key, local config, log, personal save, duplicate path, unsafe path, or symlink.
  • Integrity
    SHA256SUMS.txt is published with the archive for integrity verification.
  • Changed
    manifest.xml and the updater point to kaiqueramos/PathOfAIBuilding, keeping the release channel separate from upstream.

Known limitations

  • Limit
    Requires an existing build and a configured main skill; it does not generate a complete character from scratch.
  • Limit
    No pricing, budget planning, poe.ninja, trade API, or purchase automation.
  • Limit
    No global passive-tree optimisation; context includes at most 50 reachable candidates.
  • Limit
    Unique shortlists are heuristic samples and do not cover the complete catalogue.
  • Limit
    No transactional rollback if real Apply diverges from preflight.
  • Limit
    Chat history does not persist after PoB closes.
  • Limit
    No native Linux build and no keychain storage.
  • Limit
    The model can still produce poor advice; calculations and guards reduce risk but do not replace human review.