API റഫറൻസ്
അവലോകനം
ബാഹ്യ AI ഏജന്റുകൾക്കായുള്ള Nibomo യുടെ നിലവിലെ കരാർ ഈ പേജ് വിവരിക്കുന്നു.
നിങ്ങളുടെ ക്ലയന്റ് MCP പിന്തുണയ്ക്കുന്നുണ്ടെങ്കിൽ, ബന്ധിപ്പിക്കാനുള്ള ഏറ്റവും ലളിതമായ വഴി MCP കണക്ടർ ആണ്; അത് ഇതേ ഡാറ്റാ സർഫേസ് തന്നെ ഉൾക്കൊള്ളുന്നു. CLI ഏജന്റുകൾ ഉപയോഗിക്കുന്ന HTTP ഡിസ്കവറി, SQL, വഴികാട്ടി, ആവർത്തന കരാർ എന്നിവയാണ് ഈ പേജ് വിവരിക്കുന്നത്.
ഔദ്യോഗിക ഡിസ്കവറി പ്രവേശന കവാടത്തിൽ നിന്ന് തുടങ്ങുക:
GET https://api.nibomo.com/v1/
ഇതേ ഡിസ്കവറി പേലോഡ് GET /v1/agent ലും ലഭ്യമാണ്, പക്ഷേ പ്രാഥമിക പൊതു പ്രവേശന കവാടം /v1/ ആണ്.
ഡിസ്കവറി പ്രതികരണം ഒരു ഏജന്റിന് ഇനിപ്പറയുന്നവ എങ്ങനെ ചെയ്യണമെന്ന് പറഞ്ഞുകൊടുക്കുന്നു:
- ഇമെയിൽ OTP ലോഗിൻ തുടങ്ങുക
- OTP നൽകി ഒരു ദീർഘകാല API കീ നേടുക
- അക്കൗണ്ട് കോൺടെക്സ്റ്റ് ലോഡ് ചെയ്യുക
- ഒരു വർക്ക്സ്പേസ് ഉണ്ടാക്കുക അല്ലെങ്കിൽ തിരഞ്ഞെടുക്കുക
- പ്രസിദ്ധീകരിച്ച SQL സർഫേസ് വഴി തുടരുക
- റഫറൻസ് വഴികാട്ടികൾ എടുക്കുക, കാർഡുകൾ ഓരോന്നായി ആവർത്തിക്കുക
റൺടൈം ഡിസ്കവറിയും സോഴ്സും
OpenAPI ലഭ്യമല്ല. താഴെയുള്ള നാല് പഴയ സ്പെസിഫിക്കേഷൻ URL കൾ ഇപ്പോൾ ഒരു സ്കീമയ്ക്കു പകരം "openapiAvailable": false ഉള്ള അതേ JSON ഡിസ്കവറി അറിയിപ്പ് നൽകുന്നു:
https://api.nibomo.com/v1/agent/openapi.jsonhttps://api.nibomo.com/v1/agent/swagger.jsonhttps://api.nibomo.com/v1/openapi.jsonhttps://api.nibomo.com/v1/swagger.json
നിലവിലെ റൺടൈം ഡിസ്കവറിക്ക് GET https://api.nibomo.com/v1/ ഉപയോഗിക്കുക. റൺടൈം റൂട്ടുകൾക്കായി നൽകുന്ന docs.discoveryUrl ഉം നടപ്പാക്കൽ വിശദാംശങ്ങൾക്കായി docs.source.agentRoutesUrl ഉം പിന്തുടരുക.
ഓതന്റിക്കേഷൻ ബൂട്ട്സ്ട്രാപ്പ്
OTP ബൂട്ട്സ്ട്രാപ്പ് ഓതന്റിക്കേഷൻ സേവനത്തിലാണ് നടക്കുന്നത്:
POST https://auth.nibomo.com/api/agent/send-codePOST https://auth.nibomo.com/api/agent/verify-code
പ്രക്രിയ ഇങ്ങനെയാണ്:
GET /v1/വിളിക്കുക.- ഉപയോക്താവിന്റെ ഇമെയിൽ
send-codeലേക്ക് അയയ്ക്കുക. - പ്രതികരണത്തിൽ നിന്ന്
otpSessionTokenവായിക്കുക. - ഇമെയിലിൽ ലഭിച്ച ഏറ്റവും പുതിയ 8 അക്ക കോഡ് ഉപയോക്താവിനോട് ചോദിക്കുക.
code,otpSessionToken,labelഎന്നിവ സഹിതംverify-codeവിളിക്കുക.- ലഭിക്കുന്ന API കീ ചാറ്റ് മെമ്മറിക്ക് പുറത്ത് സ്ഥിരമായി സൂക്ഷിക്കുക.
ശുപാർശ ചെയ്യുന്ന എൻവയോൺമെന്റ് വേരിയബിൾ:
export FLASHCARDS_OPEN_SOURCE_API_KEY="fca_ABCDEFGH_0123456789ABCDEFGHJKMNPQRS"
ഓതന്റിക്കേറ്റ് ചെയ്ത അഭ്യർത്ഥനകൾ ഇത് ഉപയോഗിക്കുന്നു:
Authorization: ApiKey <key>
ബൂട്ട്സ്ട്രാപ്പ് ക്രമത്തിന്റെ ഉദാഹരണം:
curl https://api.nibomo.com/v1/
curl -X POST https://auth.nibomo.com/api/agent/send-code \
-H "Content-Type: application/json" \
-d '{"email":"you@example.com"}'
curl -X POST https://auth.nibomo.com/api/agent/verify-code \
-H "Content-Type: application/json" \
-d '{
"code":"12345678",
"otpSessionToken":"...",
"label":"Codex on MacBook"
}'
ലോഗിന് ശേഷമുള്ള ഏജന്റ് സർഫേസ്
സ്ഥിരീകരണത്തിന് ശേഷം, നിലവിലെ ഏജന്റ് സർഫേസ് ഇതാണ്:
GET /v1/agent/meGET /v1/agent/workspacesPOST /v1/agent/workspacesPOST /v1/agent/workspaces/{workspaceId}/selectPOST /v1/agent/sql/query(റീഡ്-ഒൺലി)POST /v1/agent/sql/execute(റൈറ്റ്)GET /v1/agent/guide/{topic}(റീഡ്-ഒൺലി)POST /v1/agent/reviews/next(റീഡ്-ഒൺലി)POST /v1/agent/reviews/reveal(റീഡ്-ഒൺലി)POST /v1/agent/reviews/submit(റൈറ്റ്)
സാധാരണ ബൂട്ട്സ്ട്രാപ്പ് ഇങ്ങനെയാണ്:
GET /v1/agent/meGET /v1/agent/workspaces?limit=100- ആവശ്യമെങ്കിൽ,
{"name":"Personal"}സഹിതംPOST /v1/agent/workspaces - ആവശ്യമെങ്കിൽ,
POST /v1/agent/workspaces/{workspaceId}/select - റീഡുകൾക്ക്
POST /v1/agent/sql/queryഉം റൈറ്റുകൾക്ക്POST /v1/agent/sql/executeഉം ഉപയോഗിക്കുക
വർക്ക്സ്പേസ് തിരഞ്ഞെടുപ്പ് ഓരോ API കീ കണക്ഷനും വ്യക്തമായി നടത്തുന്നതാണ്. അടുത്ത ഘട്ടം ഊഹിക്കുന്നതിനു പകരം, ഏജന്റുകൾ ലഭിക്കുന്ന instructions ടെക്സ്റ്റും റൺടൈം റൂട്ടുകൾക്കായി docs.discoveryUrl ഉം നടപ്പാക്കൽ വിശദാംശങ്ങൾക്കായി docs.source.agentRoutesUrl ഉം പിന്തുടരണം.
SQL, ആവർത്തന റൂട്ടുകൾ JSON ബോഡിയിൽ ഐച്ഛികമായ ഒരു workspaceId ഉം സ്വീകരിക്കുന്നു. തിരഞ്ഞെടുപ്പ് മാറ്റാതെ ഒരു കോളിന് മാത്രം അത് ആ വർക്ക്സ്പേസിനെ ലക്ഷ്യമിടുന്നു; തിരഞ്ഞെടുത്ത വർക്ക്സ്പേസ് ഉപയോഗിക്കാൻ അത് ഒഴിവാക്കുക. തിരഞ്ഞെടുപ്പോ workspaceId ഓ ഇല്ലെങ്കിൽ, അവ 409 WORKSPACE_SELECTION_REQUIRED എന്ന് മറുപടി നൽകുന്നു.
SQL സർഫേസ്
POST /v1/agent/sql/query കർശനമായി റീഡ്-ഒൺലി സർഫേസാണ് (SHOW TABLES, DESCRIBE, SHOW COLUMNS, SELECT), POST /v1/agent/sql/execute റൈറ്റ് സർഫേസും (INSERT, UPDATE, DELETE); ഒരു കോൾ പൂർണ്ണമായും റീഡുകളോ പൂർണ്ണമായും റൈറ്റുകളോ ആയിരിക്കണം.
ഇത് മനഃപൂർവം പരിമിതപ്പെടുത്തിയതാണ്, പൂർണ്ണമായ PostgreSQL അല്ല. ഈ രേഖകൾ പിന്തുണയുള്ള ഡയലക്റ്റ് മാത്രമാണ് വിവരിക്കുന്നത്, PostgreSQL അനുയോജ്യതാ റഫറൻസ് അല്ല.
ഒരു റീഡ് പാതയും ഡാറ്റ നന്നാക്കുകയോ ഷെഡ്യൂളിംഗ് വീണ്ടും കണക്കാക്കുകയോ കാർഡിന്റെ നില മാറ്റുകയോ ചെയ്യുന്നില്ല.
എല്ലാ കാർഡ്, ഡെക്ക് റൈറ്റുകൾക്കും POST /v1/agent/sql/execute ഉപയോഗിക്കുക. SQL ന്
review_events ലേക്കോ FSRS ഷെഡ്യൂളിംഗ് നിലയിലേക്കോ എഴുതാൻ കഴിയില്ല; ആവർത്തനങ്ങൾ
POST /v1/agent/reviews/submit വഴി രേഖപ്പെടുത്തുക.
നിലവിലെ സ്റ്റേറ്റ്മെന്റ് വിഭാഗങ്ങൾ:
SHOW TABLESDESCRIBE <resource>SHOW COLUMNS FROM <resource>SELECTINSERTUPDATEDELETE
പ്രസിദ്ധീകരിച്ച ലോജിക്കൽ റിസോഴ്സുകളിൽ നിലവിൽ ഉൾപ്പെടുന്നവ:
workspacecardsdecksreview_events
കുറിപ്പുകൾ:
LIMITന്റെ ഡിഫോൾട്ട്100ആണ്, പരമാവധിയും100ആണ്- സ്ഥിരതയുള്ള പേജിനേഷൻ വേണമെങ്കിൽ
ORDER BYഉപയോഗിക്കുക - സ്കീമ കണ്ടെത്താൻ
SHOW TABLESഅല്ലെങ്കിൽDESCRIBE cardsഉപയോഗിക്കുക - ഓരോ SQL കോളും ഒരു വർക്ക്സ്പേസിലേക്ക് പരിമിതപ്പെടുത്തിയിരിക്കുന്നു: ബോഡിയിലെ
workspaceId, അല്ലെങ്കിൽ തിരഞ്ഞെടുത്ത വർക്ക്സ്പേസ്
അഭ്യർത്ഥനയുടെ ഉദാഹരണം:
curl -X POST https://api.nibomo.com/v1/agent/sql/query \
-H "Content-Type: application/json" \
-H "Authorization: ApiKey $FLASHCARDS_OPEN_SOURCE_API_KEY" \
-d '{"sql":"SHOW TABLES"}'
കാർഡ് ക്വറിയുടെ ഉദാഹരണം:
curl -X POST https://api.nibomo.com/v1/agent/sql/query \
-H "Content-Type: application/json" \
-H "Authorization: ApiKey $FLASHCARDS_OPEN_SOURCE_API_KEY" \
-d '{
"sql":"SELECT card_id, front_text, back_text, tags FROM cards ORDER BY updated_at DESC LIMIT 20 OFFSET 0"
}'
മാറ്റം വരുത്തുന്നതിന്റെ ഉദാഹരണം:
curl -X POST https://api.nibomo.com/v1/agent/sql/execute \
-H "Content-Type: application/json" \
-H "Authorization: ApiKey $FLASHCARDS_OPEN_SOURCE_API_KEY" \
-d '{
"sql":"UPDATE cards SET back_text = '\''Updated answer'\'' WHERE card_id = '\''50b5b928-7f04-4cc8-878d-6cd0e8b98474'\''"
}'
OAuth 2.1 (Dynamic Client Registration + PKCE) ഉപയോഗിക്കുന്ന ഒരു റിമോട്ട് MCP സെർവറും https://mcp.nibomo.com/mcp ൽ ലഭ്യമാണ്. ഇതേ SQL വിഭജനം അത് sql_query (കർശനമായി റീഡ്-ഒൺലി), sql_execute (റൈറ്റ്) എന്നിങ്ങനെ ലഭ്യമാക്കുന്നു, ഒപ്പം list_workspaces, get_guide, ആവർത്തന ടൂളുകളായ next_review_card, reveal_answer, submit_review എന്നിവയും; MCP കണക്ടർ കാണുക.
സുരക്ഷയും പരിധിയും
SQL സർഫേസ് നേരിട്ടുള്ള PostgreSQL അല്ല, പാർസർ നിയന്ത്രിക്കുന്ന, പരിധിക്കുള്ളിൽ ഒതുങ്ങുന്ന ഒരു ഡയലക്റ്റാണ്. സുരക്ഷാ നിയന്ത്രണങ്ങൾ ഇവയാണ്:
- അടച്ച സ്റ്റേറ്റ്മെന്റ് അനുമതിപ്പട്ടിക: റീഡുകൾക്ക്
SHOW TABLES,DESCRIBE,SHOW COLUMNS,SELECTഎന്നിവയും റൈറ്റുകൾക്ക്INSERT,UPDATE,DELETEഎന്നിവയും മാത്രം. മറ്റെന്തും പാർസ് ചെയ്യുന്ന ഘട്ടത്തിൽ തന്നെ നിരസിക്കപ്പെടും. - പരിമിതമായ റിസോഴ്സുകൾ: സ്റ്റേറ്റ്മെന്റുകൾക്ക്
workspace,cards,decks,review_eventsഎന്നീ റിസോഴ്സുകളിൽ മാത്രമേ പ്രവർത്തിക്കാനാകൂ. - ഓരോ വർക്ക്സ്പേസിലേക്കുമുള്ള പരിധി: ഓരോ സ്റ്റേറ്റ്മെന്റും നിങ്ങൾക്ക് ആക്സസ് ഉള്ള ഒരു വർക്ക്സ്പേസിലേക്ക് പരിമിതപ്പെടുത്തിയിരിക്കുന്നു, അഭ്യർത്ഥനാ ബോഡിയിലെ
workspaceIdഅല്ലെങ്കിൽ നിങ്ങൾ തിരഞ്ഞെടുത്ത വർക്ക്സ്പേസ്; മറ്റ് ടെനന്റുകളുടെ ഡാറ്റയിലേക്ക് ആക്സസ് ഇല്ല. - കർശനമായ അഭ്യർത്ഥനാ ബോഡികൾ: SQL, ആവർത്തന റൂട്ടുകൾ അറിയാത്ത ബോഡി ഫീൽഡ് നിരസിക്കുന്നു, അതിനാൽ അക്ഷരത്തെറ്റുള്ള
workspaceIdതിരഞ്ഞെടുത്ത വർക്ക്സ്പേസിൽ പ്രവർത്തിക്കുന്നതിനു പകരം പരാജയപ്പെടുന്നു. - പരിധികൾ: ഒരു സ്റ്റേറ്റ്മെന്റിന് പരമാവധി
100വരികൾ, ഒരു ബാച്ചിൽ പരമാവധി50സ്റ്റേറ്റ്മെന്റുകൾ, ഏകദേശം12kടോക്കണുകളുടെ ഫല പരിധി. മാറ്റം വരുത്തുന്ന ബാച്ചുകൾ അറ്റോമിക്കായി പ്രയോഗിക്കുന്നു. - റീഡ്/റൈറ്റ് വിഭജനം:
sql_query,list_workspacesഎന്നിവ കർശനമായി റീഡ്-ഒൺലിയാണ് (readOnlyHint), അവ ഒരിക്കലും ഡാറ്റ നന്നാക്കുകയോ ഷെഡ്യൂളിംഗ് വീണ്ടും കണക്കാക്കുകയോ കാർഡിന്റെ നില മാറ്റുകയോ ചെയ്യുന്നില്ല.sql_executeമാത്രമാണ് SQL റൈറ്റ് ടൂൾ, അത് റൈറ്റുകൾ നടത്തുന്നു (destructiveHint); ഒരു കോൾ പൂർണ്ണമായും റീഡുകളോ പൂർണ്ണമായും റൈറ്റുകളോ ആയിരിക്കണം. SQL ന്review_eventsലേക്കോ FSRS ഷെഡ്യൂളിംഗ് നിലയിലേക്കോ എഴുതാൻ കഴിയില്ല;POST /v1/agent/reviews/submit(MCP യിൽsubmit_review) മാത്രമാണ് ഒരു ആവർത്തനം രേഖപ്പെടുത്തുന്നത്.
വഴികാട്ടികൾ
GET /v1/agent/guide/{topic} ഒരു റഫറൻസ് വഴികാട്ടി data.guide ൽ നൽകുന്നു, MCP get_guide ടൂൾ നൽകുന്ന അതേ ഉള്ളടക്കം. വിഷയങ്ങൾ:
sql_dialect: പൂർണ്ണ SQL വ്യാകരണം, പരിധികൾ, ഉദാഹരണങ്ങൾcard_authoring: കാർഡ് കരാർ, ടാഗുകൾ, ഡ്യൂപ്ലിക്കേറ്റ് പരിശോധനകൾ, ഫോർമാറ്റിംഗ്bulk_authoring: വലിയ ഒരു റൈറ്റ് ജോലി വിഭജിക്കുന്നതും പരിശോധിക്കുന്നതുംreview_flow: ആവർത്തനവും റേറ്റിംഗും നടക്കുന്ന ചക്രം
അറിയാത്ത ഒരു വിഷയത്തിന് പിന്തുണയുള്ള വിഷയങ്ങളുടെ പട്ടിക സഹിതം 400 മറുപടി ലഭിക്കും. കാർഡുകൾ എഴുതുന്നതിനോ ബൾക്കായി എഴുതുന്നതിനോ ആവർത്തനം നടത്തുന്നതിനോ മുമ്പ് ബന്ധപ്പെട്ട വഴികാട്ടി എടുക്കുക, ഒരു സ്റ്റേറ്റ്മെന്റ് നിരസിക്കപ്പെട്ടാൽ sql_dialect വീണ്ടും വായിക്കുക.
curl https://api.nibomo.com/v1/agent/guide/sql_dialect \
-H "Authorization: ApiKey $FLASHCARDS_OPEN_SOURCE_API_KEY"
ആവർത്തനങ്ങൾ
ആവർത്തന റൂട്ടുകൾ ഒരു ഏജന്റിന് പഠിതാവിനോട് ഓരോ കാർഡായി ചോദ്യങ്ങൾ ചോദിക്കാനും ഓരോ റേറ്റിംഗും കാർഡിന്റെ FSRS ഷെഡ്യൂളിലേക്ക് സംരക്ഷിക്കാനും അവസരം നൽകുന്നു. MCP ആവർത്തന ടൂളുകളുടെ അതേ JSON ആർഗ്യുമെന്റുകളാണ് അവ സ്വീകരിക്കുന്നത്:
POST /v1/agent/reviews/nextcardId,frontTextഎന്നിവയുള്ളcardനൽകുന്നു, അല്ലെങ്കിൽ ആവർത്തിക്കാൻ ഒന്നുമില്ലെങ്കിൽcard: null. ഐച്ഛികമായtags(അവയിൽ ഏതെങ്കിലും ഒന്ന് പൊരുത്തപ്പെട്ടാൽ മതി) അല്ലെങ്കിൽdeckIdക്യൂ ചുരുക്കുന്നു, രണ്ടും ഒരുമിച്ച് പാടില്ല; ബോഡി ഇല്ലാത്ത അഭ്യർത്ഥനയും സാധുവാണ്.POST /v1/agent/reviews/revealന്cardIdആവശ്യമാണ്, അത് ആ കാർഡിന്റെbackTextനൽകുന്നു.POST /v1/agent/reviews/submitന്cardId, ക്ലയന്റ് സൃഷ്ടിച്ച ഒരുreviewIdUUID,Again,Hard,Good, അല്ലെങ്കിൽEasyഎന്നിവയിൽ ഒരുrating, പഠിതാവിന്റെ IANAreviewedTimeZoneഎന്നിവ ആവശ്യമാണ്. സെർവർ ആവർത്തന സമയം രേഖപ്പെടുത്തുകയുംdueAt,state,reps,lapsesഎന്നിവ ഉൾപ്പെടെ കാർഡിന്റെ പുതിയ ഷെഡ്യൂൾ നൽകുകയും ചെയ്യുന്നു.
മൂന്ന് റൂട്ടുകളും ഐച്ഛികമായ workspaceId സ്വീകരിക്കുന്നു. സമർപ്പിക്കുന്നതിന് മുമ്പ് reviewId സ്ഥിരമായി സൂക്ഷിക്കുക, ഫലം ഉറപ്പില്ലാത്ത ഒരു സമർപ്പണം അതേ അഭ്യർത്ഥന ഉപയോഗിച്ച് വീണ്ടും ശ്രമിക്കുക; അത് ഒരിക്കലും രണ്ടാമതൊരു ആവർത്തനം രേഖപ്പെടുത്തില്ല. ആവർത്തന റൂട്ടുകൾ ഇങ്ങനെയും മറുപടി നൽകാം:
409 REVIEW_EVENT_CONFLICT: ആവർത്തനം ഇതിനകം രേഖപ്പെടുത്തിയിട്ടുണ്ട്,error.details.reviewScheduleൽ കാർഡിന്റെ നിലവിലെ ഷെഡ്യൂൾ ഉണ്ട്.409 REVIEW_ID_CARD_MISMATCH:reviewIdഇതിനകം മറ്റൊരു കാർഡിന്റെ ആവർത്തനത്തെ സൂചിപ്പിക്കുന്നു, അതിനാൽ ഒന്നും സംരക്ഷിച്ചില്ല; പുതിയൊരുreviewIdഉപയോഗിച്ച് വീണ്ടും സമർപ്പിക്കുക.409 REVIEW_STALE: കാർഡിന്റെ സംരക്ഷിച്ച ആവർത്തന സമയം നിലവിലെ സെർവർ സമയത്തിന് തുല്യമോ അതിന് ശേഷമോ ആണ്; മറ്റൊരു കാർഡ് ആവർത്തിക്കുക.400 REVIEW_INPUT_INVALID: ഒരു ആർഗ്യുമെന്റ് ഇല്ല, അസാധുവാണ്, അല്ലെങ്കിൽ പിന്തുണയില്ലാത്തതാണ്;deckIdനൊപ്പംtagsനൽകുന്നതും വർക്ക്സ്പേസ് ഉപയോഗിക്കാത്ത ടാഗും ഇതിൽ ഉൾപ്പെടുന്നു.
സമർപ്പണത്തിന്റെ ഉദാഹരണം:
curl -X POST https://api.nibomo.com/v1/agent/reviews/submit \
-H "Content-Type: application/json" \
-H "Authorization: ApiKey $FLASHCARDS_OPEN_SOURCE_API_KEY" \
-d '{
"cardId":"693c4863-28a2-45e8-8f55-9fa31fc95ff2",
"reviewId":"429bb7cc-40fb-49f3-bb50-48a5db2826d1",
"rating":"Good",
"reviewedTimeZone":"Europe/Sofia"
}'
മനുഷ്യ ഉപയോക്താക്കൾക്കും സമന്വയത്തിനുമുള്ള API കൾ
മനുഷ്യ ക്ലയന്റുകൾക്കും ഓഫ്ലൈൻ-ഫസ്റ്റ് സമന്വയത്തിനുമായി Nibomo യിൽ വേറിട്ട API കളുമുണ്ട്, പക്ഷേ അവ ബാഹ്യ ഏജന്റുകൾക്കുള്ള പ്രധാന കരാറല്ല:
- ബ്രൗസർ ഫ്ലോകൾ പങ്കിട്ട ഡൊമെയ്ൻ കുക്കികളും CSRF സംരക്ഷണവും ഉപയോഗിക്കുന്നു
- ഓഫ്ലൈൻ-ഫസ്റ്റ് ക്ലയന്റുകൾ
/v1/workspaces/{workspaceId}/sync/push,/v1/workspaces/{workspaceId}/sync/pullഎന്നിവയ്ക്ക് കീഴിൽ നടപ്പാക്കിയ സമന്വയ റൂട്ടുകൾ ഉപയോഗിക്കുന്നു - സമന്വയ റൂട്ടുകൾ ബാഹ്യ ഏജന്റ് സർഫേസിൽ നിന്ന് വേറിട്ടതാണ്