README
¶
ð€ Action Perfect Get On Go
ð æŠèŠ: å®ç§ãªæ å ±ååŸãšAIæ§é å
Action Perfect Get On Go ã¯ãè€æ°ã®ãŠã§ãããŒãžããæ¬æã䞊åã§é«éã«ååŸãããã®çµåãããããã¹ãã LLMïŒå€§èŠæš¡èšèªã¢ãã«ïŒ ã®ãã«ãã¹ãããåŠçã«ãã£ãŠæ å ±æ¬ èœãªãéè€æé€ãéèŠãªæ å ±ãä¿æãããŸãŸãæ å ±å¯åºŠã®é«ãç°¡æœãªæç« ã«è«ççã«æ§é åãããé«ãä¿å®æ§ãšå ç¢æ§ãåããã³ãã³ãã©ã€ã³ããŒã«ã§ãã
ãã®ããŒã«ã¯ãããŒã«ã«ãã¡ã€ã«ãã¹ã«å ããŠãGoogle Cloud Storage (GCS) ãã±ããå
ã®ãã¡ã€ã«ããã§ããåŠç察象ã®URLãªã¹ããééçã«èªã¿èŸŒãããšãã§ããŸãããŸããæçµçãªæ§é åçµæã¯ãèªåçã«å®å
šãªHTMLããã¥ã¡ã³ãã«å€æãããããŒã«ã«ãã¡ã€ã«ãã¹ãŸã㯠GCS URI (gs://...) ãåºåå
ãšããŠãæè»ã«æžãåºãããšãå¯èœã§ããåæããã®äžŠååŠçã§ã®è² è·ãäžæçãªãããã¯ãŒã¯ãšã©ãŒã«èããããã®å
ç¢ãªãªãã©ã€ã»é
å»¶ã¡ã«ããºã ãåããŠãããæç¢ºã«åé¢ãããDIãã€ãã©ã€ã³èšèšã«ãããé«ãä¿å®æ§ãå®çŸããŠããŸãã
ð ïž äž»ãªæ©èœãšå ç¢æ§
- å
ç¢ãªWebã¹ã¯ã¬ã€ãã³ã°ãšäžŠåæ°å¶åŸ¡:
- è€æ°ã®URLããã®æ¬ææœåºãGoã«ãŒãã³ã§åæã«å®è¡ããŸããïŒæå€§äžŠåæ°ã¯CLIãªãã·ã§ã³ã§å¶åŸ¡ãããŸããããã©ã«ãã¯10ïŒ
- 䞊ååŠçã«ã¯ã»ããã©æ©æ§ãæ¡çšããå®è¡ã¹ãããã®äžéãå³å¯ã«ç®¡çããããšã§ã察象ãµãŒããŒãžã®éè² è·ã鲿¢ããã¢ããªã±ãŒã·ã§ã³ã®ãªãœãŒã¹æ¶è²»ãæé©åããŸãã
- åã ã®Goroutineã¯ãäŸåæ§æ³šå ¥ãããã«ã¹ã¿ã HTTPã¯ã©ã€ã¢ã³ãã®ã¿ã€ã ã¢ãŠããšãªãã©ã€ããžãã¯ã«ãã£ãŠå ç¢ã«å¶åŸ¡ãããŸãã
- Webã¹ã¯ã¬ã€ãã³ã°ãšãªãã©ã€æŠç¥ã¯ã
runner.ReliableScraperãšããç¬ç«ããã³ã³ããŒãã³ãã«ã«ãã»ã«åãããDIãã€ãã©ã€ã³ã®ContentFetcherã«æ³šå ¥ãããŸããããã«ãããå ç¢æ§ããžãã¯ã®ãã¹ãå®¹ææ§ãšäº€ææ§ãåäžããŸããã
- LLMãã«ãã¹ãããåŠç (MapReduceå) ã®å
ç¢ãªå®è¡:
- 巚倧ãªçµåããã¹ããã»ã°ã¡ã³ãã«åå²ã
- åã»ã°ã¡ã³ãã䞊åã§LLMåŠçããäžéèŠçŽïŒMapïŒãäœæã
- LLMåŠçã®äžŠåå®è¡ãšã¬ãŒããªããã管çã¯ã
LLMExecutorã€ã³ã¿ãŒãã§ãŒã¹ã«ã«ãã»ã«åãããŠããŸãããŸããMapãã§ãŒãºãšReduceãã§ãŒãºã§ç°ãªãAIã¢ãã«ãæå®ããæ©èœãæœè±¡åã«å«ãŸããŠããŸãã - äžéèŠçŽãçµ±åããæçµçãªéè€æé€ãšè«çæ§é åãå®è¡ããŸãããã®éãåäž»èŠã»ã¯ã·ã§ã³ïŒ
##ïŒã®çŽåŸã«ããã®ã»ã¯ã·ã§ã³ã®æ å ±ãæ§æããåç §å URLãªã¹ããä»äžããæ å ±æºã®éææ§ã確ä¿ããŸãã
- AIé§åã®ããŒã¿ã¯ãªãŒã³ã¢ãããšæ§é å: çµåãããããã¹ãããéè€ã³ã³ãã³ãããã€ãºïŒããã¿ãŒãããã²ãŒã·ã§ã³ãªã©ïŒãæé€ããæ
å ±æ§é ãåæ§ç¯ããŸããåŠçæç€ºã¯æ¥æ¬èªã§è¡ãããŸããïŒå
éšã§
go-ai-clientãå©çšïŒ - å
ç¢ãªããŒã¿å
¥åå±€ (GCSãµããŒã):
- Go SDKãå©çšããŠGCSãã¹ (
gs://...) ãæ€ç¥ããCloud Run JobãããŒã«ã«ç°å¢ã§èªèšŒæ å ±ïŒADCïŒãçšããŠã»ãã¥ã¢ãã€ç¢ºå®ã«ãã¡ã€ã«ãèªã¿èŸŒã¿ãŸãã - å
¥åãã¡ã€ã«ã®èªã¿èŸŒã¿ããžãã¯ã¯ã
pipeline.InputReaderã€ã³ã¿ãŒãã§ãŒã¹ïŒgo-remote-ioããã±ãŒãžã®æœè±¡åãå©çšïŒã«ãã£ãŠæœè±¡åãããŸããGCSãšããŒã«ã«ãã¡ã€ã«ã®èªã¿èŸŒã¿ã¯ãäŸåæ§æ³šå ¥ãããå€éšã³ã³ããŒãã³ããééçã«æ ããŸããããã«ãããI/O責åãpipelineããã±ãŒãžããå®å šã«åé¢ãããŠããŸãã
- Go SDKãå©çšããŠGCSãã¹ (
- å
ç¢ãªããŒã¿åºåå±€ (GCSãµããŒã):
- åºåãã¹ã®æè»æ§:
--outputãã©ã°ã«ããŒã«ã«ãã¹ãŸãã¯GCS URI (gs://bucket/object) ãæå®ããããšã§ãåºåå ãééçã«åãæ¿ããããŸãã - æä»çãªåºåå¶åŸ¡: GCS URIãæå®ãããå ŽåãããŒã«ã«ãã¡ã€ã«ãžã®æžã蟌ã¿ãæšæºåºåãžã®ãã¬ãã¥ãŒã¯èªåçã«ã¹ããããããGCSãžã®åºåã®ã¿ãå®è¡ãããŸãã
- GCSãžã®åºåã«ã¯ã
pipeline.Writerã€ã³ã¿ãŒãã§ãŒã¹ïŒgo-remote-ioããã±ãŒãžã®æœè±¡åïŒ ã®å®è£ ã䜿çšãããŸããGCS URIã®ããŒã¹ããžãã¯ãå€éšãŠãŒãã£ãªãã£ã«å§è²ãããŠãããèªèšŒã¯å ¥åå±€ãšåæ§ã«ã¢ããªã±ãŒã·ã§ã³ã®ããã©ã«ãèªèšŒæ å ± (ADC) ã«äŸåããŸãã
- åºåãã¹ã®æè»æ§:
- æè»ãªèšå®: åãã§ãŒãºã§ã¿ã€ã ã¢ãŠããèšå®å¯èœã«ããLLM APIããŒãç°å¢å€æ°ãŸãã¯CLIãªãã·ã§ã³ã§æè»ã«èšå®ã§ããŸãã
- å
éšèšèšã®æé©å:
- DIããŒã¹ã®æç¢ºãªãã€ãã©ã€ã³æ§é : ã¢ããªã±ãŒã·ã§ã³ã¯ãURLçæããã³ã³ãã³ãååŸããAIã¯ãªãŒã³ã¢ããã»åºåãã®3ã€ã®ç¬ç«ããã¹ããŒãžã«åå²ãããDIã«ãã£ãŠçµåãããŸããç¹ã«ãã³ã³ãã³ãååŸãã¹ããŒãžã«ã¯ããªãã©ã€æŠç¥ã責åãšããç¬ç«ãã
ScraperRunnerå®è£ ãæ³šå ¥ããããã€ãã©ã€ã³ã®åã³ã³ããŒãã³ããåäžã®è²¬åãæã€ããã«èšèšãããŠããŸãã - ããã³ããå®çŸ©ãå€éšãã¡ã€ã«ïŒ
.mdïŒã«åé¢ããGoã®embedããã±ãŒãžã§ãã€ããªã«çµã¿èŸŒãããšã§ããããã€ã®å ç¢æ§ã確ä¿ã - LLMããã³ããã®çæã«ãã«ããŒãã¿ãŒã³ãæ¡çšãããã³ãã¬ãŒãããŒã¹ã®ã³ã¹ããåæžããããåå©çšå¯èœãªã€ã³ã¹ã¿ã³ã¹ãšããŠç®¡çããŠããŸãã
- CLIãªãã·ã§ã³ãæ§é äœã«éçŽããããšã§ãã°ããŒãã«å€æ°ãžã®äŸåãæžãããã³ãŒãã®å
ç¢æ§ãé«ããŠããŸããI/OåŠçã¯
log/slogã«ããæ§é åãã®ã³ã°ã«ç§»è¡ãããã¡ã€ã«æžãèŸŒã¿æã®ãã£ã¬ã¯ããªèªåäœæãšå ç¢ãªãã¡ã€ã«äžæžãããžãã¯ã远å ããŸããã
- DIããŒã¹ã®æç¢ºãªãã€ãã©ã€ã³æ§é : ã¢ããªã±ãŒã·ã§ã³ã¯ãURLçæããã³ã³ãã³ãååŸããAIã¯ãªãŒã³ã¢ããã»åºåãã®3ã€ã®ç¬ç«ããã¹ããŒãžã«åå²ãããDIã«ãã£ãŠçµåãããŸããç¹ã«ãã³ã³ãã³ãååŸãã¹ããŒãžã«ã¯ããªãã©ã€æŠç¥ã責åãšããç¬ç«ãã
âš æè¡ã¹ã¿ãã¯
| èŠçŽ | æè¡ / ã©ã€ãã©ãª | åœ¹å² |
|---|---|---|
| èšèª | Go (Golang) | ããŒã«ã®éçºèšèªã䞊ååŠçãšå ç¢ãªå®è¡ç°å¢ãæäŸããŸãã |
| CLI | Cobra | ã³ãã³ãã©ã€ã³åŒæ°ãšãªãã·ã§ã³ã®è§£æã«äœ¿çšããŸãã |
| Webæœåº | github.com/shouni/go-web-exact |
ä»»æã®ãŠã§ãããŒãžããã¡ã€ã³ã®æ¬æã³ã³ãã³ããæ£ç¢ºã«æœåºããŸãã |
| AIéä¿¡ | github.com/shouni/go-ai-client |
LLMïŒGeminiïŒãžã®éä¿¡ã管çããèªåãªãã©ã€æ©èœãæäŸããŸãã |
| I/O, GCS | github.com/shouni/go-remote-io) |
ããŒã«ã«ãã¡ã€ã«ãšGCSãžã®ééçãªå ¥åºåãæœè±¡åãããã€ãã©ã€ã³ã®I/O責åãåé¢ããŸãã |
| HTML倿 | github.com/shouni/go-text-format) |
LLMãåºåããMarkdownãå®å šãªHTMLããã¥ã¡ã³ãã«å€æã»ã¬ã³ããªã³ã°ããŸãã |
| ããã³ãã | text/template, embed |
ããã³ãããå€éšãã¡ã€ã«åãããã³ãã¬ãŒãããŒã¹ã®ã³ã¹ããæããå¹ççãªããã³ããçæããžãã¯ãå®çŸããŸãã |
| 䞊ååŠç | sync.WaitGroup / Goã«ãŒãã³ |
è€æ°ã®URLãžã®ã¢ã¯ã»ã¹ãããã³LLMãã«ãã¹ãããåŠçã«ãããäžéèŠçŽã®çæ (Mapãã§ãŒãº) ã䞊åã§é«éã«å®è¡ããŸãã |
| èšèšãã¿ãŒã³ | äŸåæ§æ³šå ¥ (DI) / ãã€ãã©ã€ã³ / ãã«ããŒãã¿ãŒã³ | åŠçãããŒå
šäœãæ§é åããã¢ãã¯åãšä¿å®æ§ãåäžãããŸããI/Oãšã¯ã©ã€ã¢ã³ãã®æ§ç¯ã¯ãå€éšã®factoryããã±ãŒãžã«å§è²ãããinternal/builderã¯æ³šå
¥ã®èª¿æŽåœ¹ã®ã¿ãæ
ããŸãã |
ðïž åŠçã®æµã (Pipeline Flow)
æ¬ããŒã«ã¯ãäŸåæ§æ³šå ¥ïŒDIïŒã§çµåããã3ã€ã®äž»èŠãªãã€ãã©ã€ã³ã¹ããŒãžãé ã«å®è¡ããŸãã
1. å€éšãã€ãã©ã€ã³ã¹ããŒãž
| ã¹ããŒãž | æ åœã³ã³ããŒãã³ã | åœ¹å² |
|---|---|---|
| Stage 1: URLçæ | pipeline.URLGenerator |
äŸåæ§æ³šå
¥ããã pipeline.InputReader ã䜿çšããGCS URIãŸãã¯ããŒã«ã«ãã¡ã€ã«ããURLãªã¹ããèªã¿èŸŒã¿ãåŠç察象ã®URLãæœåºããã |
| Stage 2: ã³ã³ãã³ãååŸ | pipeline.ContentFetcher |
䞊åã¹ã¯ã¬ã€ãã³ã°ãšå ç¢ãªãªãã©ã€ãå®è¡ããæ¬æã³ã³ãã³ããæœåºããã |
| Stage 3: AIã¯ãªãŒã³ã¢ããã»åºå | pipeline.LLMOutputGenerator |
æœåºã³ã³ãã³ããçµåããMapReduceåŠçïŒcleaner.CleanerïŒãå®è¡ããŠæçµçµæãHTMLããã¥ã¡ã³ããšããŠæè»ã«åºåããã |
2. Stage 3 å éš (LLM MapReduceãããŒ)
Stage 3ïŒAIã¯ãªãŒã³ã¢ããïŒã®åŠçã¯ãcleaner.Cleanerã以äžã®è©³çްãªMapReduceãããŒãå®è¡ããããšã§è¡ãããŸãã
- ã³ã³ãã³ãçµåãšåå²: æåãããã¹ãŠã®æœåºã³ã³ãã³ããçµåããLLMã®ããŒã¯ã³å¶éïŒ
MaxSegmentCharsïŒã«åŸã£ãŠå®å šãªãã£ã³ã¯ïŒSegmentïŒã«åå²ããã - Mapãã§ãŒãº (䞊åå®è¡):
- åãã£ã³ã¯ã¯ã
LLMExecutorã®äžŠåã»ããã©ãšã¬ãŒããªããã¿ãŒã®å¶åŸ¡äžã§LLMïŒ--map-modelã§æå®ïŒã«äžŠåã§éãããã - LLMã¯åãã£ã³ã¯ã«å¯ŸããŠãäžéèŠçŽããçæããã
- åãã£ã³ã¯ã¯ã
- Reduceãã§ãŒãº (åäžå®è¡):
- ãã¹ãŠã®äžéèŠçŽãçµ±åããLLMïŒ
--reduce-modelã§æå®ïŒã«éããæçµçãªéè€æé€ãè«ççãªæ§é åãå®è¡ããã - çµæã®ä»äž: ãã®éãçµ±åã«çšããããåãœãŒã¹URLããé¢é£ããäž»èŠã»ã¯ã·ã§ã³ïŒ
##ïŒã®çŽäžã«ãªã¹ããšããŠæ¿å ¥ãããã
- ãã¹ãŠã®äžéèŠçŽãçµ±åããLLMïŒ
- åºå: LLMãæ§é åããæçµçãªããã¹ãïŒMarkdown圢åŒïŒãã
go-text-formatã«ãã£ãŠå®å šãªHTMLããã¥ã¡ã³ãã«å€æãããåŸã--outputã§æå®ããããã¹ïŒããŒã«ã«ãŸãã¯GCSïŒ ã«æžã蟌ãŸããã
ð ïž äºåæºåãšèšå®
1. ãã«ã
# ãªããžããªãã¯ããŒã³
git clone git@github.com:your-repo-path/action-perfect-get-on-go.git
cd action-perfect-get-on-go
# äŸåé¢ä¿ãããŠã³ããŒã (GCS SDKãå«ã)
go mod tidy
# å®è¡ãã¡ã€ã«ã bin/ ãã£ã¬ã¯ããªã«çæ (ã«ã¬ã³ããã£ã¬ã¯ããªã® main ããã±ãŒãžã䜿çš)
go build -o bin/llm_cleaner .
å®è¡ãã¡ã€ã«ã¯ ./bin/llm_cleaner ã«çæãããŸãã
2. LLM API ããŒã®èšå® (å¿ é )
LLMïŒGeminiïŒãå©çšããããã«ã¯ãAPIããŒãå¿ èŠã§ããèšå®ã¯ä»¥äžã®ã©ã¡ããã®æ¹æ³ã§è¡ããŸãã
- æšå¥š: ã³ãã³ãå®è¡æã«
-kãŸãã¯--api-keyãã©ã°ã§çŽæ¥æå®ããã - 代æ¿: ç°å¢å€æ°
GEMINI_API_KEYãèšå®ããã
泚æ: ã³ãã³ãã©ã€ã³ãã©ã°ã§ããŒãæå®ããå Žåãç°å¢å€æ°ã®èšå®ãããåžžã«åªå ãããŸãã
# äŸ: ç°å¢å€æ°ã«èšå®ããå Žå
export GEMINI_API_KEY="YOUR_GEMINI_API_KEY"
3. GCSããã®èªã¿èŸŒã¿/æžã蟌ã¿èšå® (ã¯ã©ãŠã/ããŒã«ã«)
GCSãã±ãããããã¡ã€ã«ãèªã¿èŸŒãããŸãã¯GCSãã±ãããžãã¡ã€ã«ãæžã蟌ãå ŽåïŒ-f gs://... ãŸã㯠-o gs://...ïŒãããã°ã©ã ã¯ã¢ããªã±ãŒã·ã§ã³ã®ããã©ã«ãèªèšŒæ
å ± (ADC) ã䜿çšããŠèªèšŒãè¡ããŸãã
- Cloud Run Job: Jobã«å²ãåœãŠããããµãŒãã¹ã¢ã«ãŠã³ãã«ãGCSãã±ããã«å¯Ÿããé©åãªããŒã«ïŒèªã¿èŸŒã¿ã«ã¯
Storage ãªããžã§ã¯ãé²èЧèãæžã蟌ã¿ã«ã¯Storage ãªããžã§ã¯ãäœæèãStorage ãªããžã§ã¯ã管çèãªã©ïŒãä»äžããå¿ èŠããããŸãã - ããŒã«ã«PC: 以äžã®ã³ãã³ããå®è¡ããããŒã«ã«ç°å¢ã«èªèšŒæ å ±ãèšå®ããå¿ èŠããããŸãã
gcloud auth application-default login
ð äœ¿ãæ¹ (Usage)
æ¬ããŒã«ã¯ãåŠç察象ã®URLãèšèŒãããã¡ã€ã«ãèªã¿èŸŒã圢åŒã®ã¿ããµããŒãããŸãã
å®è¡ã³ãã³ã圢åŒãšãªãã·ã§ã³
| ãªãã·ã§ã³ | ãã©ã° | 説æ | ããã©ã«ãå€ |
|---|---|---|---|
--api-key |
-k |
Gemini APIããŒãçŽæ¥æå®ããŸãïŒæšå¥šïŒã | ãªã |
--url-file |
-f |
åŠç察象ã®URLãªã¹ããèšèŒãããã¡ã€ã«ãã¹ãæå®ããŸããããŒã«ã«ãã¹ãŸãã¯GCS URI (gs://...) ãæå®ã§ããŸãã (å¿
é ) |
ãªã |
--output |
-o |
æçµçãªæ§é åçµæã®åºåå
ãã¹ãæå®ããŸããããŒã«ã«ãã¹ãŸãã¯GCS URI (gs://...) ãæå®ã§ããŸããGCS URIãæå®ããå ŽåãããŒã«ã«ãžã®åºåã¯ã¹ããããããŸãã |
./output/output_reduce_final.md |
--llm-timeout |
-t |
LLMåŠçå šäœã®ã¿ã€ã ã¢ãŠãæéã | 5m0s (5å) |
--scraper-timeout |
-s |
Webã¹ã¯ã¬ã€ãã³ã°ïŒHTTPã¢ã¯ã»ã¹ïŒã®ã¿ã€ã ã¢ãŠãæéã | 15s (15ç§) |
--parallel |
-p |
Webã¹ã¯ã¬ã€ãã³ã°ã®æå€§åæäžŠåãªã¯ãšã¹ãæ°ããªãœãŒã¹æ¶è²»ã察象ãµãŒããŒãžã®è² è·ãèæ ®ããããã©ã«ãå€ã調æŽããŸããã | 5 |
--map-model |
ãªã | Mapãã§ãŒãºïŒäžéèŠçŽïŒã«äœ¿çšããAIã¢ãã«åïŒäŸ: gemini-2.5-flashïŒã |
gemini-2.5-flash |
--reduce-model |
ãªã | Reduceãã§ãŒãºïŒæçµæ§é åïŒã«äœ¿çšããAIã¢ãã«åïŒäŸ: gemini-2.5-proïŒã |
gemini-2.5-pro |
1. URLãã¡ã€ã« (urls.txt ã®äŸ) ã®äœæ
ãã¡ã€ã«å ã«ã1è¡ã«1ã€ãã€åŠçãããURLãèšè¿°ããŸãã
# ãã¡ã€ã«å: urls.txt
https://example.com/page-a
https://example.com/page-b
https://example.com/page-c/specification
2. å®è¡ã³ãã³ã圢åŒ
åŠçãå®è¡ããã«ã¯ãå¿
ã run ãµãã³ãã³ããš --url-file ãŸã㯠-f ãã©ã°ã䜿çšããŠæå¹ãªãã¡ã€ã«ãã¹ãæå®ããå¿
èŠããããŸããURLãçŽæ¥åŒæ°ãšããŠæž¡ã圢åŒã¯ãµããŒããããŠããŸããã
# æå°å®è¡åœ¢åŒ (ããŒã«ã«ãã¡ã€ã«ããèªã¿èŸŒã¿ãçµæã¯ããã©ã«ããã¡ã€ã«ã«åºå)
# æšæºåºåãžã¯Markdown圢åŒã®ãã¬ãã¥ãŒã®ã¿ãåºåãããŸãããã¡ã€ã«ã¯ './output/output_reduce_final.md' ã«åºåãããŸãã
./bin/llm_cleaner run -f ./urls.txt
# æšå¥šå®è¡åœ¢åŒ (APIããŒãã«ã¹ã¿ã ã¿ã€ã ã¢ãŠããããŒã«ã«ãã¡ã€ã«ã«åºåãã¢ãã«æå®)
# ããã©ã«ãã§ã¯Markdown圢åŒã§åºåãããŸãããäŸã®ããã«æ¡åŒµåã.htmlã«ããããšã§HTMLããã¥ã¡ã³ããšããŠåºåããããšãå¯èœã§ãã
./bin/llm_cleaner run -k "YOUR_API_KEY" -f ./urls.txt \
-s 30s -t 3m -p 5 \
--map-model "gemini-2.5-flash" \
--reduce-model "gemini-2.5-pro" \
-o ./output/summary.html
# ã¯ã©ãŠãéçšåãå®è¡åœ¢åŒ (GCSãã±ããããèªã¿èŸŒã¿ãGCSãã±ãããžæžãåºã)
# JobãµãŒãã¹ã¢ã«ãŠã³ãã«GCSèªã¿æžãæš©éãå¿
èŠã§ãã
./bin/llm_cleaner run -k "YOUR_API_KEY" \
-f "gs://my-project/input/urls.txt" \
-o "gs://my-project/output/summary.html"
ð ã©ã€ã»ã³ã¹ (License)
ãã®ãããžã§ã¯ã㯠MIT License ã®äžã§å ¬éãããŠããŸãã
Documentation
¶
There is no documentation for this package.