𝗢𝗻𝗲 𝗦𝗦𝗘 𝘀𝘁𝗿𝗲𝗮𝗺, 𝘀𝗲𝘃𝗲𝗻 𝗟𝗟𝗠 𝗽𝗿𝗼𝘃𝗶𝗱𝗲𝗿𝘀

ನಾನು ಏಳು ವಿಭಿನ್ನ LLM ಪ್ರೊವೈಡರ್‌ಗಳನ್ನು ಬೆಂಬಲಿಸುವ ಒಂದು Next.js ಆಪ್ ಅನ್ನು ನಿರ್ಮಿಸಿದ್ದೇನೆ.

OpenAI, Claude, Gemini, Ollama, Mistral, Groq, ಮತ್ತು Azure.

ನಾನು ಒಂದು ಕಟ್ಟುನಿಟ್ಟಿನ ನಿಯಮವನ್ನು ಹಾಕಿದ್ದೇನೆ: ಪ್ರತಿಯೊಂದು ಪ್ರೊವೈಡರ್‌ಗೂ ಬ್ರೌಸರ್ ನಿಖರವಾಗಿ ಒಂದೇ ರೀತಿಯ ಕೋಡ್ ಪಾತ್ ಅನ್ನು ಬಳಸಬೇಕು.

ಇದು ಕಷ್ಟಕರವಾಗಿದೆ ಏಕೆಂದರೆ ಈ APIಗಳು ಒಂದೇ ರೀತಿ ಇರುವುದಿಲ್ಲ. ಅವು ವಿಭಿನ್ನ ಟ್ರಾನ್ಸ್‌ಪೋರ್ಟ್ ವಿಧಾನಗಳನ್ನು ಬಳಸುತ್ತವೆ. ಅವು ವಿಭಿನ್ನ ಡೇಟಾ ರೂಪಗಳನ್ನು (data shapes) ಕಳುಹಿಸುತ್ತವೆ. ಕೆಲವು SSE ಬಳಸಿದರೆ ಇನ್ನು ಕೆಲವು NDJSON ಬಳಸುತ್ತವೆ.

ಈ ವ್ಯತ್ಯಾಸಗಳು ನಿಮ್ಮ UI ಗೆ ತಲುಪಲು ನೀವು ಬಿಟ್ಟರೆ, ನಿಮ್ಮ ಕೋಡ್ "if" ಸ್ಟೇಟ್‌ಮೆಂಟ್‌ಗಳ ಗೊಂದಲವಾಗುತ್ತದೆ. ನೀವು ಪ್ರತಿ ಬಾರಿ ಹೊಸ ಪ್ರೊವೈಡರ್ ಅನ್ನು ಸೇರಿಸಿದಾಗಲೆ마다, ನಿಮ್ಮ ಫ್ರಂಟ್‌ಎಂಡ್ ಹೆಚ್ಚು ಸಂಕೀರ್ಣವಾಗುತ್ತದೆ.

ನಾನು ಒಂದು ಏಕೈಕ ಕಾಂಟ್ರಾಕ್ಟ್ (contract) ಅನ್ನು ರಚಿಸುವ ಮೂಲಕ ಇದನ್ನು ಪರಿಹರಿಸಿದ್ದೇನೆ. ಪ್ರತಿಯೊಂದು ಪ್ರೊವೈಡರ್ ಬ್ರೌಸರ್‌ಗೆ ಈ ಫಾರ್ಮ್ಯಾಟ್ ಅನ್ನು ಕಳುಹಿಸಬೇಕು:

• data: {"delta":""} • data: {"error":""} • data: [DONE]

ಬ್ರೌಸರ್ ಕೇವಲ ಮೂರು ವಿಷಯಗಳನ್ನು ಅರ್ಥಮಾಡಿಕೊಳ್ಳಬೇಕಾಗುತ್ತದೆ: delta, error, ಮತ್ತು [DONE].

ನಾನು ಇದನ್ನು ಹೇಗೆ ನಿರ್ಮಿಸಿದ್ದೇನೆ ಎಂದರೆ:

  1. Async Generators ಬಳಸಿ ನಾನು ಪ್ರತಿಯೊಂದು ಪ್ರೊವೈಡರ್ ಅನ್ನು ಪ್ಲೇನ್ ಟೆಕ್ಸ್ಟ್ ನೀಡುವ ಜನರೇಟರ್ ಆಗಿ ಪರಿಗಣಿಸುತ್ತೇನೆ. ಇದು API ನ ಸಂಕೀರ್ಣತೆಯನ್ನು ಮರೆಮಾಚುತ್ತದೆ.

  2. The Wrapper Pattern ನಾನು createSSEStream ಎಂಬ Wrapper ಫಂಕ್ಷನ್ ಅನ್ನು ರಚಿಸಿದ್ದೇನೆ. ಈ Wrapper ವೈರ್ ಫಾರ್ಮ್ಯಾಟ್ ಅನ್ನು ನಿರ್ವಹಿಸುತ್ತದೆ. ಇದು ಸ್ಟ್ರೀಮ್ ಯಾವಾಗಲೂ ಕೊನೆಗೊಳ್ಳುವಂತೆ ನೋಡಿಕೊಳ್ಳುತ್ತದೆ. ಒಂದು ಪ್ರೊವೈಡರ್ ಅರ್ಧಕ್ಕೆ ವಿಫಲವಾದರೂ ಸಹ, Wrapper ಒಂದು ಎರರ್ ಮತ್ತು [DONE] ಸಿಗ್ನಲ್ ಅನ್ನು ಕಳುಹಿಸುತ್ತದೆ. ಇದು ಕ್ಲೈಂಟ್ ಹ್ಯಾಂಗ್ ಆಗದಂತೆ ತಡೆಯುತ್ತದೆ.

  3. ಒಂದೇ ರೀತಿಯ APIಗಳನ್ನು ಗುಂಪು ಮಾಡುವುದು OpenAI, Mistral, Groq, ಮತ್ತು Azure ಎಲ್ಲವೂ ಒಂದೇ ರೀತಿಯ ಡೈಲೆಕ್ಟ್ ಅನ್ನು ಬಳಸುತ್ತವೆ. ನಾನು ಅವೆಲ್ಲದಕ್ಕೂ ಒಂದೇ ಇಂಪ್ಲಿಮೆಂಟೇಶನ್ ಬರೆದಿದ್ದೇನೆ. ಈಗ ಹೊಸ ಹೊಂದಾಣಿಕೆಯ ಪ್ರೊವೈಡರ್ ಅನ್ನು ಸೇರಿಸಲು ಕೇವಲ ಒಂದು ಸಾಲಿನ ಕೋಡ್ ಸಾಕು.

  4. ವ್ಯತಿರಿಕ್ತಗಳನ್ನು (Outliers) ನಿರ್ವಹಿಸುವುದು Anthropic ಮತ್ತು Ollama ವಿಭಿನ್ನವಾಗಿ ಕೆಲಸ ಮಾಡುತ್ತವೆ. Anthropic ನಿರ್ದಿಷ್ಟ ಟೈಪ್ಡ್ ಇವೆಂಟ್‌ಗಳನ್ನು ಬಳಸುತ್ತದೆ. Ollama NDJSON ಬಳಸುತ್ತದೆ. ನಾನು ಅವರಿಗಾಗಿ ಕಸ್ಟಮ್ ಪಾರ್ಸರ್‌ಗಳನ್ನು ಬರೆದಿದ್ದೇನೆ, ಆದರೆ ಅವೆರಡೂ ಒಂದೇ Wrapper ಗೆ ಟೆಕ್ಸ್ಟ್ ಅನ್ನು ನೀಡುತ್ತವೆ. ಬ್ರೌಸರ್ ಅವರಿಗೆ ಇರುವ ವ್ಯತ್ಯಾಸವನ್ನು ಎಂದಿಗೂ ತಿಳಿಯುವುದಿಲ್ಲ.

Privacy and Simplicity ಈ ಆಪ್ "Bring Your Own Key" ಮಾಡೆಲ್ ಅನ್ನು ಬಳಸುತ್ತದೆ.

• ಬಳಕೆದಾರರು ತಮ್ಮದೇ ಆದ API ಕೀ ಅನ್ನು ಪೇಸ್ಟ್ ಮಾಡುತ್ತಾರೆ. • ಕೀ ಲೋಕಲ್ ಸ್ಟೋರೇಜ್‌ನಲ್ಲಿ ಇರುತ್ತದೆ. • ಸರ್ವರ್ ಕೇವಲ ಪ್ರೊಕ್ಸಿ ಆಗಿ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತದೆ. • ಕೀಯನ್ನು ಎಂದಿಗೂ ಡೇಟಾಬೇಸ್‌ನಲ್ಲಿ ಸಂಗ್ರಹಿಸಲಾಗುವುದಿಲ್ಲ.

ಈ ವಿಧಾನವು ಸಂಕೀರ್ಣವಾದ ಆಥೆಂಟಿಕೇಶನ್ ಅಥವಾ ಸೀಕ್ರೆಟ್ ಮ್ಯಾನೇಜ್‌ಮೆಂಟ್ ಅಗತ್ಯವನ್ನು ತೆಗೆದುಹಾಕುತ್ತದೆ. ಇದು ಆಪ್ ಅನ್ನು ಸೆಲ್ಫ್-ಹೋಸ್ಟ್ ಮಾಡಲು ಸುಲಭವಾಗಿಸುತ್ತದೆ.

ಪಾಠ ಸರಳವಾಗಿದೆ: ನೀವು ವಾಸ್ತವವಾಗಿ ಏನನ್ನು ಬಯಸುತ್ತೀರೋ ಅದನ್ನು ಜನರೇಟರ್ ಆಗಿ ಮಾಡೆಲ್ ಮಾಡಿ. ಅದನ್ನು ಒಮ್ಮೆ Wrap ಮಾಡಿ. ನಿಮ್ಮ ಮುಖ್ಯ ಲಾಜಿಕ್ ಸ್ವಚ್ಛವಾಗಿರಲು ವ್ಯತ್ಯಾಸಗಳನ್ನು ಜನರೇಟರ್‌ಗಳಲ್ಲಿ ಇರಲು ಬಿಡಿ.

Source: https://dev.to/ikeli0320/one-sse-stream-seven-llm-providers-giving-a-nextjs-app-a-single-streaming-code-path-1fh2

Optional learning community: https://t.me/GyaanSetuAi