V1.1.5 — context recovery
The bridge continues when a model validly requests additional data but wraps the block in explanatory prose.
- RecoveryOne 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. - SafetyAny
<actions>marker alongside the request still blocks the response before the build can change. - BoundaryDuplicate blocks, invalid JSON, and scopes outside the catalog remain rejected.
- TestRegressions 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.
- ContextQuestions about skills, minions, summons, and summoners receive PoB's canonical gem catalog.
- ContractThe AI must use exact
state.reference.gemNamesstrings inadd_skillandset_main_skill. - CompatibilityThe bridge normalizes a singular/plural variation only when one canonical gem name is possible, before preflight.
- TestRegressions cover a level-30 minion starter and
Summon Raging Spiritsnormalized toSummon Raging Spirit.
V1.1.3 — resilient AI chat
The session remains usable when transport or model output leaves the expected path.
- TransportThe 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. - StreamAn animated reply is completed before a later fast reply replaces the stream cursor, so no earlier response remains blank.
- CoverageRegression 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.
- ContextThe bridge explicitly tells the AI that the previous proposal was not applied and requires a fresh
<actions>block for corrections or replacements. - UIActions from the new reply replace the earlier proposal; Apply represents only the current batch again.
- SafetyThe build does not change during the conversation: every batch still requires explicit player Apply.
- TestRegression 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 Setupnow exposesExtra request options (JSON), persisted inai_config.json. - BridgeValidated options are sent for the connection test and every chat request; there is no MiniMax- or provider-specific branch.
- Safety
model,messages, andstreamremain bridge-managed to preserve the chat contract. - MiniMaxFor 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.
- TreeAdded
TreeData/3_29andTreeData/3_29_ruthless, includingtree.lua, sprites, textures, and passive-tree assets. - Default
GameVersions.luaregisters standard and Ruthless 3.29;latestTreeVersionnow resolves to 3.29 for new builds. - ImportImport/export mappings now recognise 3.29 and its Ruthless variant.
- Tree UIPassive-tree sprite loading accepts the coordinate shape used by the 3.29 data; the UI also recognises the Luminary ascendancy while importing characters.
- SyncSynced upstream commits after V1.0, including calculation, comparison, import, and SimpleGraphic runtime fixes.
- AIThe 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.luaas the newBuild.viewMode == "AI", registered next to the Compare tab inModules/Build.lua. - AddedGlobal
AI Setup/AI Readybutton inModules/Main.lua, openingAIConfigPanelthrough PoB's native popup system. - AddedChat messages with
user,assistant, andsystemroles; multiline input; Enter to send; and three quick prompts. - ChangedRequests run in a Lua subprocess through
LaunchSubScript, keeping PoB's drawing thread responsive. - AddedThe HTTP callback receives the complete answer, then
AIChatTab:UpdateStream()reveals it progressively in the UI. This is not API token streaming. - NoteHistory is session-only:
AIChatTab:Load()does not restore messages andSave()does not write chat into the build. - Guard
AIBridge.pendingandAIChatTab.pendingrestrict the integration to one concurrent request.
Build serialisation and context
- Added
AIBridge:SerializeBuild()produces a versioned JSON payload (version = 1) withmeta,stats,items,skills, andtree. - AddedReal
calcsTab.mainOutputvalues: DPS, EHP, life, ES, mana, ward, armour, evasion, resistances, regeneration, leech, block, suppression, attributes, DoT, five Max Hits, and minion stats when present. - AddedEquipped items are sent per slot with name, rarity, base, and
Item:BuildRaw(); skills include group, slot, level, quality, enabled state, support flag, andskillPart. - AddedThe 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 aregems,uniques,tree, andconfig; large catalogues are not sent on every request. - AddedStructured escalation through
<context_request>. The model may request one context expansion; a response cannot combine a context request with<actions>. - ChangedRecent history is capped by
HISTORY_CHAR_BUDGET = 12000; older message pairs are removed before request assembly. - GuardState fingerprint:
SHA-1(tostring(build) .. "\0" .. build:SaveDB()). Changes during a response invalidate the request, caches, and Apply.
API and HTTP transport
- AddedOpenAI-compatible API client. The configured endpoint has trailing slashes removed before appending
/chat/completions. - AddedMain payload:
model,messagesarray,max_tokens = 2048, andtemperature = 0.3. - AddedSeparate connection test with a minimal prompt,
max_tokens = 16, andtemperature = 0. - Changed
launch:DownloadPage()now accepts a POST body and timeout; it useslcurl.safe, HTTP compression, redirects, and an asynchronous callback. - ChangedTotal timeout is configurable from 1 to 600 seconds, default 120 seconds; connection timeout is
min(timeout, 10). - GuardA 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, usingProcessSocketGroup()+BuildOutput(). - GuardEvery 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. - ChangedUniques are calculated without equipping them by calling
GetMiscCalculator()withrepSlotName/repItem. Ranking preserves up to three objectives per slot: balanced, DPS, and EHP. - AddedGem and unique results are cached against the exact build fingerprint and invalidated on any state change or Apply.
- AddedGem, unique, or passive mentions in one answer feed a detailed lookup into the next question.
- ScopeShortlists 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 100set_classclass by nameset_ascendancyprimary ascendancy by nameset_secondary_ascendancyleague secondary ascendancyset_banditNone, Oak, Kraityn, or Aliraset_pantheonmajor and/or minoradd_skillnew socket group with gemsremove_skillgroup by label or gem nameset_main_skillmain group/skillset_skill_partpositive part indexequip_itemraw item text and optional slotequip_jewelraw jewel and optional nodeIdalloc_nodenode ID or name; uses PoB's pathdealloc_nodenode ID or nameset_masteryeffect index or text substringapply_tattoonode + exact tattoo nameremove_tattoonode ID or nameset_configexisting key + boolean/number
Validation, preflight, and Apply
- Validate
ParseActions()usesdkjson; the batch must be a non-empty dense array with no gaps, one of the 18 types, and a valid shape for each action. - SnapshotBefore 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. - ChangedA complete rebuild calls
wipeGlobalCache(), incrementsoutputRevision, runsBuildOutput(), and refreshes the stat list. - DiffPreview captures DPS (Combined/Total/Minion fallback), EHP, physical/fire/cold/lightning/chaos Max Hit, passive points, and ascendancy points before and after.
- GuardThe fingerprint is checked on response, before snapshot, after any rebuild, and after preflight. A stale preview cannot be applied.
- ApplyOnly the Apply button executes the batch on the real build; it is followed by a rebuild, another metrics capture, and cache invalidation.
- CaveatPreflight is all-or-nothing. Real Apply is sequential: an unexpected divergence after a valid preflight may produce
partial = true; the report exposesappliedCountand the error. V1 has no automatic rollback.
Configuration and security
- Added
Modules/AIConfig.luastores endpoint, API key, model, timeout, and config version inuserPath/ai_config.json, outside the repository and build file. - StorageThe key is masked in the
EditControlbut persisted as plain text in local JSON. On compatible systems the app attemptschmod 600; V1 has no keychain integration. - GuardThe endpoint must start with
https://. Certificate verification follows PoB's global connection setting; enabling globalnoSSLalso affects AI requests. - AddedThe 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. - NetworkThe 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
- PackagePortable Windows ZIP; extract it and run
Path of Building.exe. V1 does not include an installer. - LinuxThe same binary was validated under Wine. There is no native Linux build.
- CI387 upstream + AI integration tests passed on the release commit.
- Audit1,323 ZIP entries audited: no key, local config, log, personal save, duplicate path, unsafe path, or symlink.
- Integrity
SHA256SUMS.txtis published with the archive for integrity verification. - Changed
manifest.xmland the updater point tokaiqueramos/PathOfAIBuilding, keeping the release channel separate from upstream.
Known limitations
- LimitRequires an existing build and a configured main skill; it does not generate a complete character from scratch.
- LimitNo pricing, budget planning, poe.ninja, trade API, or purchase automation.
- LimitNo global passive-tree optimisation; context includes at most 50 reachable candidates.
- LimitUnique shortlists are heuristic samples and do not cover the complete catalogue.
- LimitNo transactional rollback if real Apply diverges from preflight.
- LimitChat history does not persist after PoB closes.
- LimitNo native Linux build and no keychain storage.
- LimitThe model can still produce poor advice; calculations and guards reduce risk but do not replace human review.