ఒకే SSE స్ట్రీమ్, ఏడు LLM ప్రొవైడర్లు
నేను ఏడు వేర్వేరు LLM ప్రొవైడర్లను సపోర్ట్ చేసే ఒక Next.js యాప్ను రూపొందించాను.
OpenAI, Claude, Gemini, Ollama, Mistral, Groq, మరియు Azure.
నేను ఒక కఠినమైన నియమాన్ని పెట్టుకున్నాను: ప్రతి ప్రొవైడర్ కోసం బ్రౌజర్ ఖచ్చితంగా ఒకే కోడ్ పాత్ను (code path) ఉపయోగించాలి.
ఇది కష్టమైన పని, ఎందుకంటే ఈ APIలు ఒకేలా ఉండవు. అవి వేర్వేరు ట్రాన్స్పోర్ట్ పద్ధతులను ఉపయోగిస్తాయి. అవి వేర్వేరు డేటా ఫార్మాట్లను (data shapes) పంపిస్తాయి. కొన్ని SSEని ఉపయోగిస్తే, మరికొన్ని NDJSONని ఉపయోగిస్తాయి.
ఈ తేడాలు మీ UIకి చేరువయ్యేలా చేస్తే, మీ కోడ్ "if" స్టేట్మెంట్లతో గందరగోళంగా మారుతుంది. మీరు ప్రతిసారీ ఒక కొత్త ప్రొవైడర్ను జోడించినప్పుడు, మీ ఫ్రంటెండ్ మరింత సంక్లిష్టంగా మారుతుంది.
నేను ఒకే ఒక కాంట్రాక్ట్ను (contract) సృష్టించడం ద్వారా దీనిని పరిష్కరించాను. ప్రతి ప్రొవైడర్ బ్రౌజర్కు ఈ క్రింది ఫార్మాట్ను పంపాలి:
• data: {"delta":"
బ్రౌజర్ కేవలం మూడు విషయాలను మాత్రమే అర్థం చేసుకోవాలి: delta, error, మరియు [DONE].
నేను దీనిని ఎలా నిర్మించానంటే:
Async Generators ఉపయోగించడం నేను ప్రతి ప్రొవైడర్ను ప్లెయిన్ టెక్స్ట్ను ఇచ్చే (yield చేసే) ఒక జనరేటర్గా పరిగణిస్తాను. ఇది API యొక్క సంక్లిష్టతను దాచిపెడుతుంది.
The Wrapper Pattern నేను
createSSEStreamఅనే ఒక wrapper ఫంక్షన్ను సృష్టించాను. ఈ wrapper వైర్ ఫార్మాట్ను నిర్వహిస్తుంది. స్ట్రీమ్ ఎల్లప్పుడూ ముగిసేలా కూడా ఇది చూస్తుంది. ఒకవేళ ప్రొవైడర్ మధ్యలో విఫలమైనా, ఈ wrapper ఒక ఎర్రర్ మరియు [DONE] సిగ్నల్ను పంపిస్తుంది. దీనివల్ల క్లయింట్ హ్యాంగ్ అవ్వకుండా ఉంటుంది.ఒకేలా ఉండే APIలను గ్రూప్ చేయడం OpenAI, Mistral, Groq, మరియు Azure అన్నీ ఒకే రకమైన విధానాన్ని (dialect) ఉపయోగిస్తాయి. నేను వాటన్నింటి కోసం ఒకే ఇంప్లిమెంటేషన్ను వ్రాశాను. ఇప్పుడు ఒక కొత్త అనుకూల ప్రొవైడర్ను జోడించడానికి కేవలం ఒక లైన్ కోడ్ సరిపోతుంది.
భిన్నంగా ఉండే వాటిని హ్యాండిల్ చేయడం Anthropic మరియు Ollama వేర్వేరుగా పనిచేస్తాయి. Anthropic నిర్దిష్టమైన టైప్డ్ ఈవెంట్లను (typed events) ఉపయోగిస్తుంది. Ollama NDJSONని ఉపయోగిస్తుంది. నేను వాటి కోసం కస్టమ్ పార్సర్లను (custom parsers) వ్రాశాను, కానీ అవి రెండూ కూడా టెక్స్ట్ను అదే wrapperలోకి పంపిస్తాయి. బ్రౌజర్కు ఆ తేడా తెలియదు.
Privacy మరియు Simplicity ఈ యాప్ "Bring Your Own Key" మోడల్ను ఉపయోగిస్తుంది.
• వినియోగదారులు తమ స్వంత API కీని పేస్ట్ చేస్తారు. • ఆ కీ లోకల్ స్టోరేజ్లోనే ఉంటుంది. • సర్వర్ కేవలం ఒక ప్రాక్సీలా (proxy) పనిచేస్తుంది. • కీని ఎప్పుడూ డేటాబేస్లో నిల్వ చేయరు.
ఈ విధానం వల్ల సంక్లిష్టమైన auth లేదా సీక్రెట్ మేనేజ్మెంట్ అవసరం ఉండదు. ఇది యాప్ను సెల్ఫ్-హోస్ట్ (self-host) చేయడం సులభతరం చేస్తుంది.
దీని నుండి నేర్చుకోవాల్సిన పాఠం సరళమైనది: మీరు నిజంగా ఏమి కోరుకుంటున్నారో, ప్రతి ఇంటిగ్రేషన్ను దాని యొక్క జనరేటర్గా మోడల్ చేయండి. దానిని ఒకసారి रैప్ (wrap) చేయండి. వైవిధ్యం (variation) జనరేటర్లలోనే ఉండనివ్వండి, తద్వారా మీ మెయిన్ లాజిక్ క్లీన్గా ఉంటుంది.
Optional learning community: https://t.me/GyaanSetuAi