feat: Add multi-provider LLM support via LiteLLM integration - #110

Closed
joeVenner wants to merge 3 commits into
VectifyAI:mainfrom
joeVenner:feat/Add_multi_provider_LLM_support_including_local_ollama
Closed

feat: Add multi-provider LLM support via LiteLLM integration#110
joeVenner wants to merge 3 commits into
VectifyAI:mainfrom
joeVenner:feat/Add_multi_provider_LLM_support_including_local_ollama

Conversation

@joeVenner

Copy link
Copy Markdown

🌟 Add Multi-Provider LLM Support - Use Any LLM with PageIndex!

Summary

This PR transforms PageIndex from an OpenAI-only tool into a universal LLM-powered document indexing solution. By integrating LiteLLM, users can now choose from 100+ LLM providers including:

ProviderModelsSetup
🟢 OpenAIGPT-4o, GPT-4 TurboOPENAI_API_KEY
🟣 AnthropicClaude 3 Opus, Sonnet, HaikuANTHROPIC_API_KEY
🔵 GoogleGemini Pro, Gemini 1.5GEMINI_API_KEY
🟦 AzureAzure OpenAI deploymentsAZURE_API_KEY + base
🟠 AWS BedrockClaude, Llama on BedrockAWS credentials
GroqLlama 3.1, MixtralGROQ_API_KEY
🦙 Ollama (Local)Llama3, Mistral, QwenNo API key!

🚀 Key Features

  • Zero Breaking Changes: Fully backward compatible with existing setups
  • Local Model Support: Run completely offline with Ollama
  • Flexible Token Counting: Automatic tokenizer selection per provider
  • Simple Migration: Just change the model string!

📝 Usage Examples

# OpenAI (default - no changes needed)
python3 run_pageindex.py --pdf_path doc.pdf
# Claude 3 Opusexport ANTHROPIC_API_KEY=your_key
python3 run_pageindex.py --pdf_path doc.pdf --model claude-3-opus-20240229
# Local Ollama (no API key!)
ollama serve
python3 run_pageindex.py --pdf_path doc.pdf --model ollama/llama3

@jdiaz-elyndra

jdiaz-elyndra commented Feb 14, 2026 via email

Copy link
Copy Markdown

@joeVenner

Copy link
Copy Markdown
Author

@zmtomorrow Can you check please ?

@hoangvantuan

Copy link
Copy Markdown

I really need this pull request.

@joeVenner

Copy link
Copy Markdown
Author

@rejojer can you check ?

Comment threadpageindex/utils.py Outdated
else:
# Use LiteLLM's token counter for other providers
try:
return litellm.token_counter(model=model, text=text)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why not use directly litellm.token_counter? Why is this needed: if is_openai_model:

Joevennerand others added 3 commits March 22, 2026 14:23
Replace OpenAI-only implementation with LiteLLM to support 100+ LLM providers
including Anthropic Claude, Google Gemini, Azure OpenAI, AWS Bedrock, Groq,
and local Ollama models.
Changes:
- Add litellm>=1.0.0 dependency
- Refactor ChatGPT_API functions to use litellm.completion()
- Enhance count_tokens() for multi-provider token counting
- Update config.yaml with provider-specific model examples
- Update README.md with multi-provider setup instructions
Backward compatible: Existing OPENAI_API_KEY and CHATGPT_API_KEY still work.
Default model remains gpt-4o-2024-11-20.
…removing reliance on direct tiktoken and hardcoded models, while cleaning up tokenization logic to prevent crashes
Accept upstream's LiteLLM implementation (llm_completion/llm_acompletion,
pinned litellm==1.82.0, ConfigLoader, drop_params) which supersedes
our parallel implementation.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@joeVenner
joeVennerforce-pushed the feat/Add_multi_provider_LLM_support_including_local_ollama branch from acc22f7 to 7d63209CompareMarch 22, 2026 13:24
@joeVenner

Copy link
Copy Markdown
Author

@ClimenteA Can you please check this PR when you have time ?

@KylinMountain

Copy link
Copy Markdown
Collaborator

Thanks @joeVenner! This is exactly the direction we took — multi-provider support via LiteLLM landed in #168 (merged), so llm_completion now routes through litellm.completion and works with any LiteLLM-supported provider by model name. Closing as already implemented; your PR helped validate the approach. 🙏

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.

5 participants

@joeVenner@jdiaz-elyndra@hoangvantuan@KylinMountain@ClimenteA
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n 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;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

feat: Add multi-provider LLM support via LiteLLM integration - #110

Closed
joeVenner wants to merge 3 commits into
VectifyAI:mainfrom
joeVenner:feat/Add_multi_provider_LLM_support_including_local_ollama
Closed

feat: Add multi-provider LLM support via LiteLLM integration#110
joeVenner wants to merge 3 commits into
VectifyAI:mainfrom
joeVenner:feat/Add_multi_provider_LLM_support_including_local_ollama

Conversation

@joeVenner

Copy link
Copy Markdown

🌟 Add Multi-Provider LLM Support - Use Any LLM with PageIndex!

Summary

This PR transforms PageIndex from an OpenAI-only tool into a universal LLM-powered document indexing solution. By integrating LiteLLM, users can now choose from 100+ LLM providers including:

ProviderModelsSetup
🟢 OpenAIGPT-4o, GPT-4 TurboOPENAI_API_KEY
🟣 AnthropicClaude 3 Opus, Sonnet, HaikuANTHROPIC_API_KEY
🔵 GoogleGemini Pro, Gemini 1.5GEMINI_API_KEY
🟦 AzureAzure OpenAI deploymentsAZURE_API_KEY + base
🟠 AWS BedrockClaude, Llama on BedrockAWS credentials
GroqLlama 3.1, MixtralGROQ_API_KEY
🦙 Ollama (Local)Llama3, Mistral, QwenNo API key!

🚀 Key Features

  • Zero Breaking Changes: Fully backward compatible with existing setups
  • Local Model Support: Run completely offline with Ollama
  • Flexible Token Counting: Automatic tokenizer selection per provider
  • Simple Migration: Just change the model string!

📝 Usage Examples

# OpenAI (default - no changes needed)
python3 run_pageindex.py --pdf_path doc.pdf
# Claude 3 Opusexport ANTHROPIC_API_KEY=your_key
python3 run_pageindex.py --pdf_path doc.pdf --model claude-3-opus-20240229
# Local Ollama (no API key!)
ollama serve
python3 run_pageindex.py --pdf_path doc.pdf --model ollama/llama3

@jdiaz-elyndra

jdiaz-elyndra commented Feb 14, 2026 via email

Copy link
Copy Markdown

@joeVenner

Copy link
Copy Markdown
Author

@zmtomorrow Can you check please ?

@hoangvantuan

Copy link
Copy Markdown

I really need this pull request.

@joeVenner

Copy link
Copy Markdown
Author

@rejojer can you check ?

Comment threadpageindex/utils.py Outdated
else:
# Use LiteLLM's token counter for other providers
try:
return litellm.token_counter(model=model, text=text)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why not use directly litellm.token_counter? Why is this needed: if is_openai_model:

Joevennerand others added 3 commits March 22, 2026 14:23
Replace OpenAI-only implementation with LiteLLM to support 100+ LLM providers
including Anthropic Claude, Google Gemini, Azure OpenAI, AWS Bedrock, Groq,
and local Ollama models.
Changes:
- Add litellm>=1.0.0 dependency
- Refactor ChatGPT_API functions to use litellm.completion()
- Enhance count_tokens() for multi-provider token counting
- Update config.yaml with provider-specific model examples
- Update README.md with multi-provider setup instructions
Backward compatible: Existing OPENAI_API_KEY and CHATGPT_API_KEY still work.
Default model remains gpt-4o-2024-11-20.
…removing reliance on direct tiktoken and hardcoded models, while cleaning up tokenization logic to prevent crashes
Accept upstream's LiteLLM implementation (llm_completion/llm_acompletion,
pinned litellm==1.82.0, ConfigLoader, drop_params) which supersedes
our parallel implementation.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@joeVenner
joeVennerforce-pushed the feat/Add_multi_provider_LLM_support_including_local_ollama branch from acc22f7 to 7d63209CompareMarch 22, 2026 13:24
@joeVenner

Copy link
Copy Markdown
Author

@ClimenteA Can you please check this PR when you have time ?

@KylinMountain

Copy link
Copy Markdown
Collaborator

Thanks @joeVenner! This is exactly the direction we took — multi-provider support via LiteLLM landed in #168 (merged), so llm_completion now routes through litellm.completion and works with any LiteLLM-supported provider by model name. Closing as already implemented; your PR helped validate the approach. 🙏

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.

5 participants

@joeVenner@jdiaz-elyndra@hoangvantuan@KylinMountain@ClimenteA
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: Add multi-provider LLM support via LiteLLM integration - #110

Closed
joeVenner wants to merge 3 commits into
VectifyAI:mainfrom
joeVenner:feat/Add_multi_provider_LLM_support_including_local_ollama
Closed

feat: Add multi-provider LLM support via LiteLLM integration#110
joeVenner wants to merge 3 commits into
VectifyAI:mainfrom
joeVenner:feat/Add_multi_provider_LLM_support_including_local_ollama

Conversation

@joeVenner

Copy link
Copy Markdown

🌟 Add Multi-Provider LLM Support - Use Any LLM with PageIndex!

Summary

This PR transforms PageIndex from an OpenAI-only tool into a universal LLM-powered document indexing solution. By integrating LiteLLM, users can now choose from 100+ LLM providers including:

ProviderModelsSetup
🟢 OpenAIGPT-4o, GPT-4 TurboOPENAI_API_KEY
🟣 AnthropicClaude 3 Opus, Sonnet, HaikuANTHROPIC_API_KEY
🔵 GoogleGemini Pro, Gemini 1.5GEMINI_API_KEY
🟦 AzureAzure OpenAI deploymentsAZURE_API_KEY + base
🟠 AWS BedrockClaude, Llama on BedrockAWS credentials
GroqLlama 3.1, MixtralGROQ_API_KEY
🦙 Ollama (Local)Llama3, Mistral, QwenNo API key!

🚀 Key Features

  • Zero Breaking Changes: Fully backward compatible with existing setups
  • Local Model Support: Run completely offline with Ollama
  • Flexible Token Counting: Automatic tokenizer selection per provider
  • Simple Migration: Just change the model string!

📝 Usage Examples

# OpenAI (default - no changes needed)
python3 run_pageindex.py --pdf_path doc.pdf
# Claude 3 Opusexport ANTHROPIC_API_KEY=your_key
python3 run_pageindex.py --pdf_path doc.pdf --model claude-3-opus-20240229
# Local Ollama (no API key!)
ollama serve
python3 run_pageindex.py --pdf_path doc.pdf --model ollama/llama3

@jdiaz-elyndra

jdiaz-elyndra commented Feb 14, 2026 via email

Copy link
Copy Markdown

@joeVenner

Copy link
Copy Markdown
Author

@zmtomorrow Can you check please ?

@hoangvantuan

Copy link
Copy Markdown

I really need this pull request.

@joeVenner

Copy link
Copy Markdown
Author

@rejojer can you check ?

Comment threadpageindex/utils.py Outdated
else:
# Use LiteLLM's token counter for other providers
try:
return litellm.token_counter(model=model, text=text)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why not use directly litellm.token_counter? Why is this needed: if is_openai_model:

Joevennerand others added 3 commits March 22, 2026 14:23
Replace OpenAI-only implementation with LiteLLM to support 100+ LLM providers
including Anthropic Claude, Google Gemini, Azure OpenAI, AWS Bedrock, Groq,
and local Ollama models.
Changes:
- Add litellm>=1.0.0 dependency
- Refactor ChatGPT_API functions to use litellm.completion()
- Enhance count_tokens() for multi-provider token counting
- Update config.yaml with provider-specific model examples
- Update README.md with multi-provider setup instructions
Backward compatible: Existing OPENAI_API_KEY and CHATGPT_API_KEY still work.
Default model remains gpt-4o-2024-11-20.
…removing reliance on direct tiktoken and hardcoded models, while cleaning up tokenization logic to prevent crashes
Accept upstream's LiteLLM implementation (llm_completion/llm_acompletion,
pinned litellm==1.82.0, ConfigLoader, drop_params) which supersedes
our parallel implementation.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@joeVenner
joeVennerforce-pushed the feat/Add_multi_provider_LLM_support_including_local_ollama branch from acc22f7 to 7d63209CompareMarch 22, 2026 13:24
@joeVenner

Copy link
Copy Markdown
Author

@ClimenteA Can you please check this PR when you have time ?

@KylinMountain

Copy link
Copy Markdown
Collaborator

Thanks @joeVenner! This is exactly the direction we took — multi-provider support via LiteLLM landed in #168 (merged), so llm_completion now routes through litellm.completion and works with any LiteLLM-supported provider by model name. Closing as already implemented; your PR helped validate the approach. 🙏

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.

5 participants

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

feat: Add multi-provider LLM support via LiteLLM integration - #110

Closed
joeVenner wants to merge 3 commits into
VectifyAI:mainfrom
joeVenner:feat/Add_multi_provider_LLM_support_including_local_ollama
Closed

feat: Add multi-provider LLM support via LiteLLM integration#110
joeVenner wants to merge 3 commits into
VectifyAI:mainfrom
joeVenner:feat/Add_multi_provider_LLM_support_including_local_ollama

Conversation

@joeVenner

Copy link
Copy Markdown

🌟 Add Multi-Provider LLM Support - Use Any LLM with PageIndex!

Summary

This PR transforms PageIndex from an OpenAI-only tool into a universal LLM-powered document indexing solution. By integrating LiteLLM, users can now choose from 100+ LLM providers including:

ProviderModelsSetup
🟢 OpenAIGPT-4o, GPT-4 TurboOPENAI_API_KEY
🟣 AnthropicClaude 3 Opus, Sonnet, HaikuANTHROPIC_API_KEY
🔵 GoogleGemini Pro, Gemini 1.5GEMINI_API_KEY
🟦 AzureAzure OpenAI deploymentsAZURE_API_KEY + base
🟠 AWS BedrockClaude, Llama on BedrockAWS credentials
GroqLlama 3.1, MixtralGROQ_API_KEY
🦙 Ollama (Local)Llama3, Mistral, QwenNo API key!

🚀 Key Features

  • Zero Breaking Changes: Fully backward compatible with existing setups
  • Local Model Support: Run completely offline with Ollama
  • Flexible Token Counting: Automatic tokenizer selection per provider
  • Simple Migration: Just change the model string!

📝 Usage Examples

# OpenAI (default - no changes needed)
python3 run_pageindex.py --pdf_path doc.pdf
# Claude 3 Opusexport ANTHROPIC_API_KEY=your_key
python3 run_pageindex.py --pdf_path doc.pdf --model claude-3-opus-20240229
# Local Ollama (no API key!)
ollama serve
python3 run_pageindex.py --pdf_path doc.pdf --model ollama/llama3

@jdiaz-elyndra

jdiaz-elyndra commented Feb 14, 2026 via email

Copy link
Copy Markdown

@joeVenner

Copy link
Copy Markdown
Author

@zmtomorrow Can you check please ?

@hoangvantuan

Copy link
Copy Markdown

I really need this pull request.

@joeVenner

Copy link
Copy Markdown
Author

@rejojer can you check ?

Comment threadpageindex/utils.py Outdated
else:
# Use LiteLLM's token counter for other providers
try:
return litellm.token_counter(model=model, text=text)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why not use directly litellm.token_counter? Why is this needed: if is_openai_model:

Joevennerand others added 3 commits March 22, 2026 14:23
Replace OpenAI-only implementation with LiteLLM to support 100+ LLM providers
including Anthropic Claude, Google Gemini, Azure OpenAI, AWS Bedrock, Groq,
and local Ollama models.
Changes:
- Add litellm>=1.0.0 dependency
- Refactor ChatGPT_API functions to use litellm.completion()
- Enhance count_tokens() for multi-provider token counting
- Update config.yaml with provider-specific model examples
- Update README.md with multi-provider setup instructions
Backward compatible: Existing OPENAI_API_KEY and CHATGPT_API_KEY still work.
Default model remains gpt-4o-2024-11-20.
…removing reliance on direct tiktoken and hardcoded models, while cleaning up tokenization logic to prevent crashes
Accept upstream's LiteLLM implementation (llm_completion/llm_acompletion,
pinned litellm==1.82.0, ConfigLoader, drop_params) which supersedes
our parallel implementation.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@joeVenner
joeVennerforce-pushed the feat/Add_multi_provider_LLM_support_including_local_ollama branch from acc22f7 to 7d63209CompareMarch 22, 2026 13:24
@joeVenner

Copy link
Copy Markdown
Author

@ClimenteA Can you please check this PR when you have time ?

@KylinMountain

Copy link
Copy Markdown
Collaborator

Thanks @joeVenner! This is exactly the direction we took — multi-provider support via LiteLLM landed in #168 (merged), so llm_completion now routes through litellm.completion and works with any LiteLLM-supported provider by model name. Closing as already implemented; your PR helped validate the approach. 🙏

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.

5 participants

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

feat: Add multi-provider LLM support via LiteLLM integration - #110

Closed
joeVenner wants to merge 3 commits into
VectifyAI:mainfrom
joeVenner:feat/Add_multi_provider_LLM_support_including_local_ollama
Closed

feat: Add multi-provider LLM support via LiteLLM integration#110
joeVenner wants to merge 3 commits into
VectifyAI:mainfrom
joeVenner:feat/Add_multi_provider_LLM_support_including_local_ollama

Conversation

@joeVenner

Copy link
Copy Markdown

🌟 Add Multi-Provider LLM Support - Use Any LLM with PageIndex!

Summary

This PR transforms PageIndex from an OpenAI-only tool into a universal LLM-powered document indexing solution. By integrating LiteLLM, users can now choose from 100+ LLM providers including:

ProviderModelsSetup
🟢 OpenAIGPT-4o, GPT-4 TurboOPENAI_API_KEY
🟣 AnthropicClaude 3 Opus, Sonnet, HaikuANTHROPIC_API_KEY
🔵 GoogleGemini Pro, Gemini 1.5GEMINI_API_KEY
🟦 AzureAzure OpenAI deploymentsAZURE_API_KEY + base
🟠 AWS BedrockClaude, Llama on BedrockAWS credentials
GroqLlama 3.1, MixtralGROQ_API_KEY
🦙 Ollama (Local)Llama3, Mistral, QwenNo API key!

🚀 Key Features

  • Zero Breaking Changes: Fully backward compatible with existing setups
  • Local Model Support: Run completely offline with Ollama
  • Flexible Token Counting: Automatic tokenizer selection per provider
  • Simple Migration: Just change the model string!

📝 Usage Examples

# OpenAI (default - no changes needed)
python3 run_pageindex.py --pdf_path doc.pdf
# Claude 3 Opusexport ANTHROPIC_API_KEY=your_key
python3 run_pageindex.py --pdf_path doc.pdf --model claude-3-opus-20240229
# Local Ollama (no API key!)
ollama serve
python3 run_pageindex.py --pdf_path doc.pdf --model ollama/llama3

@jdiaz-elyndra

jdiaz-elyndra commented Feb 14, 2026 via email

Copy link
Copy Markdown

@joeVenner

Copy link
Copy Markdown
Author

@zmtomorrow Can you check please ?

@hoangvantuan

Copy link
Copy Markdown

I really need this pull request.

@joeVenner

Copy link
Copy Markdown
Author

@rejojer can you check ?

Comment threadpageindex/utils.py Outdated
else:
# Use LiteLLM's token counter for other providers
try:
return litellm.token_counter(model=model, text=text)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why not use directly litellm.token_counter? Why is this needed: if is_openai_model:

Joevennerand others added 3 commits March 22, 2026 14:23
Replace OpenAI-only implementation with LiteLLM to support 100+ LLM providers
including Anthropic Claude, Google Gemini, Azure OpenAI, AWS Bedrock, Groq,
and local Ollama models.
Changes:
- Add litellm>=1.0.0 dependency
- Refactor ChatGPT_API functions to use litellm.completion()
- Enhance count_tokens() for multi-provider token counting
- Update config.yaml with provider-specific model examples
- Update README.md with multi-provider setup instructions
Backward compatible: Existing OPENAI_API_KEY and CHATGPT_API_KEY still work.
Default model remains gpt-4o-2024-11-20.
…removing reliance on direct tiktoken and hardcoded models, while cleaning up tokenization logic to prevent crashes
Accept upstream's LiteLLM implementation (llm_completion/llm_acompletion,
pinned litellm==1.82.0, ConfigLoader, drop_params) which supersedes
our parallel implementation.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@joeVenner
joeVennerforce-pushed the feat/Add_multi_provider_LLM_support_including_local_ollama branch from acc22f7 to 7d63209CompareMarch 22, 2026 13:24
@joeVenner

Copy link
Copy Markdown
Author

@ClimenteA Can you please check this PR when you have time ?

@KylinMountain

Copy link
Copy Markdown
Collaborator

Thanks @joeVenner! This is exactly the direction we took — multi-provider support via LiteLLM landed in #168 (merged), so llm_completion now routes through litellm.completion and works with any LiteLLM-supported provider by model name. Closing as already implemented; your PR helped validate the approach. 🙏

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.

5 participants

@joeVenner@jdiaz-elyndra@hoangvantuan@KylinMountain@ClimenteA
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: Add multi-provider LLM support via LiteLLM integration - #110

Closed
joeVenner wants to merge 3 commits into
VectifyAI:mainfrom
joeVenner:feat/Add_multi_provider_LLM_support_including_local_ollama
Closed

feat: Add multi-provider LLM support via LiteLLM integration#110
joeVenner wants to merge 3 commits into
VectifyAI:mainfrom
joeVenner:feat/Add_multi_provider_LLM_support_including_local_ollama

Conversation

@joeVenner

Copy link
Copy Markdown

🌟 Add Multi-Provider LLM Support - Use Any LLM with PageIndex!

Summary

This PR transforms PageIndex from an OpenAI-only tool into a universal LLM-powered document indexing solution. By integrating LiteLLM, users can now choose from 100+ LLM providers including:

ProviderModelsSetup
🟢 OpenAIGPT-4o, GPT-4 TurboOPENAI_API_KEY
🟣 AnthropicClaude 3 Opus, Sonnet, HaikuANTHROPIC_API_KEY
🔵 GoogleGemini Pro, Gemini 1.5GEMINI_API_KEY
🟦 AzureAzure OpenAI deploymentsAZURE_API_KEY + base
🟠 AWS BedrockClaude, Llama on BedrockAWS credentials
GroqLlama 3.1, MixtralGROQ_API_KEY
🦙 Ollama (Local)Llama3, Mistral, QwenNo API key!

🚀 Key Features

  • Zero Breaking Changes: Fully backward compatible with existing setups
  • Local Model Support: Run completely offline with Ollama
  • Flexible Token Counting: Automatic tokenizer selection per provider
  • Simple Migration: Just change the model string!

📝 Usage Examples

# OpenAI (default - no changes needed)
python3 run_pageindex.py --pdf_path doc.pdf
# Claude 3 Opusexport ANTHROPIC_API_KEY=your_key
python3 run_pageindex.py --pdf_path doc.pdf --model claude-3-opus-20240229
# Local Ollama (no API key!)
ollama serve
python3 run_pageindex.py --pdf_path doc.pdf --model ollama/llama3

@jdiaz-elyndra

jdiaz-elyndra commented Feb 14, 2026 via email

Copy link
Copy Markdown

@joeVenner

Copy link
Copy Markdown
Author

@zmtomorrow Can you check please ?

@hoangvantuan

Copy link
Copy Markdown

I really need this pull request.

@joeVenner

Copy link
Copy Markdown
Author

@rejojer can you check ?

Comment threadpageindex/utils.py Outdated
else:
# Use LiteLLM's token counter for other providers
try:
return litellm.token_counter(model=model, text=text)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why not use directly litellm.token_counter? Why is this needed: if is_openai_model:

Joevennerand others added 3 commits March 22, 2026 14:23
Replace OpenAI-only implementation with LiteLLM to support 100+ LLM providers
including Anthropic Claude, Google Gemini, Azure OpenAI, AWS Bedrock, Groq,
and local Ollama models.
Changes:
- Add litellm>=1.0.0 dependency
- Refactor ChatGPT_API functions to use litellm.completion()
- Enhance count_tokens() for multi-provider token counting
- Update config.yaml with provider-specific model examples
- Update README.md with multi-provider setup instructions
Backward compatible: Existing OPENAI_API_KEY and CHATGPT_API_KEY still work.
Default model remains gpt-4o-2024-11-20.
…removing reliance on direct tiktoken and hardcoded models, while cleaning up tokenization logic to prevent crashes
Accept upstream's LiteLLM implementation (llm_completion/llm_acompletion,
pinned litellm==1.82.0, ConfigLoader, drop_params) which supersedes
our parallel implementation.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@joeVenner
joeVennerforce-pushed the feat/Add_multi_provider_LLM_support_including_local_ollama branch from acc22f7 to 7d63209CompareMarch 22, 2026 13:24
@joeVenner

Copy link
Copy Markdown
Author

@ClimenteA Can you please check this PR when you have time ?

@KylinMountain

Copy link
Copy Markdown
Collaborator

Thanks @joeVenner! This is exactly the direction we took — multi-provider support via LiteLLM landed in #168 (merged), so llm_completion now routes through litellm.completion and works with any LiteLLM-supported provider by model name. Closing as already implemented; your PR helped validate the approach. 🙏

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.

5 participants

@joeVenner@jdiaz-elyndra@hoangvantuan@KylinMountain@ClimenteA
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: Add multi-provider LLM support via LiteLLM integration - #110

Closed
joeVenner wants to merge 3 commits into
VectifyAI:mainfrom
joeVenner:feat/Add_multi_provider_LLM_support_including_local_ollama
Closed

feat: Add multi-provider LLM support via LiteLLM integration#110
joeVenner wants to merge 3 commits into
VectifyAI:mainfrom
joeVenner:feat/Add_multi_provider_LLM_support_including_local_ollama

Conversation

@joeVenner

Copy link
Copy Markdown

🌟 Add Multi-Provider LLM Support - Use Any LLM with PageIndex!

Summary

This PR transforms PageIndex from an OpenAI-only tool into a universal LLM-powered document indexing solution. By integrating LiteLLM, users can now choose from 100+ LLM providers including:

ProviderModelsSetup
🟢 OpenAIGPT-4o, GPT-4 TurboOPENAI_API_KEY
🟣 AnthropicClaude 3 Opus, Sonnet, HaikuANTHROPIC_API_KEY
🔵 GoogleGemini Pro, Gemini 1.5GEMINI_API_KEY
🟦 AzureAzure OpenAI deploymentsAZURE_API_KEY + base
🟠 AWS BedrockClaude, Llama on BedrockAWS credentials
GroqLlama 3.1, MixtralGROQ_API_KEY
🦙 Ollama (Local)Llama3, Mistral, QwenNo API key!

🚀 Key Features

  • Zero Breaking Changes: Fully backward compatible with existing setups
  • Local Model Support: Run completely offline with Ollama
  • Flexible Token Counting: Automatic tokenizer selection per provider
  • Simple Migration: Just change the model string!

📝 Usage Examples

# OpenAI (default - no changes needed)
python3 run_pageindex.py --pdf_path doc.pdf
# Claude 3 Opusexport ANTHROPIC_API_KEY=your_key
python3 run_pageindex.py --pdf_path doc.pdf --model claude-3-opus-20240229
# Local Ollama (no API key!)
ollama serve
python3 run_pageindex.py --pdf_path doc.pdf --model ollama/llama3

@jdiaz-elyndra

jdiaz-elyndra commented Feb 14, 2026 via email

Copy link
Copy Markdown

@joeVenner

Copy link
Copy Markdown
Author

@zmtomorrow Can you check please ?

@hoangvantuan

Copy link
Copy Markdown

I really need this pull request.

@joeVenner

Copy link
Copy Markdown
Author

@rejojer can you check ?

Comment threadpageindex/utils.py Outdated
else:
# Use LiteLLM's token counter for other providers
try:
return litellm.token_counter(model=model, text=text)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why not use directly litellm.token_counter? Why is this needed: if is_openai_model:

Joevennerand others added 3 commits March 22, 2026 14:23
Replace OpenAI-only implementation with LiteLLM to support 100+ LLM providers
including Anthropic Claude, Google Gemini, Azure OpenAI, AWS Bedrock, Groq,
and local Ollama models.
Changes:
- Add litellm>=1.0.0 dependency
- Refactor ChatGPT_API functions to use litellm.completion()
- Enhance count_tokens() for multi-provider token counting
- Update config.yaml with provider-specific model examples
- Update README.md with multi-provider setup instructions
Backward compatible: Existing OPENAI_API_KEY and CHATGPT_API_KEY still work.
Default model remains gpt-4o-2024-11-20.
…removing reliance on direct tiktoken and hardcoded models, while cleaning up tokenization logic to prevent crashes
Accept upstream's LiteLLM implementation (llm_completion/llm_acompletion,
pinned litellm==1.82.0, ConfigLoader, drop_params) which supersedes
our parallel implementation.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@joeVenner
joeVennerforce-pushed the feat/Add_multi_provider_LLM_support_including_local_ollama branch from acc22f7 to 7d63209CompareMarch 22, 2026 13:24
@joeVenner

Copy link
Copy Markdown
Author

@ClimenteA Can you please check this PR when you have time ?

@KylinMountain

Copy link
Copy Markdown
Collaborator

Thanks @joeVenner! This is exactly the direction we took — multi-provider support via LiteLLM landed in #168 (merged), so llm_completion now routes through litellm.completion and works with any LiteLLM-supported provider by model name. Closing as already implemented; your PR helped validate the approach. 🙏

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.

5 participants

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

feat: Add multi-provider LLM support via LiteLLM integration - #110

Closed
joeVenner wants to merge 3 commits into
VectifyAI:mainfrom
joeVenner:feat/Add_multi_provider_LLM_support_including_local_ollama
Closed

feat: Add multi-provider LLM support via LiteLLM integration#110
joeVenner wants to merge 3 commits into
VectifyAI:mainfrom
joeVenner:feat/Add_multi_provider_LLM_support_including_local_ollama

Conversation

@joeVenner

Copy link
Copy Markdown

🌟 Add Multi-Provider LLM Support - Use Any LLM with PageIndex!

Summary

This PR transforms PageIndex from an OpenAI-only tool into a universal LLM-powered document indexing solution. By integrating LiteLLM, users can now choose from 100+ LLM providers including:

ProviderModelsSetup
🟢 OpenAIGPT-4o, GPT-4 TurboOPENAI_API_KEY
🟣 AnthropicClaude 3 Opus, Sonnet, HaikuANTHROPIC_API_KEY
🔵 GoogleGemini Pro, Gemini 1.5GEMINI_API_KEY
🟦 AzureAzure OpenAI deploymentsAZURE_API_KEY + base
🟠 AWS BedrockClaude, Llama on BedrockAWS credentials
GroqLlama 3.1, MixtralGROQ_API_KEY
🦙 Ollama (Local)Llama3, Mistral, QwenNo API key!

🚀 Key Features

  • Zero Breaking Changes: Fully backward compatible with existing setups
  • Local Model Support: Run completely offline with Ollama
  • Flexible Token Counting: Automatic tokenizer selection per provider
  • Simple Migration: Just change the model string!

📝 Usage Examples

# OpenAI (default - no changes needed)
python3 run_pageindex.py --pdf_path doc.pdf
# Claude 3 Opusexport ANTHROPIC_API_KEY=your_key
python3 run_pageindex.py --pdf_path doc.pdf --model claude-3-opus-20240229
# Local Ollama (no API key!)
ollama serve
python3 run_pageindex.py --pdf_path doc.pdf --model ollama/llama3

@jdiaz-elyndra

jdiaz-elyndra commented Feb 14, 2026 via email

Copy link
Copy Markdown

@joeVenner

Copy link
Copy Markdown
Author

@zmtomorrow Can you check please ?

@hoangvantuan

Copy link
Copy Markdown

I really need this pull request.

@joeVenner

Copy link
Copy Markdown
Author

@rejojer can you check ?

Comment threadpageindex/utils.py Outdated
else:
# Use LiteLLM's token counter for other providers
try:
return litellm.token_counter(model=model, text=text)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why not use directly litellm.token_counter? Why is this needed: if is_openai_model:

Joevennerand others added 3 commits March 22, 2026 14:23
Replace OpenAI-only implementation with LiteLLM to support 100+ LLM providers
including Anthropic Claude, Google Gemini, Azure OpenAI, AWS Bedrock, Groq,
and local Ollama models.
Changes:
- Add litellm>=1.0.0 dependency
- Refactor ChatGPT_API functions to use litellm.completion()
- Enhance count_tokens() for multi-provider token counting
- Update config.yaml with provider-specific model examples
- Update README.md with multi-provider setup instructions
Backward compatible: Existing OPENAI_API_KEY and CHATGPT_API_KEY still work.
Default model remains gpt-4o-2024-11-20.
…removing reliance on direct tiktoken and hardcoded models, while cleaning up tokenization logic to prevent crashes
Accept upstream's LiteLLM implementation (llm_completion/llm_acompletion,
pinned litellm==1.82.0, ConfigLoader, drop_params) which supersedes
our parallel implementation.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@joeVenner
joeVennerforce-pushed the feat/Add_multi_provider_LLM_support_including_local_ollama branch from acc22f7 to 7d63209CompareMarch 22, 2026 13:24
@joeVenner

Copy link
Copy Markdown
Author

@ClimenteA Can you please check this PR when you have time ?

@KylinMountain

Copy link
Copy Markdown
Collaborator

Thanks @joeVenner! This is exactly the direction we took — multi-provider support via LiteLLM landed in #168 (merged), so llm_completion now routes through litellm.completion and works with any LiteLLM-supported provider by model name. Closing as already implemented; your PR helped validate the approach. 🙏

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.

5 participants

@joeVenner@jdiaz-elyndra@hoangvantuan@KylinMountain@ClimenteA