--- /dev/null
+# Base64 ã«ãããã€ããå«ã JSON { #json-with-bytes-as-base64 }
+
+ã¢ããªã§ JSON ããŒã¿ã®åä¿¡ã»éä¿¡ãå¿
èŠã ãããã®äžã«ãã€ããªããŒã¿ãå«ããå¿
èŠãããå Žåã¯ãbase64 ã«ãšã³ã³ãŒãã§ããŸãã
+
+## Base64 ãšãã¡ã€ã« { #base64-vs-files }
+
+ãã€ããªããŒã¿ã®ã¢ããããŒãã«ã¯ãŸããJSON ã«ãšã³ã³ãŒããã代ããã« [Request Files](../tutorial/request-files.md) ãããã€ããªããŒã¿ã®éä¿¡ã«ã¯ [ã«ã¹ã¿ã ã¬ã¹ãã³ã¹ - FileResponse](./custom-response.md#fileresponse--fileresponse-) ã䜿ãããæ€èšããŠãã ããã
+
+JSON 㯠UTF-8 ã§ãšã³ã³ãŒããããæååã®ã¿ãå«ãããããããçã®ãã€ãåã¯å«ããããŸããã
+
+Base64 ã¯ãã€ããªããŒã¿ãæååã«ãšã³ã³ãŒãã§ããŸããããã®ããã«å
ã®ãã€ããªããå€ãã®æåã䜿çšããå¿
èŠããããéåžžã¯éåžžã®ãã¡ã€ã«ããéå¹çã§ãã
+
+JSON ã«ãã€ããªããŒã¿ãã©ãããŠãå«ããå¿
èŠãããããã¡ã€ã«ã䜿ããªãå Žåã«ã®ã¿ base64 ã䜿çšããŠãã ããã
+
+## Pydantic `bytes` { #pydantic-bytes }
+
+Pydantic ã¢ãã«ã§ `bytes` åã®ãã£ãŒã«ãã宣èšããã¢ãã«èšå®ã§ `val_json_bytes` ã䜿ããšãå
¥å JSON ããŒã¿ã®æ€èšŒæã« base64 ãçšããããæç€ºã§ããŸãããã®æ€èšŒã®äžç°ãšããŠãbase64 æååã¯ãã€ãåãžãã³ãŒããããŸãã
+
+{* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:9,29:35] hl[9] *}
+
+ã/docsãã確èªãããšã`data` ãã£ãŒã«ãã base64 ã§ãšã³ã³ãŒãããããã€ãåãæåŸ
ããŠããããšã衚瀺ãããŸãã
+
+<div class="screenshot">
+<img src="/img/tutorial/json-base64-bytes/image01.png">
+</div>
+
+次ã®ãããªãªã¯ãšã¹ããéããŸã:
+
+```json
+{
+ "description": "Some data",
+ "data": "aGVsbG8="
+}
+```
+
+/// tip | è±ç¥è
+
+`aGVsbG8=` 㯠`hello` ã® base64 ãšã³ã³ãŒãã§ãã
+
+///
+
+ãã®åŸãPydantic 㯠base64 æååããã³ãŒãããã¢ãã«ã® `data` ãã£ãŒã«ãã«å
ã®ãã€ãåãæž¡ããŸãã
+
+次ã®ãããªã¬ã¹ãã³ã¹ãåãåããŸã:
+
+```json
+{
+ "description": "Some data",
+ "content": "hello"
+}
+```
+
+## åºåããŒã¿åãã® Pydantic `bytes` { #pydantic-bytes-for-output-data }
+
+åºåããŒã¿çšã«ã¢ãã«èšå®ã§ `ser_json_bytes` ãšãšãã« `bytes` ãã£ãŒã«ãã䜿çšããããšãã§ããPydantic 㯠JSON ã¬ã¹ãã³ã¹ãçæãããšãã«ãã€ãåã base64 ã§ã·ãªã¢ã©ã€ãºããŸãã
+
+{* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:2,12:16,29,38:41] hl[16] *}
+
+## å
¥åã»åºåããŒã¿åãã® Pydantic `bytes` { #pydantic-bytes-for-input-and-output-data }
+
+ãã¡ãããåãã¢ãã«ã base64 ã䜿ãããã«èšå®ããŠããã°ãJSON ããŒã¿ã®åä¿¡æã¯ `val_json_bytes` ã§å
¥åããæ€èšŒãããéä¿¡æã¯ `ser_json_bytes` ã§åºåããã·ãªã¢ã©ã€ãºãããããšãã£ãå
·åã«ãå
¥åãšåºåã®äž¡æ¹ãæ±ããŸãã
+
+{* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:2,19:26,29,44:46] hl[23:26] *}
--- /dev/null
+# ããŒã¿ã®ã¹ããªãŒãã³ã° { #stream-data }
+
+JSON ãšããŠæ§é åã§ããããŒã¿ãã¹ããªãŒã ãããå Žåã¯ã[JSON Lines ãã¹ããªãŒã ãã](../tutorial/stream-json-lines.md) ãåç
§ããŠãã ããã
+
+ããããçŽç²ãªãã€ããªããŒã¿ãæååãã¹ããªãŒã ãããå Žåã¯ã次ã®ããã«ã§ããŸãã
+
+/// info | æ
å ±
+
+FastAPI 0.134.0 ã§è¿œå ãããŸããã
+
+///
+
+## ãŠãŒã¹ã±ãŒã¹ { #use-cases }
+
+äŸãã°ãAI LLM ãµãŒãã¹ã®åºåããã®ãŸãŸãçŽç²ãªæååãšããŠã¹ããªãŒã ãããå Žåã«äœ¿ããŸãã
+
+ã¡ã¢ãªã«äžåºŠã«å
šãŠèªã¿èŸŒãããšãªããèªã¿èŸŒã¿ãªãããã£ã³ã¯ããšã«éãããšã§ã巚倧ãªãã€ããªãã¡ã€ã«ãã¹ããªãŒã ããããšã«ã䜿ããŸãã
+
+åæ§ã«ãåç»ãé³å£°ãã¹ããªãŒã ããããšãã§ããŸããåŠçããªããçæãããã®ãŸãŸéä¿¡ããããšãå¯èœã§ãã
+
+## `yield` ã䜿ã£ã `StreamingResponse` { #a-streamingresponse-with-yield }
+
+path operation 颿°ã§ `response_class=StreamingResponse` ã宣èšãããšã`yield` ã䜿ã£ãŠããŒã¿ããã£ã³ã¯ããšã«é 次éä¿¡ã§ããŸãã
+
+{* ../../docs_src/stream_data/tutorial001_py310.py ln[1:23] hl[20,23] *}
+
+FastAPI ã¯åããŒã¿ãã£ã³ã¯ããã®ãŸãŸ `StreamingResponse` ã«æž¡ããJSON ãªã©ã«å€æããããšã¯ããŸããã
+
+### é async 㪠path operation 颿° { #non-async-path-operation-functions }
+
+`async` ãªãã®éåžžã® `def` 颿°ã§ãåæ§ã« `yield` ã䜿ããŸãã
+
+{* ../../docs_src/stream_data/tutorial001_py310.py ln[26:29] hl[27] *}
+
+### ã¢ãããŒã·ã§ã³ãªã { #no-annotation }
+
+ãã€ããªããŒã¿ãã¹ããªãŒã ããå Žåãæ»ãå€ã®åã¢ãããŒã·ã§ã³ã宣èšããå¿
èŠã¯å®éã«ã¯ãããŸããã
+
+ãã®å ŽåãFastAPI ã¯ããŒã¿ã Pydantic ã§ JSON åããããäœããã®æ¹æ³ã§ã·ãªã¢ã©ã€ãºããããšããªããããåã¢ãããŒã·ã§ã³ã¯ãšãã£ã¿ãããŒã«åãã®è£å©ã«ããããFastAPI èªäœã§ã¯äœ¿çšãããŸããã
+
+{* ../../docs_src/stream_data/tutorial001_py310.py ln[32:35] hl[33] *}
+
+ã€ãŸãã`StreamingResponse` ã§ã¯åã¢ãããŒã·ã§ã³ã«äŸåãããéä¿¡ããã圢åŒã«åãããŠãã€ãåãçæã»ãšã³ã³ãŒããããèªç±ããšã責任ããããªãã«ãããŸãã ð€
+
+### ãã€ãåãã¹ããªãŒã ãã { #stream-bytes }
+
+äž»ãªãŠãŒã¹ã±ãŒã¹ã®äžã€ã¯ãæååã§ã¯ãªã `bytes` ãã¹ããªãŒã ããããšã§ãããã¡ããå¯èœã§ãã
+
+{* ../../docs_src/stream_data/tutorial001_py310.py ln[44:47] hl[47] *}
+
+## ã«ã¹ã¿ã `PNGStreamingResponse` { #a-custom-pngstreamingresponse }
+
+äžèšã®äŸã§ã¯ãã€ãåãã¹ããªãŒã ããŸããããã¬ã¹ãã³ã¹ã« `Content-Type` ãããããªããããã¯ã©ã€ã¢ã³ãã¯åãåãããŒã¿ã®çš®é¡ãèªèã§ããŸããã§ããã
+
+`StreamingResponse` ãç¶æ¿ããã«ã¹ã¿ã ã¯ã©ã¹ãäœæããã¹ããªãŒã ããããŒã¿ã«å¿ã㊠`Content-Type` ããããèšå®ã§ããŸãã
+
+äŸãã°ã`media_type` 屿§ã§ `Content-Type` ã `image/png` ã«èšå®ãã `PNGStreamingResponse` ãäœæã§ããŸã:
+
+{* ../../docs_src/stream_data/tutorial002_py310.py ln[6,19:20] hl[20] *}
+
+ãã®åŸãpath operation 颿°ã§ `response_class=PNGStreamingResponse` ãšããŠãã®æ°ããã¯ã©ã¹ã䜿çšã§ããŸã:
+
+{* ../../docs_src/stream_data/tutorial002_py310.py ln[23:27] hl[23] *}
+
+### ãã¡ã€ã«ãæš¡æ¬ãã { #simulate-a-file }
+
+ãã®äŸã§ã¯ `io.BytesIO` ã§ãã¡ã€ã«ãæš¡æ¬ããŠããŸããããã¯ã¡ã¢ãªäžã ãã«ååšãããã¡ã€ã«ã©ã€ã¯ãªããžã§ã¯ãã§ãããéåžžã®ãã¡ã€ã«ãšåãã€ã³ã¿ãŒãã§ãŒã¹ãæäŸããŸãã
+
+äŸãã°ããã¡ã€ã«ãšåæ§ã«ã€ãã¬ãŒãããŠå
容ãèªã¿åºããŸãã
+
+{* ../../docs_src/stream_data/tutorial002_py310.py ln[1:27] hl[3,12:13,25] *}
+
+/// note | æè¡è©³çް
+
+ä»ã®2ã€ã®å€æ° `image_base64` ãš `binary_image` ã¯ãç»åã Base64 ã§ãšã³ã³ãŒãããããã `bytes` ã«å€æããŠãã `io.BytesIO` ã«æž¡ãããã®ã§ãã
+
+ãã®äŸã§ã¯1ã€ã®ãã¡ã€ã«å
ã«å®çµãããã³ããŒããŠãã®ãŸãŸå®è¡ã§ããããã«ããããã ãã®ãã®ã§ãã ð¥
+
+///
+
+`with` ãããã¯ã䜿ãããšã§ããžã§ãã¬ãŒã¿é¢æ°ïŒ`yield` ãæã€é¢æ°ïŒãçµäºããåŸãã€ãŸãã¬ã¹ãã³ã¹éä¿¡ãå®äºããåŸã«ããã®ãã¡ã€ã«ã©ã€ã¯ãªããžã§ã¯ãã確å®ã«ã¯ããŒãºãããŸãã
+
+ãã®äŸã§ã¯ `io.BytesIO` ã«ããã¡ã¢ãªå
ã®ç䌌ãã¡ã€ã«ãªã®ã§éèŠåºŠã¯é«ããããŸããããå®ãã¡ã€ã«ã®å Žåã¯åŠçåŸã«ç¢ºå®ã«ã¯ããŒãºããããšãéèŠã§ãã
+
+### ãã¡ã€ã«ãšéåæ { #files-and-async }
+
+å€ãã®å Žåããã¡ã€ã«ã©ã€ã¯ãªããžã§ã¯ãã¯ããã©ã«ãã§ã¯ async/await ãšäºææ§ããããŸããã
+
+äŸãã°ã`await file.read()` ã `async for chunk in file` ã®ãããªæäœã¯æäŸãããŠããŸããã
+
+ãŸããå€ãã®å Žåããã£ã¹ã¯ããããã¯ãŒã¯ããèªã¿åºããããèªã¿åãã¯ããããã³ã°ïŒã€ãã³ãã«ãŒãããããã¯ãåŸãïŒåŠçã«ãªããŸãã
+
+/// info | æ
å ±
+
+äžèšã®äŸã¯äŸå€ã§ã`io.BytesIO` ã¯æ¢ã«ã¡ã¢ãªäžã«ãããããèªã¿åããäœãããããã¯ããããšã¯ãããŸããã
+
+ãããå€ãã®å Žåããã¡ã€ã«ããã¡ã€ã«ã©ã€ã¯ãªããžã§ã¯ãã®èªã¿åãã¯ããããã³ã°ã«ãªããŸãã
+
+///
+
+ã€ãã³ãã«ãŒãã®ããããã³ã°ãé¿ããã«ã¯ãpath operation 颿°ã `async def` ã§ã¯ãªãéåžžã® `def` ã§å®£èšããŠãã ããããããããš FastAPI ã¯ãã®é¢æ°ãã¹ã¬ããããŒã«ã¯ãŒã«ãŒäžã§å®è¡ããã¡ã€ã³ã«ãŒãã®ããããã³ã°ãé¿ããŸãã
+
+{* ../../docs_src/stream_data/tutorial002_py310.py ln[30:34] hl[31] *}
+
+/// tip | è±ç¥è
+
+async 颿°å
ããããããã³ã°ãªã³ãŒããåŒã³åºãå¿
èŠãããå Žåããããã¯ããããã³ã°ãªé¢æ°å
ãã async 颿°ãåŒã³åºãå¿
èŠãããå Žåã¯ãFastAPI ã®å
åŒã©ã€ãã©ãªã§ãã [Asyncer](https://asyncer.tiangolo.com) ãå©çšã§ããŸãã
+
+///
+
+### `yield from` { #yield-from }
+
+ãã¡ã€ã«ã©ã€ã¯ãªããžã§ã¯ãã®ãããªãã®ãã€ãã¬ãŒãããŠåèŠçŽ ã«å¯Ÿã㊠`yield` ããŠããå Žåã`for` ã«ãŒããçç¥ããŠã`yield from` ã§åèŠçŽ ããã®ãŸãŸéãããšãã§ããŸãã
+
+ãã㯠FastAPI åºæã§ã¯ãªãåãªã Python ã®æ©èœã§ãããç¥ã£ãŠãããšäŸ¿å©ãªå°ã¯ã¶ã§ãã ð
+
+{* ../../docs_src/stream_data/tutorial002_py310.py ln[37:40] hl[40] *}
--- /dev/null
+# Content-Type ã®å³æ Œãã§ã㯠{ #strict-content-type-checking }
+
+æ¢å®ã§ã¯ãFastAPI 㯠JSON ãªã¯ãšã¹ãããã£ã«å¯ŸããŠå³æ Œãª `Content-Type` ããããŒã®ãã§ãã¯ãè¡ããŸããã€ãŸããJSON ã®ãªã¯ãšã¹ãã JSON ãšããŠè§£æããã«ã¯ãæå¹ãª `Content-Type` ããããŒïŒäŸ: `application/json`ïŒãå¿
ãå«ããå¿
èŠããããŸãã
+
+## CSRF ã®ãªã¹ã¯ { #csrf-risk }
+
+ãã®æ¢å®ã®æåã¯ãããç¹å®ã®ç¶æ³ã«ããã Cross-Site Request ForgeryïŒCSRFïŒæ»æã®äžçš®ã«å¯Ÿããä¿è·ãæäŸããŸãã
+
+ãããã®æ»æã¯ãæ¬¡ã®æ¡ä»¶ãæºãããšãã«ãã©ãŠã¶ã CORS ã®ããªãã©ã€ããã§ãã¯ãè¡ããã«ã¹ã¯ãªãããããªã¯ãšã¹ããéä¿¡ã§ããäºå®ãæªçšããŸãã
+
+- `Content-Type` ããããŒããªãïŒäŸ: `Blob` ãããã£ã«ã㊠`fetch()` ã䜿ãïŒ
+- ãã€ããããªãèªèšŒæ
å ±ãéä¿¡ããªã
+
+ãã®çš®ã®æ»æã¯äž»ã«æ¬¡ã®ãããªå Žåã«é¢ä¿ããŸãã
+
+- ã¢ããªã±ãŒã·ã§ã³ãããŒã«ã«ïŒäŸ: `localhost`ïŒãŸãã¯ç€Ÿå
ãããã¯ãŒã¯ã§åäœããŠãã
+- ãã€ãã¢ããªã«èªèšŒããªããåäžãããã¯ãŒã¯ããã®ãªã¯ãšã¹ãã¯ä¿¡é Œã§ãããšæ³å®ããŠãã
+
+## æ»æäŸ { #example-attack }
+
+ããŒã«ã«ã§ AI ãšãŒãžã§ã³ããå®è¡ã§ããä»çµã¿ãæ§ç¯ãããšããŸãã
+
+ããã¯æ¬¡ã® API ãæäŸããŸãã
+
+```
+http://localhost:8000/v1/agents/multivac
+```
+
+ããã³ããšã³ãããããŸãã
+
+```
+http://localhost:8000
+```
+
+/// tip | è±ç¥è
+
+äž¡æ¹ãšãåããã¹ãã§ããããšã«æ³šæããŠãã ããã
+
+///
+
+ãã®ããã³ããšã³ãã䜿ã£ãŠãAI ãšãŒãžã§ã³ãã«èªåã®ä»£ããã«äœæ¥ããããããŸãã
+
+ããããå
¬éã€ã³ã¿ãŒããããã§ã¯ãªãããŒã«ã«ã§åäœããŠãããããããŒã«ã«ãããã¯ãŒã¯ãžã®ã¢ã¯ã»ã¹ãä¿¡é ŒããèªèšŒãäžåèšå®ããªãããšã«ãããšããŸãã
+
+ãããšããŠãŒã¶ãŒã®äžäººããããã€ã³ã¹ããŒã«ããŠããŒã«ã«ã§å®è¡ã§ããŸãã
+
+ãã®åŸãäŸãã°æ¬¡ã®ãããªæªæã®ãããµã€ããéãå¯èœæ§ããããŸãã
+
+```
+https://evilhackers.example.com
+```
+
+ãããŠãã®æªæã®ãããµã€ããã`Blob` ãããã£ã«ãã `fetch()` ã䜿ã£ãŠããŒã«ã«ã® API ã«ãªã¯ãšã¹ããéä¿¡ããŸãã
+
+```
+http://localhost:8000/v1/agents/multivac
+```
+
+æªæã®ãããµã€ããšããŒã«ã«ã¢ããªã®ãã¹ãã¯ç°ãªãã«ããããããããã©ãŠã¶ã¯æ¬¡ã®çç±ã§ CORS ã®ããªãã©ã€ããªã¯ãšã¹ããçºè¡ããŸããã
+
+- èªèšŒãªãã§åäœããŠãããèªèšŒæ
å ±ãéãå¿
èŠããªããã
+- ãã©ãŠã¶ã¯ïŒ`Content-Type` ããããŒããªãããïŒJSON ãéã£ãŠããªããšå€æãããã
+
+ãã®çµæãæªæã®ãããµã€ããããŒã«ã«ã® AI ãšãŒãžã§ã³ãã«ããŠãŒã¶ãŒã®å
äžåžã«æãã®ã¡ãã»ãŒãžãéãããããšãã§ããŠããŸããŸã... ãããã¯ããã£ãšæªãããšãã ð
+
+## å
¬éã€ã³ã¿ãŒããã { #open-internet }
+
+ã¢ããªãå
¬éã€ã³ã¿ãŒãããäžã«ããå Žåãããããã¯ãŒã¯ãä¿¡é ŒãããŠèªèšŒãªãã§èª°ã«ã§ãç¹æš©çãªãªã¯ãšã¹ããéãããããšã¯ããªãã¯ãã§ãã
+
+æ»æè
ã¯åã«ã¹ã¯ãªãããå®è¡ã㊠API ã«ãªã¯ãšã¹ããéããŸãããã©ãŠã¶ãä»ããå¿
èŠããªãããããã§ã«ç¹æš©ãšã³ããã€ã³ãã¯ä¿è·ããŠããã§ãããã
+
+ãã®å Žåãããã¯ããªãã«ã¯åœãŠã¯ãŸããªãæ»æïŒãªã¹ã¯ã§ãã
+
+ãã®ãªã¹ã¯ã𿻿ãäž»ã«åé¡ã«ãªãã®ã¯ãã¢ããªãããŒã«ã«ãããã¯ãŒã¯ã§åäœããããã ããåæã®ä¿è·ãšãªã£ãŠããå Žåã§ãã
+
+## Content-Type ãªãã®ãªã¯ãšã¹ããèš±å¯ãã { #allowing-requests-without-content-type }
+
+`Content-Type` ããããŒãéããªãã¯ã©ã€ã¢ã³ãããµããŒãããå¿
èŠãããå Žåã¯ã`strict_content_type=False` ãèšå®ããŠå³æ Œãã§ãã¯ãç¡å¹åã§ããŸãã
+
+{* ../../docs_src/strict_content_type/tutorial001_py310.py hl[4] *}
+
+ãã®èšå®ã§ã¯ã`Content-Type` ããããŒããªããªã¯ãšã¹ãã§ãããã£ã JSON ãšããŠè§£æãããŸããããã¯å€ãããŒãžã§ã³ã® FastAPI ãšåãæåã§ãã
+
+/// info | æ
å ±
+
+ãã®æåãšèšå®ã¯ FastAPI 0.132.0 ã§è¿œå ãããŸããã
+
+///
--- /dev/null
+# ãšãã£ã¿å¯Ÿå¿ { #editor-support }
+
+å
¬åŒã®[FastAPI Extension](https://marketplace.visualstudio.com/items?itemName=FastAPILabs.fastapi-vscode)ã¯ã*path operation* ã®æ€åºã»ããã²ãŒã·ã§ã³ã«å ããFastAPI Cloud ãžã®ãããã€ãã©ã€ããã°ã¹ããªãŒãã³ã°ãªã©ãFastAPI ã®éçºã¯ãŒã¯ãããŒã匷åããŸãã
+
+æ¡åŒµæ©èœã®è©³çްã¯ã[GitHub ãªããžããª](https://github.com/fastapi/fastapi-vscode)ã® README ãåç
§ããŠãã ããã
+
+## ã»ããã¢ãããšã€ã³ã¹ããŒã« { #setup-and-installation }
+
+**FastAPI Extension** 㯠[VS Code](https://code.visualstudio.com/) ãš [Cursor](https://www.cursor.com/) ã®äž¡æ¹ã§å©çšã§ããŸããåãšãã£ã¿ã®æ¡åŒµæ©èœããã«ãããFastAPIããæ€çŽ¢ãã**FastAPI Labs** ãå
¬éããŠããæ¡åŒµæ©èœãéžæããŠçŽæ¥ã€ã³ã¹ããŒã«ã§ããŸãã [vscode.dev](https://vscode.dev) ã [github.dev](https://github.dev) ãªã©ã®ãã©ãŠã¶ããŒã¹ã®ãšãã£ã¿ã§ãåäœããŸãã
+
+### ã¢ããªã±ãŒã·ã§ã³æ€åº { #application-discovery }
+
+æ¢å®ã§ã¯ãã¯ãŒã¯ã¹ããŒã¹å
ã§ `FastAPI()` ãçæããŠãããã¡ã€ã«ãèµ°æ»ããFastAPI ã¢ããªã±ãŒã·ã§ã³ãèªåæ€åºããŸãããããžã§ã¯ãæ§æã®éœåã§èªåæ€åºãæ©èœããªãå Žåã¯ã`pyproject.toml` ã® `[tool.fastapi]`ããŸã㯠VS Code èšå®ã® `fastapi.entryPoint` ã«ã¢ãžã¥ãŒã«èšæ³ïŒäŸ: `myapp.main:app`ïŒã§ãšã³ããªãã€ã³ããæå®ã§ããŸãã
+
+## æ©èœ { #features }
+
+- **Path Operation ãšã¯ã¹ãããŒã©ãŒ** - ã¢ããªã±ãŒã·ã§ã³å
ã®ãã¹ãŠã® <dfn title="ã«ãŒãããšã³ããã€ã³ã">*path operations*</dfn> ããµã€ãããŒã®ããªãŒãã¥ãŒã§è¡šç€ºããŸããã¯ãªãã¯ããŠä»»æã®ã«ãŒããŸãã¯ã«ãŒã¿ãŒå®çŸ©ãžãžã£ã³ãã§ããŸãã
+- **ã«ãŒãæ€çŽ¢** - <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>E</kbd>ïŒmacOS: <kbd>Cmd</kbd> + <kbd>Shift</kbd> + <kbd>E</kbd>ïŒã§ããã¹ã»ã¡ãœããã»ååã§æ€çŽ¢ã§ããŸãã
+- **CodeLens ããã²ãŒã·ã§ã³** - ãã¹ãã¯ã©ã€ã¢ã³ãåŒã³åºãïŒäŸ: `client.get('/items')`ïŒã®äžã«è¡šç€ºãããã¯ãªãã¯å¯èœãªãªã³ã¯ããã察å¿ãã *path operation* ã«ãžã£ã³ããããã¹ããšå®è£
ã®è¡ãæ¥ããã°ããè¡ããŸãã
+- **FastAPI Cloud ãžãããã€** - [FastAPI Cloud](https://fastapicloud.com/) ã«ã¯ã³ã¯ãªãã¯ã§ã¢ããªããããã€ã§ããŸãã
+- **ã¢ããªã±ãŒã·ã§ã³ãã°ã®ã¹ããªãŒãã³ã°** - FastAPI Cloud ã«ãããã€ããã¢ããªãããã¬ãã«ãã£ã«ã¿ãããã¹ãæ€çŽ¢ä»ãã§ãªã¢ã«ã¿ã€ã ã«ãã°ãã¹ããªãŒãã³ã°ã§ããŸãã
+
+æ¡åŒµæ©èœã®æ©èœã«æ
£ããã«ã¯ãã³ãã³ããã¬ããïŒ<kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>P</kbd>ãmacOS: <kbd>Cmd</kbd> + <kbd>Shift</kbd> + <kbd>P</kbd>ïŒãéãã"Welcome: Open walkthrough..." ãéžæããŠããã"Get started with FastAPI" ã®ãŠã©ãŒã¯ã¹ã«ãŒãéžãã§ãã ããã
--- /dev/null
+# Server-Sent Events (SSE) { #server-sent-events-sse }
+
+**Server-Sent Events** (SSE) ã䜿ããšãã¯ã©ã€ã¢ã³ããžããŒã¿ãã¹ããªãŒãã³ã°ã§ããŸãã
+
+ããã¯[JSON Lines ã®ã¹ããªãŒãã³ã°](stream-json-lines.md)ã«äŒŒãŠããŸããã`text/event-stream` ãã©ãŒãããã䜿çšããŸããããã¯ãã©ãŠã¶ããã€ãã£ãã« [`EventSource` API](https://developer.mozilla.org/en-US/docs/Web/API/EventSource) ã§ãµããŒãããŠããŸãã
+
+/// info | æ
å ±
+
+FastAPI 0.135.0 ã§è¿œå ãããŸããã
+
+///
+
+## Server-Sent Events ãšã¯ { #what-are-server-sent-events }
+
+SSE ã¯ãHTTP çµç±ã§ãµãŒããŒããã¯ã©ã€ã¢ã³ããžããŒã¿ãã¹ããªãŒãã³ã°ããããã®æšæºã§ãã
+
+åã€ãã³ãã¯ã`data`ã`event`ã`id`ã`retry` ãªã©ã®ããã£ãŒã«ãããå«ãå°ããªããã¹ããããã¯ã§ã空è¡ã§åºåãããŸãã
+
+次ã®ããã«ãªããŸã:
+
+```
+data: {"name": "Portal Gun", "price": 999.99}
+
+data: {"name": "Plumbus", "price": 32.99}
+
+```
+
+SSE ã¯ãAI ãã£ããã®ã¹ããªãŒãã³ã°ãã©ã€ãéç¥ããã°ããªãã¶ããªãã£ãªã©ããµãŒããŒãã¯ã©ã€ã¢ã³ããžæŽæ°ãããã·ã¥ããçšéã§äžè¬çã«äœ¿ãããŸãã
+
+/// tip | è±ç¥è
+
+ãã€ããªããŒã¿ïŒäŸ: åç»ãé³å£°ïŒãã¹ããªãŒãã³ã°ãããå Žåã¯ãäžçŽã¬ã€ã [ããŒã¿ã®ã¹ããªãŒãã³ã°](../advanced/stream-data.md) ãåç
§ããŠãã ããã
+
+///
+
+## FastAPI ã§ SSE ãã¹ããªãŒãã³ã° { #stream-sse-with-fastapi }
+
+FastAPI ã§ SSE ãã¹ããªãŒãã³ã°ããã«ã¯ã*path operation 颿°*ã§ `yield` ã䜿ãã`response_class=EventSourceResponse` ãèšå®ããŸãã
+
+`EventSourceResponse` 㯠`fastapi.sse` ããã€ã³ããŒãããŸã:
+
+{* ../../docs_src/server_sent_events/tutorial001_py310.py ln[1:25] hl[4,22] *}
+
+yield ãããåã¢ã€ãã 㯠JSON ã«ãšã³ã³ãŒããããSSE ã€ãã³ãã® `data:` ãã£ãŒã«ãã§éä¿¡ãããŸãã
+
+æ»ãå€ã®åã `AsyncIterable[Item]` ãšå®£èšãããšãFastAPI 㯠Pydantic ãçšããŠããŒã¿ã**æ€èšŒ**ã**ããã¥ã¡ã³ãå**ã**ã·ãªã¢ã©ã€ãº**ããŸãã
+
+{* ../../docs_src/server_sent_events/tutorial001_py310.py ln[1:25] hl[10:12,23] *}
+
+/// tip | è±ç¥è
+
+Pydantic ã**Rust** åŽã§ã·ãªã¢ã©ã€ãºãè¡ããããæ»ãå€ã®åã宣èšããªãå Žåã«æ¯ã¹ãŠå€§å¹
ã«**髿§èœ**ã«ãªããŸãã
+
+///
+
+### é async ã® *path operation 颿°* { #non-async-path-operation-functions }
+
+éåžžã® `def` 颿°ïŒ`async` ãªãïŒã䜿çšã§ããåæ§ã« `yield` ã䜿ããŸãã
+
+ã€ãã³ãã«ãŒãããããã¯ããªããããFastAPI ãæ£ããå®è¡ãããããã«èª¿æŽããŸãã
+
+ãã®å Žåã¯é¢æ°ã async ã§ã¯ãªããããé©åãªæ»ãå€ã®å㯠`Iterable[Item]` ã§ã:
+
+{* ../../docs_src/server_sent_events/tutorial001_py310.py ln[28:31] hl[29] *}
+
+### æ»ãå€ã®åãªã { #no-return-type }
+
+æ»ãå€ã®åãçç¥ããããšãã§ããŸããFastAPI 㯠[`jsonable_encoder`](./encoder.md) ã䜿ã£ãŠããŒã¿ã倿ããéä¿¡ããŸãã
+
+{* ../../docs_src/server_sent_events/tutorial001_py310.py ln[34:37] hl[35] *}
+
+## `ServerSentEvent` { #serversentevent }
+
+`event`ã`id`ã`retry`ã`comment` ãªã©ã® SSE ãã£ãŒã«ããèšå®ããå¿
èŠãããå Žåã¯ãçããŒã¿ã®ä»£ããã« `ServerSentEvent` ãªããžã§ã¯ãã `yield` ã§ããŸãã
+
+`ServerSentEvent` 㯠`fastapi.sse` ããã€ã³ããŒãããŸã:
+
+{* ../../docs_src/server_sent_events/tutorial002_py310.py hl[4,26] *}
+
+`data` ãã£ãŒã«ãã¯åžžã« JSON ã«ãšã³ã³ãŒããããŸããPydantic ã¢ãã«ãå«ããJSON ã«ã·ãªã¢ã©ã€ãºå¯èœãªä»»æã®å€ãæž¡ããŸãã
+
+## çããŒã¿ { #raw-data }
+
+JSON ãšã³ã³ãŒãããã«ããŒã¿ãéãå¿
èŠãããå Žåã¯ã`data` ã®ä»£ããã« `raw_data` ã䜿çšããŸãã
+
+ããã¯ãæŽåœ¢æžã¿ããã¹ãããã°è¡ããŸã㯠`[DONE]` ã®ãããªç¹å¥ãª <dfn title="ç¹å¥ãªæ¡ä»¶ãç¶æ
ã瀺ãããã«çšããããå€">"ã»ã³ããã«"</dfn> å€ãéãã®ã«æçšã§ãã
+
+{* ../../docs_src/server_sent_events/tutorial003_py310.py hl[17] *}
+
+/// note | åè
+
+`data` ãš `raw_data` ã¯çžäºæä»çã§ããå `ServerSentEvent` ã§ã¯ã©ã¡ããäžæ¹ããèšå®ã§ããŸããã
+
+///
+
+## `Last-Event-ID` ã§ã®åé { #resuming-with-last-event-id }
+
+æ¥ç¶ãéåããåŸã«ãã©ãŠã¶ã忥ç¶ãããšãæåŸã«åä¿¡ãã `id` ã `Last-Event-ID` ããããŒã§éä¿¡ããŸãã
+
+ãããããããŒãã©ã¡ãŒã¿ãšããŠåãåããã¯ã©ã€ã¢ã³ããé¢è±ããäœçœ®ããã¹ããªãŒã ãåéã§ããŸã:
+
+{* ../../docs_src/server_sent_events/tutorial004_py310.py hl[25,27,31] *}
+
+## POST ã§ã® SSE { #sse-with-post }
+
+SSE 㯠`GET` ã ãã§ãªãã**ä»»æã® HTTP ã¡ãœãã**ã§åäœããŸãã
+
+ããã¯ã`POST` äžã§ SSE ãã¹ããªãŒãã³ã°ãã [MCP](https://modelcontextprotocol.io) ã®ãããªãããã³ã«ã§æçšã§ã:
+
+{* ../../docs_src/server_sent_events/tutorial005_py310.py hl[14] *}
+
+## æè¡è©³çް { #technical-details }
+
+FastAPI 㯠SSE ã®ããã€ãã®ãã¹ããã©ã¯ãã£ã¹ãæšæºã§å®è£
ããŠããŸãã
+
+- ã¡ãã»ãŒãžããªãå Žå㯠15 ç§ããšã«ãããŒãã¢ã©ã€ããçšã® `ping` ã³ã¡ã³ããéä¿¡ããäžéšã®ãããã·ãæ¥ç¶ãéããã®ãé²ããŸãïŒ[HTML 仿§: Server-Sent Events](https://html.spec.whatwg.org/multipage/server-sent-events.html#authoring-notes) ã®æšå¥šã«åŸããŸãïŒã
+- ã¹ããªãŒã ã®**ãã£ãã·ã¥ã鲿¢**ããããã`Cache-Control: no-cache` ããããŒãèšå®ããŸãã
+- Nginx ãªã©äžéšã®ãããã·ã§ã®**ãããã¡ãªã³ã°ãé²ã**ãããç¹å¥ãªããã㌠`X-Accel-Buffering: no` ãèšå®ããŸãã
+
+远å ã®èšå®ã¯äžèŠã§ããã®ãŸãŸåäœããŸããð€
--- /dev/null
+# JSON Lines ãã¹ããªãŒã ãã { #stream-json-lines }
+
+ããŒã¿ã®ã·ãŒã±ã³ã¹ã**ãã¹ããªãŒã ã**ã§éãããå Žåã**JSON Lines** ã䜿ã£ãŠå®çŸã§ããŸãã
+
+/// info | æ
å ±
+
+FastAPI 0.134.0 ã§è¿œå ãããŸããã
+
+///
+
+## ã¹ããªãŒã ãšã¯ { #what-is-a-stream }
+
+ããŒã¿ã**ã¹ããªãŒãã³ã°**ãããšã¯ãã¢ã€ãã ã®å
šã·ãŒã±ã³ã¹ãçšæã§ããã®ãåŸ
ããã«ãã¢ããªãããŒã¿ã¢ã€ãã ã®éä¿¡ãã¯ã©ã€ã¢ã³ãã«å¯ŸããŠéå§ããããšãæå³ããŸãã
+
+ã€ãŸããæåã®ã¢ã€ãã ãéä¿¡ããã¯ã©ã€ã¢ã³ãã¯ãããåãåã£ãŠåŠçãå§ããŸãããã®éã«ã次ã®ã¢ã€ãã ããŸã çæããŠãããããããŸããã
+
+```mermaid
+sequenceDiagram
+ participant App
+ participant Client
+
+ App->>App: Produce Item 1
+ App->>Client: Send Item 1
+ App->>App: Produce Item 2
+ Client->>Client: Process Item 1
+ App->>Client: Send Item 2
+ App->>App: Produce Item 3
+ Client->>Client: Process Item 2
+ App->>Client: Send Item 3
+ Client->>Client: Process Item 3
+ Note over App: Keeps producing...
+ Note over Client: Keeps consuming...
+```
+
+ããŒã¿ãéãç¶ããç¡éã¹ããªãŒã ã«ããããšãã§ããŸãã
+
+## JSON Lines { #json-lines }
+
+ãã®ãããªå Žåã1 è¡ã« 1 ã€ã® JSON ãªããžã§ã¯ããéãã**JSON Lines**ã圢åŒã䜿ãã®ãäžè¬çã§ãã
+
+ã¬ã¹ãã³ã¹ã® content type 㯠`application/jsonl`ïŒ`application/json` ã®ä»£ããïŒãšãªããããã£ã¯æ¬¡ã®ããã«ãªããŸã:
+
+```json
+{"name": "Plumbus", "description": "A multi-purpose household device."}
+{"name": "Portal Gun", "description": "A portal opening device."}
+{"name": "Meeseeks Box", "description": "A box that summons a Meeseeks."}
+```
+
+ãã㯠JSON é
åïŒPython ã® list ã«çžåœïŒã«ãšãŠããã䌌ãŠããŸããã`[]` ã§å²ãŸããã¢ã€ãã éã® `,` ããããŸããããã®ä»£ããã«ã**1 è¡ã« 1 ã€ã® JSON ãªããžã§ã¯ã**ã§ãæ¹è¡æåã§åºåãããŸãã
+
+/// info | æ
å ±
+
+éèŠãªç¹ã¯ãã¯ã©ã€ã¢ã³ããåã®è¡ãæ¶è²»ããŠããéã«ãã¢ããªåŽã¯æ¬¡ã®è¡ãé æ¬¡çæããŠéããããšã§ãã
+
+///
+
+/// note | æè¡è©³çް
+
+å JSON ãªããžã§ã¯ãã¯æ¹è¡ã§åºåããããããå
容ã«ãªãã©ã«ãªæ¹è¡æåã¯å«ããããŸãããã§ããããšã¹ã±ãŒãããæ¹è¡ïŒ`\n`ïŒã¯å«ããããŸãããã㯠JSON æšæºã®äžéšã§ãã
+
+ãšã¯ãããéåžžã¯æ°ã«ããå¿
èŠã¯ãããŸãããèªåã§åŠçãããŸãã®ã§ãèªã¿é²ããŠãã ãããð€
+
+///
+
+## ãŠãŒã¹ã±ãŒã¹ { #use-cases }
+
+ãã㯠**AI LLM** ãµãŒãã¹ã**ãã°**ã**ãã¬ã¡ããª**ãããã㯠**JSON** ã¢ã€ãã ãšããŠæ§é åã§ããä»ã®çš®é¡ã®ããŒã¿ãã¹ããªãŒã ããã®ã«äœ¿ããŸãã
+
+/// tip | è±ç¥è
+
+åç»ãé³å£°ãªã©ã®ãã€ããªããŒã¿ãã¹ããªãŒã ãããå Žåã¯ãäžçŽã¬ã€ããåç
§ããŠãã ãã: [ããŒã¿ã®ã¹ããªãŒã ](../advanced/stream-data.md)ã
+
+///
+
+## FastAPI ã§ JSON Lines ãã¹ããªãŒã ãã { #stream-json-lines-with-fastapi }
+
+FastAPI ã§ JSON Lines ãã¹ããªãŒã ããã«ã¯ã*path operation 颿°*ã§ `return` ã䜿ã代ããã«ã`yield` ã䜿ã£ãŠåã¢ã€ãã ãé ã«çæããŸãã
+
+{* ../../docs_src/stream_json_lines/tutorial001_py310.py ln[1:24] hl[24] *}
+
+éãè¿ãå JSON ã¢ã€ãã ã `Item`ïŒPydantic ã¢ãã«ïŒåã§ã颿°ã async ã®å Žåãæ»ãå€ã®åã `AsyncIterable[Item]` ãšå®£èšã§ããŸã:
+
+{* ../../docs_src/stream_json_lines/tutorial001_py310.py ln[1:24] hl[9:11,22] *}
+
+æ»ãå€ã®åã宣èšãããšãFastAPI ã¯ããã䜿ã£ãŠããŒã¿ã**æ€èšŒ**ããOpenAPI ã«**ããã¥ã¡ã³ãå**ãã**ãã£ã«ã¿ãŒ**ããPydantic ã§**ã·ãªã¢ã©ã€ãº**ããŸãã
+
+/// tip | è±ç¥è
+
+Pydantic 㯠**Rust** åŽã§ã·ãªã¢ã©ã€ãºãè¡ããããæ»ãå€ã®åã宣èšããªãå Žåã«æ¯ã¹ãŠå€§å¹
ã«é«ã**ããã©ãŒãã³ã¹**ãåŸãããŸãã
+
+///
+
+### é async ã® *path operation 颿°* { #non-async-path-operation-functions }
+
+`async` ã䜿ããªãéåžžã® `def` 颿°ã§ãåæ§ã« `yield` ã䜿ããŸãã
+
+FastAPI ãé©åã«å®è¡ãããããã«åŠçãããããã€ãã³ãã«ãŒãããããã¯ããŸããã
+
+ãã®å Žåã¯é¢æ°ã async ã§ã¯ãªãã®ã§ãé©åãªæ»ãå€ã®å㯠`Iterable[Item]` ã§ã:
+
+{* ../../docs_src/stream_json_lines/tutorial001_py310.py ln[27:30] hl[28] *}
+
+### æ»ãå€ã®åãªã { #no-return-type }
+
+æ»ãå€ã®åãçç¥ããããšãã§ããŸããFastAPI ã¯ãã®å ŽåãããŒã¿ã JSON ã«ã·ãªã¢ã©ã€ãºå¯èœãªåœ¢ã«å€æããããã« [`jsonable_encoder`](./encoder.md) ã䜿ããJSON Lines ãšããŠéä¿¡ããŸãã
+
+{* ../../docs_src/stream_json_lines/tutorial001_py310.py ln[33:36] hl[34] *}
+
+## Server-Sent Events (SSE) { #server-sent-events-sse }
+
+FastAPI 㯠Server-Sent Events (SSE) ã«ããã¡ãŒã¹ãã¯ã©ã¹ã§å¯Ÿå¿ããŠããŸãããšãŠã䌌ãŠããŸãããããã€ã远å ã®è©³çްããããŸããæ¬¡ã®ç« ã§åŠã¹ãŸã: [Server-Sent Events (SSE)](server-sent-events.md)ãð€