qi-agent 0.1.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- qi_agent-0.1.1/.github/workflows/ci.yml +40 -0
- qi_agent-0.1.1/.github/workflows/release.yml +42 -0
- qi_agent-0.1.1/.gitignore +16 -0
- qi_agent-0.1.1/.python-version +1 -0
- qi_agent-0.1.1/CHANGELOG.md +81 -0
- qi_agent-0.1.1/CONTRIBUTING.md +34 -0
- qi_agent-0.1.1/PKG-INFO +206 -0
- qi_agent-0.1.1/README.md +187 -0
- qi_agent-0.1.1/SECURITY.md +30 -0
- qi_agent-0.1.1/docs/adr/0001-four-package-architecture.md +20 -0
- qi_agent-0.1.1/docs/adr/0002-no-tui.md +18 -0
- qi_agent-0.1.1/docs/adr/0003-provider-normalization.md +20 -0
- qi_agent-0.1.1/docs/adr/0004-tool-policy.md +18 -0
- qi_agent-0.1.1/docs/adr/0005-extension-seams.md +18 -0
- qi_agent-0.1.1/docs/adr/0006-resource-loading.md +20 -0
- qi_agent-0.1.1/docs/adr/0007-jsonl-and-sqlite.md +20 -0
- qi_agent-0.1.1/docs/adr/0008-control-plane.md +18 -0
- qi_agent-0.1.1/docs/adr/0009-trust-model.md +18 -0
- qi_agent-0.1.1/docs/adr/0010-atomic-hot-reload.md +19 -0
- qi_agent-0.1.1/docs/adr/0011-live2d-adapter-package.md +27 -0
- qi_agent-0.1.1/docs/adr/0012-local-first-memory-extension.md +43 -0
- qi_agent-0.1.1/docs/adr/0013-two-public-distributions.md +29 -0
- qi_agent-0.1.1/docs/adr/template.md +17 -0
- qi_agent-0.1.1/docs/architecture/agent-loop.md +41 -0
- qi_agent-0.1.1/docs/architecture/compaction.md +19 -0
- qi_agent-0.1.1/docs/architecture/control-plane.md +21 -0
- qi_agent-0.1.1/docs/architecture/extension-host.md +22 -0
- qi_agent-0.1.1/docs/architecture/overview.md +73 -0
- qi_agent-0.1.1/docs/architecture/package-dependencies.md +36 -0
- qi_agent-0.1.1/docs/architecture/run-state-machine.md +26 -0
- qi_agent-0.1.1/docs/architecture/session-tree.md +22 -0
- qi_agent-0.1.1/docs/extensions/capabilities.md +19 -0
- qi_agent-0.1.1/docs/extensions/error-handling.md +15 -0
- qi_agent-0.1.1/docs/extensions/extension-api.md +24 -0
- qi_agent-0.1.1/docs/extensions/hooks.md +15 -0
- qi_agent-0.1.1/docs/extensions/hot-reload.md +16 -0
- qi_agent-0.1.1/docs/extensions/lifecycle.md +23 -0
- qi_agent-0.1.1/docs/extensions/overview.md +30 -0
- qi_agent-0.1.1/docs/extensions/package-format.md +16 -0
- qi_agent-0.1.1/docs/extensions/package-manager.md +61 -0
- qi_agent-0.1.1/docs/extensions/project-trust.md +17 -0
- qi_agent-0.1.1/docs/extensions/resource-loader.md +18 -0
- qi_agent-0.1.1/docs/extensions/state-persistence.md +14 -0
- qi_agent-0.1.1/docs/generated/agent-event.schema.json +52 -0
- qi_agent-0.1.1/docs/generated/extension-manifest.schema.json +51 -0
- qi_agent-0.1.1/docs/generated/live2d-command.schema.json +104 -0
- qi_agent-0.1.1/docs/generated/live2d-event.schema.json +468 -0
- qi_agent-0.1.1/docs/generated/live2d-model-overlay.schema.json +25 -0
- qi_agent-0.1.1/docs/generated/live2d-snapshot.schema.json +88 -0
- qi_agent-0.1.1/docs/generated/memory-record.schema.json +172 -0
- qi_agent-0.1.1/docs/generated/memory-search-result.schema.json +206 -0
- qi_agent-0.1.1/docs/generated/message.schema.json +328 -0
- qi_agent-0.1.1/docs/generated/openapi.json +1880 -0
- qi_agent-0.1.1/docs/generated/session-entry.schema.json +81 -0
- qi_agent-0.1.1/docs/implementation-plan.md +113 -0
- qi_agent-0.1.1/docs/live2d/huimeng-asset-integration.md +103 -0
- qi_agent-0.1.1/docs/live2d/model-assets.md +39 -0
- qi_agent-0.1.1/docs/live2d/overview.md +94 -0
- qi_agent-0.1.1/docs/live2d/package-usage.md +59 -0
- qi_agent-0.1.1/docs/memory/operations.md +39 -0
- qi_agent-0.1.1/docs/memory/research-and-design.md +131 -0
- qi_agent-0.1.1/docs/operations/admin-api.md +50 -0
- qi_agent-0.1.1/docs/operations/backup-and-restore.md +18 -0
- qi_agent-0.1.1/docs/operations/cli.md +46 -0
- qi_agent-0.1.1/docs/operations/configuration.md +53 -0
- qi_agent-0.1.1/docs/operations/database.md +17 -0
- qi_agent-0.1.1/docs/operations/local-development.md +24 -0
- qi_agent-0.1.1/docs/operations/macos-home-tunnel.md +142 -0
- qi_agent-0.1.1/docs/operations/security.md +39 -0
- qi_agent-0.1.1/docs/operations/session-recovery.md +16 -0
- qi_agent-0.1.1/docs/operations/telemetry.md +18 -0
- qi_agent-0.1.1/docs/operations/troubleshooting.md +15 -0
- qi_agent-0.1.1/docs/protocols/admin-events.md +8 -0
- qi_agent-0.1.1/docs/protocols/agent-events.md +68 -0
- qi_agent-0.1.1/docs/protocols/error-codes.md +30 -0
- qi_agent-0.1.1/docs/protocols/extension-manifest.md +20 -0
- qi_agent-0.1.1/docs/protocols/generated-schemas.md +20 -0
- qi_agent-0.1.1/docs/protocols/hook-port.md +10 -0
- qi_agent-0.1.1/docs/protocols/live2d-events.md +34 -0
- qi_agent-0.1.1/docs/protocols/memory-schema.md +66 -0
- qi_agent-0.1.1/docs/protocols/message-schema.md +27 -0
- qi_agent-0.1.1/docs/protocols/provider-events.md +16 -0
- qi_agent-0.1.1/docs/protocols/session-format.md +18 -0
- qi_agent-0.1.1/docs/protocols/tool-contract.md +30 -0
- qi_agent-0.1.1/docs/protocols/website-actions.md +46 -0
- qi_agent-0.1.1/docs/providers/model-capabilities.md +15 -0
- qi_agent-0.1.1/docs/providers/provider-interface.md +51 -0
- qi_agent-0.1.1/docs/roadmap.md +60 -0
- qi_agent-0.1.1/docs/testing/load-testing.md +29 -0
- qi_agent-0.1.1/docs/testing/test-strategy.md +24 -0
- qi_agent-0.1.1/docs/voice/overview.md +33 -0
- qi_agent-0.1.1/examples/custom_provider/main.py +37 -0
- qi_agent-0.1.1/examples/custom_tool/main.py +46 -0
- qi_agent-0.1.1/examples/live2d_agent/browser/README.md +66 -0
- qi_agent-0.1.1/examples/live2d_agent/browser/api-client.js +78 -0
- qi_agent-0.1.1/examples/live2d_agent/browser/index.html +75 -0
- qi_agent-0.1.1/examples/live2d_agent/browser/live2d-client.js +78 -0
- qi_agent-0.1.1/examples/live2d_agent/browser/package-lock.json +2525 -0
- qi_agent-0.1.1/examples/live2d_agent/browser/package.json +23 -0
- qi_agent-0.1.1/examples/live2d_agent/browser/scripts/verify-deployment.mjs +88 -0
- qi_agent-0.1.1/examples/live2d_agent/browser/src/main.js +279 -0
- qi_agent-0.1.1/examples/live2d_agent/browser/src/style.css +296 -0
- qi_agent-0.1.1/examples/live2d_agent/browser/test/api-client.test.js +92 -0
- qi_agent-0.1.1/examples/live2d_agent/browser/test/live2d-client.test.js +151 -0
- qi_agent-0.1.1/examples/live2d_agent/browser/vite.config.js +18 -0
- qi_agent-0.1.1/examples/live2d_agent/huimeng.overlay.json +17 -0
- qi_agent-0.1.1/examples/live2d_agent/main.py +25 -0
- qi_agent-0.1.1/examples/minimal_agent/main.py +21 -0
- qi_agent-0.1.1/examples/permission_gate/extension.py +27 -0
- qi_agent-0.1.1/examples/permission_gate/extension.toml +9 -0
- qi_agent-0.1.1/examples/stateful_extension/extension.py +28 -0
- qi_agent-0.1.1/examples/stateful_extension/extension.toml +9 -0
- qi_agent-0.1.1/packages/qi_agent_core/pyproject.toml +13 -0
- qi_agent-0.1.1/packages/qi_agent_core/src/qi_agent_core/__init__.py +48 -0
- qi_agent-0.1.1/packages/qi_agent_core/src/qi_agent_core/agent.py +731 -0
- qi_agent-0.1.1/packages/qi_agent_core/src/qi_agent_core/approvals.py +35 -0
- qi_agent-0.1.1/packages/qi_agent_core/src/qi_agent_core/events.py +143 -0
- qi_agent-0.1.1/packages/qi_agent_core/src/qi_agent_core/hooks.py +50 -0
- qi_agent-0.1.1/packages/qi_agent_core/src/qi_agent_core/models.py +67 -0
- qi_agent-0.1.1/packages/qi_agent_core/src/qi_agent_core/tools.py +105 -0
- qi_agent-0.1.1/packages/qi_agent_core/tests/test_agent_loop.py +251 -0
- qi_agent-0.1.1/packages/qi_agent_core/tests/test_controls_and_policy.py +174 -0
- qi_agent-0.1.1/packages/qi_agent_core/tests/test_event_hub.py +46 -0
- qi_agent-0.1.1/packages/qi_agent_runtime/pyproject.toml +19 -0
- qi_agent-0.1.1/packages/qi_agent_runtime/src/qi_agent_runtime/__init__.py +127 -0
- qi_agent-0.1.1/packages/qi_agent_runtime/src/qi_agent_runtime/capabilities.py +165 -0
- qi_agent-0.1.1/packages/qi_agent_runtime/src/qi_agent_runtime/extensions.py +520 -0
- qi_agent-0.1.1/packages/qi_agent_runtime/src/qi_agent_runtime/hooks.py +205 -0
- qi_agent-0.1.1/packages/qi_agent_runtime/src/qi_agent_runtime/plugin_packages.py +427 -0
- qi_agent-0.1.1/packages/qi_agent_runtime/src/qi_agent_runtime/resources.py +378 -0
- qi_agent-0.1.1/packages/qi_agent_runtime/src/qi_agent_runtime/runtime.py +439 -0
- qi_agent-0.1.1/packages/qi_agent_runtime/src/qi_agent_runtime/sessions.py +551 -0
- qi_agent-0.1.1/packages/qi_agent_runtime/tests/test_capabilities.py +37 -0
- qi_agent-0.1.1/packages/qi_agent_runtime/tests/test_extensions.py +188 -0
- qi_agent-0.1.1/packages/qi_agent_runtime/tests/test_hooks.py +75 -0
- qi_agent-0.1.1/packages/qi_agent_runtime/tests/test_plugin_packages.py +164 -0
- qi_agent-0.1.1/packages/qi_agent_runtime/tests/test_sessions.py +90 -0
- qi_agent-0.1.1/packages/qi_agent_server/pyproject.toml +30 -0
- qi_agent-0.1.1/packages/qi_agent_server/src/qi_agent_server/__init__.py +41 -0
- qi_agent-0.1.1/packages/qi_agent_server/src/qi_agent_server/app.py +814 -0
- qi_agent-0.1.1/packages/qi_agent_server/src/qi_agent_server/approvals.py +47 -0
- qi_agent-0.1.1/packages/qi_agent_server/src/qi_agent_server/cli.py +549 -0
- qi_agent-0.1.1/packages/qi_agent_server/src/qi_agent_server/config.py +146 -0
- qi_agent-0.1.1/packages/qi_agent_server/src/qi_agent_server/database.py +422 -0
- qi_agent-0.1.1/packages/qi_agent_server/src/qi_agent_server/factory.py +261 -0
- qi_agent-0.1.1/packages/qi_agent_server/src/qi_agent_server/telemetry.py +326 -0
- qi_agent-0.1.1/packages/qi_agent_server/tests/test_cli.py +122 -0
- qi_agent-0.1.1/packages/qi_agent_server/tests/test_database.py +71 -0
- qi_agent-0.1.1/packages/qi_agent_server/tests/test_factory.py +89 -0
- qi_agent-0.1.1/packages/qi_agent_server/tests/test_telemetry.py +102 -0
- qi_agent-0.1.1/packages/qi_agent_server/tests/test_workers.py +30 -0
- qi_agent-0.1.1/packages/qi_ai/pyproject.toml +13 -0
- qi_agent-0.1.1/packages/qi_ai/src/qi_ai/__init__.py +62 -0
- qi_agent-0.1.1/packages/qi_ai/src/qi_ai/provider.py +71 -0
- qi_agent-0.1.1/packages/qi_ai/src/qi_ai/providers/__init__.py +6 -0
- qi_agent-0.1.1/packages/qi_ai/src/qi_ai/providers/_common.py +203 -0
- qi_agent-0.1.1/packages/qi_ai/src/qi_ai/providers/anthropic.py +287 -0
- qi_agent-0.1.1/packages/qi_ai/src/qi_ai/providers/google.py +248 -0
- qi_agent-0.1.1/packages/qi_ai/src/qi_ai/providers/openai_compatible.py +273 -0
- qi_agent-0.1.1/packages/qi_ai/src/qi_ai/providers/testing.py +120 -0
- qi_agent-0.1.1/packages/qi_ai/src/qi_ai/registry.py +50 -0
- qi_agent-0.1.1/packages/qi_ai/src/qi_ai/types.py +158 -0
- qi_agent-0.1.1/packages/qi_ai/tests/test_provider_registry.py +19 -0
- qi_agent-0.1.1/packages/qi_ai/tests/test_scripted_provider.py +53 -0
- qi_agent-0.1.1/packages/qi_blog/pyproject.toml +13 -0
- qi_agent-0.1.1/packages/qi_blog/src/qi_blog/__init__.py +19 -0
- qi_agent-0.1.1/packages/qi_blog/src/qi_blog/catalog.py +142 -0
- qi_agent-0.1.1/packages/qi_blog/src/qi_blog/extension.py +36 -0
- qi_agent-0.1.1/packages/qi_blog/src/qi_blog/models.py +29 -0
- qi_agent-0.1.1/packages/qi_blog/src/qi_blog/service.py +115 -0
- qi_agent-0.1.1/packages/qi_blog/tests/test_catalog.py +46 -0
- qi_agent-0.1.1/packages/qi_live2d/README.md +38 -0
- qi_agent-0.1.1/packages/qi_live2d/pyproject.toml +23 -0
- qi_agent-0.1.1/packages/qi_live2d/src/qi_live2d/__init__.py +36 -0
- qi_agent-0.1.1/packages/qi_live2d/src/qi_live2d/cli.py +124 -0
- qi_agent-0.1.1/packages/qi_live2d/src/qi_live2d/extension.py +27 -0
- qi_agent-0.1.1/packages/qi_live2d/src/qi_live2d/model.py +162 -0
- qi_agent-0.1.1/packages/qi_live2d/src/qi_live2d/packaging.py +264 -0
- qi_agent-0.1.1/packages/qi_live2d/src/qi_live2d/service.py +602 -0
- qi_agent-0.1.1/packages/qi_live2d/tests/test_live2d_cli.py +90 -0
- qi_agent-0.1.1/packages/qi_live2d/tests/test_live2d_service.py +358 -0
- qi_agent-0.1.1/packages/qi_live2d/tests/test_model_packaging.py +131 -0
- qi_agent-0.1.1/packages/qi_memory/README.md +29 -0
- qi_agent-0.1.1/packages/qi_memory/pyproject.toml +20 -0
- qi_agent-0.1.1/packages/qi_memory/src/qi_memory/__init__.py +50 -0
- qi_agent-0.1.1/packages/qi_memory/src/qi_memory/capture.py +152 -0
- qi_agent-0.1.1/packages/qi_memory/src/qi_memory/embeddings.py +130 -0
- qi_agent-0.1.1/packages/qi_memory/src/qi_memory/extension.py +423 -0
- qi_agent-0.1.1/packages/qi_memory/src/qi_memory/models.py +85 -0
- qi_agent-0.1.1/packages/qi_memory/src/qi_memory/service.py +321 -0
- qi_agent-0.1.1/packages/qi_memory/src/qi_memory/store.py +820 -0
- qi_agent-0.1.1/packages/qi_memory/tests/test_capture.py +35 -0
- qi_agent-0.1.1/packages/qi_memory/tests/test_embeddings.py +42 -0
- qi_agent-0.1.1/packages/qi_memory/tests/test_memory_extension.py +204 -0
- qi_agent-0.1.1/packages/qi_memory/tests/test_memory_service.py +134 -0
- qi_agent-0.1.1/packages/qi_voice/README.md +17 -0
- qi_agent-0.1.1/packages/qi_voice/pyproject.toml +15 -0
- qi_agent-0.1.1/packages/qi_voice/src/qi_voice/__init__.py +15 -0
- qi_agent-0.1.1/packages/qi_voice/src/qi_voice/service.py +232 -0
- qi_agent-0.1.1/packages/qi_voice/tests/test_dashscope_tts.py +149 -0
- qi_agent-0.1.1/packages/qi_web/pyproject.toml +13 -0
- qi_agent-0.1.1/packages/qi_web/src/qi_web/__init__.py +19 -0
- qi_agent-0.1.1/packages/qi_web/src/qi_web/extension.py +15 -0
- qi_agent-0.1.1/packages/qi_web/src/qi_web/service.py +165 -0
- qi_agent-0.1.1/packages/qi_web/tests/test_service.py +75 -0
- qi_agent-0.1.1/pyproject.toml +111 -0
- qi_agent-0.1.1/scripts/generate_references.py +75 -0
- qi_agent-0.1.1/scripts/load_test.py +107 -0
- qi_agent-0.1.1/scripts/macos/io.qi-agent.home.plist.example +34 -0
- qi_agent-0.1.1/scripts/macos/serve-home.zsh +43 -0
- qi_agent-0.1.1/scripts/smoke_installed_packages.py +149 -0
- qi_agent-0.1.1/scripts/smoke_wheels.py +55 -0
- qi_agent-0.1.1/scripts/verify_docs.py +94 -0
- qi_agent-0.1.1/scripts/verify_live2d_deployment.py +152 -0
- qi_agent-0.1.1/tests/contract/test_macos_home_service.py +138 -0
- qi_agent-0.1.1/tests/contract/test_package_boundaries.py +44 -0
- qi_agent-0.1.1/tests/contract/test_provider_contract.py +284 -0
- qi_agent-0.1.1/tests/e2e/test_admin_api.py +97 -0
- qi_agent-0.1.1/tests/e2e/test_live2d_api.py +163 -0
- qi_agent-0.1.1/tests/e2e/test_server_security.py +101 -0
- qi_agent-0.1.1/tests/e2e/test_voice_api.py +67 -0
- qi_agent-0.1.1/tests/integration/test_memory_flow.py +75 -0
- qi_agent-0.1.1/tests/integration/test_runtime_flow.py +412 -0
- qi_agent-0.1.1/uv.lock +1853 -0
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
name: ci
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
pull_request:
|
|
6
|
+
|
|
7
|
+
jobs:
|
|
8
|
+
quality:
|
|
9
|
+
runs-on: ubuntu-latest
|
|
10
|
+
steps:
|
|
11
|
+
- uses: actions/checkout@v4
|
|
12
|
+
- uses: astral-sh/setup-uv@v6
|
|
13
|
+
with:
|
|
14
|
+
python-version: "3.12"
|
|
15
|
+
enable-cache: true
|
|
16
|
+
- run: uv sync --frozen --all-packages
|
|
17
|
+
- uses: actions/setup-node@v4
|
|
18
|
+
with:
|
|
19
|
+
node-version: "22"
|
|
20
|
+
- run: npm install --global @mermaid-js/mermaid-cli
|
|
21
|
+
- run: uv run ruff check .
|
|
22
|
+
- run: uv run ruff format --check .
|
|
23
|
+
- run: uv run pyright
|
|
24
|
+
- run: uv run pytest packages tests/contract
|
|
25
|
+
- run: uv run pytest tests/integration tests/e2e
|
|
26
|
+
- run: uv run python scripts/load_test.py --sessions 5 --turns 5 --telemetry 100
|
|
27
|
+
- run: uv run python scripts/verify_docs.py
|
|
28
|
+
- run: uv run python scripts/generate_references.py --check
|
|
29
|
+
- run: uv build --all-packages --out-dir dist/internal
|
|
30
|
+
- run: uv build --package qi-ai --out-dir dist
|
|
31
|
+
- run: uv build --package qi-agent --out-dir dist
|
|
32
|
+
- run: uv run python scripts/smoke_wheels.py
|
|
33
|
+
- working-directory: examples/live2d_agent/browser
|
|
34
|
+
run: npm ci
|
|
35
|
+
- working-directory: examples/live2d_agent/browser
|
|
36
|
+
run: npm audit --audit-level=high
|
|
37
|
+
- working-directory: examples/live2d_agent/browser
|
|
38
|
+
run: npm test
|
|
39
|
+
- working-directory: examples/live2d_agent/browser
|
|
40
|
+
run: npm run build
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
name: Publish packages to PyPI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags:
|
|
6
|
+
- "v*"
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
publish:
|
|
10
|
+
runs-on: ubuntu-latest
|
|
11
|
+
environment:
|
|
12
|
+
name: pypi
|
|
13
|
+
permissions:
|
|
14
|
+
contents: read
|
|
15
|
+
id-token: write
|
|
16
|
+
|
|
17
|
+
steps:
|
|
18
|
+
- name: Check out source
|
|
19
|
+
uses: actions/checkout@v4
|
|
20
|
+
|
|
21
|
+
- name: Install uv
|
|
22
|
+
uses: astral-sh/setup-uv@v6
|
|
23
|
+
with:
|
|
24
|
+
python-version: "3.12"
|
|
25
|
+
enable-cache: true
|
|
26
|
+
|
|
27
|
+
- name: Install workspace
|
|
28
|
+
run: uv sync --frozen --all-packages --dev
|
|
29
|
+
|
|
30
|
+
- name: Run tests
|
|
31
|
+
run: uv run pytest -q
|
|
32
|
+
|
|
33
|
+
- name: Build public packages
|
|
34
|
+
run: |
|
|
35
|
+
uv build --package qi-ai --out-dir dist
|
|
36
|
+
uv build --package qi-agent --out-dir dist
|
|
37
|
+
|
|
38
|
+
- name: Smoke test public wheels
|
|
39
|
+
run: uv run python scripts/smoke_wheels.py
|
|
40
|
+
|
|
41
|
+
- name: Publish to PyPI
|
|
42
|
+
run: uv publish --check-url https://pypi.org/simple dist/*
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
.venv/
|
|
2
|
+
.pytest_cache/
|
|
3
|
+
.ruff_cache/
|
|
4
|
+
.hypothesis/
|
|
5
|
+
.coverage
|
|
6
|
+
htmlcov/
|
|
7
|
+
dist/
|
|
8
|
+
build/
|
|
9
|
+
*.egg-info/
|
|
10
|
+
__pycache__/
|
|
11
|
+
*.py[cod]
|
|
12
|
+
*.db
|
|
13
|
+
*.sqlite3
|
|
14
|
+
.pi-py/
|
|
15
|
+
node_modules/
|
|
16
|
+
examples/live2d_agent/browser/public/live2dcubismcore.min.js
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.12
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
格式遵循 Keep a Changelog;版本号遵循 Semantic Versioning。
|
|
4
|
+
|
|
5
|
+
## Unreleased
|
|
6
|
+
|
|
7
|
+
- 新增可选 `qi-voice` 包、阿里百炼 `cosyvoice-v3.5-plus` WebSocket 实时 TTS、一次性默认音色
|
|
8
|
+
注册命令与受保护的 PCM 流式接口。
|
|
9
|
+
- 明确正式 Live2D UI 嵌入 Astro Blog 全局布局,独立浏览器示例仅用于协议诊断和部署冒烟。
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
- 新增 `qi-agent install/update/remove/list` 轻量插件管理,支持本地目录、Git、PyPI、原子替换和
|
|
14
|
+
`extensions.lock.json` 解析版本锁定。
|
|
15
|
+
|
|
16
|
+
- 完成 `agent.qixiaoluo.dpdns.org` Named Tunnel、Vercel Production BFF 与
|
|
17
|
+
`blog.qixiaoluo.dpdns.org` 自定义域名部署,并通过 Session、Run、Live2D SSE 和 PCM TTS
|
|
18
|
+
线上冒烟测试。
|
|
19
|
+
- 新增 macOS 家庭服务器启动包装器、Keychain/launchd/Cloudflare Named Tunnel 运维文档,
|
|
20
|
+
并覆盖 loopback 绑定、异常恢复和 Vercel BFF 部署边界。
|
|
21
|
+
- 新增可独立构建的 `qi-blog` 与 `qi-web` 包:Blog Catalog 检索/打开/相关推荐工具,以及只读、同源、白名单校验的网站动作意图。
|
|
22
|
+
- Live2D 事件流支持 `live2d.web.action.intent`;动作只由浏览器在用户确认后执行,不提供 DOM、脚本或内容写入能力。
|
|
23
|
+
- 新增可独立构建的 `qi-memory` 包:ADD-only MemoryService、SQLite/InMemory Store、Hashing 与
|
|
24
|
+
OpenAI-compatible Embedder、FTS/向量 RRF、情景时间衰减和 MMR。
|
|
25
|
+
- 新增 `memory_remember`、`memory_search`、`memory_forget` Tool,七个 Memory AdminAction 和
|
|
26
|
+
`qi-agent memory` 运维 CLI;遗忘 Tool 默认进入 Approval。
|
|
27
|
+
- 新增按 Session Metadata/Identity Hash/Session 回退的 Namespace 隔离,以及成功 Run 后 User-only
|
|
28
|
+
保守捕获、Secret/PII/Prompt Injection 拒绝和不可信上下文转义。
|
|
29
|
+
- 新增 Memory 研究、ADR、Schema、配置、安全与运维文档,并把第六个 wheel 纳入隔离安装烟测。
|
|
30
|
+
- 新增可独立构建的 `qi-live2d` 包:Cubism 模型资产校验、LLM 控制 Tool、AgentEvent 状态映射、
|
|
31
|
+
Session Snapshot 和可重放 SSE。
|
|
32
|
+
- 新增阿里云百炼 `dashscope` OpenAI-compatible Provider 配置。
|
|
33
|
+
- 新增 Live2D 模型、资产、命令、Snapshot、事件流和 Extension AdminAction 管理接口。
|
|
34
|
+
- 新增 `qi-live2d inspect` 模型诊断命令和隔离 wheel 安装冒烟门禁。
|
|
35
|
+
- 新增安全、原子、支持旧文件名编码的 `qi-live2d unpack`,以及可复用的部署 Manifest
|
|
36
|
+
`overlay` 命令。
|
|
37
|
+
- 新增可运行的 PixiJS Live2D 参考 Renderer,覆盖 Session、Run、Live2D SSE、Expression 与
|
|
38
|
+
Motion 端到端调用。
|
|
39
|
+
- 新增可选 Chromium 部署烟测,验证 WebGL 模型加载、Session 刷新恢复、认证、Agent Tool 与
|
|
40
|
+
Live2D SSE 的真实浏览器链路。
|
|
41
|
+
- 完成 `huimeng.zip` 模型实测:10 个 Expression、`Idle[0]` Motion、8192 纹理和 DashScope
|
|
42
|
+
Tool Call 全链路均已验证。
|
|
43
|
+
|
|
44
|
+
### Changed
|
|
45
|
+
|
|
46
|
+
- PyPI 发布面从九个 workspace distribution 收敛为 `qi-ai` 与 `qi-agent` 两个公开包;内部模块
|
|
47
|
+
继续独立做依赖边界、类型和构建验证。
|
|
48
|
+
|
|
49
|
+
- Runtime 现在真正消费 ContextProvider、TelemetrySink、AdminAction Capability。
|
|
50
|
+
- Extension 全局/Session 禁用同时作用于 Capability、Hook、Telemetry 和生命周期。
|
|
51
|
+
- 热重载把 Capability、Hook 与 lifecycle 固定到同一 Run generation;旧实例在最后一个 Registry
|
|
52
|
+
Snapshot 释放后 Shutdown。
|
|
53
|
+
- Run 与 Live2D SSE 支持 SQLite 重放、`Last-Event-ID` 续传和 Live2D Snapshot/Sequence 重启恢复。
|
|
54
|
+
- ContextProvider 与 TelemetrySink 使用 Hook 超时预算,坏扩展不能永久阻塞 Run。
|
|
55
|
+
- `qi-agent doctor` 会隔离报告 Live2D 模型错误并继续执行其余后端检查。
|
|
56
|
+
- Live2D 终止事件显式携带最终状态,使浏览器在 Run 完成或失败时无需额外 Snapshot 请求即可
|
|
57
|
+
恢复为 `idle` 或 `error`。
|
|
58
|
+
- Live2D Event 在 Python 运行时执行与 JSON Schema 相同的类型/载荷校验;公开错误只含稳定错误码
|
|
59
|
+
和安全文案。
|
|
60
|
+
- Session Live2D SSE 连接可承载连续多轮 Run,内存回放改为有界窗口,完整历史继续由 SQLite
|
|
61
|
+
提供。
|
|
62
|
+
- 模型 Overlay 改为保留并合并原有 Expression/Motion,同名冲突明确拒绝。
|
|
63
|
+
|
|
64
|
+
## 0.1.0 - 2026-07-31
|
|
65
|
+
|
|
66
|
+
### Added
|
|
67
|
+
|
|
68
|
+
- 四包 Python 3.12+ `uv` workspace 和单向依赖检查。
|
|
69
|
+
- 四种 Provider Adapter、统一流事件、Usage/Cost、重试和取消。
|
|
70
|
+
- Agent Loop、Tool Policy、Approval、Steering、Follow-up 与运行限制。
|
|
71
|
+
- Capability/Hook/Extension/ResourceLoader 和可回滚热重载。
|
|
72
|
+
- JSONL Session、Branch、Compaction、修复、导出和 Extension State。
|
|
73
|
+
- FastAPI/SSE 控制面、SQLite Telemetry 投影、Rollup 与恢复 Worker。
|
|
74
|
+
- 云 Provider 原生 SSE、结构化 Tool 续轮、并发幂等 Run 与延迟/Approval 投影。
|
|
75
|
+
- Run 级持久 Extension Session 绑定和有界 Event subscriber backpressure。
|
|
76
|
+
- 非交互式 `qi-agent` CLI、配置优先级、Keyring 和日志脱敏。
|
|
77
|
+
- Contract、Integration、E2E 测试和完整架构/协议/运维文档。
|
|
78
|
+
|
|
79
|
+
### Explicitly not included in 0.1.0
|
|
80
|
+
|
|
81
|
+
- TUI、管理前端、Live2D、TTS、RAG 和具体 Channel Adapter。
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# Contributing
|
|
2
|
+
|
|
3
|
+
## 开发环境
|
|
4
|
+
|
|
5
|
+
要求 `uv` 和 Git。初始化后不要直接在系统 Python 安装依赖。
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
uv sync --all-packages
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## 改动规则
|
|
12
|
+
|
|
13
|
+
1. 保持 `qi_ai ← qi_agent_core ← qi_agent_runtime ← qi_agent_server` 单向依赖;可选
|
|
14
|
+
`qi_live2d` 只依赖 Runtime,Server 可以组合它,主体包禁止反向导入。
|
|
15
|
+
2. 新的外部变化必须放到现有 seam 的 Adapter 后;不要让 Core 感知供应商或数据库。
|
|
16
|
+
3. 先添加一个描述公共行为的测试,再实现一条纵向链路。
|
|
17
|
+
4. 公共接口、事件或存储格式变化必须同时修改 Markdown、Schema 和 Changelog。
|
|
18
|
+
5. Accepted ADR 不修改结论;新建 ADR 取代旧决定。
|
|
19
|
+
|
|
20
|
+
## 提交前检查
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
uv run ruff check .
|
|
24
|
+
uv run ruff format --check .
|
|
25
|
+
uv run pyright
|
|
26
|
+
uv run pytest
|
|
27
|
+
uv build --all-packages
|
|
28
|
+
uv run python scripts/smoke_wheels.py
|
|
29
|
+
uv run python scripts/verify_docs.py
|
|
30
|
+
uv run python scripts/generate_references.py --check
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
提交应小而完整:测试、实现和对应文档在同一提交。不要提交真实 API Key、用户 Session、
|
|
34
|
+
SQLite 数据库或 Extension 信任文件。
|
qi_agent-0.1.1/PKG-INFO
ADDED
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: qi-agent
|
|
3
|
+
Version: 0.1.1
|
|
4
|
+
Summary: Python-first extensible agent backend, server, and built-in adapters
|
|
5
|
+
Requires-Python: >=3.12
|
|
6
|
+
Requires-Dist: dashscope>=1.26.4
|
|
7
|
+
Requires-Dist: fastapi>=0.116
|
|
8
|
+
Requires-Dist: filelock>=3.18
|
|
9
|
+
Requires-Dist: httpx>=0.28
|
|
10
|
+
Requires-Dist: jsonschema>=4.23
|
|
11
|
+
Requires-Dist: keyring>=25.6
|
|
12
|
+
Requires-Dist: platformdirs>=4.3
|
|
13
|
+
Requires-Dist: pydantic-settings>=2.9
|
|
14
|
+
Requires-Dist: pydantic>=2.10
|
|
15
|
+
Requires-Dist: qi-ai<0.2,>=0.1.1
|
|
16
|
+
Requires-Dist: typer>=0.16
|
|
17
|
+
Requires-Dist: uvicorn>=0.35
|
|
18
|
+
Description-Content-Type: text/markdown
|
|
19
|
+
|
|
20
|
+
# pi-agent-py
|
|
21
|
+
|
|
22
|
+
`pi-agent-py` 是一个 Python 3.12+ 的独立 Agent 后端。它把模型供应商、确定性 Agent
|
|
23
|
+
Loop、扩展宿主、持久会话和控制面拆成内部模块;Adapter 通过公共
|
|
24
|
+
Extension seam 接入,供网站、桌面应用或未来 Channel Adapter 共用。主体不包含 TUI、管理前端、
|
|
25
|
+
RAG 或具体 Channel。
|
|
26
|
+
|
|
27
|
+
## 当前能力
|
|
28
|
+
|
|
29
|
+
- `qi_ai`:统一 Message/Content/Provider/Event,OpenAI-compatible、Anthropic、Google
|
|
30
|
+
Adapter,Usage/Cost、重试、Context Overflow 与协作取消。
|
|
31
|
+
- `qi_agent_core`:Run/Turn 状态机、Agent Loop、Tool JSON Schema 校验、Policy、Approval、
|
|
32
|
+
Steering、Follow-up、Abort、限制和不可变事件。
|
|
33
|
+
- `qi_agent_runtime`:Capability Registry、Hook Pipeline、Extension API、资源发现、项目信任、
|
|
34
|
+
原子热重载、JSONL Session、Branch、Compaction 和 Extension State。
|
|
35
|
+
- `qi_agent_server`:FastAPI 管理接口、SSE、SQLite 统计投影、后台维护任务和非交互式 CLI。
|
|
36
|
+
- `qi_live2d`:内置的 Cubism 模型校验、LLM 控制 Tool、AgentEvent 映射、Snapshot 和 Live2D
|
|
37
|
+
SSE Adapter;不进入四个主体模块的下层依赖。
|
|
38
|
+
- `qi_voice`:Provider-neutral TTS seam;首个 Adapter 使用阿里百炼 CosyVoice,并只在服务端读取密钥。
|
|
39
|
+
- `qi_memory`:内置的本地优先长期记忆 Extension,提供 Namespace 隔离、SQLite FTS +
|
|
40
|
+
Embedding 混合召回、ADD-only 写入、来源审计和物理遗忘。
|
|
41
|
+
- `qi_blog`:读取版本化 Blog Catalog,提供 `blog_search`、`blog_open` 和 `blog_related`,结果带
|
|
42
|
+
canonical URL 和稳定文档 ID。
|
|
43
|
+
- `qi_web`:只产生经过白名单校验的网站动作意图;默认支持站内导航和章节定位,不提供 DOM、脚本或
|
|
44
|
+
内容修改能力。
|
|
45
|
+
|
|
46
|
+
## 安装
|
|
47
|
+
|
|
48
|
+
普通用户只安装两个公开包:`qi-ai` 提供可复用的 Provider/Event 协议,`qi-agent` 包含 Agent、
|
|
49
|
+
Runtime、Server 和内置 Adapter:
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
uv tool install qi-agent
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
源码开发仍保留独立 workspace 模块:
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
git clone <repository-url> pi-agent-py
|
|
59
|
+
cd pi-agent-py
|
|
60
|
+
uv sync --all-packages
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
无需 Docker。`uv` 会根据 `.python-version` 准备 Python 3.12。
|
|
64
|
+
|
|
65
|
+
## 快速开始
|
|
66
|
+
|
|
67
|
+
运行无需外部密钥的本地 Echo Agent:
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
uv run qi-agent run --prompt "hello"
|
|
71
|
+
uv run qi-agent run --json --prompt "hello"
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
启动管理后端:
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
uv run qi-agent serve
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
服务默认监听 `127.0.0.1:8765`。创建会话和 Run:
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
curl -s -X POST http://127.0.0.1:8765/api/v1/sessions \
|
|
84
|
+
-H 'content-type: application/json' \
|
|
85
|
+
-d '{"metadata":{"title":"demo"}}'
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
有外部 Provider 密钥时,通过 `OPENAI_API_KEY`、`ANTHROPIC_API_KEY`、`GOOGLE_API_KEY` 或
|
|
89
|
+
`DASHSCOPE_API_KEY` 注入;密钥不会写入 Session 或 SQLite。阿里百炼使用 `dashscope` Provider
|
|
90
|
+
和默认模型 `qwen-plus`。
|
|
91
|
+
|
|
92
|
+
启用 Live2D + 阿里百炼完整后端流:
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
export DASHSCOPE_API_KEY='replace-with-your-key'
|
|
96
|
+
export PI_AGENT_DEFAULT_PROVIDER='dashscope'
|
|
97
|
+
export PI_AGENT_DEFAULT_MODEL='qwen-plus'
|
|
98
|
+
export PI_AGENT_LIVE2D_MODEL_PATH='/absolute/path/avatar.model3.json'
|
|
99
|
+
uv run qi-agent serve
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
浏览器先读取 `/api/v1/live2d/model` 获得 `manifest_url`,再订阅
|
|
103
|
+
`/api/v1/live2d/sessions/{session_id}/events`。详见
|
|
104
|
+
[Live2D 完整流程](docs/live2d/overview.md)。可运行的 PixiJS 参考 Renderer 位于
|
|
105
|
+
`examples/live2d_agent/browser`,支持模型加载、手动 Expression/Motion 预览和真实 Agent Prompt。
|
|
106
|
+
|
|
107
|
+
启用长期记忆(默认关闭自动捕获):
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
export PI_AGENT_MEMORY_ENABLED=true
|
|
111
|
+
export PI_AGENT_MEMORY_AUTO_CAPTURE=false
|
|
112
|
+
uv run qi-agent memory remember "偏好简洁的中文回答" --namespace 'blog:user-42'
|
|
113
|
+
uv run qi-agent memory search "回答风格" --namespace 'blog:user-42'
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
Blog 或 Channel 创建 Session 时应传 `memory_namespace` 或稳定的 `user_id`;未登录访客不传身份时
|
|
117
|
+
自动使用 `session:<session_id>`,不会跨访客共享。完整设计见
|
|
118
|
+
[Memory 研究与设计](docs/memory/research-and-design.md)。
|
|
119
|
+
|
|
120
|
+
## Python 使用
|
|
121
|
+
|
|
122
|
+
```python
|
|
123
|
+
import asyncio
|
|
124
|
+
|
|
125
|
+
from qi_agent_core import Agent
|
|
126
|
+
from qi_ai import AssistantMessage, Model, TextContent
|
|
127
|
+
from qi_ai.providers.testing import ScriptedProvider
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
async def main() -> None:
|
|
131
|
+
agent = Agent(
|
|
132
|
+
provider=ScriptedProvider([AssistantMessage(content=[TextContent(text="hello")])]),
|
|
133
|
+
model=Model(id="test-local", provider="test", display_name="Scripted test model"),
|
|
134
|
+
)
|
|
135
|
+
result = await agent.run("hi")
|
|
136
|
+
assert result.final_text == "hello"
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
asyncio.run(main())
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
## 包结构与依赖方向
|
|
143
|
+
|
|
144
|
+
```mermaid
|
|
145
|
+
flowchart LR
|
|
146
|
+
Server["qi_agent_server<br/>Control Plane"] --> Runtime["qi_agent_runtime<br/>Extension + Session"]
|
|
147
|
+
Server --> Live2D["qi_live2d<br/>Optional Adapter"]
|
|
148
|
+
Server --> Memory["qi_memory<br/>Optional Extension"]
|
|
149
|
+
Live2D --> Runtime
|
|
150
|
+
Memory --> Runtime
|
|
151
|
+
Runtime --> Core["qi_agent_core<br/>Agent Loop"]
|
|
152
|
+
Core --> AI["qi_ai<br/>Provider Protocol"]
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
只有向下依赖;Contract Test 会扫描 Python AST 阻止反向导入。内部模块保留各自
|
|
156
|
+
`pyproject.toml` 以验证依赖边界,但 PyPI 只发布 `qi-ai` 和聚合的 `qi-agent`,用户不需要逐个安装。
|
|
157
|
+
|
|
158
|
+
## 插件管理
|
|
159
|
+
|
|
160
|
+
`qi-agent` 可以直接管理本地目录、Git 仓库和 PyPI 插件:
|
|
161
|
+
|
|
162
|
+
```bash
|
|
163
|
+
qi-agent install ./my-extension
|
|
164
|
+
qi-agent install github:owner/weather-extension@v1.2.0
|
|
165
|
+
qi-agent install pypi:qi-agent-weather@1.2.0
|
|
166
|
+
qi-agent list
|
|
167
|
+
qi-agent update weather-extension
|
|
168
|
+
qi-agent update
|
|
169
|
+
qi-agent remove weather-extension
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
安装状态记录在 `~/.pi-agent-py/extensions.lock.json`。Git 和本地插件被复制到受管目录;PyPI
|
|
173
|
+
插件必须声明 `pi_agent.extensions` Entry Point,并安装到当前 `qi-agent` Python 环境。完整规则见
|
|
174
|
+
[插件安装与更新](docs/extensions/package-manager.md)。
|
|
175
|
+
|
|
176
|
+
## 开发验证
|
|
177
|
+
|
|
178
|
+
```bash
|
|
179
|
+
uv run ruff check .
|
|
180
|
+
uv run ruff format --check .
|
|
181
|
+
uv run pyright
|
|
182
|
+
uv run pytest
|
|
183
|
+
uv build --all-packages --out-dir dist/internal
|
|
184
|
+
uv build --package qi-ai --out-dir dist
|
|
185
|
+
uv build --package qi-agent --out-dir dist
|
|
186
|
+
uv run python scripts/smoke_wheels.py
|
|
187
|
+
uv run python scripts/verify_docs.py
|
|
188
|
+
uv run python scripts/generate_references.py --check
|
|
189
|
+
cd examples/live2d_agent/browser && npm ci && npm test && npm run build
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
带外部模型和 Provider 的可选真实门禁见
|
|
193
|
+
[绘梦模型接入记录](docs/live2d/huimeng-asset-integration.md),包含 Python Runtime 与 Chromium
|
|
194
|
+
Renderer 两个可执行烟测入口。
|
|
195
|
+
|
|
196
|
+
架构从 [docs/architecture/overview.md](docs/architecture/overview.md) 开始;扩展作者从
|
|
197
|
+
[docs/extensions/overview.md](docs/extensions/overview.md) 开始;部署者从
|
|
198
|
+
[docs/operations/local-development.md](docs/operations/local-development.md) 开始。
|
|
199
|
+
|
|
200
|
+
## 版本状态
|
|
201
|
+
|
|
202
|
+
当前实现版本为 `0.1.1`。完成范围和后续 Live2D/Channel 扩展见
|
|
203
|
+
[docs/roadmap.md](docs/roadmap.md)。
|
|
204
|
+
|
|
205
|
+
将本机作为 Blog 的 Agent 后端时,使用 loopback + Cloudflare Named Tunnel,完整安全和恢复步骤见
|
|
206
|
+
[docs/operations/macos-home-tunnel.md](docs/operations/macos-home-tunnel.md)。
|
qi_agent-0.1.1/README.md
ADDED
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
# pi-agent-py
|
|
2
|
+
|
|
3
|
+
`pi-agent-py` 是一个 Python 3.12+ 的独立 Agent 后端。它把模型供应商、确定性 Agent
|
|
4
|
+
Loop、扩展宿主、持久会话和控制面拆成内部模块;Adapter 通过公共
|
|
5
|
+
Extension seam 接入,供网站、桌面应用或未来 Channel Adapter 共用。主体不包含 TUI、管理前端、
|
|
6
|
+
RAG 或具体 Channel。
|
|
7
|
+
|
|
8
|
+
## 当前能力
|
|
9
|
+
|
|
10
|
+
- `qi_ai`:统一 Message/Content/Provider/Event,OpenAI-compatible、Anthropic、Google
|
|
11
|
+
Adapter,Usage/Cost、重试、Context Overflow 与协作取消。
|
|
12
|
+
- `qi_agent_core`:Run/Turn 状态机、Agent Loop、Tool JSON Schema 校验、Policy、Approval、
|
|
13
|
+
Steering、Follow-up、Abort、限制和不可变事件。
|
|
14
|
+
- `qi_agent_runtime`:Capability Registry、Hook Pipeline、Extension API、资源发现、项目信任、
|
|
15
|
+
原子热重载、JSONL Session、Branch、Compaction 和 Extension State。
|
|
16
|
+
- `qi_agent_server`:FastAPI 管理接口、SSE、SQLite 统计投影、后台维护任务和非交互式 CLI。
|
|
17
|
+
- `qi_live2d`:内置的 Cubism 模型校验、LLM 控制 Tool、AgentEvent 映射、Snapshot 和 Live2D
|
|
18
|
+
SSE Adapter;不进入四个主体模块的下层依赖。
|
|
19
|
+
- `qi_voice`:Provider-neutral TTS seam;首个 Adapter 使用阿里百炼 CosyVoice,并只在服务端读取密钥。
|
|
20
|
+
- `qi_memory`:内置的本地优先长期记忆 Extension,提供 Namespace 隔离、SQLite FTS +
|
|
21
|
+
Embedding 混合召回、ADD-only 写入、来源审计和物理遗忘。
|
|
22
|
+
- `qi_blog`:读取版本化 Blog Catalog,提供 `blog_search`、`blog_open` 和 `blog_related`,结果带
|
|
23
|
+
canonical URL 和稳定文档 ID。
|
|
24
|
+
- `qi_web`:只产生经过白名单校验的网站动作意图;默认支持站内导航和章节定位,不提供 DOM、脚本或
|
|
25
|
+
内容修改能力。
|
|
26
|
+
|
|
27
|
+
## 安装
|
|
28
|
+
|
|
29
|
+
普通用户只安装两个公开包:`qi-ai` 提供可复用的 Provider/Event 协议,`qi-agent` 包含 Agent、
|
|
30
|
+
Runtime、Server 和内置 Adapter:
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
uv tool install qi-agent
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
源码开发仍保留独立 workspace 模块:
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
git clone <repository-url> pi-agent-py
|
|
40
|
+
cd pi-agent-py
|
|
41
|
+
uv sync --all-packages
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
无需 Docker。`uv` 会根据 `.python-version` 准备 Python 3.12。
|
|
45
|
+
|
|
46
|
+
## 快速开始
|
|
47
|
+
|
|
48
|
+
运行无需外部密钥的本地 Echo Agent:
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
uv run qi-agent run --prompt "hello"
|
|
52
|
+
uv run qi-agent run --json --prompt "hello"
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
启动管理后端:
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
uv run qi-agent serve
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
服务默认监听 `127.0.0.1:8765`。创建会话和 Run:
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
curl -s -X POST http://127.0.0.1:8765/api/v1/sessions \
|
|
65
|
+
-H 'content-type: application/json' \
|
|
66
|
+
-d '{"metadata":{"title":"demo"}}'
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
有外部 Provider 密钥时,通过 `OPENAI_API_KEY`、`ANTHROPIC_API_KEY`、`GOOGLE_API_KEY` 或
|
|
70
|
+
`DASHSCOPE_API_KEY` 注入;密钥不会写入 Session 或 SQLite。阿里百炼使用 `dashscope` Provider
|
|
71
|
+
和默认模型 `qwen-plus`。
|
|
72
|
+
|
|
73
|
+
启用 Live2D + 阿里百炼完整后端流:
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
export DASHSCOPE_API_KEY='replace-with-your-key'
|
|
77
|
+
export PI_AGENT_DEFAULT_PROVIDER='dashscope'
|
|
78
|
+
export PI_AGENT_DEFAULT_MODEL='qwen-plus'
|
|
79
|
+
export PI_AGENT_LIVE2D_MODEL_PATH='/absolute/path/avatar.model3.json'
|
|
80
|
+
uv run qi-agent serve
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
浏览器先读取 `/api/v1/live2d/model` 获得 `manifest_url`,再订阅
|
|
84
|
+
`/api/v1/live2d/sessions/{session_id}/events`。详见
|
|
85
|
+
[Live2D 完整流程](docs/live2d/overview.md)。可运行的 PixiJS 参考 Renderer 位于
|
|
86
|
+
`examples/live2d_agent/browser`,支持模型加载、手动 Expression/Motion 预览和真实 Agent Prompt。
|
|
87
|
+
|
|
88
|
+
启用长期记忆(默认关闭自动捕获):
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
export PI_AGENT_MEMORY_ENABLED=true
|
|
92
|
+
export PI_AGENT_MEMORY_AUTO_CAPTURE=false
|
|
93
|
+
uv run qi-agent memory remember "偏好简洁的中文回答" --namespace 'blog:user-42'
|
|
94
|
+
uv run qi-agent memory search "回答风格" --namespace 'blog:user-42'
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Blog 或 Channel 创建 Session 时应传 `memory_namespace` 或稳定的 `user_id`;未登录访客不传身份时
|
|
98
|
+
自动使用 `session:<session_id>`,不会跨访客共享。完整设计见
|
|
99
|
+
[Memory 研究与设计](docs/memory/research-and-design.md)。
|
|
100
|
+
|
|
101
|
+
## Python 使用
|
|
102
|
+
|
|
103
|
+
```python
|
|
104
|
+
import asyncio
|
|
105
|
+
|
|
106
|
+
from qi_agent_core import Agent
|
|
107
|
+
from qi_ai import AssistantMessage, Model, TextContent
|
|
108
|
+
from qi_ai.providers.testing import ScriptedProvider
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
async def main() -> None:
|
|
112
|
+
agent = Agent(
|
|
113
|
+
provider=ScriptedProvider([AssistantMessage(content=[TextContent(text="hello")])]),
|
|
114
|
+
model=Model(id="test-local", provider="test", display_name="Scripted test model"),
|
|
115
|
+
)
|
|
116
|
+
result = await agent.run("hi")
|
|
117
|
+
assert result.final_text == "hello"
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
asyncio.run(main())
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
## 包结构与依赖方向
|
|
124
|
+
|
|
125
|
+
```mermaid
|
|
126
|
+
flowchart LR
|
|
127
|
+
Server["qi_agent_server<br/>Control Plane"] --> Runtime["qi_agent_runtime<br/>Extension + Session"]
|
|
128
|
+
Server --> Live2D["qi_live2d<br/>Optional Adapter"]
|
|
129
|
+
Server --> Memory["qi_memory<br/>Optional Extension"]
|
|
130
|
+
Live2D --> Runtime
|
|
131
|
+
Memory --> Runtime
|
|
132
|
+
Runtime --> Core["qi_agent_core<br/>Agent Loop"]
|
|
133
|
+
Core --> AI["qi_ai<br/>Provider Protocol"]
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
只有向下依赖;Contract Test 会扫描 Python AST 阻止反向导入。内部模块保留各自
|
|
137
|
+
`pyproject.toml` 以验证依赖边界,但 PyPI 只发布 `qi-ai` 和聚合的 `qi-agent`,用户不需要逐个安装。
|
|
138
|
+
|
|
139
|
+
## 插件管理
|
|
140
|
+
|
|
141
|
+
`qi-agent` 可以直接管理本地目录、Git 仓库和 PyPI 插件:
|
|
142
|
+
|
|
143
|
+
```bash
|
|
144
|
+
qi-agent install ./my-extension
|
|
145
|
+
qi-agent install github:owner/weather-extension@v1.2.0
|
|
146
|
+
qi-agent install pypi:qi-agent-weather@1.2.0
|
|
147
|
+
qi-agent list
|
|
148
|
+
qi-agent update weather-extension
|
|
149
|
+
qi-agent update
|
|
150
|
+
qi-agent remove weather-extension
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
安装状态记录在 `~/.pi-agent-py/extensions.lock.json`。Git 和本地插件被复制到受管目录;PyPI
|
|
154
|
+
插件必须声明 `pi_agent.extensions` Entry Point,并安装到当前 `qi-agent` Python 环境。完整规则见
|
|
155
|
+
[插件安装与更新](docs/extensions/package-manager.md)。
|
|
156
|
+
|
|
157
|
+
## 开发验证
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
uv run ruff check .
|
|
161
|
+
uv run ruff format --check .
|
|
162
|
+
uv run pyright
|
|
163
|
+
uv run pytest
|
|
164
|
+
uv build --all-packages --out-dir dist/internal
|
|
165
|
+
uv build --package qi-ai --out-dir dist
|
|
166
|
+
uv build --package qi-agent --out-dir dist
|
|
167
|
+
uv run python scripts/smoke_wheels.py
|
|
168
|
+
uv run python scripts/verify_docs.py
|
|
169
|
+
uv run python scripts/generate_references.py --check
|
|
170
|
+
cd examples/live2d_agent/browser && npm ci && npm test && npm run build
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
带外部模型和 Provider 的可选真实门禁见
|
|
174
|
+
[绘梦模型接入记录](docs/live2d/huimeng-asset-integration.md),包含 Python Runtime 与 Chromium
|
|
175
|
+
Renderer 两个可执行烟测入口。
|
|
176
|
+
|
|
177
|
+
架构从 [docs/architecture/overview.md](docs/architecture/overview.md) 开始;扩展作者从
|
|
178
|
+
[docs/extensions/overview.md](docs/extensions/overview.md) 开始;部署者从
|
|
179
|
+
[docs/operations/local-development.md](docs/operations/local-development.md) 开始。
|
|
180
|
+
|
|
181
|
+
## 版本状态
|
|
182
|
+
|
|
183
|
+
当前实现版本为 `0.1.1`。完成范围和后续 Live2D/Channel 扩展见
|
|
184
|
+
[docs/roadmap.md](docs/roadmap.md)。
|
|
185
|
+
|
|
186
|
+
将本机作为 Blog 的 Agent 后端时,使用 loopback + Cloudflare Named Tunnel,完整安全和恢复步骤见
|
|
187
|
+
[docs/operations/macos-home-tunnel.md](docs/operations/macos-home-tunnel.md)。
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Security
|
|
2
|
+
|
|
3
|
+
## 支持范围
|
|
4
|
+
|
|
5
|
+
安全更新优先覆盖最新 `0.x` 版本。漏洞请通过仓库私有安全报告渠道提交,不要在公开 Issue
|
|
6
|
+
附带 Secret、Session JSONL 或数据库副本。
|
|
7
|
+
|
|
8
|
+
## 信任边界
|
|
9
|
+
|
|
10
|
+
Extension 是进程内 Python 代码,不是沙箱。已安装 Entry Point 和用户目录 Extension 被视为
|
|
11
|
+
操作者主动安装;项目目录 `.pi-py/extensions/` 默认不执行,必须通过 Trust Store 授权。
|
|
12
|
+
Manifest 权限是审计声明,不等价于操作系统隔离。
|
|
13
|
+
|
|
14
|
+
## Secret
|
|
15
|
+
|
|
16
|
+
- 优先读取 Provider 专用环境变量,其次读取系统 Keyring。
|
|
17
|
+
- Secret 不进入 `Model`、Agent Event、Session JSONL、Audit Log 或 OpenAPI。
|
|
18
|
+
- `RedactingFilter` 会遮盖常见 Bearer/API Key/Token 日志片段,但调用者仍应避免记录原始请求头。
|
|
19
|
+
- 曾粘贴到聊天、Issue 或日志的测试 Key 也视为已泄露,完成烟测后应立即轮换。
|
|
20
|
+
|
|
21
|
+
## 管理接口
|
|
22
|
+
|
|
23
|
+
生产或远程访问必须设置 `PI_AGENT_ADMIN_TOKEN`,使用 Bearer Token;Cookie 会话还要求
|
|
24
|
+
`X-CSRF-Token`。默认监听回环地址。TLS 应由反向代理终止,数据库和 Session 目录应限制为
|
|
25
|
+
服务账号可读写。
|
|
26
|
+
|
|
27
|
+
## Extension 供应链
|
|
28
|
+
|
|
29
|
+
固定依赖版本,验证发布包来源;本地代码变更通过 Fingerprint 触发两阶段重载。已安装包代码
|
|
30
|
+
升级应重启进程,以免同一解释器同时持有不兼容模块。
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# ADR-0001: Four-package architecture
|
|
2
|
+
|
|
3
|
+
- Status: Accepted
|
|
4
|
+
- Date: 2026-07-31
|
|
5
|
+
|
|
6
|
+
## Context
|
|
7
|
+
|
|
8
|
+
Agent 主体必须能脱离网站、Live2D 和任何 Channel 复用,同时允许模型、运行时与控制面按不同
|
|
9
|
+
速度变化。单包会让 FastAPI/SQLite/厂商 SDK 侵入 Agent Loop。
|
|
10
|
+
|
|
11
|
+
## Decision
|
|
12
|
+
|
|
13
|
+
采用 `qi_ai ← qi_agent_core ← qi_agent_runtime ← qi_agent_server` 四包单向依赖。以 AST Contract
|
|
14
|
+
Test 和独立 wheel build 强制边界。
|
|
15
|
+
|
|
16
|
+
## Consequences
|
|
17
|
+
|
|
18
|
+
Core 测试快速且确定;Provider 和存储可替换。跨包功能需要显式事件/协议,初期文件数更多,
|
|
19
|
+
但调用者只学习所在层的接口。
|
|
20
|
+
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# ADR-0002: No TUI
|
|
2
|
+
|
|
3
|
+
- Status: Accepted
|
|
4
|
+
- Date: 2026-07-31
|
|
5
|
+
|
|
6
|
+
## Context
|
|
7
|
+
|
|
8
|
+
系统目标是多客户端共享后端。TUI 会把键盘循环、渲染状态和交互假设带入主体。
|
|
9
|
+
|
|
10
|
+
## Decision
|
|
11
|
+
|
|
12
|
+
0.1.0 不实现 TUI。只提供非交互 CLI、HTTP/SSE 和 OpenAPI。后台统计先提供后端接口,不提供
|
|
13
|
+
管理 SPA。
|
|
14
|
+
|
|
15
|
+
## Consequences
|
|
16
|
+
|
|
17
|
+
自动化和服务部署更简单;交互式体验由未来独立客户端实现,不改变 Agent Core。
|
|
18
|
+
|