એક SSE સ્ટ્રીમ, સાત LLM પ્રોવાઇડર્સ
મેં એક Next.js એપ બનાવી છે જે સાત અલગ-અલગ LLM પ્રોવાઇડર્સને સપોર્ટ કરે છે.
OpenAI, Claude, Gemini, Ollama, Mistral, Groq, અને Azure.
મેં એક કડક નિયમ રાખ્યો: બ્રાઉઝરે દરેક પ્રોવાઇડર માટે બરાબર એક જ કોડ પાથ (code path) નો ઉપયોગ કરવો જોઈએ.
આ મુશ્કેલ છે કારણ કે આ APIs સમાન નથી. તેઓ અલગ-અલગ ટ્રાન્સપોર્ટ પદ્ધતિઓનો ઉપયોગ કરે છે. તેઓ અલગ-અલગ ડેટા ફોર્મેટ (data shapes) મોકલે છે. કેટલાક SSE નો ઉપયોગ કરે છે જ્યારે અન્ય NDJSON નો ઉપયોગ કરે છે.
જો તમે આ તફાવતોને તમારા UI સુધી પહોંચવા દો છો, તો તમારો કોડ "if" સ્ટેટમેન્ટ્સનો ગૂંચવણભર્યો જથ્થો બની જશે. જ્યારે પણ તમે નવો પ્રોવાઇડર ઉમેરો છો, ત્યારે તમારું ફ્રન્ટએન્ડ વધુ જટિલ બનતું જાય છે.
મેં એક સિંગલ કોન્ટ્રાક્ટ (contract) બનાવીને આ સમસ્યાનો ઉકેલ લાવ્યો. દરેક પ્રોવાઇડરે બ્રાઉઝરને આ ફોર્મેટ મોકલવું જ જોઈએ:
• data: {"delta":"
બ્રાઉઝરે ફક્ત ત્રણ વસ્તુઓ સમજવાની જરૂર છે: delta, error, અને [DONE].
મેં તે કેવી રીતે બનાવ્યું તે અહીં છે:
Async Generators નો ઉપયોગ કરો હું દરેક પ્રોવાઇડરને એક જનરેટર તરીકે ગણું છું જે પ્લેન ટેક્સ્ટ આપે છે. આ API ની જટિલતાને છુપાવે છે.
ધ વ્રેપર પેટર્ન (The Wrapper Pattern) મેં createSSEStream નામનું એક વ્રેપર ફંક્શન બનાવ્યું છે. આ વ્રેપર વાયર ફોર્મેટનું સંચાલન કરે છે. તે એ પણ સુનિશ્ચિત કરે છે કે સ્ટ્રીમ હંમેશા સમાપ્ત થાય. જો કોઈ પ્રોવાઇડર અધવચ્ચે નિષ્ફળ જાય તો પણ, વ્રેપર એરર અને [DONE] સિગ્નલ મોકલે છે. આ ક્લાયન્ટને હેંગ (hang) થતા અટકાવે છે.
સમાન APIs નું જૂથ બનાવવું OpenAI, Mistral, Groq, અને Azure બધા એક જ ડાયલેક્ટનો ઉપયોગ કરે છે. મેં તે બધા માટે એક જ ઇમ્પ્લીમેન્ટેશન લખ્યું છે. હવે નવો સુસંગત પ્રોવાઇડર ઉમેરવા માટે માત્ર એક જ લાઇનનો કોડ જોઈએ છે.
અપવાદોનું સંચાલન (Handling Outliers) Anthropic અને Ollama અલગ રીતે કામ કરે છે. Anthropic ચોક્કસ ટાઇપ્ડ ઇવેન્ટ્સનો ઉપયોગ કરે છે. Ollama NDJSON નો ઉપયોગ કરે છે. મેં તેમના માટે કસ્ટમ પાર્સર્સ લખ્યા છે, પરંતુ તેઓ બંને ટેક્સ્ટને સમાન વ્રેપર દ્વારા જ આપે છે. બ્રાઉઝરને ક્યારેય તફાવત ખબર પડતી નથી.
પ્રાઇવસી અને સરળતા એપ "Bring Your Own Key" મોડેલનો ઉપયોગ કરે છે.
• વપરાશકર્તાઓ તેમની પોતાની API કી પેસ્ટ કરે છે. • કી લોકલ સ્ટોરેજમાં રહે છે. • સર્વર શુદ્ધ પ્રોક્સી તરીકે કામ કરે છે. • કી ક્યારેય ડેટાબેઝમાં સંગ્રહિત કરવામાં આવતી નથી.
આ અભિગમ જટિલ ઓથેન્ટિકેશન (auth) અથવા સિક્રેટ મેનેજમેન્ટની જરૂરિયાત દૂર કરે છે. તે એપને સેલ્ફ-હોસ્ટ (self-host) કરવાનું સરળ બનાવે છે.
બોધપાઠ સરળ છે: દરેક ઇન્ટિગ્રેશનને તમે ખરેખર જે ઈચ્છો છો તેના જનરેટર તરીકે મોડેલ કરો. તેને એકવાર વ્રેપ કરો. વિવિધતાઓને જનરેટરમાં રહેવા દો જેથી તમારું મુખ્ય લોજિક સ્વચ્છ રહે.
Optional learning community: https://t.me/GyaanSetuAi