Skip to content

fix: post-merge review fixes for v0.2.10 - #402

Merged
rejojer merged 7 commits into
mainfrom
fix/post-merge-review
Aug 13, 2026
Merged

fix: post-merge review fixes for v0.2.10#402
rejojer merged 7 commits into
mainfrom
fix/post-merge-review

Conversation

@rejojer

Copy link
Copy Markdown
Member

Summary

  • Conformant responses() envelope: official output (model items only) + items (full transcript for round-trip), verified against real OpenAI API
  • Usage details aggregated across turns (cached_tokens, reasoning_tokens) on both OpenAI surfaces
  • Python floor corrected to >=3.10 (litellm stable channel requires it; verified in clean venv)
  • Three stale anthropic>=0.84.0 hint strings updated to 0.108.0
  • Image-stub behavior disclosed on as_openai_tools / as_anthropic_tools docstrings
  • Non-essential comments trimmed (−61 lines)

Test plan

  • 267 tests passed locally
  • Live A/B vs real OpenAI API: field-identical to official hand-rolled flow
  • Response.model_validate passes on non-stream envelope
  • Stream events validate against official ResponseStreamEvent union
  • Clean 3.10 venv install + full suite verified
  • Round-trip prefix tests confirm cache contract unchanged

… items, full usage details
- output now carries only model-produced items, so the envelope parses
with the official openai SDK types (function_call_output is input
vocabulary — the real API never returns it in output)
- the full process transcript moves to the new items field; round-trip
appends items instead of output (same bytes, so the provider
prompt-cache prefix contract is unchanged)
- usage aggregates token details across turns (cached_tokens,
cache_write_tokens, reasoning_tokens) on both OpenAI surfaces — cache
hits are now observable instead of discarded
- streaming stops synthesizing the nonstandard tool-output event; every
stream event now validates against the official event union, tool
results arrive in the terminal envelope's items
- tests: two conformance tests pin the contract (non-stream
model_validate + per-event stream validation); round-trip prefix
tests append items
Verified: 267 tests green; live A/B against the real OpenAI API —
field-identical to the official hand-rolled flow, round-trip accepted
with zero repeat tool calls.
pyproject raised the floor in f58cca1 (0.84-0.107 execute a refusal
turn's tool_use blocks); the three user-facing strings still pointed
hand-installers at the broken range.
…ertising tool surfaces
as_openai_tools / as_anthropic_tools cloud docstrings advertised the
image tool without mentioning that the in-process bridge replaces
base64 payloads with text placeholder stubs (mcp_bridge call_tool).
litellm's stable channel (every release satisfying our >=1.84.0 floor)
and both agent extras require 3.10; on 3.9 pip resolution fails on the
hard deps (verified in a clean venv — zero packages install). A clean
3.10 venv with all three extras runs the full suite green. CI already
tests 3.10/3.13 only. The >=3.7 claim was inherited from the two-dep
0.2.8 client and was already unsatisfiable then (openai>=1.70 needs
3.8). Closes recurring review finding #10.
53 comment lines removed: rationale that belongs in commit messages,
descriptions restating what adjacent code or function names already
show, and cloud-implementation provenance notes. Section headers and
constraint comments (protocol invariants, safety guards) kept.
Sign up for freeto 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

@rejojer
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
fix: post-merge review fixes for v0.2.10 by rejojer · Pull Request #402 · VectifyAI/PageIndex · GitHub
Skip to content

fix: post-merge review fixes for v0.2.10 - #402

Merged
rejojer merged 7 commits into
mainfrom
fix/post-merge-review
Aug 13, 2026
Merged

fix: post-merge review fixes for v0.2.10#402
rejojer merged 7 commits into
mainfrom
fix/post-merge-review

Conversation

@rejojer

Copy link
Copy Markdown
Member

Summary

  • Conformant responses() envelope: official output (model items only) + items (full transcript for round-trip), verified against real OpenAI API
  • Usage details aggregated across turns (cached_tokens, reasoning_tokens) on both OpenAI surfaces
  • Python floor corrected to >=3.10 (litellm stable channel requires it; verified in clean venv)
  • Three stale anthropic>=0.84.0 hint strings updated to 0.108.0
  • Image-stub behavior disclosed on as_openai_tools / as_anthropic_tools docstrings
  • Non-essential comments trimmed (−61 lines)

Test plan

  • 267 tests passed locally
  • Live A/B vs real OpenAI API: field-identical to official hand-rolled flow
  • Response.model_validate passes on non-stream envelope
  • Stream events validate against official ResponseStreamEvent union
  • Clean 3.10 venv install + full suite verified
  • Round-trip prefix tests confirm cache contract unchanged

… items, full usage details
- output now carries only model-produced items, so the envelope parses
with the official openai SDK types (function_call_output is input
vocabulary — the real API never returns it in output)
- the full process transcript moves to the new items field; round-trip
appends items instead of output (same bytes, so the provider
prompt-cache prefix contract is unchanged)
- usage aggregates token details across turns (cached_tokens,
cache_write_tokens, reasoning_tokens) on both OpenAI surfaces — cache
hits are now observable instead of discarded
- streaming stops synthesizing the nonstandard tool-output event; every
stream event now validates against the official event union, tool
results arrive in the terminal envelope's items
- tests: two conformance tests pin the contract (non-stream
model_validate + per-event stream validation); round-trip prefix
tests append items
Verified: 267 tests green; live A/B against the real OpenAI API —
field-identical to the official hand-rolled flow, round-trip accepted
with zero repeat tool calls.
pyproject raised the floor in f58cca1 (0.84-0.107 execute a refusal
turn's tool_use blocks); the three user-facing strings still pointed
hand-installers at the broken range.
…ertising tool surfaces
as_openai_tools / as_anthropic_tools cloud docstrings advertised the
image tool without mentioning that the in-process bridge replaces
base64 payloads with text placeholder stubs (mcp_bridge call_tool).
litellm's stable channel (every release satisfying our >=1.84.0 floor)
and both agent extras require 3.10; on 3.9 pip resolution fails on the
hard deps (verified in a clean venv — zero packages install). A clean
3.10 venv with all three extras runs the full suite green. CI already
tests 3.10/3.13 only. The >=3.7 claim was inherited from the two-dep
0.2.8 client and was already unsatisfiable then (openai>=1.70 needs
3.8). Closes recurring review finding #10.
53 comment lines removed: rationale that belongs in commit messages,
descriptions restating what adjacent code or function names already
show, and cloud-implementation provenance notes. Section headers and
constraint comments (protocol invariants, safety guards) kept.
Sign up for freeto 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

@rejojer
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' fix: post-merge review fixes for v0.2.10 by rejojer · Pull Request #402 · VectifyAI/PageIndex · GitHub
Skip to content

fix: post-merge review fixes for v0.2.10 - #402

Merged
rejojer merged 7 commits into
mainfrom
fix/post-merge-review
Aug 13, 2026
Merged

fix: post-merge review fixes for v0.2.10#402
rejojer merged 7 commits into
mainfrom
fix/post-merge-review

Conversation

@rejojer

Copy link
Copy Markdown
Member

Summary

  • Conformant responses() envelope: official output (model items only) + items (full transcript for round-trip), verified against real OpenAI API
  • Usage details aggregated across turns (cached_tokens, reasoning_tokens) on both OpenAI surfaces
  • Python floor corrected to >=3.10 (litellm stable channel requires it; verified in clean venv)
  • Three stale anthropic>=0.84.0 hint strings updated to 0.108.0
  • Image-stub behavior disclosed on as_openai_tools / as_anthropic_tools docstrings
  • Non-essential comments trimmed (−61 lines)

Test plan

  • 267 tests passed locally
  • Live A/B vs real OpenAI API: field-identical to official hand-rolled flow
  • Response.model_validate passes on non-stream envelope
  • Stream events validate against official ResponseStreamEvent union
  • Clean 3.10 venv install + full suite verified
  • Round-trip prefix tests confirm cache contract unchanged

… items, full usage details
- output now carries only model-produced items, so the envelope parses
with the official openai SDK types (function_call_output is input
vocabulary — the real API never returns it in output)
- the full process transcript moves to the new items field; round-trip
appends items instead of output (same bytes, so the provider
prompt-cache prefix contract is unchanged)
- usage aggregates token details across turns (cached_tokens,
cache_write_tokens, reasoning_tokens) on both OpenAI surfaces — cache
hits are now observable instead of discarded
- streaming stops synthesizing the nonstandard tool-output event; every
stream event now validates against the official event union, tool
results arrive in the terminal envelope's items
- tests: two conformance tests pin the contract (non-stream
model_validate + per-event stream validation); round-trip prefix
tests append items
Verified: 267 tests green; live A/B against the real OpenAI API —
field-identical to the official hand-rolled flow, round-trip accepted
with zero repeat tool calls.
pyproject raised the floor in f58cca1 (0.84-0.107 execute a refusal
turn's tool_use blocks); the three user-facing strings still pointed
hand-installers at the broken range.
…ertising tool surfaces
as_openai_tools / as_anthropic_tools cloud docstrings advertised the
image tool without mentioning that the in-process bridge replaces
base64 payloads with text placeholder stubs (mcp_bridge call_tool).
litellm's stable channel (every release satisfying our >=1.84.0 floor)
and both agent extras require 3.10; on 3.9 pip resolution fails on the
hard deps (verified in a clean venv — zero packages install). A clean
3.10 venv with all three extras runs the full suite green. CI already
tests 3.10/3.13 only. The >=3.7 claim was inherited from the two-dep
0.2.8 client and was already unsatisfiable then (openai>=1.70 needs
3.8). Closes recurring review finding #10.
53 comment lines removed: rationale that belongs in commit messages,
descriptions restating what adjacent code or function names already
show, and cloud-implementation provenance notes. Section headers and
constraint comments (protocol invariants, safety guards) kept.
Sign up for freeto 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

@rejojer
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' fix: post-merge review fixes for v0.2.10 by rejojer · Pull Request #402 · VectifyAI/PageIndex · GitHub
Skip to content

fix: post-merge review fixes for v0.2.10 - #402

Merged
rejojer merged 7 commits into
mainfrom
fix/post-merge-review
Aug 13, 2026
Merged

fix: post-merge review fixes for v0.2.10#402
rejojer merged 7 commits into
mainfrom
fix/post-merge-review

Conversation

@rejojer

Copy link
Copy Markdown
Member

Summary

  • Conformant responses() envelope: official output (model items only) + items (full transcript for round-trip), verified against real OpenAI API
  • Usage details aggregated across turns (cached_tokens, reasoning_tokens) on both OpenAI surfaces
  • Python floor corrected to >=3.10 (litellm stable channel requires it; verified in clean venv)
  • Three stale anthropic>=0.84.0 hint strings updated to 0.108.0
  • Image-stub behavior disclosed on as_openai_tools / as_anthropic_tools docstrings
  • Non-essential comments trimmed (−61 lines)

Test plan

  • 267 tests passed locally
  • Live A/B vs real OpenAI API: field-identical to official hand-rolled flow
  • Response.model_validate passes on non-stream envelope
  • Stream events validate against official ResponseStreamEvent union
  • Clean 3.10 venv install + full suite verified
  • Round-trip prefix tests confirm cache contract unchanged

… items, full usage details
- output now carries only model-produced items, so the envelope parses
with the official openai SDK types (function_call_output is input
vocabulary — the real API never returns it in output)
- the full process transcript moves to the new items field; round-trip
appends items instead of output (same bytes, so the provider
prompt-cache prefix contract is unchanged)
- usage aggregates token details across turns (cached_tokens,
cache_write_tokens, reasoning_tokens) on both OpenAI surfaces — cache
hits are now observable instead of discarded
- streaming stops synthesizing the nonstandard tool-output event; every
stream event now validates against the official event union, tool
results arrive in the terminal envelope's items
- tests: two conformance tests pin the contract (non-stream
model_validate + per-event stream validation); round-trip prefix
tests append items
Verified: 267 tests green; live A/B against the real OpenAI API —
field-identical to the official hand-rolled flow, round-trip accepted
with zero repeat tool calls.
pyproject raised the floor in f58cca1 (0.84-0.107 execute a refusal
turn's tool_use blocks); the three user-facing strings still pointed
hand-installers at the broken range.
…ertising tool surfaces
as_openai_tools / as_anthropic_tools cloud docstrings advertised the
image tool without mentioning that the in-process bridge replaces
base64 payloads with text placeholder stubs (mcp_bridge call_tool).
litellm's stable channel (every release satisfying our >=1.84.0 floor)
and both agent extras require 3.10; on 3.9 pip resolution fails on the
hard deps (verified in a clean venv — zero packages install). A clean
3.10 venv with all three extras runs the full suite green. CI already
tests 3.10/3.13 only. The >=3.7 claim was inherited from the two-dep
0.2.8 client and was already unsatisfiable then (openai>=1.70 needs
3.8). Closes recurring review finding #10.
53 comment lines removed: rationale that belongs in commit messages,
descriptions restating what adjacent code or function names already
show, and cloud-implementation provenance notes. Section headers and
constraint comments (protocol invariants, safety guards) kept.
Sign up for freeto 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

@rejojer
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' fix: post-merge review fixes for v0.2.10 by rejojer · Pull Request #402 · VectifyAI/PageIndex · GitHub
Skip to content

fix: post-merge review fixes for v0.2.10 - #402

Merged
rejojer merged 7 commits into
mainfrom
fix/post-merge-review
Aug 13, 2026
Merged

fix: post-merge review fixes for v0.2.10#402
rejojer merged 7 commits into
mainfrom
fix/post-merge-review

Conversation

@rejojer

Copy link
Copy Markdown
Member

Summary

  • Conformant responses() envelope: official output (model items only) + items (full transcript for round-trip), verified against real OpenAI API
  • Usage details aggregated across turns (cached_tokens, reasoning_tokens) on both OpenAI surfaces
  • Python floor corrected to >=3.10 (litellm stable channel requires it; verified in clean venv)
  • Three stale anthropic>=0.84.0 hint strings updated to 0.108.0
  • Image-stub behavior disclosed on as_openai_tools / as_anthropic_tools docstrings
  • Non-essential comments trimmed (−61 lines)

Test plan

  • 267 tests passed locally
  • Live A/B vs real OpenAI API: field-identical to official hand-rolled flow
  • Response.model_validate passes on non-stream envelope
  • Stream events validate against official ResponseStreamEvent union
  • Clean 3.10 venv install + full suite verified
  • Round-trip prefix tests confirm cache contract unchanged

… items, full usage details
- output now carries only model-produced items, so the envelope parses
with the official openai SDK types (function_call_output is input
vocabulary — the real API never returns it in output)
- the full process transcript moves to the new items field; round-trip
appends items instead of output (same bytes, so the provider
prompt-cache prefix contract is unchanged)
- usage aggregates token details across turns (cached_tokens,
cache_write_tokens, reasoning_tokens) on both OpenAI surfaces — cache
hits are now observable instead of discarded
- streaming stops synthesizing the nonstandard tool-output event; every
stream event now validates against the official event union, tool
results arrive in the terminal envelope's items
- tests: two conformance tests pin the contract (non-stream
model_validate + per-event stream validation); round-trip prefix
tests append items
Verified: 267 tests green; live A/B against the real OpenAI API —
field-identical to the official hand-rolled flow, round-trip accepted
with zero repeat tool calls.
pyproject raised the floor in f58cca1 (0.84-0.107 execute a refusal
turn's tool_use blocks); the three user-facing strings still pointed
hand-installers at the broken range.
…ertising tool surfaces
as_openai_tools / as_anthropic_tools cloud docstrings advertised the
image tool without mentioning that the in-process bridge replaces
base64 payloads with text placeholder stubs (mcp_bridge call_tool).
litellm's stable channel (every release satisfying our >=1.84.0 floor)
and both agent extras require 3.10; on 3.9 pip resolution fails on the
hard deps (verified in a clean venv — zero packages install). A clean
3.10 venv with all three extras runs the full suite green. CI already
tests 3.10/3.13 only. The >=3.7 claim was inherited from the two-dep
0.2.8 client and was already unsatisfiable then (openai>=1.70 needs
3.8). Closes recurring review finding #10.
53 comment lines removed: rationale that belongs in commit messages,
descriptions restating what adjacent code or function names already
show, and cloud-implementation provenance notes. Section headers and
constraint comments (protocol invariants, safety guards) kept.
Sign up for freeto 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

@rejojer
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' fix: post-merge review fixes for v0.2.10 by rejojer · Pull Request #402 · VectifyAI/PageIndex · GitHub
Skip to content

fix: post-merge review fixes for v0.2.10 - #402

Merged
rejojer merged 7 commits into
mainfrom
fix/post-merge-review
Aug 13, 2026
Merged

fix: post-merge review fixes for v0.2.10#402
rejojer merged 7 commits into
mainfrom
fix/post-merge-review

Conversation

@rejojer

Copy link
Copy Markdown
Member

Summary

  • Conformant responses() envelope: official output (model items only) + items (full transcript for round-trip), verified against real OpenAI API
  • Usage details aggregated across turns (cached_tokens, reasoning_tokens) on both OpenAI surfaces
  • Python floor corrected to >=3.10 (litellm stable channel requires it; verified in clean venv)
  • Three stale anthropic>=0.84.0 hint strings updated to 0.108.0
  • Image-stub behavior disclosed on as_openai_tools / as_anthropic_tools docstrings
  • Non-essential comments trimmed (−61 lines)

Test plan

  • 267 tests passed locally
  • Live A/B vs real OpenAI API: field-identical to official hand-rolled flow
  • Response.model_validate passes on non-stream envelope
  • Stream events validate against official ResponseStreamEvent union
  • Clean 3.10 venv install + full suite verified
  • Round-trip prefix tests confirm cache contract unchanged

… items, full usage details
- output now carries only model-produced items, so the envelope parses
with the official openai SDK types (function_call_output is input
vocabulary — the real API never returns it in output)
- the full process transcript moves to the new items field; round-trip
appends items instead of output (same bytes, so the provider
prompt-cache prefix contract is unchanged)
- usage aggregates token details across turns (cached_tokens,
cache_write_tokens, reasoning_tokens) on both OpenAI surfaces — cache
hits are now observable instead of discarded
- streaming stops synthesizing the nonstandard tool-output event; every
stream event now validates against the official event union, tool
results arrive in the terminal envelope's items
- tests: two conformance tests pin the contract (non-stream
model_validate + per-event stream validation); round-trip prefix
tests append items
Verified: 267 tests green; live A/B against the real OpenAI API —
field-identical to the official hand-rolled flow, round-trip accepted
with zero repeat tool calls.
pyproject raised the floor in f58cca1 (0.84-0.107 execute a refusal
turn's tool_use blocks); the three user-facing strings still pointed
hand-installers at the broken range.
…ertising tool surfaces
as_openai_tools / as_anthropic_tools cloud docstrings advertised the
image tool without mentioning that the in-process bridge replaces
base64 payloads with text placeholder stubs (mcp_bridge call_tool).
litellm's stable channel (every release satisfying our >=1.84.0 floor)
and both agent extras require 3.10; on 3.9 pip resolution fails on the
hard deps (verified in a clean venv — zero packages install). A clean
3.10 venv with all three extras runs the full suite green. CI already
tests 3.10/3.13 only. The >=3.7 claim was inherited from the two-dep
0.2.8 client and was already unsatisfiable then (openai>=1.70 needs
3.8). Closes recurring review finding #10.
53 comment lines removed: rationale that belongs in commit messages,
descriptions restating what adjacent code or function names already
show, and cloud-implementation provenance notes. Section headers and
constraint comments (protocol invariants, safety guards) kept.
Sign up for freeto 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

@rejojer
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' fix: post-merge review fixes for v0.2.10 by rejojer · Pull Request #402 · VectifyAI/PageIndex · GitHub
Skip to content

fix: post-merge review fixes for v0.2.10 - #402

Merged
rejojer merged 7 commits into
mainfrom
fix/post-merge-review
Aug 13, 2026
Merged

fix: post-merge review fixes for v0.2.10#402
rejojer merged 7 commits into
mainfrom
fix/post-merge-review

Conversation

@rejojer

Copy link
Copy Markdown
Member

Summary

  • Conformant responses() envelope: official output (model items only) + items (full transcript for round-trip), verified against real OpenAI API
  • Usage details aggregated across turns (cached_tokens, reasoning_tokens) on both OpenAI surfaces
  • Python floor corrected to >=3.10 (litellm stable channel requires it; verified in clean venv)
  • Three stale anthropic>=0.84.0 hint strings updated to 0.108.0
  • Image-stub behavior disclosed on as_openai_tools / as_anthropic_tools docstrings
  • Non-essential comments trimmed (−61 lines)

Test plan

  • 267 tests passed locally
  • Live A/B vs real OpenAI API: field-identical to official hand-rolled flow
  • Response.model_validate passes on non-stream envelope
  • Stream events validate against official ResponseStreamEvent union
  • Clean 3.10 venv install + full suite verified
  • Round-trip prefix tests confirm cache contract unchanged

… items, full usage details
- output now carries only model-produced items, so the envelope parses
with the official openai SDK types (function_call_output is input
vocabulary — the real API never returns it in output)
- the full process transcript moves to the new items field; round-trip
appends items instead of output (same bytes, so the provider
prompt-cache prefix contract is unchanged)
- usage aggregates token details across turns (cached_tokens,
cache_write_tokens, reasoning_tokens) on both OpenAI surfaces — cache
hits are now observable instead of discarded
- streaming stops synthesizing the nonstandard tool-output event; every
stream event now validates against the official event union, tool
results arrive in the terminal envelope's items
- tests: two conformance tests pin the contract (non-stream
model_validate + per-event stream validation); round-trip prefix
tests append items
Verified: 267 tests green; live A/B against the real OpenAI API —
field-identical to the official hand-rolled flow, round-trip accepted
with zero repeat tool calls.
pyproject raised the floor in f58cca1 (0.84-0.107 execute a refusal
turn's tool_use blocks); the three user-facing strings still pointed
hand-installers at the broken range.
…ertising tool surfaces
as_openai_tools / as_anthropic_tools cloud docstrings advertised the
image tool without mentioning that the in-process bridge replaces
base64 payloads with text placeholder stubs (mcp_bridge call_tool).
litellm's stable channel (every release satisfying our >=1.84.0 floor)
and both agent extras require 3.10; on 3.9 pip resolution fails on the
hard deps (verified in a clean venv — zero packages install). A clean
3.10 venv with all three extras runs the full suite green. CI already
tests 3.10/3.13 only. The >=3.7 claim was inherited from the two-dep
0.2.8 client and was already unsatisfiable then (openai>=1.70 needs
3.8). Closes recurring review finding #10.
53 comment lines removed: rationale that belongs in commit messages,
descriptions restating what adjacent code or function names already
show, and cloud-implementation provenance notes. Section headers and
constraint comments (protocol invariants, safety guards) kept.
Sign up for freeto 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

@rejojer
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); fix: post-merge review fixes for v0.2.10 by rejojer · Pull Request #402 · VectifyAI/PageIndex · GitHub
Skip to content

fix: post-merge review fixes for v0.2.10 - #402

Merged
rejojer merged 7 commits into
mainfrom
fix/post-merge-review
Aug 13, 2026
Merged

fix: post-merge review fixes for v0.2.10#402
rejojer merged 7 commits into
mainfrom
fix/post-merge-review

Conversation

@rejojer

Copy link
Copy Markdown
Member

Summary

  • Conformant responses() envelope: official output (model items only) + items (full transcript for round-trip), verified against real OpenAI API
  • Usage details aggregated across turns (cached_tokens, reasoning_tokens) on both OpenAI surfaces
  • Python floor corrected to >=3.10 (litellm stable channel requires it; verified in clean venv)
  • Three stale anthropic>=0.84.0 hint strings updated to 0.108.0
  • Image-stub behavior disclosed on as_openai_tools / as_anthropic_tools docstrings
  • Non-essential comments trimmed (−61 lines)

Test plan

  • 267 tests passed locally
  • Live A/B vs real OpenAI API: field-identical to official hand-rolled flow
  • Response.model_validate passes on non-stream envelope
  • Stream events validate against official ResponseStreamEvent union
  • Clean 3.10 venv install + full suite verified
  • Round-trip prefix tests confirm cache contract unchanged

… items, full usage details
- output now carries only model-produced items, so the envelope parses
with the official openai SDK types (function_call_output is input
vocabulary — the real API never returns it in output)
- the full process transcript moves to the new items field; round-trip
appends items instead of output (same bytes, so the provider
prompt-cache prefix contract is unchanged)
- usage aggregates token details across turns (cached_tokens,
cache_write_tokens, reasoning_tokens) on both OpenAI surfaces — cache
hits are now observable instead of discarded
- streaming stops synthesizing the nonstandard tool-output event; every
stream event now validates against the official event union, tool
results arrive in the terminal envelope's items
- tests: two conformance tests pin the contract (non-stream
model_validate + per-event stream validation); round-trip prefix
tests append items
Verified: 267 tests green; live A/B against the real OpenAI API —
field-identical to the official hand-rolled flow, round-trip accepted
with zero repeat tool calls.
pyproject raised the floor in f58cca1 (0.84-0.107 execute a refusal
turn's tool_use blocks); the three user-facing strings still pointed
hand-installers at the broken range.
…ertising tool surfaces
as_openai_tools / as_anthropic_tools cloud docstrings advertised the
image tool without mentioning that the in-process bridge replaces
base64 payloads with text placeholder stubs (mcp_bridge call_tool).
litellm's stable channel (every release satisfying our >=1.84.0 floor)
and both agent extras require 3.10; on 3.9 pip resolution fails on the
hard deps (verified in a clean venv — zero packages install). A clean
3.10 venv with all three extras runs the full suite green. CI already
tests 3.10/3.13 only. The >=3.7 claim was inherited from the two-dep
0.2.8 client and was already unsatisfiable then (openai>=1.70 needs
3.8). Closes recurring review finding #10.
53 comment lines removed: rationale that belongs in commit messages,
descriptions restating what adjacent code or function names already
show, and cloud-implementation provenance notes. Section headers and
constraint comments (protocol invariants, safety guards) kept.
Sign up for freeto 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

@rejojer