programasweights 0.2.2.dev1__tar.gz → 0.2.3__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.
- programasweights-0.2.3/AGENTS.md +173 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/CHANGELOG.md +8 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/PKG-INFO +5 -1
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/PYPI_README.md +4 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/docs/api-reference/python-sdk.md +31 -1
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/programasweights/__init__.py +2 -1
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/pyproject.toml +1 -1
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/.env.example +0 -1
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/api/config.py +1 -2
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/api/main.py +50 -4
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/api/models/schemas.py +1 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/api/routes/auth.py +0 -1
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/api/routes/health.py +8 -3
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/api/routes/programs.py +4 -3
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/e2e/full.spec.ts +65 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/index.html +5 -5
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/src/App.tsx +34 -1
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/src/components/AboutPage.tsx +3 -1
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/src/components/AgentsPage.tsx +92 -47
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/src/components/AuthorPage.tsx +14 -7
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/src/components/BrowserPage.tsx +26 -11
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/src/components/CasesSection.tsx +8 -5
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/src/components/Header.tsx +14 -11
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/src/components/HubPage.tsx +5 -5
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/src/components/HubProgramPage.tsx +41 -24
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/src/components/HubUploadPage.tsx +8 -1
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/src/components/MainInterface.tsx +39 -15
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/src/components/NavigationHelper.tsx +8 -3
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/src/components/ProfilePage.tsx +23 -21
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/src/components/SettingsPage.tsx +18 -22
- programasweights-0.2.3/web-app/frontend/src/contexts/AuthContext.tsx +45 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/src/types/index.ts +2 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/src/utils/api.ts +0 -8
- programasweights-0.2.3/web-app/frontend/test-results/.last-run.json +4 -0
- programasweights-0.2.2.dev1/AGENTS.md +0 -129
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/.cursor/rules/sdk-publishing.mdc +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/.cursor/rules/vllm-deployment.mdc +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/.git +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/.github/workflows/web-sdk.yml +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/.gitignore +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/.gitmodules +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/.hatch_build.toml +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/.readthedocs.yaml +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/1apple.jpg +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/1apple2.jpg +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/2apples.jpg +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/2apples2.jpg +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/3apples.jpg +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/3apples2.jpg +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/479400.png +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/4apples.jpg +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/4apples2.jpg +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/4apples3.jpg +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/4apples4.jpg +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/5apples.jpg +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/6apples.jpg +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/8apples.jpg +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/9apples.jpg +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/FLOW_SUMMARY.md +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/LICENSE +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/MANIFEST.in +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/ONNX_MIGRATION_PLAN.md +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/PREFIX_TOKENS_DESIGN.md +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/README.md +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/TRUNCATION_CHANGES.md +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/USE_CASES_AND_IDEAS.md +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/VERIFICATION_USAGE.md +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/analyze_dataset.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/analyze_lengths.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/baselines/code_prompt.md +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/baselines/evaluate_openai_python_code_baseline.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/baselines/openai_batch_request.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/baselines/prepare_alchemist_data.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/baselines/prepare_var_bench_data.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/baselines/python_code_sandbox.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/baselines/script_evaluation_var_bench.sh +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/baselines/script_evalution_evaluation.sh +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/baselines/script_evalution_request.sh +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/baselines/script_evalution_statistics.sh +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/benchmark_pytorch_vs_onnx.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/benchmark_user_experience.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/check_dataset.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/combine_datasets.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/compare_datasets.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/compare_old_vs_regen.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/convert_paw_to_svg.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/create_favicon_sizes.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/create_visualization_from_log.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/create_vqa_dataset.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/debug_cache.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/debug_eos_example.sh +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/docs/adr/001-llama-cpp-over-pytorch.md +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/docs/adr/002-q4_0-adapter-format.md +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/docs/adr/003-single-spec-field.md +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/docs/adr/004-compiler-naming.md +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/docs/adr/005-vllm-hidden-states.md +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/docs/adr/006-email-api-key-auth.md +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/docs/advanced/adrs.md +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/docs/advanced/architecture.md +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/docs/api-reference/cli.md +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/docs/api-reference/rest-api.md +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/docs/architecture.md +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/docs/getting-started/first-program.md +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/docs/getting-started/installation.md +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/docs/getting-started/naming-programs.md +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/docs/guide/browser-inference.md +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/docs/guide/how-it-works.md +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/docs/guide/local-inference.md +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/docs/guide/writing-good-specs.md +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/docs/hub/browsing-programs.md +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/docs/hub/feedback-cases.md +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/docs/hub/publishing-programs.md +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/docs/index.md +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/docs/requirements.txt +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/estimate_data_gen_cost.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/eval.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/examples/flask_app.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/examples/jupyter_notebook.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/examples/langchain_integration.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/examples/replace_openai.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/export_to_onnx.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/extract_models.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/inspect_data_dirs.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/latest_export.csv +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/log.train.81920.morecategories.extraprefix +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/main_no_spec_direct_ans_mix_continuous_sampleref_shorterprompt_vllm.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/merge_datasets.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/mkdocs.yml +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/paw.png +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/paw.svg +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/process_im2latex_dataset.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/programasweights/artifacts.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/programasweights/cache.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/programasweights/cli.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/programasweights/client.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/programasweights/compiler/__init__.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/programasweights/compiler/dummy.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/programasweights/config.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/programasweights/convert_peft_to_paw.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/programasweights/paw_format.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/programasweights/runtime/__init__.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/programasweights/runtime/interpreter.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/programasweights/runtime/interpreter_onnx.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/programasweights/runtime_llamacpp.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/programasweights_lora/__init__.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/programasweights_lora/compiler/__init__.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/programasweights_lora/lora_format.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/programasweights_lora/runtime/__init__.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/programasweights_lora/runtime/interpreter_lora.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/programasweights_lora/tests/test_compile_and_run.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/programasweights_lora/tests/test_lora_format.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/programasweights_lora/tests/test_training.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/programasweights_lora/train_lora.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/programasweights_lora/training/__init__.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/programasweights_lora/training/loops/lora_tuning_sft.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/run_eval.sh +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/run_training.sh +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/scripts/filter_table_by_length.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/alembic/env.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/alembic/script.py.mako +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/alembic/versions/001_initial_schema.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/alembic/versions/002_namespaced_aliases_hf_url.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/alembic/versions/003_fulltext_search_ranking.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/alembic/versions/004_fix_alias_slug_constraint.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/alembic.ini +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/api/__init__.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/api/dependencies.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/api/logging_config.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/api/middleware/__init__.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/api/middleware/rate_limit.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/api/models/__init__.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/api/models/database.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/api/models/orm.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/api/routes/__init__.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/api/routes/compile.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/api/routes/feedback.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/api/routes/infer.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/api/routes/models_info.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/api/services/__init__.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/api/services/auto_tag_service.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/api/services/auto_title_service.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/api/services/compile_provider.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/api/services/compile_service.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/api/services/infer_service.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/api/services/search_service.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/api/services/storage_service.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/benchmarks/benchmark_api.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/benchmarks/handcrafted_specs.json +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/benchmarks/last_benchmark_results.json +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/benchmarks/last_stress_results.json +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/benchmarks/stress_test.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/compiler_registry.json +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/provider_configs/gpt2.json +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/provider_configs/qwen3-0.6b.json +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/requirements.txt +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/scripts/ab_test_hf_vs_vllm.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/scripts/ablation_search.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/scripts/backfill_hf_browser_assets.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/scripts/backfill_hf_safetensors.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/scripts/backfill_interestingness.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/scripts/backfill_tags.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/scripts/backfill_titles.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/scripts/benchmark_gpt2.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/scripts/cleanup_storage.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/scripts/eval_search.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/scripts/evict_cold_programs.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/scripts/generate_prefix_cache.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/scripts/launch_gpt2_compiler.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/scripts/launch_qwen3_compiler.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/scripts/patch_vllm.sh +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/scripts/restart.sh +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/scripts/start_all.sh +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/scripts/start_gpt2_services.sh +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/scripts/start_provider.sh +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/scripts/start_services.sh +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/tests/__init__.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/tests/conftest.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/tests/test_auth.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/tests/test_compile.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/tests/test_errors.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/tests/test_infer.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/tests/test_integration_gpu.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/tests/test_rate_limit.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/tests/test_storage.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/vllm_models/__init__.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/vllm_models/gpt2_lora_patch.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/vllm_models/paw_compiler.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/vllm_models/prepare_checkpoint.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/vllm_models/register.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/stage2_firstpromptqwen_512_e1_generate_lora_e2grpo_overfit_one_debug.reward_plot.rollout_ppl.png +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/stage2_firstpromptqwen_512_e1_generate_lora_e2grpo_overfit_one_debug.reward_plot.train_gt_logprob.em_es.png +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/stage2_firstpromptqwen_512_e1_generate_lora_e2grpo_overfit_one_debug.reward_plot.train_gt_logprob.ppl.png +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/stage2_firstpromptqwen_512_e1_generate_lora_e2grpo_overfit_one_debug.reward_plot.train_gt_logprob.reward.png +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/test_1spec.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/test_all_caching.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/test_apple_count.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/test_batch_pilot.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/test_compile.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/test_e2e.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/test_execute.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/test_nspecs.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/test_one_vs_two_step.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/test_onnx_correctness.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/test_onnx_hf_model.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/test_onnx_hf_with_images.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/test_paw_format.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/test_thinking_comparison.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/tests/test_offline_cache.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/tests/test_sdk.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/tests/test_sdk.sh +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/train.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/train_no_spec_direct_ans_mix_continuous_sampleref_trainonly_shorterprompt_withregularizer_generate_lora.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/README.md +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/__init__.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/DATASET_CHANGELOG.md +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/README.md +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/VERIFICATION_PIPELINE.md +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/build_user_bench.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/dry_run_batch.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/filter_test_data.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/generate_specs.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/generate_specs_batch.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/incremental_merge.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/merge_and_upload.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/regenerate_outputs_batch.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/synthesize_data.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/synthesize_data_batch.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/templates/filter_system.txt +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/templates/filter_user.txt +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/templates/pairs_system.txt +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/templates/pairs_user.txt +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/templates/specs_system.txt +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/templates/specs_user.txt +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/templates/specs_user_freeform.txt +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/templates/specs_user_freeform_with_examples.txt +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/templates/specs_user_with_examples.txt +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/templates/verify_system.txt +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/templates/verify_user.txt +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/templates_old/filter_system.txt +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/templates_old/filter_user.txt +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/templates_old/pairs_system.txt +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/templates_old/pairs_user.txt +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/templates_old/specs_system.txt +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/templates_old/specs_user.txt +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/templates_old/specs_user_freeform.txt +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/templates_old/specs_user_freeform_with_examples.txt +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/templates_old/specs_user_with_examples.txt +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/templates_old/verify_system.txt +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/templates_old/verify_user.txt +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/verify_test_data.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/datasets/__init__.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/datasets/jsonl_text_pairs.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/loops/__init__.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/loops/prefix_tuning_sft.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/ttt.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/upload_model.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/upload_onnx_to_huggingface.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/upload_onnx_to_huggingface_with_token.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/utils.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/HANDOFF.md +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/README.md +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/app/__init__.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/app/config.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/app/main.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/app/middleware/__init__.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/app/middleware/rate_limit.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/app/models.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/app/services/__init__.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/app/services/auth_service.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/app/services/case_service.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/app/services/compiler_service.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/app/services/gpt_service.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/app/services/hub_service.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/app/services/image_service.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/app/services/interpreter_service.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/app/services/sql_manager.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/app/templates/gpt_test_generation.txt +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/app/utils/__init__.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/app/utils/image_placeholders.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/app/utils/program_hash.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/clear_db.sh +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/clear_tables.sql +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/data/programs.db +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/env_example.txt +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/example_images/README.md +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/get_data_examples.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/requirements.txt +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/run_server.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/setup_analytics_tables.sql +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/setup_auth_tables.sql +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/setup_cache_tables.sql +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/setup_cases_tables.sql +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/setup_database.sql +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/setup_database_simple.sql +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/setup_db.sh +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/setup_example_images.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/setup_hub_tables.sql +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/test_compilation_cache.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/README.md +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/e2e/helpers.ts +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/e2e/smoke.spec.ts +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/eslint.config.js +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/package-lock.json +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/package.json +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/playwright.config.ts +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/postcss.config.js +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/public/apple-touch-icon.png +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/public/browser-worker.html +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/public/favicon-16x16.png +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/public/favicon-32x32.png +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/public/paw-192.png +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/public/paw-512.png +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/public/paw.svg +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/public/react-test.html +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/public/test.html +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/public/vite.svg +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/scripts/deploy.sh +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/src/App.css +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/src/assets/react.svg +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/src/components/CompileButtonWithConfig.tsx +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/src/components/CompileSection.tsx +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/src/components/DocsPage.tsx +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/src/components/ExamplesInput.tsx +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/src/components/Footer.tsx +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/src/components/LandingPage.tsx +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/src/components/ModelSelector.tsx +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/src/components/PrivacyPage.tsx +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/src/components/SpecSuggestions.tsx +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/src/components/TermsPage.tsx +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/src/components/TestSection.tsx +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/src/index.css +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/src/main.tsx +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/tailwind.config.js +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/tsconfig.app.json +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/tsconfig.json +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/tsconfig.node.json +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/vite.config.ts +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/nginx-paw.conf +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/nginx.conf +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/setup_mysql.sh +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/start.sh +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/test_setup.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/ttt.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/.gitignore +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/LICENSE +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/README.md +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/__tests__/e2e/browser.spec.ts +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/__tests__/e2e/server.ts +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/__tests__/e2e/start-server.ts +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/__tests__/e2e/test-page.html +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/__tests__/loader.test.ts +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/__tests__/prompt.test.ts +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/examples/basic.html +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/package-lock.json +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/package.json +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/playwright.config.ts +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/serve.py +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/src/index.ts +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/src/loader.ts +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/src/runtime.ts +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/src/types.ts +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/test-standalone.html +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/tsconfig.json +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/vitest.config.ts +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/.git +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/.github/workflows/build-hf-space.yml +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/.github/workflows/ci.yml +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/.github/workflows/generate-docs.yml +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/.github/workflows/verify-generated-code.yml +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/.gitignore +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/.gitmodules +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/.npmignore +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/.prettierignore +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/CMakeLists.txt +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/LICENCE +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/README.md +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/README_banner.png +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/assets/screenshot_0.png +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/cpp/actions.hpp +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/cpp/generate_glue_prototype.js +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/cpp/glue.hpp +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/cpp/helpers/wcommon.cpp +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/cpp/helpers/wcommon.h +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/cpp/helpers/wlog.cpp +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/cpp/helpers/wlog.h +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/cpp/helpers/wsampling.cpp +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/cpp/helpers/wsampling.h +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/cpp/test_glue.cpp +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/cpp/wllama.cpp +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/basic/index.html +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/embeddings/index.html +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/.eslintrc.cjs +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/.gitignore +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/README.md +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/index.html +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/package-lock.json +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/package.json +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/postcss.config.js +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/public/favicon.ico +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/public/wllama.png +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/src/App.tsx +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/src/components/ChatScreen.tsx +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/src/components/GuideScreen.tsx +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/src/components/LogScreen.tsx +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/src/components/MarkdownMessage.tsx +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/src/components/ModelScreen.tsx +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/src/components/Navbar.tsx +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/src/components/ScreenWrapper.tsx +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/src/components/Sidebar.tsx +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/src/config.ts +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/src/index.css +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/src/main.tsx +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/src/utils/benchmark.ts +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/src/utils/custom-models.tsx +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/src/utils/displayed-model.tsx +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/src/utils/messages.context.tsx +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/src/utils/nl2br.tsx +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/src/utils/types.ts +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/src/utils/use-interval-when.ts +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/src/utils/utils.ts +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/src/utils/wllama.context.tsx +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/src/vite-env.d.ts +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/tailwind.config.cjs +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/tsconfig.app.json +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/tsconfig.json +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/tsconfig.node.json +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/vite.config.ts +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/guides/intro-v2.md +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/index.ts +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/package-lock.json +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/package.json +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/scripts/build_hf_space.sh +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/scripts/build_wasm.sh +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/scripts/build_worker.sh +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/scripts/docker-compose.yml +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/scripts/generate_wasm_from_cdn.js +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/scripts/http_server.js +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/scripts/post_build.sh +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/src/cache-manager.ts +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/src/glue/glue.ts +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/src/glue/messages.ts +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/src/index.ts +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/src/mjs.test.ts +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/src/model-manager.test.ts +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/src/model-manager.ts +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/src/multi-thread/wllama.js +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/src/multi-thread/wllama.wasm +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/src/single-thread/wllama.js +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/src/single-thread/wllama.wasm +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/src/utils.test.ts +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/src/utils.ts +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/src/wasm-from-cdn.ts +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/src/wllama.test.ts +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/src/wllama.ts +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/src/worker.ts +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/src/workers-code/generated.ts +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/src/workers-code/llama-cpp.js +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/src/workers-code/opfs-utils.js +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/tsconfig.build.json +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/tsup.config.ts +0 -0
- {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/vitest.config.ts +0 -0
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
# ProgramAsWeights (PAW)
|
|
2
|
+
|
|
3
|
+
PAW compiles natural language specifications into tiny neural functions that run locally. Each function takes a single text input and returns a single text output. Use it when you need fuzzy text processing — classification, extraction, format repair, search, triage — that regex can't handle but a full LLM is overkill for.
|
|
4
|
+
|
|
5
|
+
Website: https://programasweights.com
|
|
6
|
+
Docs: https://programasweights.readthedocs.io
|
|
7
|
+
|
|
8
|
+
## Install
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
pip install programasweights --extra-index-url https://pypi.programasweights.com/simple/
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
## Usage
|
|
15
|
+
|
|
16
|
+
```python
|
|
17
|
+
import programasweights as paw
|
|
18
|
+
|
|
19
|
+
# Use a pre-compiled function (downloads once, runs locally forever)
|
|
20
|
+
# "email-triage" is an official pre-compiled program (slug)
|
|
21
|
+
fn = paw.function("email-triage")
|
|
22
|
+
fn("Urgent: server is down!") # "immediate"
|
|
23
|
+
fn("Newsletter: spring picnic") # "wait"
|
|
24
|
+
|
|
25
|
+
# Compile your own from a description
|
|
26
|
+
program = paw.compile(
|
|
27
|
+
"Fix malformed JSON: repair missing quotes and trailing commas",
|
|
28
|
+
compiler="paw-4b-qwen3-0.6b" # or "paw-4b-gpt2" for smaller/faster
|
|
29
|
+
)
|
|
30
|
+
fn = paw.function(program.id)
|
|
31
|
+
fn("{name: 'Alice',}") # '{"name": "Alice"}'
|
|
32
|
+
|
|
33
|
+
# Or compile and load in one step
|
|
34
|
+
fn = paw.compile_and_load("Classify sentiment as positive or negative")
|
|
35
|
+
fn("I love this!") # "positive"
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Two Compilers
|
|
39
|
+
|
|
40
|
+
| | Standard (Qwen3 0.6B) | Compact (GPT-2 124M) |
|
|
41
|
+
|---|---|---|
|
|
42
|
+
| Compiler name | `paw-4b-qwen3-0.6b` | `paw-4b-gpt2` |
|
|
43
|
+
| Accuracy | Higher | Lower |
|
|
44
|
+
| Base model size | 594 MB | 105 MB |
|
|
45
|
+
| Program size | ~22 MB | ~5 MB |
|
|
46
|
+
| Inference speed | ~90ms (server) | ~50ms (server) |
|
|
47
|
+
| Runs in browser | No | Yes (must use this compiler) |
|
|
48
|
+
|
|
49
|
+
Default is Standard. Use Compact for smaller files or browser deployment.
|
|
50
|
+
|
|
51
|
+
## When to Use PAW
|
|
52
|
+
|
|
53
|
+
- **Fuzzy search** — typo-tolerant matching, semantic search, near-duplicate detection
|
|
54
|
+
- **Format repair** — fix broken JSON, normalize dates, repair malformed inputs
|
|
55
|
+
- **Classification** — sentiment, urgency, categories defined in your own words
|
|
56
|
+
- **Extraction** — emails, names, dates from messy unstructured text
|
|
57
|
+
- **Log triage** — extract errors from verbose output, filter noise
|
|
58
|
+
- **Intent routing** — map user descriptions to the closest URL, menu item, or setting
|
|
59
|
+
- **Agent preprocessing** — parse tool calls, validate outputs, route tasks
|
|
60
|
+
|
|
61
|
+
## Writing Good Specs
|
|
62
|
+
|
|
63
|
+
Description + examples. Use `Input: ... Output: ...` format.
|
|
64
|
+
|
|
65
|
+
```python
|
|
66
|
+
fn = paw.compile_and_load("""
|
|
67
|
+
Classify user intent. Return ONLY one of: search, create, delete, other.
|
|
68
|
+
|
|
69
|
+
Input: Find the latest report
|
|
70
|
+
Output: search
|
|
71
|
+
|
|
72
|
+
Input: Make a new folder
|
|
73
|
+
Output: create
|
|
74
|
+
|
|
75
|
+
Input: Remove old backups
|
|
76
|
+
Output: delete
|
|
77
|
+
""")
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
- State output constraints explicitly if any: "Return ONLY one of: X, Y, Z"
|
|
81
|
+
- Each function is stateless: one input, one output. No conversation history.
|
|
82
|
+
- Write a few test inputs with expected outputs, then try different spec phrasings and pick the one that passes the most.
|
|
83
|
+
|
|
84
|
+
## Browser / JavaScript SDK
|
|
85
|
+
|
|
86
|
+
Programs compiled with `paw-4b-gpt2` run in the browser via WebAssembly.
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
npm install @programasweights/web
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
```javascript
|
|
93
|
+
import paw from '@programasweights/web';
|
|
94
|
+
|
|
95
|
+
const fn = await paw.function('programasweights/email-triage');
|
|
96
|
+
const result = await fn('Urgent: server is down!');
|
|
97
|
+
// result: "immediate"
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
## Authentication (optional)
|
|
101
|
+
|
|
102
|
+
Sign in for higher rate limits and program naming. Everything works without it.
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
export PAW_API_KEY=paw_sk_...
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
Generate API keys at https://programasweights.com/settings.
|
|
109
|
+
|
|
110
|
+
| | Anonymous | Authenticated |
|
|
111
|
+
|---|---|---|
|
|
112
|
+
| Compile rate limit | 20/hr | 60/hr |
|
|
113
|
+
| Name programs (slugs) | No | Yes |
|
|
114
|
+
|
|
115
|
+
## CLI
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
paw compile --spec "Classify sentiment" --json
|
|
119
|
+
paw run --program <program_id> --input "I love this!" --json
|
|
120
|
+
paw info <program_id> # show program metadata
|
|
121
|
+
paw rename <program_id> my-slug # name a program (requires auth)
|
|
122
|
+
paw login # save API key
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
`--json` gives structured output. Example:
|
|
126
|
+
|
|
127
|
+
```json
|
|
128
|
+
{"program_id": "a6b454023d41ac9ca845", "slug": null, "status": "ready", "error": null, "timings": {"total_ms": 2800}}
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
## Full API Reference
|
|
132
|
+
|
|
133
|
+
```python
|
|
134
|
+
program = paw.compile(
|
|
135
|
+
spec, # natural language specification (str)
|
|
136
|
+
compiler="paw-4b-qwen3-0.6b",
|
|
137
|
+
slug=None, # URL-safe handle (requires auth)
|
|
138
|
+
public=True, # list on public hub
|
|
139
|
+
)
|
|
140
|
+
# Returns: Program(id, slug, status, timings, error)
|
|
141
|
+
|
|
142
|
+
fn = paw.function(program) # accepts Program object, hash ID, or slug
|
|
143
|
+
fn = paw.function("a6b454023d41ac9ca845")
|
|
144
|
+
fn = paw.function("da03/my-classifier")
|
|
145
|
+
|
|
146
|
+
result: str = fn(input_text: str, max_tokens=512, temperature=0.0)
|
|
147
|
+
|
|
148
|
+
fn = paw.compile_and_load(spec, compiler="paw-4b-qwen3-0.6b")
|
|
149
|
+
|
|
150
|
+
programs = paw.list_programs(sort="recent", per_page=20) # requires auth
|
|
151
|
+
|
|
152
|
+
paw.login()
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
## Common Errors
|
|
156
|
+
|
|
157
|
+
| Error | Cause | Fix |
|
|
158
|
+
|-------|-------|-----|
|
|
159
|
+
| `httpx.HTTPStatusError: 404` on download | Program still uploading to CDN | SDK retries automatically. If persistent, recompile. |
|
|
160
|
+
| `httpx.HTTPStatusError: 422` on compile | Spec too short (<10 chars) | Adjust spec length. |
|
|
161
|
+
| `httpx.HTTPStatusError: 429` | Rate limit exceeded | Wait, or sign in for higher limits. |
|
|
162
|
+
|
|
163
|
+
## Performance
|
|
164
|
+
|
|
165
|
+
- **First call** ~500ms (loads base model). Subsequent calls ~50-90ms.
|
|
166
|
+
- **Base model shared** across functions. Each LoRA adapter adds ~22 MB.
|
|
167
|
+
- **Thread-safe** and **blocking**.
|
|
168
|
+
- **Cache**: `~/.cache/programasweights/`. Override with `PAW_CACHE_DIR`.
|
|
169
|
+
- **Offline** after first download.
|
|
170
|
+
|
|
171
|
+
## Browse Programs
|
|
172
|
+
|
|
173
|
+
https://programasweights.com/hub
|
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.2.2 (2026-03-19)
|
|
4
|
+
|
|
5
|
+
- Add `paw.compile_and_load()` convenience method (compile + load in one call)
|
|
6
|
+
- `paw.function()` now accepts a `Program` object directly (not just string ID)
|
|
7
|
+
- Add `paw.list_programs()` for authenticated users to list their programs
|
|
8
|
+
- Suppress `llama.cpp` stderr noise by default; use `verbose=True` to enable
|
|
9
|
+
- Rewritten AGENTS.md with spec-writing tips, full API reference, common errors, and performance notes
|
|
10
|
+
|
|
3
11
|
## 0.2.0 (2026-04-01)
|
|
4
12
|
|
|
5
13
|
First public release.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: programasweights
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.3
|
|
4
4
|
Summary: Compile natural language specifications into neural programs that run locally via llama.cpp.
|
|
5
5
|
Project-URL: Homepage, https://programasweights.com
|
|
6
6
|
Project-URL: Repository, https://github.com/programasweights/programasweights-python
|
|
@@ -58,6 +58,10 @@ program = paw.compile(
|
|
|
58
58
|
)
|
|
59
59
|
fn = paw.function(program.slug) # or paw.function(program.id)
|
|
60
60
|
fn("{name: 'Alice',}") # '{"name": "Alice"}'
|
|
61
|
+
|
|
62
|
+
# Or compile and load in one step
|
|
63
|
+
fn = paw.compile_and_load("Classify sentiment as positive or negative")
|
|
64
|
+
fn("I love this!") # "positive"
|
|
61
65
|
```
|
|
62
66
|
|
|
63
67
|
## Two Compilers
|
|
@@ -28,6 +28,10 @@ program = paw.compile(
|
|
|
28
28
|
)
|
|
29
29
|
fn = paw.function(program.slug) # or paw.function(program.id)
|
|
30
30
|
fn("{name: 'Alice',}") # '{"name": "Alice"}'
|
|
31
|
+
|
|
32
|
+
# Or compile and load in one step
|
|
33
|
+
fn = paw.compile_and_load("Classify sentiment as positive or negative")
|
|
34
|
+
fn("I love this!") # "positive"
|
|
31
35
|
```
|
|
32
36
|
|
|
33
37
|
## Two Compilers
|
|
@@ -24,7 +24,7 @@ Loads a compiled program and returns a callable. Downloads the program and base
|
|
|
24
24
|
|
|
25
25
|
| Parameter | Description |
|
|
26
26
|
|-----------|-------------|
|
|
27
|
-
| `name_or_id` | Program hash ID (e.g. `a6b454023d41ac9ca845`), slug (e.g. `da03/my-classifier`), or official shorthand (e.g. `email-triage`). |
|
|
27
|
+
| `name_or_id` | A `Program` object, hash ID (e.g. `a6b454023d41ac9ca845`), slug (e.g. `da03/my-classifier`), or official shorthand (e.g. `email-triage`). |
|
|
28
28
|
| `n_ctx` | Context length for the local runtime (default `2048`). |
|
|
29
29
|
| `n_gpu_layers` | GPU layers to offload (`0` = CPU-only, `-1` = all). Set `PAW_GPU_LAYERS` env var as default. |
|
|
30
30
|
| `verbose` | Enable verbose logging (default `False`). |
|
|
@@ -76,6 +76,36 @@ Compiles a natural language spec on the server. Returns a `Program` object.
|
|
|
76
76
|
| `timings` | Timing metadata from the server. |
|
|
77
77
|
| `error` | Error message when compilation fails. |
|
|
78
78
|
|
|
79
|
+
## `paw.compile_and_load`
|
|
80
|
+
|
|
81
|
+
```python
|
|
82
|
+
fn = paw.compile_and_load(spec, compiler="paw-4b-qwen3-0.6b", **kwargs)
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Convenience method that compiles a spec and immediately loads the result for local inference. Equivalent to `paw.function(paw.compile(spec, ...).id)`. Returns a callable.
|
|
86
|
+
|
|
87
|
+
Accepts all the same parameters as `paw.compile`.
|
|
88
|
+
|
|
89
|
+
## `paw.list_programs`
|
|
90
|
+
|
|
91
|
+
```python
|
|
92
|
+
result = paw.list_programs(sort="recent", per_page=20)
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Returns a dict with the authenticated user's compiled programs. Requires authentication.
|
|
96
|
+
|
|
97
|
+
| Parameter | Description |
|
|
98
|
+
|-----------|-------------|
|
|
99
|
+
| `sort` | Sort order: `"recent"` (default), `"votes"`, `"recommended"`. |
|
|
100
|
+
| `per_page` | Number of results per page (default `20`). |
|
|
101
|
+
|
|
102
|
+
**Return value** -- dict:
|
|
103
|
+
|
|
104
|
+
| Key | Description |
|
|
105
|
+
|-----|-------------|
|
|
106
|
+
| `programs` | List of program dicts with `id`, `spec`, `name`, `compiler`, etc. |
|
|
107
|
+
| `total` | Total number of programs. |
|
|
108
|
+
|
|
79
109
|
## `paw.login`
|
|
80
110
|
|
|
81
111
|
```python
|
|
@@ -21,8 +21,9 @@ API reference:
|
|
|
21
21
|
paw.api_url Server URL (default: https://programasweights.com)
|
|
22
22
|
paw.api_key API key (set via login() or PAW_API_KEY env var)
|
|
23
23
|
"""
|
|
24
|
+
from __future__ import annotations
|
|
24
25
|
|
|
25
|
-
__version__ = "0.2.
|
|
26
|
+
__version__ = "0.2.3"
|
|
26
27
|
|
|
27
28
|
from .config import get_api_url, get_api_key, set_api_key
|
|
28
29
|
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "programasweights"
|
|
7
|
-
version = "0.2.
|
|
7
|
+
version = "0.2.3"
|
|
8
8
|
description = "Compile natural language specifications into neural programs that run locally via llama.cpp."
|
|
9
9
|
readme = "PYPI_README.md"
|
|
10
10
|
requires-python = ">=3.9"
|
|
@@ -50,10 +50,9 @@ class Settings(BaseSettings):
|
|
|
50
50
|
LOG_LEVEL: str = "INFO"
|
|
51
51
|
LOG_FORMAT: str = "json"
|
|
52
52
|
|
|
53
|
-
# Server
|
|
53
|
+
# Server (single process: sessions and compile jobs are in-memory)
|
|
54
54
|
HOST: str = "0.0.0.0"
|
|
55
55
|
PORT: int = 8000
|
|
56
|
-
WORKERS: int = 4
|
|
57
56
|
|
|
58
57
|
# CORS
|
|
59
58
|
CORS_ORIGINS: list[str] = [
|
|
@@ -16,6 +16,8 @@ from redis.asyncio import Redis
|
|
|
16
16
|
|
|
17
17
|
from api.config import get_settings
|
|
18
18
|
from api.logging_config import configure_logging, request_id_ctx
|
|
19
|
+
from collections import deque
|
|
20
|
+
|
|
19
21
|
from api.middleware.rate_limit import (
|
|
20
22
|
RateLimiter,
|
|
21
23
|
identifier_for_request,
|
|
@@ -29,6 +31,31 @@ gpu_semaphore = asyncio.Semaphore(1)
|
|
|
29
31
|
|
|
30
32
|
_RATE_LIMITED_PATHS = {"/api/v1/compile", "/api/v1/infer", "/api/v1/feedback"}
|
|
31
33
|
|
|
34
|
+
_FALLBACK_LIMITS = {"compile": 13000, "infer": 5700}
|
|
35
|
+
_FALLBACK_WINDOW = 3600
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class _FallbackLimiter:
|
|
39
|
+
"""In-memory global rate limiter used when Redis is unavailable."""
|
|
40
|
+
|
|
41
|
+
def __init__(self):
|
|
42
|
+
self._windows: dict[str, deque] = {
|
|
43
|
+
"compile": deque(),
|
|
44
|
+
"infer": deque(),
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
def check(self, endpoint: str) -> bool:
|
|
48
|
+
key = "compile" if "compile" in endpoint else "infer"
|
|
49
|
+
now = time.time()
|
|
50
|
+
window = self._windows[key]
|
|
51
|
+
cutoff = now - _FALLBACK_WINDOW
|
|
52
|
+
while window and window[0] < cutoff:
|
|
53
|
+
window.popleft()
|
|
54
|
+
if len(window) >= _FALLBACK_LIMITS[key]:
|
|
55
|
+
return False
|
|
56
|
+
window.append(now)
|
|
57
|
+
return True
|
|
58
|
+
|
|
32
59
|
|
|
33
60
|
def create_app() -> FastAPI:
|
|
34
61
|
settings = get_settings()
|
|
@@ -45,13 +72,13 @@ def create_app() -> FastAPI:
|
|
|
45
72
|
openapi_url="/api/openapi.json",
|
|
46
73
|
)
|
|
47
74
|
|
|
48
|
-
# Redis + rate limiter (attached to app state for access in routes)
|
|
49
75
|
redis_client: Redis | None = None
|
|
50
76
|
rate_limiter: RateLimiter | None = None
|
|
77
|
+
fallback_limiter: _FallbackLimiter | None = None
|
|
51
78
|
|
|
52
79
|
@app.on_event("startup")
|
|
53
80
|
async def startup_redis():
|
|
54
|
-
nonlocal redis_client, rate_limiter
|
|
81
|
+
nonlocal redis_client, rate_limiter, fallback_limiter
|
|
55
82
|
try:
|
|
56
83
|
redis_client = Redis.from_url(
|
|
57
84
|
settings.REDIS_URL, decode_responses=True, socket_connect_timeout=5,
|
|
@@ -60,11 +87,14 @@ def create_app() -> FastAPI:
|
|
|
60
87
|
rate_limiter = RateLimiter(redis_client)
|
|
61
88
|
app.state.redis = redis_client
|
|
62
89
|
app.state.rate_limiter = rate_limiter
|
|
90
|
+
app.state.redis_available = True
|
|
63
91
|
logger.info("redis_connected", url=settings.REDIS_URL)
|
|
64
92
|
except Exception:
|
|
65
|
-
logger.warning("redis_unavailable", url=settings.REDIS_URL)
|
|
93
|
+
logger.warning("redis_unavailable, using in-memory global fallback limiter", url=settings.REDIS_URL)
|
|
66
94
|
app.state.redis = None
|
|
67
95
|
app.state.rate_limiter = None
|
|
96
|
+
app.state.redis_available = False
|
|
97
|
+
fallback_limiter = _FallbackLimiter()
|
|
68
98
|
|
|
69
99
|
@app.on_event("shutdown")
|
|
70
100
|
async def shutdown_redis():
|
|
@@ -90,7 +120,23 @@ def create_app() -> FastAPI:
|
|
|
90
120
|
token = request_id_ctx.set(rid)
|
|
91
121
|
try:
|
|
92
122
|
# Rate limiting for /compile and /infer
|
|
93
|
-
if request.method == "POST" and request.url.path in _RATE_LIMITED_PATHS and rate_limiter is not None:
|
|
123
|
+
if request.method == "POST" and request.url.path in _RATE_LIMITED_PATHS and rate_limiter is None and fallback_limiter is not None:
|
|
124
|
+
endpoint = "compile" if "compile" in request.url.path else "infer"
|
|
125
|
+
if not fallback_limiter.check(endpoint):
|
|
126
|
+
logger.info("fallback_rate_limited", endpoint=endpoint)
|
|
127
|
+
return JSONResponse(
|
|
128
|
+
status_code=429,
|
|
129
|
+
content={
|
|
130
|
+
"error": "rate_limit_exceeded",
|
|
131
|
+
"message": "Server is busy. Please try again shortly.",
|
|
132
|
+
"request_id": rid,
|
|
133
|
+
},
|
|
134
|
+
headers={"Retry-After": "10"},
|
|
135
|
+
)
|
|
136
|
+
request.state.has_concurrent_lock = False
|
|
137
|
+
request.state.rate_limit_result = None
|
|
138
|
+
|
|
139
|
+
elif request.method == "POST" and request.url.path in _RATE_LIMITED_PATHS and rate_limiter is not None:
|
|
94
140
|
from api.dependencies import get_current_user
|
|
95
141
|
from api.models.database import get_db
|
|
96
142
|
|
|
@@ -132,7 +132,6 @@ async def github_callback(code: str, state: str, request: Request, db: AsyncSess
|
|
|
132
132
|
"email": email,
|
|
133
133
|
"avatar_url": avatar_url,
|
|
134
134
|
"tier": "github",
|
|
135
|
-
"github_access_token": access_token,
|
|
136
135
|
"created_at": time.time(),
|
|
137
136
|
}
|
|
138
137
|
_sessions[session_token] = user_info
|
|
@@ -4,7 +4,7 @@ Health check endpoint.
|
|
|
4
4
|
|
|
5
5
|
import time
|
|
6
6
|
|
|
7
|
-
from fastapi import APIRouter
|
|
7
|
+
from fastapi import APIRouter, Request
|
|
8
8
|
|
|
9
9
|
from api.models.schemas import HealthResponse
|
|
10
10
|
|
|
@@ -14,11 +14,16 @@ _start_time = time.time()
|
|
|
14
14
|
|
|
15
15
|
|
|
16
16
|
@router.get("/health", response_model=HealthResponse)
|
|
17
|
-
async def health_check():
|
|
17
|
+
async def health_check(request: Request):
|
|
18
|
+
warnings = []
|
|
19
|
+
if not getattr(request.app.state, "redis_available", True):
|
|
20
|
+
warnings.append("redis_unavailable: using in-memory global rate limit fallback")
|
|
21
|
+
|
|
18
22
|
return HealthResponse(
|
|
19
|
-
status="healthy",
|
|
23
|
+
status="healthy" if not warnings else "degraded",
|
|
20
24
|
version="0.2.0",
|
|
21
25
|
gpu_services={},
|
|
22
26
|
queue_depth=0,
|
|
23
27
|
uptime_s=time.time() - _start_time,
|
|
28
|
+
warnings=warnings,
|
|
24
29
|
)
|
|
@@ -146,9 +146,10 @@ async def list_programs(
|
|
|
146
146
|
if search_term:
|
|
147
147
|
try:
|
|
148
148
|
from redis.asyncio import Redis as AsyncRedis
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
await
|
|
149
|
+
settings = get_settings()
|
|
150
|
+
_redis = AsyncRedis.from_url(settings.REDIS_URL, decode_responses=True, socket_connect_timeout=1)
|
|
151
|
+
queue_depth = int(await _redis.get("paw:compile_queue_depth") or 0)
|
|
152
|
+
await _redis.aclose()
|
|
152
153
|
server_idle = queue_depth <= 1
|
|
153
154
|
except Exception:
|
|
154
155
|
server_idle = True
|
|
@@ -794,3 +794,68 @@ test.describe('Slug and naming', () => {
|
|
|
794
794
|
expect(count).toBeGreaterThanOrEqual(0);
|
|
795
795
|
});
|
|
796
796
|
});
|
|
797
|
+
|
|
798
|
+
// ---------------------------------------------------------------------------
|
|
799
|
+
// Auth and permissions (signed-out)
|
|
800
|
+
// ---------------------------------------------------------------------------
|
|
801
|
+
|
|
802
|
+
test.describe('Auth: signed-out behavior', () => {
|
|
803
|
+
test('profile redirects to home when not signed in', async ({ page }) => {
|
|
804
|
+
await page.goto('/profile');
|
|
805
|
+
await page.waitForURL('/', { timeout: 10_000 });
|
|
806
|
+
expect(page.url()).toMatch(/\/$/);
|
|
807
|
+
});
|
|
808
|
+
|
|
809
|
+
test('settings redirects to home when not signed in', async ({ page }) => {
|
|
810
|
+
await page.goto('/settings');
|
|
811
|
+
await page.waitForURL('/', { timeout: 10_000 });
|
|
812
|
+
expect(page.url()).toMatch(/\/$/);
|
|
813
|
+
});
|
|
814
|
+
|
|
815
|
+
test('hub program page does not show slug edit for anonymous users', async ({ page }) => {
|
|
816
|
+
await page.goto(`/hub/${KNOWN_PROGRAM_ID}`);
|
|
817
|
+
await waitForPageLoad(page);
|
|
818
|
+
const pencil = page.locator('button:has(svg.lucide-pencil)');
|
|
819
|
+
const bookmark = page.locator('button:has(svg.lucide-bookmark)');
|
|
820
|
+
await expect(pencil).toHaveCount(0);
|
|
821
|
+
await expect(bookmark).toHaveCount(0);
|
|
822
|
+
});
|
|
823
|
+
|
|
824
|
+
test('case delete buttons not shown for anonymous users', async ({ page }) => {
|
|
825
|
+
await page.goto(`/hub/${KNOWN_PROGRAM_ID}`);
|
|
826
|
+
await waitForPageLoad(page);
|
|
827
|
+
const trash = page.locator('button:has(svg.lucide-trash-2)');
|
|
828
|
+
await expect(trash).toHaveCount(0);
|
|
829
|
+
});
|
|
830
|
+
|
|
831
|
+
test('header does not flash sign-in button then switch', async ({ page }) => {
|
|
832
|
+
await page.goto('/');
|
|
833
|
+
const signIn = page.locator('a[href*="auth/github"]').first();
|
|
834
|
+
await expect(signIn).toBeVisible({ timeout: 10_000 });
|
|
835
|
+
});
|
|
836
|
+
});
|
|
837
|
+
|
|
838
|
+
// ---------------------------------------------------------------------------
|
|
839
|
+
// Mobile menu route-change close
|
|
840
|
+
// ---------------------------------------------------------------------------
|
|
841
|
+
|
|
842
|
+
test.describe('Mobile menu closes on navigation', () => {
|
|
843
|
+
test.use({ viewport: { width: 375, height: 812 } });
|
|
844
|
+
|
|
845
|
+
test('mobile menu closes when navigating via logo', async ({ page }) => {
|
|
846
|
+
await page.goto('/playground');
|
|
847
|
+
await waitForPageLoad(page);
|
|
848
|
+
|
|
849
|
+
const menuBtn = page.locator('button[aria-label*="menu"]').first();
|
|
850
|
+
if (await menuBtn.isVisible()) {
|
|
851
|
+
await menuBtn.click();
|
|
852
|
+
await page.waitForTimeout(300);
|
|
853
|
+
const menu = page.locator('nav.space-y-1').first();
|
|
854
|
+
await expect(menu).toBeVisible();
|
|
855
|
+
|
|
856
|
+
await page.locator('a[href="/"]').first().click();
|
|
857
|
+
await page.waitForTimeout(500);
|
|
858
|
+
await expect(menu).not.toBeVisible();
|
|
859
|
+
}
|
|
860
|
+
});
|
|
861
|
+
});
|
|
@@ -14,20 +14,20 @@
|
|
|
14
14
|
|
|
15
15
|
<!-- App Info -->
|
|
16
16
|
<title>PAW — Define functions in English, run them locally</title>
|
|
17
|
-
<meta name="description" content="ProgramAsWeights compiles natural language specs into tiny neural programs that run
|
|
17
|
+
<meta name="description" content="ProgramAsWeights compiles natural language specs into tiny neural programs that run on your machine. Once compiled, they work as regular Python functions." />
|
|
18
18
|
|
|
19
19
|
<!-- Open Graph / Social Media -->
|
|
20
20
|
<meta property="og:title" content="PAW — Define functions in English, run them locally" />
|
|
21
|
-
<meta property="og:description" content="Compile natural language into tiny neural programs.
|
|
22
|
-
<meta property="og:image" content="/paw-192.png" />
|
|
21
|
+
<meta property="og:description" content="Compile natural language specs into tiny neural programs that run on your machine. Once compiled, they work as regular Python functions." />
|
|
22
|
+
<meta property="og:image" content="https://programasweights.com/paw-192.png" />
|
|
23
23
|
<meta property="og:type" content="website" />
|
|
24
24
|
<meta property="og:site_name" content="ProgramAsWeights" />
|
|
25
25
|
|
|
26
26
|
<!-- Twitter Card -->
|
|
27
27
|
<meta name="twitter:card" content="summary_large_image" />
|
|
28
28
|
<meta name="twitter:title" content="PAW — Define functions in English, run them locally" />
|
|
29
|
-
<meta name="twitter:description" content="Compile natural language into tiny neural programs.
|
|
30
|
-
<meta name="twitter:image" content="/paw-192.png" />
|
|
29
|
+
<meta name="twitter:description" content="Compile natural language specs into tiny neural programs that run on your machine. Once compiled, they work as regular Python functions." />
|
|
30
|
+
<meta name="twitter:image" content="https://programasweights.com/paw-192.png" />
|
|
31
31
|
|
|
32
32
|
<!-- Theme Color -->
|
|
33
33
|
<meta name="theme-color" content="#111827" />
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { BrowserRouter as Router, Routes, Route, Navigate, useLocation } from 'react-router-dom';
|
|
2
|
-
import { useEffect } from 'react';
|
|
2
|
+
import { Component, useEffect } from 'react';
|
|
3
|
+
import type { ReactNode } from 'react';
|
|
3
4
|
import { Toaster } from 'react-hot-toast';
|
|
5
|
+
import { AuthProvider } from './contexts/AuthContext';
|
|
4
6
|
import MainInterface from './components/MainInterface';
|
|
5
7
|
import Header from './components/Header';
|
|
6
8
|
import LandingPage from './components/LandingPage';
|
|
@@ -26,9 +28,38 @@ function ScrollToTop() {
|
|
|
26
28
|
return null;
|
|
27
29
|
}
|
|
28
30
|
|
|
31
|
+
class ErrorBoundary extends Component<{ children: ReactNode }, { hasError: boolean }> {
|
|
32
|
+
state = { hasError: false };
|
|
33
|
+
static getDerivedStateFromError() { return { hasError: true }; }
|
|
34
|
+
componentDidCatch(error: unknown, info: unknown) {
|
|
35
|
+
console.error('Uncaught render error:', error, info);
|
|
36
|
+
}
|
|
37
|
+
render() {
|
|
38
|
+
if (this.state.hasError) {
|
|
39
|
+
return (
|
|
40
|
+
<div className="min-h-screen flex items-center justify-center bg-gray-50">
|
|
41
|
+
<div className="text-center max-w-md px-6">
|
|
42
|
+
<h1 className="text-2xl font-bold text-gray-900 mb-3">Something went wrong</h1>
|
|
43
|
+
<p className="text-gray-600 mb-6">An unexpected error occurred. Please try reloading the page.</p>
|
|
44
|
+
<button
|
|
45
|
+
onClick={() => window.location.reload()}
|
|
46
|
+
className="px-5 py-2.5 bg-gray-900 text-white rounded-lg hover:bg-gray-800 transition-colors text-sm font-medium"
|
|
47
|
+
>
|
|
48
|
+
Reload page
|
|
49
|
+
</button>
|
|
50
|
+
</div>
|
|
51
|
+
</div>
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
return this.props.children;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
29
58
|
function App() {
|
|
30
59
|
return (
|
|
60
|
+
<ErrorBoundary>
|
|
31
61
|
<Router>
|
|
62
|
+
<AuthProvider>
|
|
32
63
|
<ScrollToTop />
|
|
33
64
|
<div className="min-h-screen bg-gray-50">
|
|
34
65
|
<Toaster
|
|
@@ -70,7 +101,9 @@ function App() {
|
|
|
70
101
|
<Footer />
|
|
71
102
|
<NavigationHelper />
|
|
72
103
|
</div>
|
|
104
|
+
</AuthProvider>
|
|
73
105
|
</Router>
|
|
106
|
+
</ErrorBoundary>
|
|
74
107
|
);
|
|
75
108
|
}
|
|
76
109
|
|
{programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/src/components/AboutPage.tsx
RENAMED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { Link } from 'react-router-dom';
|
|
2
|
+
import { Helmet } from 'react-helmet-async';
|
|
2
3
|
import { Code, Zap, Shield, Users, BookOpen, Github, ExternalLink, Package, Terminal, Globe } from 'lucide-react';
|
|
3
4
|
|
|
4
5
|
const AboutPage: React.FC = () => {
|
|
5
6
|
return (
|
|
6
7
|
<div className="max-w-4xl mx-auto space-y-12">
|
|
8
|
+
<Helmet><title>About — PAW</title></Helmet>
|
|
7
9
|
{/* Hero */}
|
|
8
10
|
<div className="text-center">
|
|
9
11
|
<div className="flex items-center justify-center w-16 h-16 bg-gray-900 rounded-2xl mx-auto mb-6">
|
|
@@ -81,7 +83,7 @@ const AboutPage: React.FC = () => {
|
|
|
81
83
|
</h2>
|
|
82
84
|
<div className="grid md:grid-cols-2 gap-6">
|
|
83
85
|
{[
|
|
84
|
-
{ icon: Shield, title: 'Private by default', desc: '
|
|
86
|
+
{ icon: Shield, title: 'Private by default', desc: 'Programs run locally after download. Your data stays on your machine during local inference.' },
|
|
85
87
|
{ icon: Zap, title: 'Deterministic', desc: 'Greedy decoding means identical input always produces identical output.' },
|
|
86
88
|
{ icon: Package, title: 'Tiny programs', desc: 'Programs are small LoRA adapters (5-22 MB). The interpreter is a lightweight pretrained model (105-594 MB, downloaded once).' },
|
|
87
89
|
{ icon: Code, title: 'Python-native', desc: 'pip install, import, call. No Docker, no servers, no configuration.' },
|