Skip to content

ai4next/iperson

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

90 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

iPerson โ€” ้€š็”จๅ…จ่‡ชๅŠจไธชไบบIP่ฟ่ฅๅนณๅฐ

็”จAIๆ”พๅคงๅˆ›ไฝœ่€…็š„ไบบๆ ผ๏ผŒ่€Œ้žๆ›ฟไปฃๅฎƒ

iPerson ๆ˜ฏไธ€ไธช CLI ไผ˜ๅ…ˆ ็š„ไธชไบบ IP ๅ†…ๅฎนๅผ•ๆ“Ž๏ผŒ้€š่ฟ‡ๆ’ไปถๅŒ–็ฎก็บฟ็ผ–ๆŽ’ๅ†…ๅฎน็”Ÿไบงๆต็จ‹๏ผŒๆ”ฏๆŒ็Ÿฅ่ฏ†ๅบ“้ฉฑๅŠจ็š„ๅ†…ๅฎน็”Ÿๆˆใ€ๅคš็ปดๅบฆ่ดจ้‡ๅฎกๆ ธใ€ไบบ่ฎพ้ฃŽๆ ผๆŽงๅˆถ๏ผŒไปฅๅŠๅคšๅนณๅฐๅ‘ๅธƒใ€‚

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

ๅฎ‰่ฃ…

# ้€š่ฟ‡ uv ๅฎ‰่ฃ…
uv pip install iperson

# ๆˆ–ไปŽๆบ็ ๅฎ‰่ฃ…
git clone https://github.com/ai4next/iperson.git
cd iperson
uv sync --all-extras

ๅˆๅง‹ๅŒ–้…็ฝฎ

# ๅˆ›ๅปบ้…็ฝฎ็›ฎๅฝ•
mkdir -p ~/.iperson

# ็ผ–่พ‘้…็ฝฎๆ–‡ไปถ
vim ~/.iperson/config.yaml
# ~/.iperson/config.yaml
llm:
  provider: openai              # ๆˆ– anthropic / gemini
  api_key: sk-xxx               # ไฝ ็š„ API Key
  model: gpt-4o                 # ็”Ÿๆˆๆจกๅž‹

้ฆ–ๆฌก่ฟ่กŒ

# 1. ๅฏผๅ…ฅ็Ÿฅ่ฏ†ๅบ“ๆ–‡ๆกฃ๏ผˆๅฐ†ไฝ ็š„็ด ๆๅ–‚็ป™็ณป็ปŸ๏ผ‰
iperson kb import ./my-articles/

# 2. ๅˆ›ๅปบไบบ่ฎพ๏ผˆๅฎšไน‰ไฝ ็š„ๅ†™ไฝœ้ฃŽๆ ผ๏ผ‰
iperson persona create

# 3. ่ฟ่กŒๅ†…ๅฎน็ฎก็บฟ๏ผˆ่‡ชๅŠจ้€‰้ข˜ + ็”Ÿๆˆ + ๅ‘ๅธƒ๏ผ‰
iperson publish run

# 4. ๆŸฅ็œ‹่พ“ๅ‡บ
ls ~/.iperson/output/

่ฏดๆ˜Ž๏ผš--topic ไธบๅฏ้€‰ๅ‚ๆ•ฐใ€‚ไธไผ ๆ—ถไผšๆ นๆฎ็Ÿฅ่ฏ†ๅบ“็ด ๆๅ’Œไบบ่ฎพ่‡ชๅŠจ้€‰้ข˜ใ€‚


้…็ฝฎๅ‚่€ƒ

ๅฎŒๆ•ด้…็ฝฎ้กน

# ~/.iperson/config.yaml

# LLM ๅ…จๅฑ€้…็ฝฎ
llm:
  provider: openai              # openai / anthropic / gemini
  api_key: sk-xxx
  model: gpt-4o

# ๆŒ‰้˜ถๆฎต็‹ฌ็ซ‹้…็ฝฎ LLM๏ผˆ่ฆ†็›–ๅ…จๅฑ€้…็ฝฎ๏ผ‰
providers:
  - stage: default              provider: openai    model: gpt-4o          temperature: 0.7
  - stage: generation           provider: openai    model: gpt-4o          temperature: 0.8
  - stage: audit                provider: openai    model: gpt-4o          temperature: 0.3
  - stage: humanizer            provider: openai    model: gpt-4o          temperature: 0.5

# ๆ•ฐๆฎ็›ฎๅฝ•๏ผˆ้ป˜่ฎค ~/.iperson/data๏ผ‰
data_dir: ~/.iperson/data
output_dir: ~/.iperson/output

# ๆ•ฐๆฎๅบ“่ทฏๅพ„
db:
  path: ~/.iperson/data/iperson.db

# Webhook ้€š็Ÿฅ๏ผˆๅฏ้€‰๏ผ‰
webhooks:
  - url: https://your-server.com/webhook
    secret: your-hmac-secret

็Žฏๅขƒๅ˜้‡่ฆ†็›–

ๆ‰€ๆœ‰้…็ฝฎ้กนๅ‡ๅฏ้€š่ฟ‡ IPERSON_<KEY> ็Žฏๅขƒๅ˜้‡่ฆ†็›–๏ผš

export IPERSON_LLM_API_KEY=sk-xxx
export IPERSON_LLM_MODEL=gpt-4o
export IPERSON_DB_PATH=/custom/path/iperson.db

ๅตŒๅฅ—ๅญ—ๆฎตไฝฟ็”จไธ‹ๅˆ’็บฟ่ฟžๆŽฅ๏ผšIPERSON_LLM_API_KEY ๅฏนๅบ” llm.api_keyใ€‚

ๆŒ‰้˜ถๆฎต LLM ้…็ฝฎ

ๆฏไธช็ฎก้“้˜ถๆฎตๅฏๆŒ‡ๅฎšไธๅŒ็š„ provider / model / temperature๏ผš

้˜ถๆฎต ็”จ้€” ๆŽจ่ temperature
default ๆœชๅŒน้…้˜ถๆฎต็š„ๅ›ž้€€้…็ฝฎ 0.7
generation ๅ†…ๅฎน็”Ÿๆˆ๏ผˆๅˆ›ๆ„ๆ€ง่ฆๆฑ‚้ซ˜๏ผ‰ 0.8
audit ่ดจ้‡ๅฎกๆ ธ๏ผˆ้œ€็กฎๅฎšๆ€งๅˆคๆ–ญ๏ผ‰ 0.3
humanizer AI ็—•่ฟนๆทกๅŒ–ๆ”นๅ†™ 0.5

ๆœช้…็ฝฎ็š„้˜ถๆฎตไผš่‡ชๅŠจๅ›ž้€€ๅˆฐ defaultใ€‚


็ฎก็บฟไธŽ Pipeline

ไป€ไนˆๆ˜ฏ Pipeline๏ผŸ

Pipeline๏ผˆ็ฎก็บฟ๏ผ‰ๅฎšไน‰ๅ†…ๅฎน็”Ÿไบง็š„่Š‚็‚น้กบๅบๅ’Œๆฏไธช่Š‚็‚น็š„้…็ฝฎใ€‚ๆฏไธชไบบ่ฎพ้ƒฝๆœ‰่‡ชๅทฑ็š„ Pipeline ้…็ฝฎ๏ผŒๆ”พๅœจไบบ่ฎพ็›ฎๅฝ•็š„ config.yaml ไธญใ€‚

้ป˜่ฎค Pipeline

ๆœช้…็ฝฎๆ—ถไฝฟ็”จๅ†…็ฝฎ้ป˜่ฎค็ฎก็บฟ๏ผš็ด ๆๆฃ€็ดข โ†’ ่‡ชๅŠจ้€‰้ข˜ โ†’ ๅ†…ๅฎน็”Ÿๆˆ โ†’ ๅคšๅนณๅฐๅ‘ๅธƒใ€‚

Pipeline ้…็ฝฎ

ๅœจไบบ่ฎพ็š„ config.yaml ไธญๆทปๅŠ  pipeline ๅญ—ๆฎตๅณๅฏ่‡ชๅฎšไน‰๏ผš

# ~/.iperson/personas/{name}/config.yaml
is_active: true
pipeline:
  nodes:
    - id: research
      node: research.kb_retrieve
      config:
        top_k: 10

    - id: generate
      node: generation.article
      hooks:
        after:
          - hook: quality.humanizer
            config:
              min_score: 0.35
              max_iterations: 2

    - id: publish
      node: publish.multiplatform
      hooks:
        before:
          - hook: quality.platformize
            config:
              platforms: [xiaohongshu, wechat, zhihu]
      config:
        platforms: [xiaohongshu, wechat, zhihu]

ๆฏไธช่Š‚็‚นๆ”ฏๆŒ็š„ๅญ—ๆฎต๏ผš

ๅญ—ๆฎต ่ฏดๆ˜Ž
id ่Š‚็‚นๅ”ฏไธ€ๆ ‡่ฏ†
node ่Š‚็‚นๆ’ไปถ ID๏ผˆๅฆ‚ research.kb_retrieve๏ผ‰
config ่Š‚็‚น้…็ฝฎๅ‚ๆ•ฐ
hooks.before ๆ‰ง่กŒๅ‰้’ฉๅญๅˆ—่กจ
hooks.after ๆ‰ง่กŒๅŽ้’ฉๅญๅˆ—่กจ

้’ฉๅญ็ณป็ปŸ (Hooks)

้’ฉๅญๆ˜ฏๅœจ็ฎก็บฟ้˜ถๆฎตๆ‰ง่กŒๅ‰ๅŽๆ’ๅ…ฅ็š„ๆ‰ฉๅฑ•็‚น๏ผŒ็”จไบŽๅœจไธไฟฎๆ”น้˜ถๆฎตๆ’ไปถ็š„ๆƒ…ๅ†ตไธ‹ๅขžๅผบ็ฎก็บฟ่ƒฝๅŠ›ใ€‚

ๅ†…็ฝฎ้’ฉๅญ

้’ฉๅญ ID ๆŒ‚่ฝฝ็‚น ๅŠŸ่ƒฝ ้…็ฝฎๅ‚ๆ•ฐ
intelligence.trending_inject before.generation ไปŽ็ŸฅไนŽ/ๅพฎๅš่Žทๅ–็ƒญ็‚น่ฏ้ข˜๏ผŒๆณจๅ…ฅ็”ŸๆˆไธŠไธ‹ๆ–‡ source: zhihu / weibo
safety.prompt_guard before.generation ๆฃ€ๆŸฅ็”Ÿๆˆ็Žฏๅขƒๆ˜ฏๅฆๅฎŒๅค‡๏ผˆๅฆ‚ไบบ่ฎพๅผ•ๆ“Žๆ˜ฏๅฆๅญ˜ๅœจ๏ผ‰ ๆ— 
intelligence.seo_analyze after.generation ๅˆ†ๆžๅ†…ๅฎนๅญ—ๆ•ฐใ€ๅฏ่ฏปๆ€งใ€ๅ…ณ้”ฎ่ฏๅฏ†ๅบฆ็ญ‰ SEO ๆŒ‡ๆ ‡ ๆ— 
safety.content_scan after.generation ๆ‰ซๆ็”Ÿๆˆๅ†…ๅฎนไธญ็š„ๅฑ่”ฝ่ฏ ๆ— 
media.image_gen before.publish ่ฐƒ็”จ DALL-E ็”Ÿๆˆๅฐ้ขๅ’Œๅ†…ๆ–‡้…ๅ›พ provider, style, count, cover
webhook.notify after.publish ็ฎก็บฟๅฎŒๆˆๅŽๅ‘้€ HTTP ้€š็Ÿฅ๏ผˆHMAC-SHA256 ็ญพๅ๏ผ‰ ไปŽ config.yaml ่ฏปๅ– webhooks ้…็ฝฎ

ๅœจ Pipeline ไธญ้…็ฝฎ้’ฉๅญ

้’ฉๅญๅœจ Pipeline ็š„ hooks ๅญ—ๆฎตไธญ้…็ฝฎ๏ผŒๅˆ†ไธบ before ๅ’Œ after๏ผš

stages:
  - plugin: generation.article
    hooks:
      before:
        - hook: intelligence.trending_inject
          config: { source: zhihu }       # ไผ ็ป™้’ฉๅญ็š„้…็ฝฎ
        - hook: safety.prompt_guard
      after:
        - hook: intelligence.seo_analyze
        - hook: safety.content_scan

Webhook ้…็ฝฎ

Webhook ้€š็Ÿฅ้’ฉๅญไปŽๅ…จๅฑ€้…็ฝฎ่ฏปๅ–็›ฎๆ ‡ๅœฐๅ€๏ผš

# ~/.iperson/config.yaml
webhooks:
  - url: https://your-server.com/pipeline/notify
    secret: your-hmac-secret

้€š็Ÿฅ payload ๆ ผๅผ๏ผš

{
  "event": "pipeline.complete",
  "topic": "ไฝ ็š„้€‰้ข˜",
  "status": "completed",
  "content_id": "xxx",
  "errors": []
}

่ฏทๆฑ‚ๅคดๆบๅธฆ X-Webhook-Signature: <sha256-hex> ็”จไบŽ้ชŒ็ญพใ€‚

่‡ชๅฎšไน‰้’ฉๅญ

ๅฐ†็ปงๆ‰ฟ BaseHook ็š„ .py ๆ–‡ไปถๆ”พๅ…ฅ ~/.iperson/plugins/๏ผŒ็ณป็ปŸ่‡ชๅŠจๅŠ ่ฝฝ๏ผš

# ~/.iperson/plugins/my_hook.py
from iperson.pipeline.hook import BaseHook, HookContext

class MyCustomHook(BaseHook):
    hook_id = "custom.my_hook"
    hook_point = "after.generation"       # ๆŒ‚่ฝฝ็‚น
    name = "My Custom Hook"
    description = "Does something useful"

    async def execute(self, ctx: HookContext) -> HookContext:
        # ่ฏปๅ–้…็ฝฎ๏ผˆๆฅ่‡ช pipeline ไธญ hooks ๅญ—ๆฎต็š„ config๏ผ‰
        param = ctx.config.get("param", "default")
        # ๆ“ไฝœ็ฎก็บฟไธŠไธ‹ๆ–‡
        ctx.pipeline_ctx.data["my_result"] = param
        return ctx

ๆŸฅ็œ‹ๅทฒๅฎ‰่ฃ…็š„้’ฉๅญ

iperson plugin list-plugins

ๅŒๆ—ถๅˆ—ๅ‡บๅทฒๆณจๅ†Œ็š„ๆ’ไปถๅ’Œ้’ฉๅญใ€‚


ๆ’ไปถ็ฎก็†

ๅ†…็ฝฎๆ’ไปถ

ๆ’ไปถ ID ้˜ถๆฎต ๅŠŸ่ƒฝ
research.kb_retrieve Research ไปŽ็Ÿฅ่ฏ†ๅบ“ๆฃ€็ดข Top-K ็›ธๅ…ณ็ด ๆ
generation.article Generation ็ป“ๅˆไบบ่ฎพไธŽ็ด ๆ็”Ÿๆˆๆ–‡็ซ ๆญฃๆ–‡
quality.humanizer Quality AI ็—•่ฟนๆทกๅŒ–๏ผˆๆฃ€ๆต‹ โ†’ ่ฏ„ๅˆ† โ†’ ๆ”นๅ†™๏ผ‰
quality.audit Quality ๅคš็ปดๅบฆ่ดจ้‡ๅฎกๆ ธ
publish.multiplatform Publish ๅคšๅนณๅฐๆ ผๅผ้€‚้…ไธŽๅ†…ๅฎนๅฏผๅ‡บ

ๅฎ‰่ฃ…็ฌฌไธ‰ๆ–นๆ’ไปถ

# ไปŽ pip ๅฎ‰่ฃ…๏ผˆๅŒ…ๅ้œ€ไปฅ iperson_plugin_ ๅผ€ๅคด๏ผ‰
iperson plugin install iperson_plugin_xxx

# ๅธ่ฝฝ
iperson plugin remove iperson_plugin_xxx

# ๆŸฅ็œ‹ๅทฒๅฎ‰่ฃ…็š„ๆ’ไปถๅ’Œ้’ฉๅญ
iperson plugin list-plugins

ๅผ€ๅ‘่‡ชๅฎšไน‰ๆ’ไปถ

ๅฐ†ๆ–‡ไปถๆ”พๅ…ฅ ~/.iperson/plugins/ ๅณๅฏ่‡ชๅŠจๅŠ ่ฝฝ๏ผš

# ~/.iperson/plugins/my_plugin.py
from iperson.pipeline.context import PipelineContext
from iperson.pipeline.plugin import StagePlugin

class MyPlugin(StagePlugin):
    plugin_id = "custom.my_plugin"
    name = "My Plugin"
    description = "Custom pipeline stage"
    category = "quality"
    version = "1.0.0"
    tags = ["custom"]
    config_schema = {}
    default_config = {}

    def execute(self, ctx: PipelineContext, config: dict) -> PipelineContext:
        # ๅฎž็Žฐไฝ ็š„้˜ถๆฎต้€ป่พ‘
        return ctx

็„ถๅŽๅœจ Pipeline ไธญๅผ•็”จ๏ผš

stages:
  - plugin: custom.my_plugin
    config:
      your_param: value

CLI ๅ‘ฝไปคๅ‚่€ƒ

ๅ‘ฝไปค ่ฏดๆ˜Ž
iperson publish run ่ฟ่กŒๅ†…ๅฎน็”Ÿไบง็ฎก็บฟ๏ผŒๆ”ฏๆŒ่‡ชๅŠจ้€‰้ข˜๏ผˆๆ ธๅฟƒๅ‘ฝไปค๏ผ‰
iperson publish status ๆŸฅ็œ‹ๅ‘ๅธƒ้˜Ÿๅˆ—็Šถๆ€
iperson publish schedule ่ฎพ็ฝฎๅฎšๆ—ถๅ‘ๅธƒ
iperson publish retry ้‡่ฏ•ๅคฑ่ดฅ็š„ๅ‘ๅธƒ
iperson kb import ๅฏผๅ…ฅๆ–‡ๆกฃๅˆฐ็Ÿฅ่ฏ†ๅบ“
iperson kb search ๆททๅˆๆฃ€็ดข็Ÿฅ่ฏ†ๅบ“
iperson persona create ๅˆ›ๅปบ/็ผ–่พ‘ๅˆ›ไฝœ่€…ไบบ่ฎพ
iperson persona list ๅˆ—ๅ‡บๅทฒไฟๅญ˜็š„ไบบ่ฎพ
iperson audit report ๆŸฅ็œ‹่ดจ้‡ๅฎกๆ ธๆŠฅๅ‘Š
iperson analytics collect ่ฎฐๅฝ•ๅ†…ๅฎน่กจ็Žฐๆ•ฐๆฎ
iperson analytics report ๆŸฅ็œ‹ๅ†…ๅฎน่กจ็Žฐๅˆ†ๆž
iperson topics suggest ๅŸบไบŽ KB ๅ’Œๅˆ†ๆžๆ•ฐๆฎๆŽจ่้€‰้ข˜
iperson agent run ่ฟ่กŒๅ•ๆฌก่‡ชไธปๅ†…ๅฎน็”Ÿๆˆ
iperson agent auto ่‡ชๅŠจ้€‰้ข˜ๅนถ็”Ÿๆˆ N ็ฏ‡ๅ†…ๅฎน
iperson tuning analyze ๅˆ†ๆžไบบ่ฎพ้ฃŽๆ ผๅนถ็ป™ๅ‡บ่ฐƒไผ˜ๅปบ่ฎฎ
iperson plugin list-plugins ๅˆ—ๅ‡บๅทฒๅฎ‰่ฃ…็š„ๆ’ไปถๅ’Œ้’ฉๅญ
iperson plugin install ไปŽ pip ๅฎ‰่ฃ…ๆ’ไปถ
iperson plugin remove ๅธ่ฝฝ pip ๆ’ไปถ
iperson --version ๆŸฅ็œ‹็‰ˆๆœฌๅท

iperson publish run ๅฎŒๆ•ด้€‰้กน

iperson publish run [TOPIC]                  # ๅ†…ๅฎนไธป้ข˜๏ผˆๅฏ้€‰๏ผŒ็•™็ฉบๅˆ™่‡ชๅŠจ้€‰้ข˜๏ผ‰
  --persona, -p    <name>                    # ไบบ่ฎพๅ็งฐ
  --platform       <name>                    # ็›ฎๆ ‡ๅนณๅฐ๏ผŒ้ป˜่ฎค "xiaohongshu"
  --verbose                                  # ๆ˜พ็คบ่ฏฆ็ป†่พ“ๅ‡บ๏ผˆๅซๆ’ไปถๆณจๅ†Œใ€้˜ถๆฎต่€—ๆ—ถใ€ๅ†…ๅฎน้ข„่งˆ็ญ‰๏ผ‰

็ฎก็บฟๆžถๆž„

ๅ†…ๅฎน็”Ÿไบง้‡‡็”จ LangGraph ็ผ–ๆŽ’ ๆžถๆž„๏ผŒๆฏไธช้˜ถๆฎตๆ˜ฏไธ€ไธช Node๏ผŒNode ๆ”ฏๆŒ pre/post hook ๆŒ‚่ฝฝ๏ผš

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                       Pipeline                              โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”     โ”‚
โ”‚  โ”‚   Research   โ”‚โ†’ โ”‚    Topic     โ”‚โ†’ โ”‚  Generation  โ”‚     โ”‚
โ”‚  โ”‚   ็ด ๆๆฃ€็ดข     โ”‚  โ”‚   Selection  โ”‚  โ”‚   ๅ†…ๅฎน็”Ÿๆˆ     โ”‚     โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜     โ”‚
โ”‚                                              โ”‚              โ”‚
โ”‚                                        post-hook           โ”‚
โ”‚                                              โ”‚              โ”‚
โ”‚                                    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”‚
โ”‚                                    โ”‚  quality.humanizerโ”‚    โ”‚
โ”‚                                    โ”‚  AI็—•่ฟนๆทกๅŒ–       โ”‚    โ”‚
โ”‚                                    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ”‚
โ”‚                                              โ”‚              โ”‚
โ”‚                                              โ–ผ              โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”     โ”‚
โ”‚  โ”‚   Publish    โ”‚โ† โ”‚  pre-hook    โ”‚โ† โ”‚  Generation  โ”‚     โ”‚
โ”‚  โ”‚  ๅคšๅนณๅฐๅ‘ๅธƒ    โ”‚  โ”‚ platformize  โ”‚  โ”‚  (่พ“ๅ‡บ)       โ”‚     โ”‚
โ”‚  โ”‚              โ”‚  โ”‚ ๅนณๅฐๅŒ–้€‚้…    โ”‚  โ”‚              โ”‚     โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜     โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

ๅ†…็ฝฎ Node

้€‰้ข˜๏ผˆTopic Selection๏ผ‰้€š่ฟ‡ pipeline-level topic_selection: true ๅผ€ๅ…ณๆŽงๅˆถ๏ผŒไธ็”ฑ Node ๆ‰ง่กŒใ€‚

Node ID ่ฏดๆ˜Ž
Research research.kb_retrieve ไปŽ็Ÿฅ่ฏ†ๅบ“ๆฃ€็ดข Top-K ็›ธๅ…ณ็ด ๆ
Generation generation.article ็ป“ๅˆไบบ่ฎพไธŽ็ด ๆ็”Ÿๆˆๆ–‡็ซ ๆญฃๆ–‡
Topic Selection pipeline.topic_selection (flag) ่‡ชๅŠจ้€‰้ข˜๏ผˆไบบ่ฎพ+KBๅŒน้…๏ผŒPipeline ็บงๅˆซๅผ€ๅ…ณ๏ผ‰
Publish publish.multiplatform ๅคšๅนณๅฐๆ ผๅผ้€‚้…ไธŽๅ†…ๅฎนๅฏผๅ‡บ

ๅ†…็ฝฎ Hook

Hook ๆŒ‚่ฝฝ็‚น ่ฏดๆ˜Ž
quality.humanizer after.generate AI ็—•่ฟนๆทกๅŒ–๏ผˆๆฃ€ๆต‹ โ†’ ่ฏ„ๅˆ† โ†’ ๆ”นๅ†™่ฟญไปฃ๏ผ‰
quality.platformize before.publish ๆŒ‰ๅนณๅฐ้ฃŽๆ ผๆ”นๅ†™ๅ†…ๅฎน
intelligence.trending_inject before.generate ็ƒญ็‚น่ฏ้ข˜ๆณจๅ…ฅ็”ŸๆˆไธŠไธ‹ๆ–‡
safety.prompt_guard before.generate ็”Ÿๆˆๅ‰ๅฎ‰ๅ…จๆฃ€ๆŸฅ
intelligence.seo_analyze after.generate SEO ๅˆ†ๆž
safety.content_scan after.generate ๅ†…ๅฎนๆ•ๆ„Ÿ่ฏๆ‰ซๆ
media.image_gen before.publish ่‡ชๅŠจ้…ๅ›พ
webhook.notify after.publish ็ฎก็บฟๅฎŒๆˆ้€š็Ÿฅ

็ฎก็บฟๆ”ฏๆŒ CircuitBreaker ็†”ๆ–ญไฟๆŠคใ€Pipeline ้ข„ๆ ก้ชŒใ€on_error ็ญ–็•ฅ๏ผˆabort/skip๏ผ‰ใ€‚

Pipelines๏ผˆๅ†…ๅฎน็ฎก็บฟ๏ผ‰

้€š่ฟ‡ YAML ็ผ–ๆŽ’ๅ„้˜ถๆฎตๆ’ไปถๅŠๅ…ถ้…็ฝฎใ€‚ๅ†…็ฝฎไธ€ๅฅ—้€š็”จ Pipeline๏ผŒๅทฎๅผ‚ๅŒ–้€š่ฟ‡ hook ้…็ฝฎๅฎž็Žฐ๏ผš

  • ้ป˜่ฎค็ฎก็บฟ (default.yaml) โ€” KBๆœ็ดข(10ๆก) โ†’ ่‡ชๅŠจ้€‰้ข˜(ไบบ่ฎพๅŒน้…) โ†’ ็”Ÿๆˆ โ†’ ไบบๅ‘ณๅŒ– โ†’ ๅนณๅฐๅŒ–้€‚้… โ†’ ๅคšๅนณๅฐๅ‘ๅธƒ

Pipeline ็คบไพ‹๏ผˆdefault.yaml๏ผ‰๏ผš

name: "default"
description: "้€š็”จๅ†…ๅฎน็ฎก็บฟ"
topic_selection: true
nodes:
  - id: research
    node: research.kb_retrieve
    config:
      top_k: 10
  - id: generate
    node: generation.article
    hooks:
      after:
        - hook: quality.humanizer
          config:
            min_score: 0.35
            max_iterations: 2
  - id: publish
    node: publish.multiplatform
    hooks:
      before:
        - hook: quality.platformize
          config:
            platforms: [xiaohongshu, wechat, zhihu]
    config:
      platforms: [xiaohongshu, wechat, zhihu]

ๅŠŸ่ƒฝๆจกๅ—

็Ÿฅ่ฏ†ๅบ“ (iperson kb)

ๅŸบไบŽ SQLite ็š„่ฝป้‡็บง็Ÿฅ่ฏ†ๅบ“๏ผŒๆ”ฏๆŒ BM25 ๅ…จๆ–‡ๆฃ€็ดข๏ผš

  • kb import <path> โ€” ๅฏผๅ…ฅๆ–‡ๆกฃ๏ผˆๆ”ฏๆŒ .txt, .md, .py ็ญ‰๏ผ‰๏ผŒ่‡ชๅŠจๅˆ†ๅ—ไธŽ็ดขๅผ•
  • kb search <query> โ€” ๆฃ€็ดข็Ÿฅ่ฏ†ๅบ“๏ผˆBM25 ๅ…จๆ–‡ๆœ็ดข๏ผ‰
  • ๅบ•ๅฑ‚็ป„ไปถ๏ผšchunker๏ผˆๆ–‡ๆœฌๅˆ†ๅ—๏ผ‰ใ€loader๏ผˆๆ–‡ไปถๅŠ ่ฝฝ๏ผ‰ใ€bm25๏ผˆๅ…จๆ–‡็ดขๅผ•๏ผ‰

ไบบ่ฎพๅผ•ๆ“Ž (iperson persona)

ไบบ่ฎพๆ˜ฏๅˆ›ไฝœ่€…็š„ๆ•ฐๅญ—็ต้ญ‚๏ผŒๅฎšไน‰็”Ÿๆˆๅ†…ๅฎน็š„้ฃŽๆ ผไธŽ่ฏญๆฐ”ใ€‚ๆฏไธชไบบ่ฎพๆ˜ฏไธ€ไธช็›ฎๅฝ•๏ผš

~/.iperson/personas/{name}/
โ”œโ”€โ”€ soul.md       # ไบบ่ฎพ็ต้ญ‚๏ผˆMarkdown๏ผŒ็›ดๆŽฅไฝœไธบ LLM ็ณป็ปŸๆ็คบ๏ผ‰
โ””โ”€โ”€ config.yaml   # ้…็ฝฎ๏ผˆๅฆ‚ is_active๏ผ‰

soul.md ๆ˜ฏ่‡ช็”ฑๆ ผๅผ็š„ Markdown๏ผŒๆ่ฟฐไฝ ็š„ๅ†™ไฝœ้ฃŽๆ ผใ€่ฏญๆฐ”ใ€ๅ…ณๆณจ้ข†ๅŸŸ็ญ‰๏ผŒๅ†…ๅฎน็›ดๆŽฅไฝœไธบ LLM ็ณป็ปŸๆ็คบ๏ผš

# ็ง‘ๆŠ€ๅšไธปๅฐๆ˜Ž ็š„ไบบ่ฎพ็ต้ญ‚

## ๅŸบๆœฌๅฎšไฝ
็ง‘ๆŠ€้ข†ๅŸŸๆทฑๅบฆๅ†…ๅฎนๅˆ›ไฝœ่€…๏ผŒไธ“ๆณจ AI ๅ’Œ็ผ–็จ‹ใ€‚

## ่ฏญๆฐ”้ฃŽๆ ผ
- ไธ“ไธšไฝ†ไธๆžฏ็‡ฅ
- ๆ•ฐๆฎ้ฉฑๅŠจ๏ผŒๆฏ่ง‚็‚นๅฟ…ๆœ‰ไพๆฎ
- ๅ–„็”จ็ฑปๆฏ”่งฃ้‡Šๅคๆ‚ๆฆ‚ๅฟต

## ๅ†™ไฝœ่ง„่Œƒ
- ๅผ€ๅคด็›ดๆŽฅๅˆ‡ๅ…ฅไธป้ข˜
- ๅคš็”จ็Ÿญๅฅ๏ผŒๆฎต่ฝไธ่ถ…่ฟ‡ 5 ่กŒ
- ้ฟๅ… AI ๅฅ—่ฏ
# ๅˆ›ๅปบไบบ่ฎพ๏ผˆไผš็”Ÿๆˆ soul.md ๆจกๆฟ๏ผ‰
iperson persona create ็ง‘ๆŠ€ๅšไธปๅฐๆ˜Ž

# ็ผ–่พ‘ไบบ่ฎพ
vim ~/.iperson/personas/็ง‘ๆŠ€ๅšไธปๅฐๆ˜Ž/soul.md

# ๅˆ—ๅ‡บๆ‰€ๆœ‰ไบบ่ฎพ
iperson persona list

ๅ†…ๅฎน็”Ÿๆˆ (generation.article)

ๅŸบไบŽ LangChain ่ฐƒ็”จ LLM๏ผŒ็ป“ๅˆไบบ่ฎพๅผ•ๆ“Žๆž„ๅปบ็š„ System Prompt ๅ’Œ็Ÿฅ่ฏ†ๅบ“ไธŠไธ‹ๆ–‡็”Ÿๆˆๆ–‡็ซ ๏ผš

  • ๆ”ฏๆŒ OpenAI / Anthropic ๅŒๆไพ›ๅ•†๏ผŒ่‡ชๅŠจ่ทฏ็”ฑ
  • ๆฏ้˜ถๆฎตๅฏ็‹ฌ็ซ‹้…็ฝฎ provider + model + temperature
  • LLM ๅฎžไพ‹่‡ชๅŠจ LRU ็ผ“ๅญ˜๏ผŒ้ฟๅ…้‡ๅคๅˆ›ๅปบ

AI ็—•่ฟนๆทกๅŒ– (quality.humanizer)

ไธ‰ๆฎตๅผ็ฎก็บฟ๏ผšๆฃ€ๆต‹ AI ๆจกๅผ โ†’ ่ฏ„ๅˆ† โ†’ ๆ”นๅ†™้‡่ฏ•๏ผš

  • Detector๏ผš่ฏ†ๅˆซ AI ็”Ÿๆˆๆ–‡ๆœฌ็š„ๆจกๅผ็‰นๅพ๏ผˆๆŽ’ๆฏ”ๅฅใ€่ฟ‡ๆธก่ฏใ€ๆจกๆฟๅŒ–่กจ่พพ็ญ‰๏ผ‰
  • Scorer๏ผšๅฏนๆฃ€ๆต‹็ป“ๆžœๆ‰“ๅˆ†๏ผˆ0~1๏ผ‰๏ผŒไฝŽไบŽ้˜ˆๅ€ผ่งฆๅ‘ๆ”นๅ†™
  • Transformer๏ผš็ป“ๅˆไบบ่ฎพๅผ•ๆ“Ž็š„ tone instruction ่ฟ›่กŒๆ”นๅ†™๏ผŒไฟ็•™ๅŽŸๆ–‡ไฟกๆฏ้‡

่ดจ้‡ๅฎกๆ ธ (quality.audit)

ไปŽ 6 ไธช็ปดๅบฆๅฏน็”Ÿๆˆๅ†…ๅฎน่ฟ›่กŒ่ฏ„ๅˆ†๏ผˆ0~1๏ผ‰๏ผš

็ปดๅบฆ ่ฏดๆ˜Ž
keyword_fit ๅ…ณ้”ฎ่ฏๅˆ่ง„ โ€” ๆ•ๆ„Ÿ่ฏ/็ฆ็”จ่ฏๆฃ€ๆต‹
structure ็ป“ๆž„่ดจ้‡ โ€” ๆฎต่ฝใ€ๆ ‡้ข˜ใ€้€ป่พ‘็ป“ๆž„
platform_rules ๅนณๅฐ่ง„ๅˆ™ โ€” ๅ„ๅนณๅฐๅˆ่ง„่ฆๆฑ‚
ai_score AI ๆต“ๅบฆ โ€” AI ็—•่ฟน่ฏ„ๅˆ†๏ผˆ่ถŠไฝŽ่ถŠๅฅฝ๏ผ‰
style_consistency ้ฃŽๆ ผไธ€่‡ด โ€” ๆ˜ฏๅฆๅŒน้…ไบบ่ฎพ้ฃŽๆ ผ
grounding ไบ‹ๅฎžไพๆฎ โ€” ๅ†…ๅฎนๆ˜ฏๅฆๅ็ฆป็Ÿฅ่ฏ†ๅบ“็ด ๆ

ๅฎกๆ ธ็ป“ๆžœไปฅ JSON ๆŠฅๅ‘Š่พ“ๅ‡บๅˆฐ output/{timestamp}-{topic}/audit_report.jsonใ€‚

ๅคšๅนณๅฐๅ‘ๅธƒ (publish.multiplatform)

ๅŸบไบŽ Pipeline ็ผ–ๆŽ’็š„ๆœ€็ปˆ้˜ถๆฎต๏ผŒๅฐ†็”Ÿๆˆๅ†…ๅฎน้€‚้…ไธบ็›ฎๆ ‡ๅนณๅฐๆ ผๅผ๏ผš

  • ๆ”ฏๆŒๅฐ็บขไนฆ๏ผˆxiaohongshu๏ผ‰ใ€ๅพฎไฟกๅ…ฌไผ—ๅท๏ผˆwechat๏ผ‰ใ€็ŸฅไนŽ๏ผˆzhihu๏ผ‰
  • ๅนณๅฐๅ†…ๅฎน่พ“ๅ‡บๅˆฐ output/{timestamp}-{topic}/platforms/{platform}.md
  • ็ฎก็บฟไธŠไธ‹ๆ–‡ไผ ้€’ใ€ๆ‰ง่กŒ่€—ๆ—ถ่ฟฝ่ธชใ€้”™่ฏฏๅค„็†๏ผˆๅซ้‡่ฏ•ๆœบๅˆถ๏ผ‰

่พ“ๅ‡บ็›ฎๅฝ•็ป“ๆž„

~/.iperson/
โ”œโ”€โ”€ config.yaml              # ๅ…จๅฑ€้…็ฝฎ
โ”œโ”€โ”€ data/
โ”‚   โ””โ”€โ”€ iperson.db           # SQLite ๆ•ฐๆฎๅบ“
โ”œโ”€โ”€ personas/                 # ไบบ่ฎพ็›ฎๅฝ•
โ”‚   โ””โ”€โ”€ {name}/
โ”‚       โ”œโ”€โ”€ soul.md          # ไบบ่ฎพ็ต้ญ‚
โ”‚       โ””โ”€โ”€ config.yaml      # ไบบ่ฎพ้…็ฝฎ
โ””โ”€โ”€ output/                   # ็ฎก็บฟ่พ“ๅ‡บ
    โ””โ”€โ”€ {timestamp}-{topic}/
        โ”œโ”€โ”€ article.md                 # ๅŽŸๅง‹็”Ÿๆˆๅ†…ๅฎน
        โ”œโ”€โ”€ humanized_article.md        # ไบบๅ‘ณๅŒ–ๅŽๅ†…ๅฎน
        โ”œโ”€โ”€ audit_report.json          # ๅฎกๆ ธ็ป“ๆžœ
        โ””โ”€โ”€ platforms/
            โ”œโ”€โ”€ xiaohongshu.md
            โ”œโ”€โ”€ wechat.md
            โ””โ”€โ”€ zhihu.md

ๆ•ฐๆฎๆŒไน…ๅŒ–

SQLite ๆ•ฐๆฎๅบ“๏ผˆ~/.iperson/data/iperson.db๏ผ‰ๅŒ…ๅซไปฅไธ‹่กจ๏ผš

่กจๅ ่ฏดๆ˜Ž
contents ๅ†…ๅฎน่ฎฐๅฝ•๏ผˆๅซ่‰็จฟใ€็ปˆ็จฟใ€ๅฎกๆ ธๅˆ†ๆ•ฐ๏ผ‰
publications ๅ‘ๅธƒ่ฎฐๅฝ•๏ผˆๅนณๅฐใ€็Šถๆ€ใ€ๆ—ถ้—ด๏ผ‰
kb_docs ็Ÿฅ่ฏ†ๅบ“ๆ–‡ๆกฃ
kb_chunks ๆ–‡ๆกฃๅˆ†ๅ—
content_metrics ๅ†…ๅฎน่กจ็Žฐๆ•ฐๆฎ๏ผˆ้˜…่ฏป/็‚น่ตž/ๅˆ†ไบซ/่ฏ„่ฎบ๏ผ‰

ๆŠ€ๆœฏๆ ˆ

ๅฑ‚ ๆŠ€ๆœฏ
่ฏญ่จ€ Python 3.12+
CLI ๆก†ๆžถ Typer + Rich
ๅญ˜ๅ‚จ SQLite (Pydantic ๆจกๅž‹)
AI LangChain (OpenAI / Anthropic / Gemini)
ๆœ็ดข BM25 ๅ…จๆ–‡ๆœ็ดข
้…็ฝฎ YAML + ็Žฏๅขƒๅ˜้‡่ฆ†็›–
ๆต‹่ฏ• pytest, pytest-asyncio
ๆž„ๅปบ uv + Hatchling

ๆต‹่ฏ•

# ่ฟ่กŒๅ…จ้ƒจๆต‹่ฏ•
uv run pytest

# ๅธฆ่ฆ†็›–็އๆŠฅๅ‘Š
uv run pytest --cov=iperson

# ่ฟ่กŒ็‰นๅฎšๆต‹่ฏ•
uv run pytest tests/test_pipeline.py -v
uv run pytest tests/test_audit_gate.py -v

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

ๅผ€ๅ‘

# ๅฎ‰่ฃ…ๅผ€ๅ‘ไพ่ต–๏ผˆๅซๆ‰€ๆœ‰ extras๏ผ‰
uv sync --all-extras

# ่ฟ่กŒๆต‹่ฏ•
uv run pytest

# ไปฃ็ ๆฃ€ๆŸฅ
uv run ruff check .
uv run mypy iperson/

# ่ฟ่กŒ็ฎก็บฟ๏ผˆ่‡ชๅŠจ้€‰้ข˜ๆจกๅผ๏ผ‰
uv run iperson publish run --verbose

# ๆˆ–ๆŒ‡ๅฎš้€‰้ข˜
uv run iperson publish run "็คบไพ‹้€‰้ข˜" --verbose

้กน็›ฎ็ป“ๆž„

iperson/
โ”œโ”€โ”€ pyproject.toml              # ้กน็›ฎๅ…ƒๆ•ฐๆฎไธŽไพ่ต–
โ”œโ”€โ”€ tests/                      # ๆต‹่ฏ•ๅฅ—ไปถ๏ผˆ22 ไธชๆต‹่ฏ•ๆ–‡ไปถ๏ผ‰
โ”œโ”€โ”€ iperson/
โ”‚   โ”œโ”€โ”€ cli/                    # CLI ๅ…ฅๅฃ
โ”‚   โ”‚   โ”œโ”€โ”€ app.py             # Typer ๅบ”็”จไธปๅ…ฅๅฃ
โ”‚   โ”‚   โ”œโ”€โ”€ publish_cmd.py     # publish ๅ‘ฝไปค็ป„๏ผˆrun/status/schedule/retry๏ผ‰
โ”‚   โ”‚   โ”œโ”€โ”€ kb_cmd.py          # kb ๅ‘ฝไปค็ป„
โ”‚   โ”‚   โ”œโ”€โ”€ persona_cmd.py     # persona ๅ‘ฝไปค็ป„
โ”‚   โ”‚   โ”œโ”€โ”€ audit_cmd.py       # audit ๅ‘ฝไปค็ป„
โ”‚   โ”‚   โ”œโ”€โ”€ agent_cmd.py       # agent ๅ‘ฝไปค็ป„
โ”‚   โ”‚   โ”œโ”€โ”€ analytics_cmd.py   # analytics ๅ‘ฝไปค็ป„
โ”‚   โ”‚   โ”œโ”€โ”€ topics_cmd.py      # topics ๅ‘ฝไปค็ป„
โ”‚   โ”‚   โ”œโ”€โ”€ tuning_cmd.py      # tuning ๅ‘ฝไปค็ป„
โ”‚   โ”‚   โ””โ”€โ”€ plugin_cmd.py      # plugin ๅ‘ฝไปค็ป„
โ”‚   โ”œโ”€โ”€ pipeline/               # ็ฎก็บฟๅผ•ๆ“Ž
โ”‚   โ”‚   โ”œโ”€โ”€ orchestrator.py    # PipelineOrchestrator
โ”‚   โ”‚   โ”œโ”€โ”€ context.py         # PipelineContext๏ผˆ็Šถๆ€ไผ ้€’๏ผ‰
โ”‚   โ”‚   โ”œโ”€โ”€ pipeline.py          # Pipeline ๅŠ ่ฝฝไธŽ้ชŒ่ฏ
โ”‚   โ”‚   โ”œโ”€โ”€ registry.py        # ๆ’ไปถๆณจๅ†Œ่กจ
โ”‚   โ”‚   โ”œโ”€โ”€ plugin.py          # StagePlugin ๅŸบ็ฑป
โ”‚   โ”‚   โ”œโ”€โ”€ loader.py          # FilePluginLoader / PipPluginLoader
โ”‚   โ”‚   โ”œโ”€โ”€ hook.py            # BaseHook / HookRegistry
โ”‚   โ”‚   โ”œโ”€โ”€ hook_orchestrator.py # HookOrchestrator
โ”‚   โ”‚   โ”œโ”€โ”€ circuit_breaker.py # ็†”ๆ–ญไฟๆŠค
โ”‚   โ”‚   โ”œโ”€โ”€ errors.py          # PipelineError
โ”‚   โ”‚   โ”œโ”€โ”€ plugins/           # ๅ†…็ฝฎๆ’ไปถๅฎž็Žฐ
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ research/kb_retrieve.py
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ generation/article.py
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ quality/audit.py
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ quality/humanizer.py
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ publish/multiplatform.py
โ”‚   โ”‚   โ””โ”€โ”€ hooks/             # ๅ†…็ฝฎ้’ฉๅญๅฎž็Žฐ
โ”‚   โ”‚       โ”œโ”€โ”€ trending_inject.py
โ”‚   โ”‚       โ”œโ”€โ”€ prompt_guard.py
โ”‚   โ”‚       โ”œโ”€โ”€ seo_analyze.py
โ”‚   โ”‚       โ”œโ”€โ”€ content_scan.py
โ”‚   โ”‚       โ”œโ”€โ”€ image_gen.py
โ”‚   โ”‚       โ””โ”€โ”€ webhook_notify.py
โ”‚   โ”œโ”€โ”€ core/                   # ๆ ธๅฟƒไธšๅŠก้€ป่พ‘
โ”‚   โ”‚   โ”œโ”€โ”€ persona/           # ไบบ่ฎพๅผ•ๆ“Ž
โ”‚   โ”‚   โ”œโ”€โ”€ kb/                # ็Ÿฅ่ฏ†ๅบ“๏ผˆๅˆ†ๅ—/ๅŠ ่ฝฝ/ๅ‘้‡/BM25/ๆททๅˆๆœ็ดข๏ผ‰
โ”‚   โ”‚   โ”œโ”€โ”€ generation/        # ๅ†…ๅฎน็”Ÿๆˆ
โ”‚   โ”‚   โ”œโ”€โ”€ humanizer/         # AI ็—•่ฟนๆทกๅŒ–
โ”‚   โ”‚   โ”œโ”€โ”€ audit/             # ่ดจ้‡ๅฎกๆ ธ๏ผˆ6 ็ปดๅบฆ๏ผ‰
โ”‚   โ”‚   โ”œโ”€โ”€ media/             # ๅ›พๅƒ็”Ÿๆˆ
โ”‚   โ”‚   โ”œโ”€โ”€ output/            # ่พ“ๅ‡บ Pydantic ๆจกๅž‹
โ”‚   โ”‚   โ””โ”€โ”€ security/          # ๅฑ่”ฝ่ฏๅˆ—่กจ
โ”‚   โ”œโ”€โ”€ agent/                 # ๆ•ฐๅญ—ๅˆ†่บซ่‡ชไธปไปฃ็†
โ”‚   โ”œโ”€โ”€ analytics/             # ๅ†…ๅฎนๅˆ†ๆžๅผ•ๆ“Ž
โ”‚   โ”œโ”€โ”€ topics/                # ้€‰้ข˜ๅปบ่ฎฎๅผ•ๆ“Ž
โ”‚   โ”œโ”€โ”€ tuning/                # ้ฃŽๆ ผ่ฐƒไผ˜ๅผ•ๆ“Ž
โ”‚   โ”œโ”€โ”€ publish/               # ๅ‘ๅธƒๅผ•ๆ“Ž + ๅนณๅฐๅฎขๆˆท็ซฏ
โ”‚   โ”œโ”€โ”€ storage/               # ๆ•ฐๆฎๆŒไน…ๅŒ–๏ผˆSQLite + Pydantic๏ผ‰
โ”‚   โ””โ”€โ”€ utils/                 # ๅทฅๅ…ทๅบ“๏ผˆLLM ๅทฅๅŽ‚ใ€ๆ–‡ไปถ่พ“ๅ‡บ๏ผ‰

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages