ಡೆವಲಪರ್ಗಳು ಈಗ Zod schemas ಅನ್ನು Vercel AI SDK ಅಥವಾ Anthropic’s tool-use API ಗೆ ಜೋಡಿಸುವ ಮೂಲಕ, LLM ನೀಡುವ JSON ಮೊದಲೇ ನಿರ್ಧರಿಸಿದ ರೂಪಕ್ಕೆ (shape) ಅನುಗುಣವಾಗಿರುವುದನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಬಹುದು. ಇದರಿಂದ ಮಾಡೆಲ್ ಅನಿರೀಕ್ಷಿತ ಫೀಲ್ಡ್ ಅನ್ನು ಸೇರಿಸಿದಾಗ ಉಂಟಾಗುವ runtime crashes ಅನ್ನು ತಪ್ಪಿಸಬಹುದು.
ಜನವರಿಯಲ್ಲಿ ಒಂದು ಕ್ಲಾಸಿಫೈಯರ್ (classifier) ಮೂರು ವಾರಗಳ ಕಾಲ ಯಾವುದೇ ತೊಂದರೆಯಿಲ್ಲದೆ ಕೆಲಸ ಮಾಡಿದ ನಂತರ, ಎರಡನೇ “explanation” ಕೀ ಅನ್ನು ನೀಡಲು ಪ್ರಾರಂಭಿಸಿದಾಗ, ಒಂದು ಗಟ್ಟಿಯಾದ ರಕ್ಷಣಾ ವ್ಯವಸ್ಥೆಯ (guard) ಅಗತ್ಯವು ಸ್ಪಷ್ಟವಾಯಿತು. ಕೋಡ್ ಕೇವಲ ಒಂದು ಫೀಲ್ಡ್ ಅನ್ನು ನಿರೀಕ್ಷಿಸಿತ್ತು, ಆದ್ದರಿಂದ ಆ ಹೆಚ್ಚುವರಿ ಕೀ ಯಾವುದೇ ಕೋಡ್ ಡಿಪ್ಲಾಯ್ ಇಲ್ಲದೆಯೇ ಎಕ್ಸೆಪ್ಶನ್ (exception) ಉಂಟುಮಾಡಿತು. ಈ ಘಟನೆಯು ಒಂದು ದೊಡ್ಡ ಸಮಸ್ಯೆಯನ್ನು ಎತ್ತಿ ತೋರಿಸುತ್ತದೆ: ಹೆಚ್ಚಿನ ಟ್ಯುಟೋರಿಯಲ್ಗಳು ಮಾಡೆಲ್ ಪ್ರಾಂಪ್ಟ್ನ ಸ್ಕೀಮಾವನ್ನು ಪಾಲಿಸುತ್ತದೆ ಎಂದು ಭಾವಿಸಿ ಕೇವಲ JSON.parse(response) ಹಂತದಲ್ಲಿ ನಿಲ್ಲುತ್ತವೆ. ವಾಸ್ತವದಲ್ಲಿ, LLMಗಳು ಆಗಾಗ್ಗೆ ದಾರಿ ತಪ್ಪುತ್ತವೆ—ಕೇಸಿಂಗ್ (casing) ಬದಲಾಯಿಸುವುದು, ಫೀಲ್ಡ್ಗಳನ್ನು ಸೇರಿಸುವುದು ಅಥವಾ ಔಟ್ಪುಟ್ ಅನ್ನು ಮಾರ್ಕ್ಡೌನ್ ಫೆನ್ಸ್ಗಳಲ್ಲಿ (markdown fences) ಸುತ್ತುವುದು—ಇದು ಡೇಟಾ ಕರಪ್ಶನ್ ಅಥವಾ ಸಂಪೂರ್ಣ ವೈಫಲ್ಯಗಳಿಗೆ ಕಾರಣವಾಗುತ್ತದೆ.
ಕೇವಲ raw JSON ಪಾರ್ಸಿಂಗ್ ಏಕೆ ಅಸುರಕ್ಷಿತ
LLMಗಳನ್ನು ಸಹಾಯಕವಾಗಿರಲು ತರಬೇತಿಗೊಳಿಸಲಾಗಿದೆಯೇ ಹೊರತು, ಕಟ್ಟುನಿಟ್ಟಾಗಿ ಪಾಲಿಸಲು ಅಲ್ಲ. ```json { "category": "string" }
ಇಂತಹ ವ್ಯತ್ಯಾಸವು ಪ್ರೊಡಕ್ಷನ್ ಕೋಡ್ಗೆ ತಲುಪಿದಾಗ, ಅದರ ಪರಿಣಾಮ ತಕ್ಷಣವೇ ಕಂಡುಬರುತ್ತದೆ: ಎಕ್ಸೆಪ್ಶನ್ ಉಂಟಾಗುವುದು, ವಿನಂತಿ (request) ವಿಫಲವಾಗುವುದು ಮತ್ತು ಸಂಭವನೀಯವಾಗಿ ಮುಂದಿನ ದೋಷಗಳ ಸರಮಾಲೆ (cascade of errors). ದೊಡ್ಡ ಸೇವೆಗಳಲ್ಲಿ, ಅಂತಹ ಕೆಲವು ನಿಮಿಷಗಳ ಡೌನ್ಟೈಮ್ (downtime) ಆದಾಯದ ನಷ್ಟ ಮತ್ತು ಬಳಕೆದಾರರ ನಂಬಿಕೆಯ ಕುಸಿತಕ್ಕೆ ಕಾರಣವಾಗುತ್ತದೆ.
## Zod + Vercel AI SDK: ಮೂರು ಹಂತಗಳ ಸುರಕ್ಷತಾ ಜಾಲ
Zod ಎಂಬುದು TypeScript-first ಸ್ಕೀಮಾ ವ್ಯಾಲಿಡೇಟರ್ ಆಗಿದ್ದು, ಮಾಡೆಲ್ ನೀಡಬೇಕಾದ ನಿಖರವಾದ ಡೇಟಾ ರೂಪವನ್ನು (shape) ಇದು ವಿವರಿಸಬಲ್ಲದು. Vercel AI SDK ನ `Output.object` ಹೆಲ್ಪರ್ ಜೊತೆಗೆ ಬಳಸಿದಾಗ, ಮಾಡೆಲ್ ತನ್ನ ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು ನೀಡಿದ ನಂತರ ವ್ಯಾಲಿಡೇಶನ್ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ನಡೆಯುತ್ತದೆ.
1. **ಸ್ಕೀಮಾವನ್ನು ವ್ಯಾಖ್ಯಾನಿಸಿ (Define the schema)** – ಬಯಸಲಾದ JSON ಅನ್ನು ಪ್ರತಿಬಿಂಬಿಸುವ Zod ಆಬ್ಜೆಕ್ಟ್ ಅನ್ನು ಬರೆಯಿರಿ. ಸರಳ ಕ್ಲಾಸಿಫೈಯರ್ಗೆ ಇದು `z.object({ category: z.string() })` ಆಗಿರಬಹುದು; ಸಂಕೀರ್ಣವಾದ ಇನ್ವಾಯ್ಸ್ ಎಕ್ಸ್ಟ್ರಾಕ್ಟರ್ಗಾಗಿ ಸ್ಕೀಮಾದಲ್ಲಿ ಆಬ್ಜೆಕ್ಟ್ಗಳು, ಅರೇಗಳು (arrays) ಮತ್ತು ಡಿಸ್ಕ್ರಿಮಿನೇಟೆಡ್ ಯೂನಿಯನ್ಗಳನ್ನು (discriminated unions) ಬಳಸಬಹುದು.
2. **ಅದನ್ನು SDK ಗೆ ಕಳುಹಿಸಿ** – ಸ್ಕೀಮಾವನ್ನು `Output.object(schema)` ಮೂಲಕ ಸುತ್ತಿ (wrap). SDK ಒಂದು ಪ್ರಾಂಪ್ಟ್ ಅನ್ನು ಸೇರಿಸುತ್ತದೆ, ಇದು ಮಾಡೆಲ್ಗೆ ಸ್ಕೀಮಾಗೆ ಹೊಂದಿಕೆಯಾಗುವ JSON ಬ್ಲಾಕ್ ಅನ್ನು ನೀಡಲು ಸೂಚಿಸುತ್ತದೆ ಮತ್ತು Zod ನ `safeParse` ಬಳಸಿ ಫಲಿತಾಂಶವನ್ನು ಪಾರ್ಸ್ ಮಾಡುತ್ತದೆ.
3. **ವೈಫಲ್ಯಗಳನ್ನು ನಿರ್ವಹಿಸಿ (Handle failures)** – `safeParse` ಎಕ್ಸೆಪ್ಶನ್ ಎಸೆಯುವ ಬದಲು ಒಂದು ರಿಸಲ್ಟ್ ಆಬ್ಜೆಕ್ಟ್ ಅನ್ನು ನೀಡುತ್ತದೆ. ಪಾರ್ಸಿಂಗ್ ವಿಫಲವಾದರೆ, ಆ ದೋಷವನ್ನು ಮಾಡೆಲ್ಗೆ ಮರಳಿ ಕಳುಹಿಸಿ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ (retry). ನಿಖರವಾದ ವ್ಯಾಲಿಡೇಶನ್ ಸಂದೇಶದ ಆಧಾರದ ಮೇಲೆ ಔಟ್ಪುಟ್ ಅನ್ನು ಸರಿಪಡಿಸಲು ಮಾಡೆಲ್ಗೆ ಸೂಚಿಸಬಹುದು, ಇದು ಹೆಚ್ಚಿನ ಎಡ್ಜ್ ಕೇಸ್ಗಳನ್ನು (edge cases) ಸ್ವಯಂ-ಗುಣಪಡಿಸುವ ಲೂಪ್ ಆಗಿ (self-healing loop) ಪರಿವರ್ತಿಸುತ್ತದೆ.
SDK ಪ್ರಾಂಪ್ಟಿಂಗ್, ಪಾರ್ಸಿಂಗ್ ಮತ್ತು ರಿಟ್ರೈ ಲಾಜಿಕ್ ಅನ್ನು ಒಂದೇ ಕಡೆ ಮಾಡುವುದರಿಂದ, ಡೆವಲಪರ್ಗಳು ಹಲವಾರು ಅಡ್-ಹಾಕ್ ಸ್ಟ್ರಿಂಗ್ ಮ್ಯಾನಿಪ್ಯುಲೇಶನ್ಗಳ ಬದಲಿಗೆ ಕೇವಲ ಒಂದು ಟೈಪ್-ಚೆಕ್ ಮಾಡಲಾದ ಕರೆಯನ್ನು (type-checked call) ಬಳಸಬಹುದು.
## Anthropic tool use: ರಚನಾತ್ಮಕ ಔಟ್ಪುಟ್ಗೆ ಒತ್ತಾಯಿಸುವುದು
Anthropic API ಜೊತೆಗೆ ನೇರವಾಗಿ ಕೆಲಸ ಮಾಡುವಾಗ, "tool use" ಮೂಲಕ ಇದೇ ಭರವಸೆಯನ್ನು ಪಡೆಯಬಹುದು. ಒಂದು ಟೂಲ್ ಅನ್ನು JSON Schema ನಲ್ಲಿ ವ್ಯಕ್ತಪಡಿಸಲಾದ ಇನ್ಪುಟ್ ಸ್ಕೀಮಾವನ್ನು ಹೊಂದಿರುವ ಫಂಕ್ಷನ್ ಎಂದು ವ್ಯಾಖ್ಯಾನಿಸಲಾಗುತ್ತದೆ; Anthropic ಮಾಡೆಲ್ ಸ್ಕೀಮಾವನ್ನು ಪೂರೈಸಲು ಸಾಧ್ಯವಾದರೆ ಮಾತ್ರ ಆ ಟೂಲ್ ಅನ್ನು ಕರೆಯುತ್ತದೆ. `tool_choice` ಅನ್ನು `"any"` (ಅಥವಾ ನಿರ್ದಿಷ್ಟ ಟೂಲ್ ಹೆಸರು) ಗೆ ಸೆಟ್ ಮಾಡುವ ಮೂಲಕ, ಮಾಡೆಲ್ ಮುಕ್ತ ರೂಪದ ಪಠ್ಯದ ಬದಲಿಗೆ ರಚನಾತ್ಮಕ ಬ್ಲಾಕ್ ಅನ್ನು ನೀಡಲು ಒತ್ತಾಯಿಸಲಾಗುತ್ತದೆ.
ಈ ವರ್ಕ್ಫ್ಲೋ Vercel ವಿಧಾನವನ್ನು ಹೋಲುತ್ತದೆ:
- Zod ಸ್ಕೀಮಾವನ್ನು ಬರೆಯಿರಿ.
- ಟೂಲ್ ವ್ಯಾಖ್ಯಾನಕ್ಕಾಗಿ ಅದನ್ನು JSON Schema ಪೇಲೋಡ್ಗೆ ಪರಿವರ್ತಿಸಿ.
- ವಿನಂತಿಯಲ್ಲಿ (request) ಟೂಲ್ ಅನ್ನು ಸೇರಿಸಿ ಮತ್ತು ಮಾಡೆಲ್ ಅದನ್ನು ಬಳಸುವಂತೆ ಸೂಚಿಸಿ.
- `zod.safeParse` ಬಳಸಿ ಟೂಲ್ನ ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು ಪಾರ್ಸ್ ಮಾಡಿ.
ಮಾಡೆಲ್ ಇನ್ನೂ ತಪ್ಪಾದ ಡೇಟಾವನ್ನು ನೀಡಿದರೆ, ಅದೇ ರಿಟ್ರೈ-ವಿತ್-ಫೀಡ್ಬ್ಯಾಕ್ (retry-with-feedback) ಮಾದರಿಯನ್ನು ಅನ್ವಯಿಸಬಹುದು.
## ವ್ಯಾಲಿಡೇಶನ್ ಇನ್ನೂ ವಿಫಲವಾದಾಗ
ಸ್ಕೀಮಾ ಜಾರಿಗೊಳಿಸಿದರೂ ಸಹ, ಸಾಂದರ್ಭಿಕ ವ್ಯತ್ಯಾಸಗಳು ಸಂಭವಿಸಬಹುದು. ಕಾರಣಗಳು ಹೀಗಿವೆ:
- **Model hallucination**: ಮಾಡೆಲ್ JSON ನಂತೆ ಕಾಣುವ ಆದರೆ ಸಿಂಟ್ಯಾಕ್ಸ್ ದೋಷಗಳನ್ನು (syntax errors) ಹೊಂದಿರುವ ಸ್ಟ್ರಿಂಗ್ ಅನ್ನು ಸೃಷ್ಟಿಸಬಹುದು.
- **Prompt leakage**: ಹಿಂದಿನ ಸಂಭಾಷಣೆಯ ಹಂತಗಳು ಸ್ಕೀಮಾ ವಿನಂತಿಯನ್ನು ಮೀರಿದ ಫಾರ್ಮ್ಯಾಟಿಂಗ್ ಸೂಚನೆಗಳನ್ನು ಸೋರಿಕೆ ಮಾಡಬಹುದು.
- **Version differences**: ಹೊಸ ಮಾಡೆಲ್ ಬಿಡುಗಡೆಗಳು ಕೆಲವೊಮ್ಮೆ ಟೂಲ್ ಕರೆಗಳನ್ನು (tool calls) ಅರ್ಥೈಸುವ ರೀತಿಯನ್ನು ಬದಲಾಯಿಸಬಹುದು.
ಶಿಫಾರಸು ಮಾಡಲಾದ ಪರಿಹಾರವೆಂದರೆ ಲೈಟ್ವೇಯ್ಟ್ ರಿಟ್ರೈ ಲೂಪ್ (lightweight retry loop). ಪಾರ್ಸಿಂಗ್ ವಿಫಲವಾದಾಗ, ಕೋಡ್ “ನಿಮ್ಮ ಕೊನೆಯ ಔಟ್ಪುಟ್ ಮಾನ್ಯವಾದ JSON ಆಗಿರಲಿಲ್ಲ. ಅದರಲ್ಲಿ ... ಇತ್ತು. ದಯವಿಟ್ಟು ಸ್ಕೀಮಾದಲ್ಲಿ ವ್ಯಾಖ್ಯಾನಿಸಲಾದ ಫೀಲ್ಡ್ಗಳನ್ನು ಮಾತ್ರ ನೀಡಿ.” ಎಂಬಂತಹ ಫಾಲೋ-ಅಪ್ ಪ್ರಾಂಪ್ಟ್ ಅನ್ನು ಕಳುಹಿಸುತ್ತದೆ. ವ್ಯಾಲಿಡೇಶನ್ ದೋಷವು ಸ್ಪಷ್ಟವಾಗಿರುವುದರಿಂದ, ಮಾಡೆಲ್ ಮಾನವ ಹಸ್ತಕ್ಷೇಪವಿಲ್ಲದೆ ತನ್ನನ್ನು ತಾನು ಸರಿಪಡಿಸಿಕೊಳ್ಳಬಹುದು.
## ಕಾರ್ಯಕ್ಷಮತೆ ಮತ್ತು ವೆಚ್ಚದ ಪರಿಗಣನೆಗಳು
Zod validation ಅನ್ನು ಸೇರಿಸುವುದರಿಂದ ಅತ್ಯಲ್ಪ CPU overhead ಉಂಟಾಗುತ್ತದೆ—ಸಾಮಾನ್ಯ payloads ಗಾಗಿ `safeParse` ಕಾರ್ಯಾಚರಣೆಯು microseconds ನಲ್ಲಿ ನಡೆಯುತ್ತದೆ. Network latency ಬದಲಾಗುವುದಿಲ್ಲ; retry ಗಾಗಿ ಆಗುವ ಹೆಚ್ಚುವರಿ round-trip ಕೇವಲ ಅಪರೂಪದ ವೈಫಲ್ಯದ ಸಂದರ್ಭದಲ್ಲಿ ಮಾತ್ರ ಸಂಭವಿಸುತ್ತದೆ. ಪ್ರಾಯೋಗಿಕವಾಗಿ, ಒಂದು exception ಅನ್ನು ತಡೆಯುವುದರಿಂದ ಆಗುವ ಪ್ರಯೋಜನವು, request time ನಲ್ಲಿ ಆಗುವ ಸಣ್ಣ ಹೆಚ್ಚಳಕ್ಕಿಂತ ಬಹಳ ದೊಡ್ಡದಾಗಿರುತ್ತದೆ.
## ವಿರೋಧಾತ್ಮಕ ವಾದ: schema enforcement ಅತಿಯಾದದ್ದೇ?
ಕೆಲವು ಡೆವಲಪರ್ಗಳು ಕಟ್ಟುನಿಟ್ಟಾದ schemas ಮಾಡೆಲ್ನ ನಮ್ಯತೆಯನ್ನು (flexibility) ಸೀಮಿತಗೊಳಿಸುತ್ತವೆ ಎಂದು ವಾದಿಸುತ್ತಾರೆ, ವಿಶೇಷವಾಗಿ ಹೊಸ field ಗಳು ಅಮೂಲ್ಯವಾದ context ಅನ್ನು ಒದಗಿಸಬಹುದಾದಾಗ. ಇದು ಸುರಕ್ಷತೆ (safety) ಮತ್ತು ಮುಕ್ತತೆ (openness) ನಡುವಿನ ಸಮತೋಲನವಾಗಿದೆ. ಪೇಮೆಂಟ್ ಪ್ರೊಸೆಸಿಂಗ್, ಐಡೆಂಟಿಟಿ ವೆರಿಫಿಕೇಶನ್, ಕಾಂಪ್ಲೈಯನ್ಸ್ ರಿಪೋರ್ಟಿಂಗ್ನಂತಹ ಅತ್ಯಂತ ನಿರ್ಣಾಯಕ (mission-critical) ಸೇವೆಗಳಲ್ಲಿ, ಮುನ್ಸೂಚನೆ ನೀಡುವ ಸಾಮರ್ಥ್ಯವೇ (predictability) ಗೆಲ್ಲುತ್ತದೆ. ಸಂಶೋಧನಾತ್ಮಕ ಪ್ರೊಟೊಟೈಪ್ಗಳಲ್ಲಿ (exploratory prototypes), ಸ್ವಲ್ಪ ಸಡಿಲವಾದ ವಿಧಾನವು ಸ್ವೀಕಾರಾರ್ಹವಾಗಿರಬಹುದು, ಆದರೆ ಅಲ್ಲಿಯೂ ಸಹ ಒಂದು ಕನಿಷ್ಠ ರಕ್ಷಣೆ (ಉದಾಹರಣೆಗೆ, `z.object({}).passthrough()`) ಉಪಯುಕ್ತ ಎಕ್ಸ್ಟೆನ್ಶನ್ಗಳನ್ನು ಕೈಬಿಡದೆ, ಭೀಕರವಾದ parsing ತಪ್ಪುಗಳನ್ನು ಪತ್ತೆಹಚ್ಚಬಲ್ಲದು.
## ಮುಂದೆ ಗಮನಿಸಬೇಕಾದವುಗಳು
- **SDK evolution**: Vercel ನ AI SDK roadmap ನಲ್ಲಿ ಅಂತರ್ಗತ retry policies ಮತ್ತು ಸಮೃದ್ಧವಾದ error reporting ಸೇರಿವೆ, ಇದು repair loop ಅನ್ನು ಮತ್ತಷ್ಟು ಸುಗಮಗೊಳಿಸುತ್ತದೆ.
- **Tooling standardization**: ಹೆಚ್ಚಿನ ಪ್ರೊವೈಡರ್ಗಳು tool-use ನಿಯಮಗಳನ್ನು ಅಳವಡಿಸಿಕೊಳ್ಳುತ್ತಿದ್ದಂತೆ, cross-provider schema validators ಉದಯಿಸಬಹುದು, ಇದು ಪ್ರೊವೈಡರ್-ನಿರ್ದಿಷ್ಟ ಅಡಾಪ್ಟರ್ಗಳ ಅಗತ್ಯವನ್ನು ಕಡಿಮೆ ಮಾಡುತ್ತದೆ.
- **Community patterns**: ಓಪನ್-ಸೋರ್ಸ್ ಲೈಬ್ರರಿಗಳು Zod schemas ಅನ್ನು prompt templates ಗಳೊಂದಿಗೆ ಒಟ್ಟಿಗೆ ನೀಡಲು ಪ್ರಾರಂಭಿಸುತ್ತಿವೆ, ಇದು “schema-first” ವರ್ಕ್ಫ್ಲೋ ಅನ್ನು ಮರುಬಳಕೆ ಮಾಡಬಹುದಾದ ಆಸ್ತಿಯನ್ನಾಗಿ ಮಾಡುತ್ತದೆ.
## ಸಾರಾಂಶ
Zod schema ಅನ್ನು ಮಾಡೆಲ್ ಮುರಿಯಲಾಗದ ಒಪ್ಪಂದವನ್ನಾಗಿ (contract) ಪರಿಗಣಿಸುವ ಮೂಲಕ, ಡೆವಲಪರ್ಗಳು ಅಸ್ಥಿರವಾದ `JSON.parse` ಹ್ಯಾಕ್ಗಳಿಂದ ಒಂದು ನಿಶ್ಚಿತ (deterministic) ಪೈಪ್ಲೈನ್ಗೆ ಬದಲಾಗುತ್ತಾರೆ. ಇಲ್ಲಿ ಅನಿರೀಕ್ಷಿತ field ಗಳು production ಕ್ರ್ಯಾಶ್ ಆಗುವ ಬದಲು, ನಿಯಂತ್ರಿತ ವ್ಯಾಲಿಡೇಶನ್ ವೈಫಲ್ಯಕ್ಕೆ ಕಾರಣವಾಗುತ್ತವೆ. Vercel ನ `Output.object` ಹೆಲ್ಪರ್ ಮತ್ತು Anthropic ನ tool-use ಮೆಕ್ಯಾನಿಸಂನ ಸಂಯೋಜನೆಯು LLM ಗಳನ್ನು ಅನಿರೀಕ್ಷಿತ ಪಠ್ಯ ಜನರೇಟರ್ಗಳಿಂದ ವಿಶ್ವಾಸಾರ್ಹ ಡೇಟಾ ಪ್ರೊವೈಡರ್ಗಳನ್ನಾಗಿ ಪರಿವರ್ತಿಸುತ್ತದೆ, ಇದು ತಂಡಗಳು ಅಂತ್ಯವಿಲ್ಲದ edge-case debugging ಗಿಂತ ಹೆಚ್ಚಾಗಿ ಬಿಸಿನೆಸ್ ಲಾಜಿಕ್ ಮೇಲೆ ಗಮನ ಹರಿಸಲು ಅನುವು ಮಾಡಿಕೊಡುತ್ತದೆ.
