Reuse OpenAI clients to improve throughput - #72

Closed
luojiyin1987 wants to merge 1 commit into
VectifyAI:mainfrom
luojiyin1987:feat/openai-client-reuse
Closed

Reuse OpenAI clients to improve throughput#72
luojiyin1987 wants to merge 1 commit into
VectifyAI:mainfrom
luojiyin1987:feat/openai-client-reuse

Conversation

@luojiyin1987

Copy link
Copy Markdown
Contributor

Summary

  • Add module-level singleton clients cached per API key
  • Replace client creation with _get_sync_client/_get_async_client helper functions
  • Fix chat_history mutation side effect (use list concatenation instead of append)
  • Fix error return type inconsistency in ChatGPT_API_with_finish_reason
  • Add missing re import

Closes#71

- Add module-level singleton clients cached per API key
- Replace client creation with _get_sync_client/_get_async_client
- Fix chat_history mutation side effect (use list concatenation)
- Fix error return type inconsistency in ChatGPT_API_with_finish_reason
- Add missing 're' import
@murthi1832-cmd

Copy link
Copy Markdown

@ncurado

Copy link
Copy Markdown

Nice improvement on client reuse + chat_history immutability. One small concern: _normalize_api_key returns "" when no key is set, so we end up caching a client under the empty-string key. Suggest guarding in _get_sync_client/_get_async_client (raise ValueError if normalized key is empty) or skip caching in that case, to avoid creating a client with an empty API key.

@KylinMountain

Copy link
Copy Markdown
Collaborator

Thanks @luojiyin1987! Since this was opened, the LLM layer was rewritten to route through LiteLLM (#168), so the functions this patches (ChatGPT_API* with direct openai.OpenAI clients) no longer exist on main and the PR now conflicts.

Each concern is already covered in the current code:

  • Client reuse / throughput (Reuse OpenAI clients to improve throughput #71): LiteLLM reuses its underlying HTTP connections internally, so there's no per-call client creation anymore.
  • chat_history mutation: llm_completion builds messages with list(chat_history) + [...], so the caller's list isn't mutated.
  • Error return consistency: it returns "", "error" on max retries.
  • Missing re import: landed via Adds missing re import #281.

Closing as superseded by the LiteLLM migration — thanks for the solid fixes, they're all reflected in main now. 🙏

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.

Reuse OpenAI clients to improve throughput

4 participants

@luojiyin1987@murthi1832-cmd@ncurado@KylinMountain
, '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

Reuse OpenAI clients to improve throughput - #72

Closed
luojiyin1987 wants to merge 1 commit into
VectifyAI:mainfrom
luojiyin1987:feat/openai-client-reuse
Closed

Reuse OpenAI clients to improve throughput#72
luojiyin1987 wants to merge 1 commit into
VectifyAI:mainfrom
luojiyin1987:feat/openai-client-reuse

Conversation

@luojiyin1987

Copy link
Copy Markdown
Contributor

Summary

  • Add module-level singleton clients cached per API key
  • Replace client creation with _get_sync_client/_get_async_client helper functions
  • Fix chat_history mutation side effect (use list concatenation instead of append)
  • Fix error return type inconsistency in ChatGPT_API_with_finish_reason
  • Add missing re import

Closes#71

- Add module-level singleton clients cached per API key
- Replace client creation with _get_sync_client/_get_async_client
- Fix chat_history mutation side effect (use list concatenation)
- Fix error return type inconsistency in ChatGPT_API_with_finish_reason
- Add missing 're' import
@murthi1832-cmd

Copy link
Copy Markdown

@ncurado

Copy link
Copy Markdown

Nice improvement on client reuse + chat_history immutability. One small concern: _normalize_api_key returns "" when no key is set, so we end up caching a client under the empty-string key. Suggest guarding in _get_sync_client/_get_async_client (raise ValueError if normalized key is empty) or skip caching in that case, to avoid creating a client with an empty API key.

@KylinMountain

Copy link
Copy Markdown
Collaborator

Thanks @luojiyin1987! Since this was opened, the LLM layer was rewritten to route through LiteLLM (#168), so the functions this patches (ChatGPT_API* with direct openai.OpenAI clients) no longer exist on main and the PR now conflicts.

Each concern is already covered in the current code:

  • Client reuse / throughput (Reuse OpenAI clients to improve throughput #71): LiteLLM reuses its underlying HTTP connections internally, so there's no per-call client creation anymore.
  • chat_history mutation: llm_completion builds messages with list(chat_history) + [...], so the caller's list isn't mutated.
  • Error return consistency: it returns "", "error" on max retries.
  • Missing re import: landed via Adds missing re import #281.

Closing as superseded by the LiteLLM migration — thanks for the solid fixes, they're all reflected in main now. 🙏

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.

Reuse OpenAI clients to improve throughput

4 participants

@luojiyin1987@murthi1832-cmd@ncurado@KylinMountain
, '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

Reuse OpenAI clients to improve throughput - #72

Closed
luojiyin1987 wants to merge 1 commit into
VectifyAI:mainfrom
luojiyin1987:feat/openai-client-reuse
Closed

Reuse OpenAI clients to improve throughput#72
luojiyin1987 wants to merge 1 commit into
VectifyAI:mainfrom
luojiyin1987:feat/openai-client-reuse

Conversation

@luojiyin1987

Copy link
Copy Markdown
Contributor

Summary

  • Add module-level singleton clients cached per API key
  • Replace client creation with _get_sync_client/_get_async_client helper functions
  • Fix chat_history mutation side effect (use list concatenation instead of append)
  • Fix error return type inconsistency in ChatGPT_API_with_finish_reason
  • Add missing re import

Closes#71

- Add module-level singleton clients cached per API key
- Replace client creation with _get_sync_client/_get_async_client
- Fix chat_history mutation side effect (use list concatenation)
- Fix error return type inconsistency in ChatGPT_API_with_finish_reason
- Add missing 're' import
@murthi1832-cmd

Copy link
Copy Markdown

@ncurado

Copy link
Copy Markdown

Nice improvement on client reuse + chat_history immutability. One small concern: _normalize_api_key returns "" when no key is set, so we end up caching a client under the empty-string key. Suggest guarding in _get_sync_client/_get_async_client (raise ValueError if normalized key is empty) or skip caching in that case, to avoid creating a client with an empty API key.

@KylinMountain

Copy link
Copy Markdown
Collaborator

Thanks @luojiyin1987! Since this was opened, the LLM layer was rewritten to route through LiteLLM (#168), so the functions this patches (ChatGPT_API* with direct openai.OpenAI clients) no longer exist on main and the PR now conflicts.

Each concern is already covered in the current code:

  • Client reuse / throughput (Reuse OpenAI clients to improve throughput #71): LiteLLM reuses its underlying HTTP connections internally, so there's no per-call client creation anymore.
  • chat_history mutation: llm_completion builds messages with list(chat_history) + [...], so the caller's list isn't mutated.
  • Error return consistency: it returns "", "error" on max retries.
  • Missing re import: landed via Adds missing re import #281.

Closing as superseded by the LiteLLM migration — thanks for the solid fixes, they're all reflected in main now. 🙏

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.

Reuse OpenAI clients to improve throughput

4 participants

@luojiyin1987@murthi1832-cmd@ncurado@KylinMountain
, '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

Reuse OpenAI clients to improve throughput - #72

Closed
luojiyin1987 wants to merge 1 commit into
VectifyAI:mainfrom
luojiyin1987:feat/openai-client-reuse
Closed

Reuse OpenAI clients to improve throughput#72
luojiyin1987 wants to merge 1 commit into
VectifyAI:mainfrom
luojiyin1987:feat/openai-client-reuse

Conversation

@luojiyin1987

Copy link
Copy Markdown
Contributor

Summary

  • Add module-level singleton clients cached per API key
  • Replace client creation with _get_sync_client/_get_async_client helper functions
  • Fix chat_history mutation side effect (use list concatenation instead of append)
  • Fix error return type inconsistency in ChatGPT_API_with_finish_reason
  • Add missing re import

Closes#71

- Add module-level singleton clients cached per API key
- Replace client creation with _get_sync_client/_get_async_client
- Fix chat_history mutation side effect (use list concatenation)
- Fix error return type inconsistency in ChatGPT_API_with_finish_reason
- Add missing 're' import
@murthi1832-cmd

Copy link
Copy Markdown

@ncurado

Copy link
Copy Markdown

Nice improvement on client reuse + chat_history immutability. One small concern: _normalize_api_key returns "" when no key is set, so we end up caching a client under the empty-string key. Suggest guarding in _get_sync_client/_get_async_client (raise ValueError if normalized key is empty) or skip caching in that case, to avoid creating a client with an empty API key.

@KylinMountain

Copy link
Copy Markdown
Collaborator

Thanks @luojiyin1987! Since this was opened, the LLM layer was rewritten to route through LiteLLM (#168), so the functions this patches (ChatGPT_API* with direct openai.OpenAI clients) no longer exist on main and the PR now conflicts.

Each concern is already covered in the current code:

  • Client reuse / throughput (Reuse OpenAI clients to improve throughput #71): LiteLLM reuses its underlying HTTP connections internally, so there's no per-call client creation anymore.
  • chat_history mutation: llm_completion builds messages with list(chat_history) + [...], so the caller's list isn't mutated.
  • Error return consistency: it returns "", "error" on max retries.
  • Missing re import: landed via Adds missing re import #281.

Closing as superseded by the LiteLLM migration — thanks for the solid fixes, they're all reflected in main now. 🙏

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.

Reuse OpenAI clients to improve throughput

4 participants

@luojiyin1987@murthi1832-cmd@ncurado@KylinMountain
, '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

Reuse OpenAI clients to improve throughput - #72

Closed
luojiyin1987 wants to merge 1 commit into
VectifyAI:mainfrom
luojiyin1987:feat/openai-client-reuse
Closed

Reuse OpenAI clients to improve throughput#72
luojiyin1987 wants to merge 1 commit into
VectifyAI:mainfrom
luojiyin1987:feat/openai-client-reuse

Conversation

@luojiyin1987

Copy link
Copy Markdown
Contributor

Summary

  • Add module-level singleton clients cached per API key
  • Replace client creation with _get_sync_client/_get_async_client helper functions
  • Fix chat_history mutation side effect (use list concatenation instead of append)
  • Fix error return type inconsistency in ChatGPT_API_with_finish_reason
  • Add missing re import

Closes#71

- Add module-level singleton clients cached per API key
- Replace client creation with _get_sync_client/_get_async_client
- Fix chat_history mutation side effect (use list concatenation)
- Fix error return type inconsistency in ChatGPT_API_with_finish_reason
- Add missing 're' import
@murthi1832-cmd

Copy link
Copy Markdown

@ncurado

Copy link
Copy Markdown

Nice improvement on client reuse + chat_history immutability. One small concern: _normalize_api_key returns "" when no key is set, so we end up caching a client under the empty-string key. Suggest guarding in _get_sync_client/_get_async_client (raise ValueError if normalized key is empty) or skip caching in that case, to avoid creating a client with an empty API key.

@KylinMountain

Copy link
Copy Markdown
Collaborator

Thanks @luojiyin1987! Since this was opened, the LLM layer was rewritten to route through LiteLLM (#168), so the functions this patches (ChatGPT_API* with direct openai.OpenAI clients) no longer exist on main and the PR now conflicts.

Each concern is already covered in the current code:

  • Client reuse / throughput (Reuse OpenAI clients to improve throughput #71): LiteLLM reuses its underlying HTTP connections internally, so there's no per-call client creation anymore.
  • chat_history mutation: llm_completion builds messages with list(chat_history) + [...], so the caller's list isn't mutated.
  • Error return consistency: it returns "", "error" on max retries.
  • Missing re import: landed via Adds missing re import #281.

Closing as superseded by the LiteLLM migration — thanks for the solid fixes, they're all reflected in main now. 🙏

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.

Reuse OpenAI clients to improve throughput

4 participants

@luojiyin1987@murthi1832-cmd@ncurado@KylinMountain
, '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

Reuse OpenAI clients to improve throughput - #72

Closed
luojiyin1987 wants to merge 1 commit into
VectifyAI:mainfrom
luojiyin1987:feat/openai-client-reuse
Closed

Reuse OpenAI clients to improve throughput#72
luojiyin1987 wants to merge 1 commit into
VectifyAI:mainfrom
luojiyin1987:feat/openai-client-reuse

Conversation

@luojiyin1987

Copy link
Copy Markdown
Contributor

Summary

  • Add module-level singleton clients cached per API key
  • Replace client creation with _get_sync_client/_get_async_client helper functions
  • Fix chat_history mutation side effect (use list concatenation instead of append)
  • Fix error return type inconsistency in ChatGPT_API_with_finish_reason
  • Add missing re import

Closes#71

- Add module-level singleton clients cached per API key
- Replace client creation with _get_sync_client/_get_async_client
- Fix chat_history mutation side effect (use list concatenation)
- Fix error return type inconsistency in ChatGPT_API_with_finish_reason
- Add missing 're' import
@murthi1832-cmd

Copy link
Copy Markdown

@ncurado

Copy link
Copy Markdown

Nice improvement on client reuse + chat_history immutability. One small concern: _normalize_api_key returns "" when no key is set, so we end up caching a client under the empty-string key. Suggest guarding in _get_sync_client/_get_async_client (raise ValueError if normalized key is empty) or skip caching in that case, to avoid creating a client with an empty API key.

@KylinMountain

Copy link
Copy Markdown
Collaborator

Thanks @luojiyin1987! Since this was opened, the LLM layer was rewritten to route through LiteLLM (#168), so the functions this patches (ChatGPT_API* with direct openai.OpenAI clients) no longer exist on main and the PR now conflicts.

Each concern is already covered in the current code:

  • Client reuse / throughput (Reuse OpenAI clients to improve throughput #71): LiteLLM reuses its underlying HTTP connections internally, so there's no per-call client creation anymore.
  • chat_history mutation: llm_completion builds messages with list(chat_history) + [...], so the caller's list isn't mutated.
  • Error return consistency: it returns "", "error" on max retries.
  • Missing re import: landed via Adds missing re import #281.

Closing as superseded by the LiteLLM migration — thanks for the solid fixes, they're all reflected in main now. 🙏

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.

Reuse OpenAI clients to improve throughput

4 participants

@luojiyin1987@murthi1832-cmd@ncurado@KylinMountain
, '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

Reuse OpenAI clients to improve throughput - #72

Closed
luojiyin1987 wants to merge 1 commit into
VectifyAI:mainfrom
luojiyin1987:feat/openai-client-reuse
Closed

Reuse OpenAI clients to improve throughput#72
luojiyin1987 wants to merge 1 commit into
VectifyAI:mainfrom
luojiyin1987:feat/openai-client-reuse

Conversation

@luojiyin1987

Copy link
Copy Markdown
Contributor

Summary

  • Add module-level singleton clients cached per API key
  • Replace client creation with _get_sync_client/_get_async_client helper functions
  • Fix chat_history mutation side effect (use list concatenation instead of append)
  • Fix error return type inconsistency in ChatGPT_API_with_finish_reason
  • Add missing re import

Closes#71

- Add module-level singleton clients cached per API key
- Replace client creation with _get_sync_client/_get_async_client
- Fix chat_history mutation side effect (use list concatenation)
- Fix error return type inconsistency in ChatGPT_API_with_finish_reason
- Add missing 're' import
@murthi1832-cmd

Copy link
Copy Markdown

@ncurado

Copy link
Copy Markdown

Nice improvement on client reuse + chat_history immutability. One small concern: _normalize_api_key returns "" when no key is set, so we end up caching a client under the empty-string key. Suggest guarding in _get_sync_client/_get_async_client (raise ValueError if normalized key is empty) or skip caching in that case, to avoid creating a client with an empty API key.

@KylinMountain

Copy link
Copy Markdown
Collaborator

Thanks @luojiyin1987! Since this was opened, the LLM layer was rewritten to route through LiteLLM (#168), so the functions this patches (ChatGPT_API* with direct openai.OpenAI clients) no longer exist on main and the PR now conflicts.

Each concern is already covered in the current code:

  • Client reuse / throughput (Reuse OpenAI clients to improve throughput #71): LiteLLM reuses its underlying HTTP connections internally, so there's no per-call client creation anymore.
  • chat_history mutation: llm_completion builds messages with list(chat_history) + [...], so the caller's list isn't mutated.
  • Error return consistency: it returns "", "error" on max retries.
  • Missing re import: landed via Adds missing re import #281.

Closing as superseded by the LiteLLM migration — thanks for the solid fixes, they're all reflected in main now. 🙏

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.

Reuse OpenAI clients to improve throughput

4 participants

@luojiyin1987@murthi1832-cmd@ncurado@KylinMountain
, '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

Reuse OpenAI clients to improve throughput - #72

Closed
luojiyin1987 wants to merge 1 commit into
VectifyAI:mainfrom
luojiyin1987:feat/openai-client-reuse
Closed

Reuse OpenAI clients to improve throughput#72
luojiyin1987 wants to merge 1 commit into
VectifyAI:mainfrom
luojiyin1987:feat/openai-client-reuse

Conversation

@luojiyin1987

Copy link
Copy Markdown
Contributor

Summary

  • Add module-level singleton clients cached per API key
  • Replace client creation with _get_sync_client/_get_async_client helper functions
  • Fix chat_history mutation side effect (use list concatenation instead of append)
  • Fix error return type inconsistency in ChatGPT_API_with_finish_reason
  • Add missing re import

Closes#71

- Add module-level singleton clients cached per API key
- Replace client creation with _get_sync_client/_get_async_client
- Fix chat_history mutation side effect (use list concatenation)
- Fix error return type inconsistency in ChatGPT_API_with_finish_reason
- Add missing 're' import
@murthi1832-cmd

Copy link
Copy Markdown

@ncurado

Copy link
Copy Markdown

Nice improvement on client reuse + chat_history immutability. One small concern: _normalize_api_key returns "" when no key is set, so we end up caching a client under the empty-string key. Suggest guarding in _get_sync_client/_get_async_client (raise ValueError if normalized key is empty) or skip caching in that case, to avoid creating a client with an empty API key.

@KylinMountain

Copy link
Copy Markdown
Collaborator

Thanks @luojiyin1987! Since this was opened, the LLM layer was rewritten to route through LiteLLM (#168), so the functions this patches (ChatGPT_API* with direct openai.OpenAI clients) no longer exist on main and the PR now conflicts.

Each concern is already covered in the current code:

  • Client reuse / throughput (Reuse OpenAI clients to improve throughput #71): LiteLLM reuses its underlying HTTP connections internally, so there's no per-call client creation anymore.
  • chat_history mutation: llm_completion builds messages with list(chat_history) + [...], so the caller's list isn't mutated.
  • Error return consistency: it returns "", "error" on max retries.
  • Missing re import: landed via Adds missing re import #281.

Closing as superseded by the LiteLLM migration — thanks for the solid fixes, they're all reflected in main now. 🙏

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.

Reuse OpenAI clients to improve throughput

4 participants

@luojiyin1987@murthi1832-cmd@ncurado@KylinMountain