Skip to content

TFRobotServer

ๅŸบไบŽ TFRobot ๆก†ๆžถ็š„ใ€Œๆ•ฐๅญ—ๅ‘˜ๅทฅใ€ๆœๅŠก็ซฏ๏ผŒๆไพ› RESTful API ๆŽฅๅฃใ€‚

็ฎ€ไป‹

TFRobotServer ๆ˜ฏๅฏน TFRobot ๆก†ๆžถ็š„ FastAPI ๅฐ่ฃ…๏ผŒๅฐ†ๅ…ถ่ƒฝๅŠ›ไปฅๆœๅŠกๅฝขๅผๅฏนๅค–ๆไพ›ใ€‚้€š่ฟ‡็ตๆดป็š„ API ๆŽฅๅฃ๏ผŒๅฏไปฅๅฎž็Žฐๅฏน TFRobot ็š„้…็ฝฎ่ฐƒๆ•ดๅ’ŒๅŠจๆ€็ฎก็†๏ผŒๅนถๆ”ฏๆŒ Kubernetes ้›†็พค้ƒจ็ฝฒใ€‚

ๆ ธๅฟƒ็›ฎๆ ‡

  • ๆœๅŠกๅŒ–ๅฐ่ฃ…๏ผšๅฐ† TFRobot ็š„ๅŠŸ่ƒฝๅฐ่ฃ…ไธบ RESTful API
  • ๅŠจๆ€้…็ฝฎ๏ผš้€š่ฟ‡ API ๅฎžๆ—ถ่ฐƒๆ•ด Robot ้…็ฝฎ
  • ไบ‘ๅŽŸ็”Ÿ้ƒจ็ฝฒ๏ผšๆ”ฏๆŒ Kubernetes ้ƒจ็ฝฒ๏ผŒๆฏไธช Pod ๆไพ›็‹ฌ็ซ‹ๆœๅŠก
  • ๅฏ่ง‚ๆต‹ๆ€ง๏ผšๅ†…็ฝฎ็›‘ๆŽงใ€ๆ—ฅๅฟ—่ฎฐๅฝ•ๅ’Œไปช่กจๆฟ่ƒฝๅŠ›
  • ๅผ‚ๆญฅไปปๅŠก๏ผš้€š่ฟ‡ Celery ๆไพ›้ซ˜ๅนถๅ‘ไปปๅŠกๅค„็†่ƒฝๅŠ›

ๆ ธๅฟƒ็‰นๆ€ง

ๅ•็บฟ็จ‹ๆ‰ง่กŒๆจกๅž‹

TFRobotServer ้‡‡็”จๅ•็บฟ็จ‹ๆจกๅผ่ฟ่กŒ๏ผŒ่ฟ™ๆ˜ฏ็”ฑไปฅไธ‹่ฎพ่ฎกๅ†ณๅฎš๏ผš

  • ้…็ฝฎไพ่ต–๏ผšTFRobot ้…็ฝฎๅญ˜ๅ‚จๅœจๆ–‡ไปถ็ณป็ปŸ๏ผŒๅ•่ฟ›็จ‹็กฎไฟ้…็ฝฎไธ€่‡ดๆ€ง
  • ๅบ”็”จๅœบๆ™ฏ๏ผšใ€Œๆ•ฐๅญ—ๅ‘˜ๅทฅใ€ๅœบๆ™ฏๆ— ้œ€้ซ˜ๅนถๅ‘๏ผŒๅ•ไธชๅ‘˜ๅทฅไธ“ๆณจๅค„็†ไปปๅŠก
  • ่ต„ๆบ็ฎก็†๏ผš้ฟๅ…ๅคš่ฟ›็จ‹ๅธฆๆฅ็š„่ต„ๆบ็ซžไบ‰ๅ’Œ็Šถๆ€ๅŒๆญฅ้—ฎ้ข˜

ๅฏนไบŽๆœ‰้™็š„ๅนถๅ‘้œ€ๆฑ‚๏ผŒไฝฟ็”จ FastAPI ็š„ๅผ‚ๆญฅๆจกๅผ๏ผˆasync/await๏ผ‰ๅณๅฏๆปก่ถณใ€‚

ๅˆ†ๅฑ‚ๆžถๆž„

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                   API Layer                      โ”‚
โ”‚        (RESTful API - FastAPI)                  โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                       โ†“
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                 Services Layer                   โ”‚
โ”‚         (ไธšๅŠก้€ป่พ‘ - RobotFactory, Admin)         โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                       โ†“
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚              Dependencies Layer                  โ”‚
โ”‚      (ไพ่ต–ๆณจๅ…ฅ - TFSContainer + Providers)       โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                       โ†“
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚           Infrastructure Layer                   โ”‚
โ”‚    (Database, Redis, Celery, TFRobot Core)       โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

OpenTelemetry ้›†ๆˆ

ๅฎŒๆ•ด็š„่ฐƒ็”จ้“พ่ฟฝ่ธช๏ผŒๅฏๆŽฅๅ…ฅ Grafana ็ญ‰็›‘ๆŽง็ณป็ปŸใ€‚

ๆŠ€ๆœฏๆ ˆ

็ฑปๅˆซ ๆŠ€ๆœฏ
Web ๆก†ๆžถ FastAPI + Uvicorn
ๆ•ฐๆฎ้ชŒ่ฏ Pydantic V2
ORM SQLAlchemy 2.0 (ๅผ‚ๆญฅ)
ไพ่ต–ๆณจๅ…ฅ dependency-injector
ไปปๅŠก้˜Ÿๅˆ— Celery + RabbitMQ
ๆ•ฐๆฎๅบ“ PostgreSQL + Redis
่ฟฝ่ธช OpenTelemetry
ๆ–‡ๆกฃ MkDocs + Material
ๆŽฅๅฃๆ–‡ๆกฃ Apifox

ๅฟซ้€Ÿๅผ€ๅง‹

็Žฏๅขƒ่ฆๆฑ‚

  • Python 3.11+
  • Poetry
  • Kubernetes (ๅฏ้€‰๏ผŒ็”จไบŽ็”Ÿไบง้ƒจ็ฝฒ)
  • kubectl CLI (ๅฏ้€‰)

ๅˆๅง‹ๅŒ–ๅผ€ๅ‘็Žฏๅขƒ

# 1. ๅฎ‰่ฃ…ไพ่ต–ๅนถๅˆๅง‹ๅŒ– alembic
make init

# 2. ้‡็ฝฎ PostgreSQL ๆ•ฐๆฎๅบ“๏ผˆ้œ€่ฆ k8s๏ผ‰
make reset_postgresql

# 3. ้‡็ฝฎ Redis ๅนถ้‡ๅปบ็ดขๅผ•๏ผˆ้œ€่ฆ k8s๏ผ‰
make reset_redis

# 4. ๅฏๅŠจๅผ€ๅ‘ๆœๅŠกๅ™จ
poetry run uvicorn tfrobotserver.main:app --host 0.0.0.0 --port 8000 --reload

่ฟ่กŒๆต‹่ฏ•

# ๅ•ๅ…ƒๆต‹่ฏ•
make test-unit

# ้›†ๆˆๆต‹่ฏ•
make integration_tests

# ๅฎŒๆ•ดๆต‹่ฏ•๏ผˆๅซ่ฆ†็›–็އ๏ผ‰
make test-coverage

ๆ–‡ๆกฃๅฏผ่ˆช

API ๆŽฅๅฃ

่ฏฆ็ป†็š„ API ๆŽฅๅฃๆ–‡ๆกฃ่ฏทๆŸฅ้˜… Apifoxใ€‚

่ฎพ่ฎกๆ–‡ๆกฃ๏ผš - Chat API ่ฎพ่ฎก - Admin API ่ฎพ่ฎก - Robot Factory API ่ฎพ่ฎก

ๆœๅŠกๅฑ‚

ๅŸบ็ก€่ฎพๆ–ฝ

่ฎพ่ฎก็บฆๅฎš

ๅˆ†้กตไปŽ 0 ๅผ€ๅง‹

ๆ‰€ๆœ‰ๅˆ†้กตๆŽฅๅฃ็š„้กต็ ไปŽ 0 ๅผ€ๅง‹๏ผˆ่€Œ้ž 1๏ผ‰ใ€‚

็Žฏๅขƒๅ˜้‡ๅ‰็ผ€

้…็ฝฎ้กนไฝฟ็”จ TFS_ ๅ‰็ผ€๏ผŒไพ‹ๅฆ‚๏ผš - TFS_USERNAME - TFS_PROFILE

ๆ•ฐๆฎๅบ“ Schema

ๆ‰€ๆœ‰่กจไฝฟ็”จ tfrserver schemaใ€‚

็ดขๅผ•ๅฎšไน‰

ไฝฟ็”จ Index() ็ฑปๅฎšไน‰็ดขๅผ•๏ผŒ่€Œ้ž __table_args__๏ผˆๅ› ไธบๅŸบ็ฑปๅทฒๅ ็”จ๏ผ‰ใ€‚

ๅผ€ๅ‘ๆŒ‡ๅ—

ไปฃ็ ๆ ผๅผๅŒ–

make format  # Ruff ๆ ผๅผๅŒ–ๅ’Œๅฏผๅ…ฅๆŽ’ๅบ
make lint    # MyPy ๅ’Œ Ruff ๆฃ€ๆŸฅ

ๆ•ฐๆฎๅบ“่ฟ็งป

make upgrade_postgresql  # ่‡ชๅŠจ็”Ÿๆˆๅนถๅบ”็”จ่ฟ็งป

ๅธธ็”จๅ‘ฝไปค

# ๆŸฅ็œ‹ๅฏ็”จๅ‘ฝไปค
make help

# ้‡็ฝฎ MinIO๏ผˆ้œ€่ฆ mc CLI ๅ’Œ jq๏ผ‰
make reset_minio

ๆžถๆž„่ฏดๆ˜Ž

ไธŽ TFRobot ็š„ๅ…ณ็ณป

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚         TFRobotServer (ๆœฌ้กน็›ฎ)             โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚  โ”‚   FastAPI Web ๆœๅŠก (RESTful API)    โ”‚ โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚  โ”‚   Celery ไปปๅŠก้˜Ÿๅˆ—                    โ”‚ โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                   โ†“ ่ฐƒ็”จ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚         TFRobot ๆ ธๅฟƒๆก†ๆžถ                   โ”‚
โ”‚  (Chain/Memory/Tool/Drive/Neural)         โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

้ƒจ็ฝฒๆžถๆž„

                    Kubernetes Cluster
                            โ”‚
        โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
        โ”‚                   โ”‚                   โ”‚
    โ”Œโ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”        โ”Œโ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”        โ”Œโ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”
    โ”‚  Pod 1 โ”‚        โ”‚  Pod 2 โ”‚        โ”‚  Pod N โ”‚
    โ”‚ (ๅ‘˜ๅทฅA) โ”‚        โ”‚ (ๅ‘˜ๅทฅB) โ”‚        โ”‚ (ๅ‘˜ๅทฅN) โ”‚
    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜        โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜        โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
         โ”‚                  โ”‚                  โ”‚
         โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                            โ”‚
              โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
              โ”‚   PostgreSQL + Redis      โ”‚
              โ”‚   RabbitMQ + MinIO        โ”‚
              โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

ๅธธ่ง้—ฎ้ข˜

Q: ไธบไป€ไนˆ้‡‡็”จๅ•็บฟ็จ‹ๆจกๅผ๏ผŸ

A: TFRobot ้…็ฝฎไพ่ต–ๆ–‡ไปถ็ณป็ปŸ๏ผŒๅคš่ฟ›็จ‹ไผšๅฏผ่‡ด้…็ฝฎไธไธ€่‡ดใ€‚ๆ•ฐๅญ—ๅ‘˜ๅทฅๅœบๆ™ฏไนŸๆ— ้œ€้ซ˜ๅนถๅ‘๏ผŒๅผ‚ๆญฅๆจกๅผๅทฒ่ƒฝๆปก่ถณๆœ‰้™ๅนถๅ‘้œ€ๆฑ‚ใ€‚

Q: ๅฆ‚ไฝ•ๆ‰ฉๅฑ•ๅนถๅ‘่ƒฝๅŠ›๏ผŸ

A: ้€š่ฟ‡ Kubernetes ๆฐดๅนณๆ‰ฉๅฑ• Pod ๆ•ฐ้‡๏ผŒๆฏไธช Pod ็‹ฌ็ซ‹่ฟ่กŒไธ€ไธชใ€Œๆ•ฐๅญ—ๅ‘˜ๅทฅใ€ใ€‚

Q: API ๆ–‡ๆกฃๅœจๅ“ช้‡Œ๏ผŸ

A: ่ฏฆ็ป†ๆŽฅๅฃๆ–‡ๆกฃๅœจ Apifox ไธญ็ปดๆŠค๏ผŒ่ฎพ่ฎกๆ–‡ๆกฃ่ฏดๆ˜ŽๆŽฅๅฃ็š„่ฎพ่ฎกๆ€่ทฏๅ’Œไฝฟ็”จๅœบๆ™ฏใ€‚

็‰ˆๆœฌไฟกๆฏ

ๅฝ“ๅ‰็‰ˆๆœฌ๏ผš0.1.1-rc2

็›ธๅ…ณ้กน็›ฎ

  • TFRobot - ๆ ธๅฟƒ Agent ๆก†ๆžถ
  • TFRobotOps - ่ฟ็ปดๅ’ŒๅŸบ็ก€่ฎพๆ–ฝ
  • TFRobotFront - ๅ‰็ซฏ้กน็›ฎ