programasweights 0.2.1__tar.gz → 0.2.2.dev1__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.2.dev1/.cursor/rules/sdk-publishing.mdc +53 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/.cursor/rules/vllm-deployment.mdc +17 -5
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/PKG-INFO +1 -1
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/programasweights/__init__.py +59 -3
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/programasweights/client.py +25 -7
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/programasweights/runtime_llamacpp.py +19 -6
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/pyproject.toml +1 -1
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/api/routes/programs.py +10 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/api/services/compile_provider.py +26 -5
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/tests/test_sdk.py +82 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/tests/test_sdk.sh +1 -1
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/frontend/e2e/full.spec.ts +12 -14
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/frontend/src/components/AuthorPage.tsx +10 -5
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/frontend/src/components/Footer.tsx +1 -1
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/frontend/src/components/HubProgramPage.tsx +14 -20
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/frontend/src/components/LandingPage.tsx +4 -2
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/frontend/src/components/MainInterface.tsx +52 -36
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/frontend/src/components/NavigationHelper.tsx +1 -1
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/frontend/src/components/ProfilePage.tsx +27 -20
- programasweights-0.2.1/web-app/frontend/test-results/.last-run.json +0 -4
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/.git +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/.github/workflows/web-sdk.yml +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/.gitignore +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/.gitmodules +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/.hatch_build.toml +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/.readthedocs.yaml +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/1apple.jpg +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/1apple2.jpg +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/2apples.jpg +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/2apples2.jpg +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/3apples.jpg +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/3apples2.jpg +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/479400.png +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/4apples.jpg +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/4apples2.jpg +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/4apples3.jpg +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/4apples4.jpg +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/5apples.jpg +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/6apples.jpg +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/8apples.jpg +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/9apples.jpg +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/AGENTS.md +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/CHANGELOG.md +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/FLOW_SUMMARY.md +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/LICENSE +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/MANIFEST.in +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/ONNX_MIGRATION_PLAN.md +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/PREFIX_TOKENS_DESIGN.md +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/PYPI_README.md +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/README.md +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/TRUNCATION_CHANGES.md +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/USE_CASES_AND_IDEAS.md +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/VERIFICATION_USAGE.md +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/analyze_dataset.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/analyze_lengths.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/baselines/code_prompt.md +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/baselines/evaluate_openai_python_code_baseline.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/baselines/openai_batch_request.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/baselines/prepare_alchemist_data.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/baselines/prepare_var_bench_data.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/baselines/python_code_sandbox.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/baselines/script_evaluation_var_bench.sh +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/baselines/script_evalution_evaluation.sh +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/baselines/script_evalution_request.sh +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/baselines/script_evalution_statistics.sh +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/benchmark_pytorch_vs_onnx.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/benchmark_user_experience.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/check_dataset.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/combine_datasets.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/compare_datasets.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/compare_old_vs_regen.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/convert_paw_to_svg.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/create_favicon_sizes.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/create_visualization_from_log.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/create_vqa_dataset.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/debug_cache.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/debug_eos_example.sh +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/docs/adr/001-llama-cpp-over-pytorch.md +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/docs/adr/002-q4_0-adapter-format.md +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/docs/adr/003-single-spec-field.md +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/docs/adr/004-compiler-naming.md +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/docs/adr/005-vllm-hidden-states.md +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/docs/adr/006-email-api-key-auth.md +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/docs/advanced/adrs.md +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/docs/advanced/architecture.md +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/docs/api-reference/cli.md +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/docs/api-reference/python-sdk.md +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/docs/api-reference/rest-api.md +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/docs/architecture.md +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/docs/getting-started/first-program.md +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/docs/getting-started/installation.md +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/docs/getting-started/naming-programs.md +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/docs/guide/browser-inference.md +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/docs/guide/how-it-works.md +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/docs/guide/local-inference.md +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/docs/guide/writing-good-specs.md +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/docs/hub/browsing-programs.md +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/docs/hub/feedback-cases.md +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/docs/hub/publishing-programs.md +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/docs/index.md +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/docs/requirements.txt +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/estimate_data_gen_cost.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/eval.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/examples/flask_app.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/examples/jupyter_notebook.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/examples/langchain_integration.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/examples/replace_openai.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/export_to_onnx.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/extract_models.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/inspect_data_dirs.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/latest_export.csv +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/log.train.81920.morecategories.extraprefix +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/main_no_spec_direct_ans_mix_continuous_sampleref_shorterprompt_vllm.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/merge_datasets.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/mkdocs.yml +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/paw.png +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/paw.svg +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/process_im2latex_dataset.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/programasweights/artifacts.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/programasweights/cache.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/programasweights/cli.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/programasweights/compiler/__init__.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/programasweights/compiler/dummy.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/programasweights/config.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/programasweights/convert_peft_to_paw.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/programasweights/paw_format.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/programasweights/runtime/__init__.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/programasweights/runtime/interpreter.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/programasweights/runtime/interpreter_onnx.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/programasweights_lora/__init__.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/programasweights_lora/compiler/__init__.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/programasweights_lora/lora_format.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/programasweights_lora/runtime/__init__.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/programasweights_lora/runtime/interpreter_lora.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/programasweights_lora/tests/test_compile_and_run.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/programasweights_lora/tests/test_lora_format.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/programasweights_lora/tests/test_training.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/programasweights_lora/train_lora.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/programasweights_lora/training/__init__.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/programasweights_lora/training/loops/lora_tuning_sft.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/run_eval.sh +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/run_training.sh +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/scripts/filter_table_by_length.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/.env.example +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/alembic/env.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/alembic/script.py.mako +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/alembic/versions/001_initial_schema.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/alembic/versions/002_namespaced_aliases_hf_url.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/alembic/versions/003_fulltext_search_ranking.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/alembic/versions/004_fix_alias_slug_constraint.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/alembic.ini +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/api/__init__.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/api/config.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/api/dependencies.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/api/logging_config.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/api/main.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/api/middleware/__init__.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/api/middleware/rate_limit.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/api/models/__init__.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/api/models/database.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/api/models/orm.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/api/models/schemas.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/api/routes/__init__.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/api/routes/auth.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/api/routes/compile.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/api/routes/feedback.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/api/routes/health.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/api/routes/infer.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/api/routes/models_info.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/api/services/__init__.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/api/services/auto_tag_service.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/api/services/auto_title_service.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/api/services/compile_service.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/api/services/infer_service.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/api/services/search_service.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/api/services/storage_service.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/benchmarks/benchmark_api.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/benchmarks/handcrafted_specs.json +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/benchmarks/last_benchmark_results.json +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/benchmarks/last_stress_results.json +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/benchmarks/stress_test.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/compiler_registry.json +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/provider_configs/gpt2.json +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/provider_configs/qwen3-0.6b.json +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/requirements.txt +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/scripts/ab_test_hf_vs_vllm.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/scripts/ablation_search.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/scripts/backfill_hf_browser_assets.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/scripts/backfill_hf_safetensors.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/scripts/backfill_interestingness.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/scripts/backfill_tags.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/scripts/backfill_titles.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/scripts/benchmark_gpt2.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/scripts/cleanup_storage.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/scripts/eval_search.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/scripts/evict_cold_programs.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/scripts/generate_prefix_cache.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/scripts/launch_gpt2_compiler.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/scripts/launch_qwen3_compiler.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/scripts/patch_vllm.sh +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/scripts/restart.sh +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/scripts/start_all.sh +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/scripts/start_gpt2_services.sh +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/scripts/start_provider.sh +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/scripts/start_services.sh +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/tests/__init__.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/tests/conftest.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/tests/test_auth.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/tests/test_compile.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/tests/test_errors.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/tests/test_infer.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/tests/test_integration_gpu.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/tests/test_rate_limit.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/tests/test_storage.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/vllm_models/__init__.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/vllm_models/gpt2_lora_patch.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/vllm_models/paw_compiler.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/vllm_models/prepare_checkpoint.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/vllm_models/register.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/stage2_firstpromptqwen_512_e1_generate_lora_e2grpo_overfit_one_debug.reward_plot.rollout_ppl.png +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/stage2_firstpromptqwen_512_e1_generate_lora_e2grpo_overfit_one_debug.reward_plot.train_gt_logprob.em_es.png +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/stage2_firstpromptqwen_512_e1_generate_lora_e2grpo_overfit_one_debug.reward_plot.train_gt_logprob.ppl.png +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/stage2_firstpromptqwen_512_e1_generate_lora_e2grpo_overfit_one_debug.reward_plot.train_gt_logprob.reward.png +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/test_1spec.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/test_all_caching.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/test_apple_count.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/test_batch_pilot.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/test_compile.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/test_e2e.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/test_execute.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/test_nspecs.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/test_one_vs_two_step.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/test_onnx_correctness.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/test_onnx_hf_model.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/test_onnx_hf_with_images.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/test_paw_format.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/test_thinking_comparison.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/tests/test_offline_cache.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/train.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/train_no_spec_direct_ans_mix_continuous_sampleref_trainonly_shorterprompt_withregularizer_generate_lora.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/training/README.md +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/training/__init__.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/training/data_generation/DATASET_CHANGELOG.md +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/training/data_generation/README.md +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/training/data_generation/VERIFICATION_PIPELINE.md +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/training/data_generation/build_user_bench.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/training/data_generation/dry_run_batch.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/training/data_generation/filter_test_data.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/training/data_generation/generate_specs.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/training/data_generation/generate_specs_batch.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/training/data_generation/incremental_merge.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/training/data_generation/merge_and_upload.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/training/data_generation/regenerate_outputs_batch.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/training/data_generation/synthesize_data.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/training/data_generation/synthesize_data_batch.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/training/data_generation/templates/filter_system.txt +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/training/data_generation/templates/filter_user.txt +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/training/data_generation/templates/pairs_system.txt +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/training/data_generation/templates/pairs_user.txt +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/training/data_generation/templates/specs_system.txt +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/training/data_generation/templates/specs_user.txt +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/training/data_generation/templates/specs_user_freeform.txt +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/training/data_generation/templates/specs_user_freeform_with_examples.txt +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/training/data_generation/templates/specs_user_with_examples.txt +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/training/data_generation/templates/verify_system.txt +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/training/data_generation/templates/verify_user.txt +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/training/data_generation/templates_old/filter_system.txt +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/training/data_generation/templates_old/filter_user.txt +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/training/data_generation/templates_old/pairs_system.txt +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/training/data_generation/templates_old/pairs_user.txt +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/training/data_generation/templates_old/specs_system.txt +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/training/data_generation/templates_old/specs_user.txt +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/training/data_generation/templates_old/specs_user_freeform.txt +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/training/data_generation/templates_old/specs_user_freeform_with_examples.txt +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/training/data_generation/templates_old/specs_user_with_examples.txt +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/training/data_generation/templates_old/verify_system.txt +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/training/data_generation/templates_old/verify_user.txt +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/training/data_generation/verify_test_data.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/training/datasets/__init__.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/training/datasets/jsonl_text_pairs.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/training/loops/__init__.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/training/loops/prefix_tuning_sft.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/ttt.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/upload_model.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/upload_onnx_to_huggingface.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/upload_onnx_to_huggingface_with_token.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/utils.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/HANDOFF.md +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/README.md +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/backend/app/__init__.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/backend/app/config.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/backend/app/main.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/backend/app/middleware/__init__.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/backend/app/middleware/rate_limit.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/backend/app/models.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/backend/app/services/__init__.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/backend/app/services/auth_service.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/backend/app/services/case_service.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/backend/app/services/compiler_service.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/backend/app/services/gpt_service.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/backend/app/services/hub_service.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/backend/app/services/image_service.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/backend/app/services/interpreter_service.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/backend/app/services/sql_manager.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/backend/app/templates/gpt_test_generation.txt +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/backend/app/utils/__init__.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/backend/app/utils/image_placeholders.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/backend/app/utils/program_hash.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/backend/clear_db.sh +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/backend/clear_tables.sql +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/backend/data/programs.db +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/backend/env_example.txt +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/backend/example_images/README.md +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/backend/get_data_examples.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/backend/requirements.txt +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/backend/run_server.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/backend/setup_analytics_tables.sql +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/backend/setup_auth_tables.sql +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/backend/setup_cache_tables.sql +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/backend/setup_cases_tables.sql +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/backend/setup_database.sql +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/backend/setup_database_simple.sql +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/backend/setup_db.sh +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/backend/setup_example_images.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/backend/setup_hub_tables.sql +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/backend/test_compilation_cache.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/frontend/README.md +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/frontend/e2e/helpers.ts +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/frontend/e2e/smoke.spec.ts +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/frontend/eslint.config.js +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/frontend/index.html +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/frontend/package-lock.json +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/frontend/package.json +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/frontend/playwright.config.ts +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/frontend/postcss.config.js +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/frontend/public/apple-touch-icon.png +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/frontend/public/browser-worker.html +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/frontend/public/favicon-16x16.png +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/frontend/public/favicon-32x32.png +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/frontend/public/paw-192.png +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/frontend/public/paw-512.png +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/frontend/public/paw.svg +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/frontend/public/react-test.html +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/frontend/public/test.html +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/frontend/public/vite.svg +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/frontend/scripts/deploy.sh +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/frontend/src/App.css +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/frontend/src/App.tsx +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/frontend/src/assets/react.svg +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/frontend/src/components/AboutPage.tsx +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/frontend/src/components/AgentsPage.tsx +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/frontend/src/components/BrowserPage.tsx +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/frontend/src/components/CasesSection.tsx +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/frontend/src/components/CompileButtonWithConfig.tsx +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/frontend/src/components/CompileSection.tsx +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/frontend/src/components/DocsPage.tsx +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/frontend/src/components/ExamplesInput.tsx +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/frontend/src/components/Header.tsx +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/frontend/src/components/HubPage.tsx +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/frontend/src/components/HubUploadPage.tsx +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/frontend/src/components/ModelSelector.tsx +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/frontend/src/components/PrivacyPage.tsx +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/frontend/src/components/SettingsPage.tsx +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/frontend/src/components/SpecSuggestions.tsx +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/frontend/src/components/TermsPage.tsx +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/frontend/src/components/TestSection.tsx +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/frontend/src/index.css +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/frontend/src/main.tsx +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/frontend/src/types/index.ts +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/frontend/src/utils/api.ts +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/frontend/tailwind.config.js +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/frontend/tsconfig.app.json +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/frontend/tsconfig.json +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/frontend/tsconfig.node.json +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/frontend/vite.config.ts +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/nginx-paw.conf +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/nginx.conf +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/setup_mysql.sh +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/start.sh +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/test_setup.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/ttt.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/.gitignore +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/LICENSE +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/README.md +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/__tests__/e2e/browser.spec.ts +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/__tests__/e2e/server.ts +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/__tests__/e2e/start-server.ts +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/__tests__/e2e/test-page.html +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/__tests__/loader.test.ts +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/__tests__/prompt.test.ts +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/examples/basic.html +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/package-lock.json +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/package.json +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/playwright.config.ts +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/serve.py +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/src/index.ts +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/src/loader.ts +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/src/runtime.ts +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/src/types.ts +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/test-standalone.html +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/tsconfig.json +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/vitest.config.ts +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/.git +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/.github/workflows/build-hf-space.yml +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/.github/workflows/ci.yml +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/.github/workflows/generate-docs.yml +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/.github/workflows/verify-generated-code.yml +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/.gitignore +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/.gitmodules +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/.npmignore +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/.prettierignore +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/CMakeLists.txt +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/LICENCE +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/README.md +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/README_banner.png +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/assets/screenshot_0.png +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/cpp/actions.hpp +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/cpp/generate_glue_prototype.js +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/cpp/glue.hpp +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/cpp/helpers/wcommon.cpp +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/cpp/helpers/wcommon.h +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/cpp/helpers/wlog.cpp +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/cpp/helpers/wlog.h +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/cpp/helpers/wsampling.cpp +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/cpp/helpers/wsampling.h +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/cpp/test_glue.cpp +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/cpp/wllama.cpp +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/examples/basic/index.html +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/examples/embeddings/index.html +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/examples/main/.eslintrc.cjs +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/examples/main/.gitignore +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/examples/main/README.md +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/examples/main/index.html +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/examples/main/package-lock.json +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/examples/main/package.json +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/examples/main/postcss.config.js +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/examples/main/public/favicon.ico +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/examples/main/public/wllama.png +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/examples/main/src/App.tsx +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/examples/main/src/components/ChatScreen.tsx +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/examples/main/src/components/GuideScreen.tsx +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/examples/main/src/components/LogScreen.tsx +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/examples/main/src/components/MarkdownMessage.tsx +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/examples/main/src/components/ModelScreen.tsx +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/examples/main/src/components/Navbar.tsx +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/examples/main/src/components/ScreenWrapper.tsx +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/examples/main/src/components/Sidebar.tsx +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/examples/main/src/config.ts +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/examples/main/src/index.css +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/examples/main/src/main.tsx +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/examples/main/src/utils/benchmark.ts +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/examples/main/src/utils/custom-models.tsx +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/examples/main/src/utils/displayed-model.tsx +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/examples/main/src/utils/messages.context.tsx +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/examples/main/src/utils/nl2br.tsx +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/examples/main/src/utils/types.ts +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/examples/main/src/utils/use-interval-when.ts +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/examples/main/src/utils/utils.ts +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/examples/main/src/utils/wllama.context.tsx +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/examples/main/src/vite-env.d.ts +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/examples/main/tailwind.config.cjs +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/examples/main/tsconfig.app.json +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/examples/main/tsconfig.json +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/examples/main/tsconfig.node.json +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/examples/main/vite.config.ts +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/guides/intro-v2.md +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/index.ts +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/package-lock.json +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/package.json +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/scripts/build_hf_space.sh +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/scripts/build_wasm.sh +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/scripts/build_worker.sh +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/scripts/docker-compose.yml +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/scripts/generate_wasm_from_cdn.js +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/scripts/http_server.js +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/scripts/post_build.sh +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/src/cache-manager.ts +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/src/glue/glue.ts +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/src/glue/messages.ts +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/src/index.ts +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/src/mjs.test.ts +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/src/model-manager.test.ts +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/src/model-manager.ts +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/src/multi-thread/wllama.js +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/src/multi-thread/wllama.wasm +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/src/single-thread/wllama.js +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/src/single-thread/wllama.wasm +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/src/utils.test.ts +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/src/utils.ts +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/src/wasm-from-cdn.ts +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/src/wllama.test.ts +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/src/wllama.ts +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/src/worker.ts +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/src/workers-code/generated.ts +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/src/workers-code/llama-cpp.js +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/src/workers-code/opfs-utils.js +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/tsconfig.build.json +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/tsup.config.ts +0 -0
- {programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-sdk/wllama/vitest.config.ts +0 -0
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: SDK publishing workflow for Python and JavaScript packages
|
|
3
|
+
alwaysApply: true
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# SDK Publishing Rules
|
|
7
|
+
|
|
8
|
+
## Public repos are the source of truth for published packages
|
|
9
|
+
|
|
10
|
+
- **Python SDK**: https://github.com/programasweights/programasweights-python
|
|
11
|
+
- **JS SDK**: https://github.com/programasweights/programasweights-js
|
|
12
|
+
|
|
13
|
+
## Release workflow
|
|
14
|
+
|
|
15
|
+
1. Make changes in the public repo (feature branch -> PR -> main)
|
|
16
|
+
2. Bump version in `pyproject.toml` / `__init__.py` (Python) or `package.json` (JS)
|
|
17
|
+
3. Run tests: `bash tests/test_sdk.sh` (Python) or `npm test && npx playwright test` (JS)
|
|
18
|
+
4. Tag: `git tag -a vX.Y.Z -m "Release vX.Y.Z"`
|
|
19
|
+
5. Build and publish from the tagged commit:
|
|
20
|
+
- Python: `python -m build && twine upload dist/*`
|
|
21
|
+
- JS: `npm publish --access public`
|
|
22
|
+
6. Push tag: `git push origin vX.Y.Z`
|
|
23
|
+
7. Verify: compare published package with repo (`pip download` / `npm pack` then diff)
|
|
24
|
+
|
|
25
|
+
## Never do
|
|
26
|
+
|
|
27
|
+
- Do NOT publish from the monorepo (`paw_discrete/programasweights/`) -- always use the public repos
|
|
28
|
+
- Do NOT publish without tagging first
|
|
29
|
+
- Do NOT forget to sync the monorepo after publishing (if changes originated there)
|
|
30
|
+
- Do NOT use rsync/scp for code deployment -- always git push + git pull
|
|
31
|
+
- Do NOT deploy to server without committing to git first
|
|
32
|
+
|
|
33
|
+
## All repos are under github.com/programasweights/
|
|
34
|
+
|
|
35
|
+
- `website` -- monorepo deployed to server (git push website main)
|
|
36
|
+
- `programasweights-python` -- Python SDK (published to PyPI)
|
|
37
|
+
- `programasweights-js` -- JS SDK (published to npm)
|
|
38
|
+
|
|
39
|
+
## Wheel index
|
|
40
|
+
|
|
41
|
+
Pre-built `llama-cpp-python` wheels are hosted at `pypi.programasweights.com`.
|
|
42
|
+
Install command: `pip install programasweights --extra-index-url https://pypi.programasweights.com/simple/`
|
|
43
|
+
If `llama-cpp-python` releases a new version, rebuild wheels on our servers and update the index.
|
|
44
|
+
|
|
45
|
+
## PyPI credentials
|
|
46
|
+
|
|
47
|
+
- Token in `~/.bashrc` on server 31.22.104.226 as `PYPI_API_TOKEN`
|
|
48
|
+
- Upload via: `twine upload --username __token__ --password $PYPI_API_TOKEN`
|
|
49
|
+
|
|
50
|
+
## npm credentials
|
|
51
|
+
|
|
52
|
+
- Token in `~/.bashrc` on server 31.22.104.226 as `NPM_TOKEN`
|
|
53
|
+
- Granular access token with publish permissions for `@programasweights` scope
|
|
@@ -13,14 +13,26 @@ All server code lives at `/root/paw-website/` (git clone of `programasweights/we
|
|
|
13
13
|
|
|
14
14
|
**Deployment (the ONLY way to update code):**
|
|
15
15
|
```bash
|
|
16
|
-
# Local: push
|
|
17
|
-
git push
|
|
16
|
+
# Local: commit and push to the website repo
|
|
17
|
+
git push website main
|
|
18
18
|
|
|
19
|
-
# Server: pull
|
|
20
|
-
cd /root/paw-website && git
|
|
21
|
-
cd
|
|
19
|
+
# Server: pull, build frontend, restart backend
|
|
20
|
+
cd /root/paw-website && git fetch origin && git reset --hard origin/main
|
|
21
|
+
cd web-app/frontend && npm run build && rsync -a --delete dist/ /data/paw-frontend/
|
|
22
|
+
cd /root/paw-website/server && bash scripts/restart.sh
|
|
22
23
|
```
|
|
23
24
|
|
|
25
|
+
**IMPORTANT:** `dist/` is in `.gitignore`. Frontend must be built on the server after pull.
|
|
26
|
+
|
|
27
|
+
**Repos (all under github.com/programasweights/):**
|
|
28
|
+
- `website` -- monorepo (server, frontend, web-sdk, docs). Deployed to server.
|
|
29
|
+
- `programasweights-python` -- Python SDK source. Published to PyPI.
|
|
30
|
+
- `programasweights-js` -- JS SDK source. Published to npm.
|
|
31
|
+
|
|
32
|
+
**Local remote setup:**
|
|
33
|
+
- `origin` = `yuntian-group/programasweights` (private monorepo)
|
|
34
|
+
- `website` = `programasweights/website` (public, deployed to server)
|
|
35
|
+
|
|
24
36
|
**NEVER use rsync or scp for code.** Model weights use scp between servers.
|
|
25
37
|
|
|
26
38
|
### GPU Layout
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: programasweights
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.2.dev1
|
|
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
|
|
@@ -22,7 +22,7 @@ API reference:
|
|
|
22
22
|
paw.api_key API key (set via login() or PAW_API_KEY env var)
|
|
23
23
|
"""
|
|
24
24
|
|
|
25
|
-
__version__ = "0.2.
|
|
25
|
+
__version__ = "0.2.2.dev1"
|
|
26
26
|
|
|
27
27
|
from .config import get_api_url, get_api_key, set_api_key
|
|
28
28
|
|
|
@@ -72,7 +72,7 @@ def compile(
|
|
|
72
72
|
|
|
73
73
|
|
|
74
74
|
def function(
|
|
75
|
-
program_id
|
|
75
|
+
program_id,
|
|
76
76
|
n_ctx: int = 2048,
|
|
77
77
|
n_gpu_layers: int | None = None,
|
|
78
78
|
verbose: bool = False,
|
|
@@ -83,7 +83,7 @@ def function(
|
|
|
83
83
|
Subsequent calls use the local cache.
|
|
84
84
|
|
|
85
85
|
Args:
|
|
86
|
-
program_id:
|
|
86
|
+
program_id: Program ID (str), slug, or a ``Program`` object from compile().
|
|
87
87
|
n_ctx: Context window size for llama.cpp.
|
|
88
88
|
n_gpu_layers: GPU layers (-1 = all, 0 = CPU only). Defaults to CPU.
|
|
89
89
|
Set ``PAW_GPU_LAYERS`` env var or pass explicitly for GPU acceleration.
|
|
@@ -96,7 +96,12 @@ def function(
|
|
|
96
96
|
>>> fn = paw.function("email-triage")
|
|
97
97
|
>>> fn("Urgent: the server is down!")
|
|
98
98
|
'immediate'
|
|
99
|
+
|
|
100
|
+
>>> program = paw.compile("Classify sentiment")
|
|
101
|
+
>>> fn = paw.function(program) # accepts Program object directly
|
|
99
102
|
"""
|
|
103
|
+
if hasattr(program_id, 'id'):
|
|
104
|
+
program_id = program_id.slug or program_id.id
|
|
100
105
|
import os
|
|
101
106
|
import re
|
|
102
107
|
from .cache import is_program_cached, get_program_dir, get_cached_slug, save_slug_mapping
|
|
@@ -175,9 +180,60 @@ def login(key: str | None = None):
|
|
|
175
180
|
print("You can also set the PAW_API_KEY environment variable.")
|
|
176
181
|
|
|
177
182
|
|
|
183
|
+
def compile_and_load(
|
|
184
|
+
spec: str,
|
|
185
|
+
compiler: str = "paw-4b-qwen3-0.6b",
|
|
186
|
+
n_ctx: int = 2048,
|
|
187
|
+
n_gpu_layers: int | None = None,
|
|
188
|
+
verbose: bool = False,
|
|
189
|
+
**compile_kwargs,
|
|
190
|
+
):
|
|
191
|
+
"""Compile a spec and immediately load it for local inference.
|
|
192
|
+
|
|
193
|
+
Convenience wrapper that combines ``paw.compile()`` and ``paw.function()``
|
|
194
|
+
into a single call.
|
|
195
|
+
|
|
196
|
+
Args:
|
|
197
|
+
spec: Natural language specification.
|
|
198
|
+
compiler: Compiler model name.
|
|
199
|
+
n_ctx: Context window size for llama.cpp.
|
|
200
|
+
n_gpu_layers: GPU layers (-1 = all, 0 = CPU only).
|
|
201
|
+
verbose: Print llama.cpp debug output.
|
|
202
|
+
**compile_kwargs: Additional args passed to compile (slug, public, etc.)
|
|
203
|
+
|
|
204
|
+
Returns:
|
|
205
|
+
A callable ``PawFunction``.
|
|
206
|
+
|
|
207
|
+
Example:
|
|
208
|
+
>>> fn = paw.compile_and_load("Classify sentiment as positive or negative")
|
|
209
|
+
>>> fn("I love this!")
|
|
210
|
+
'positive'
|
|
211
|
+
"""
|
|
212
|
+
program = compile(spec, compiler=compiler, **compile_kwargs)
|
|
213
|
+
return function(program, n_ctx=n_ctx, n_gpu_layers=n_gpu_layers, verbose=verbose)
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
def list_programs(sort: str = "recent", per_page: int = 20, page: int = 1) -> dict:
|
|
217
|
+
"""List your compiled programs. Requires authentication (PAW_API_KEY).
|
|
218
|
+
|
|
219
|
+
Returns:
|
|
220
|
+
Dict with ``programs`` (list), ``total``, ``page``, ``per_page``.
|
|
221
|
+
|
|
222
|
+
Example:
|
|
223
|
+
>>> programs = paw.list_programs()
|
|
224
|
+
>>> for p in programs["programs"]:
|
|
225
|
+
... print(p["id"], p["name"])
|
|
226
|
+
"""
|
|
227
|
+
from .client import PAWClient
|
|
228
|
+
client = PAWClient(api_url=api_url, api_key=api_key)
|
|
229
|
+
return client.list_programs(sort=sort, per_page=per_page, page=page)
|
|
230
|
+
|
|
231
|
+
|
|
178
232
|
__all__ = [
|
|
179
233
|
"compile",
|
|
234
|
+
"compile_and_load",
|
|
180
235
|
"function",
|
|
236
|
+
"list_programs",
|
|
181
237
|
"login",
|
|
182
238
|
"api_url",
|
|
183
239
|
"api_key",
|
|
@@ -108,18 +108,25 @@ class PAWClient:
|
|
|
108
108
|
"""Download a .paw bundle to the local cache.
|
|
109
109
|
|
|
110
110
|
Returns the path to the extracted program directory.
|
|
111
|
+
Retries on 404 since freshly compiled programs may still be uploading.
|
|
111
112
|
"""
|
|
112
113
|
program_dir = config.get_programs_dir() / program_id
|
|
113
114
|
if (program_dir / "prompt_template.txt").exists():
|
|
114
115
|
return program_dir
|
|
115
116
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
117
|
+
max_retries = 10
|
|
118
|
+
for attempt in range(max_retries):
|
|
119
|
+
resp = httpx.get(
|
|
120
|
+
f"{self._api_url}/api/v1/programs/{program_id}/download",
|
|
121
|
+
headers=self._headers(),
|
|
122
|
+
timeout=60.0,
|
|
123
|
+
follow_redirects=True,
|
|
124
|
+
)
|
|
125
|
+
if resp.status_code == 404 and attempt < max_retries - 1:
|
|
126
|
+
time.sleep(3)
|
|
127
|
+
continue
|
|
128
|
+
resp.raise_for_status()
|
|
129
|
+
break
|
|
123
130
|
|
|
124
131
|
program_dir.mkdir(parents=True, exist_ok=True)
|
|
125
132
|
paw_path = program_dir / f"{program_id}.paw"
|
|
@@ -140,6 +147,17 @@ class PAWClient:
|
|
|
140
147
|
resp.raise_for_status()
|
|
141
148
|
return resp.json()
|
|
142
149
|
|
|
150
|
+
def list_programs(self, sort: str = "recent", per_page: int = 20, page: int = 1) -> dict:
|
|
151
|
+
"""List programs for the authenticated user."""
|
|
152
|
+
resp = httpx.get(
|
|
153
|
+
f"{self._api_url}/api/v1/programs",
|
|
154
|
+
params={"mine": "true", "sort": sort, "per_page": per_page, "page": page},
|
|
155
|
+
headers=self._headers(),
|
|
156
|
+
timeout=10.0,
|
|
157
|
+
)
|
|
158
|
+
resp.raise_for_status()
|
|
159
|
+
return resp.json()
|
|
160
|
+
|
|
143
161
|
|
|
144
162
|
_default_client: PAWClient | None = None
|
|
145
163
|
|
|
@@ -53,12 +53,25 @@ class PawFunction:
|
|
|
53
53
|
interpreter = self._meta.get("interpreter", "Qwen/Qwen3-0.6B")
|
|
54
54
|
base_model_path = cache.get_base_model_path(interpreter)
|
|
55
55
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
56
|
+
if not verbose:
|
|
57
|
+
import os as _os, sys as _sys
|
|
58
|
+
_stderr_fd = _sys.stderr.fileno()
|
|
59
|
+
_devnull = _os.open(_os.devnull, _os.O_WRONLY)
|
|
60
|
+
_old_stderr = _os.dup(_stderr_fd)
|
|
61
|
+
_os.dup2(_devnull, _stderr_fd)
|
|
62
|
+
|
|
63
|
+
try:
|
|
64
|
+
self._llm = Llama(
|
|
65
|
+
model_path=str(base_model_path),
|
|
66
|
+
n_ctx=n_ctx,
|
|
67
|
+
n_gpu_layers=n_gpu_layers,
|
|
68
|
+
verbose=verbose,
|
|
69
|
+
)
|
|
70
|
+
finally:
|
|
71
|
+
if not verbose:
|
|
72
|
+
_os.dup2(_old_stderr, _stderr_fd)
|
|
73
|
+
_os.close(_devnull)
|
|
74
|
+
_os.close(_old_stderr)
|
|
62
75
|
|
|
63
76
|
adapter_path = program_dir / "adapter.gguf"
|
|
64
77
|
if adapter_path.exists():
|
|
@@ -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.2.dev1"
|
|
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"
|
|
@@ -292,6 +292,7 @@ async def list_programs(
|
|
|
292
292
|
"compiler_snapshot": p.compiler_snapshot,
|
|
293
293
|
"interpreter": p.interpreter,
|
|
294
294
|
"author": author_map[p.author_id].username if p.author_id and p.author_id in author_map else "Anonymous",
|
|
295
|
+
"author_display_name": author_map[p.author_id].display_name if p.author_id and p.author_id in author_map else None,
|
|
295
296
|
"author_avatar": author_map[p.author_id].avatar_url if p.author_id and p.author_id in author_map else None,
|
|
296
297
|
"author_id": p.author_id,
|
|
297
298
|
"tags": p.tags or [],
|
|
@@ -412,6 +413,15 @@ async def download_program(
|
|
|
412
413
|
program.downloads = (program.downloads or 0) + 1
|
|
413
414
|
await db.commit()
|
|
414
415
|
|
|
416
|
+
settings = get_settings()
|
|
417
|
+
local_paw = Path(settings.STORAGE_PATH) / program.id / f"{program.id}.paw"
|
|
418
|
+
if local_paw.exists():
|
|
419
|
+
return FileResponse(
|
|
420
|
+
path=str(local_paw),
|
|
421
|
+
media_type="application/octet-stream",
|
|
422
|
+
filename=f"{program.id}.paw",
|
|
423
|
+
)
|
|
424
|
+
|
|
415
425
|
hf_url = f"https://huggingface.co/programasweights/paw-programs/resolve/main/{program.id}.paw"
|
|
416
426
|
return RedirectResponse(url=hf_url, status_code=302)
|
|
417
427
|
|
{programasweights-0.2.1 → programasweights-0.2.2.dev1}/server/api/services/compile_provider.py
RENAMED
|
@@ -145,7 +145,7 @@ class CompileProvider:
|
|
|
145
145
|
self.ref_tok = AutoTokenizer.from_pretrained(ref_model, trust_remote_code=True)
|
|
146
146
|
|
|
147
147
|
self.compiler_fingerprint = self._compute_fingerprint()
|
|
148
|
-
self.
|
|
148
|
+
self._redis_url = os.environ.get("REDIS_URL", "redis://localhost:6379/0")
|
|
149
149
|
self._compiler_model_name: str | None = None
|
|
150
150
|
|
|
151
151
|
logger.info("compile_provider_ready",
|
|
@@ -216,9 +216,20 @@ class CompileProvider:
|
|
|
216
216
|
cache_key = hashlib.sha256(
|
|
217
217
|
f"{rendered}|max_tokens={max_tokens}|temp=0".encode()
|
|
218
218
|
).hexdigest()[:32]
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
219
|
+
|
|
220
|
+
try:
|
|
221
|
+
import asyncpg
|
|
222
|
+
db_url = os.environ.get("DATABASE_URL", "postgresql://paw:pawdev2026@localhost:5432/paw")
|
|
223
|
+
conn = await asyncpg.connect(db_url)
|
|
224
|
+
row = await conn.fetchrow(
|
|
225
|
+
"SELECT pseudo_program FROM pseudo_cache WHERE cache_key = $1", cache_key
|
|
226
|
+
)
|
|
227
|
+
await conn.close()
|
|
228
|
+
if row:
|
|
229
|
+
logger.info("pseudo_gen_cache_hit", spec_len=len(spec))
|
|
230
|
+
return row["pseudo_program"], prompt_tokens
|
|
231
|
+
except Exception:
|
|
232
|
+
pass
|
|
222
233
|
|
|
223
234
|
async with httpx.AsyncClient(timeout=60.0) as client:
|
|
224
235
|
resp = await client.post(
|
|
@@ -233,7 +244,17 @@ class CompileProvider:
|
|
|
233
244
|
resp.raise_for_status()
|
|
234
245
|
data = resp.json()
|
|
235
246
|
pseudo = data["choices"][0]["text"].strip()
|
|
236
|
-
|
|
247
|
+
|
|
248
|
+
try:
|
|
249
|
+
conn = await asyncpg.connect(db_url)
|
|
250
|
+
await conn.execute(
|
|
251
|
+
"INSERT INTO pseudo_cache (cache_key, pseudo_program) VALUES ($1, $2) ON CONFLICT (cache_key) DO NOTHING",
|
|
252
|
+
cache_key, pseudo
|
|
253
|
+
)
|
|
254
|
+
await conn.close()
|
|
255
|
+
except Exception:
|
|
256
|
+
pass
|
|
257
|
+
|
|
237
258
|
return pseudo, prompt_tokens
|
|
238
259
|
|
|
239
260
|
def _build_compiler_input(self, spec: str, pseudo_program: str) -> str:
|
|
@@ -442,3 +442,85 @@ class TestCLIRename:
|
|
|
442
442
|
assert result.returncode == 0
|
|
443
443
|
data = json.loads(result.stdout)
|
|
444
444
|
assert data.get("program_id")
|
|
445
|
+
|
|
446
|
+
|
|
447
|
+
# ── Phase 12: New convenience methods ──
|
|
448
|
+
|
|
449
|
+
|
|
450
|
+
class TestCompileAndLoad:
|
|
451
|
+
def test_compile_and_load_returns_callable(self):
|
|
452
|
+
fn = paw.compile_and_load("Classify text as positive or negative sentiment.")
|
|
453
|
+
assert callable(fn)
|
|
454
|
+
result = fn("I love this product!")
|
|
455
|
+
assert isinstance(result, str)
|
|
456
|
+
assert len(result) > 0
|
|
457
|
+
|
|
458
|
+
def test_compile_and_load_with_compiler(self):
|
|
459
|
+
fn = paw.compile_and_load(
|
|
460
|
+
"Count the vowels in the input. Return just the number.",
|
|
461
|
+
compiler="paw-4b-qwen3-0.6b",
|
|
462
|
+
)
|
|
463
|
+
result = fn("hello")
|
|
464
|
+
assert isinstance(result, str)
|
|
465
|
+
|
|
466
|
+
|
|
467
|
+
class TestFunctionAcceptsProgram:
|
|
468
|
+
def test_function_with_program_object(self):
|
|
469
|
+
program = paw.compile("Classify text as positive or negative sentiment.")
|
|
470
|
+
fn = paw.function(program)
|
|
471
|
+
assert callable(fn)
|
|
472
|
+
result = fn("Great product!")
|
|
473
|
+
assert isinstance(result, str)
|
|
474
|
+
assert len(result) > 0
|
|
475
|
+
|
|
476
|
+
def test_function_with_string_still_works(self):
|
|
477
|
+
fn = paw.function("email-triage")
|
|
478
|
+
assert callable(fn)
|
|
479
|
+
|
|
480
|
+
|
|
481
|
+
class TestListPrograms:
|
|
482
|
+
@needs_auth
|
|
483
|
+
def test_list_programs_returns_dict(self):
|
|
484
|
+
old_key = paw.api_key
|
|
485
|
+
try:
|
|
486
|
+
paw.api_key = API_KEY
|
|
487
|
+
result = paw.list_programs()
|
|
488
|
+
assert isinstance(result, dict)
|
|
489
|
+
assert "programs" in result
|
|
490
|
+
assert "total" in result
|
|
491
|
+
assert isinstance(result["programs"], list)
|
|
492
|
+
finally:
|
|
493
|
+
paw.api_key = old_key
|
|
494
|
+
|
|
495
|
+
@needs_auth
|
|
496
|
+
def test_list_programs_has_entries(self):
|
|
497
|
+
old_key = paw.api_key
|
|
498
|
+
try:
|
|
499
|
+
paw.api_key = API_KEY
|
|
500
|
+
result = paw.list_programs(per_page=5)
|
|
501
|
+
assert len(result["programs"]) <= 5
|
|
502
|
+
if result["programs"]:
|
|
503
|
+
p = result["programs"][0]
|
|
504
|
+
assert "id" in p
|
|
505
|
+
assert "spec" in p
|
|
506
|
+
finally:
|
|
507
|
+
paw.api_key = old_key
|
|
508
|
+
|
|
509
|
+
|
|
510
|
+
class TestStderrSuppression:
|
|
511
|
+
def test_no_stderr_by_default(self):
|
|
512
|
+
result = subprocess.run(
|
|
513
|
+
[sys.executable, "-c",
|
|
514
|
+
"import programasweights as paw; fn = paw.function('email-triage'); fn('test')"],
|
|
515
|
+
capture_output=True, text=True, timeout=120,
|
|
516
|
+
)
|
|
517
|
+
assert "n_ctx_seq" not in result.stderr
|
|
518
|
+
assert "llama_context" not in result.stderr
|
|
519
|
+
|
|
520
|
+
def test_stderr_with_verbose(self):
|
|
521
|
+
result = subprocess.run(
|
|
522
|
+
[sys.executable, "-c",
|
|
523
|
+
"import programasweights as paw; fn = paw.function('email-triage', verbose=True); fn('test')"],
|
|
524
|
+
capture_output=True, text=True, timeout=120,
|
|
525
|
+
)
|
|
526
|
+
assert result.returncode == 0
|
|
@@ -39,7 +39,7 @@ PY="$VENV_DIR/bin/python"
|
|
|
39
39
|
# Step 2: Install from PyPI (timed)
|
|
40
40
|
echo ">>> Installing programasweights from PyPI..."
|
|
41
41
|
START=$(date +%s)
|
|
42
|
-
$PIP install --no-cache-dir programasweights --extra-index-url "$EXTRA_INDEX" -q 2>&1
|
|
42
|
+
$PIP install --no-cache-dir --upgrade programasweights --extra-index-url "$EXTRA_INDEX" -q 2>&1
|
|
43
43
|
END=$(date +%s)
|
|
44
44
|
INSTALL_TIME=$((END - START))
|
|
45
45
|
echo " Install time: ${INSTALL_TIME}s"
|
|
@@ -210,20 +210,18 @@ test.describe('Playground', () => {
|
|
|
210
210
|
await expect(page.locator('button', { hasText: /Compile/i }).first()).toBeVisible();
|
|
211
211
|
});
|
|
212
212
|
|
|
213
|
-
test('
|
|
214
|
-
const
|
|
215
|
-
await expect(
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
})
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
const val = await options.nth(1).getAttribute('value');
|
|
226
|
-
if (val) await select.selectOption(val);
|
|
213
|
+
test('compile button shows interpreter name', async ({ page }) => {
|
|
214
|
+
const compileBtn = page.locator('button', { hasText: /Compile.*Standard|Compile.*Compact/ }).first();
|
|
215
|
+
await expect(compileBtn).toBeVisible();
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
test('compiler dropdown opens and has options', async ({ page }) => {
|
|
219
|
+
const chevron = page.locator('button:has(svg.lucide-chevron-down)').first();
|
|
220
|
+
if (await chevron.isVisible()) {
|
|
221
|
+
await chevron.click();
|
|
222
|
+
await page.waitForTimeout(300);
|
|
223
|
+
const options = page.locator('button', { hasText: /Standard|Compact/ });
|
|
224
|
+
expect(await options.count()).toBeGreaterThanOrEqual(1);
|
|
227
225
|
}
|
|
228
226
|
});
|
|
229
227
|
|
|
@@ -20,7 +20,8 @@ const AuthorPage: React.FC = () => {
|
|
|
20
20
|
const { id } = useParams<{ id: string }>();
|
|
21
21
|
const [programs, setPrograms] = useState<ProgramSummary[]>([]);
|
|
22
22
|
const [loading, setLoading] = useState(true);
|
|
23
|
-
const [
|
|
23
|
+
const [authorUsername, setAuthorUsername] = useState('');
|
|
24
|
+
const [authorDisplayName, setAuthorDisplayName] = useState('');
|
|
24
25
|
const [authorAvatar, setAuthorAvatar] = useState('');
|
|
25
26
|
|
|
26
27
|
useEffect(() => {
|
|
@@ -29,7 +30,8 @@ const AuthorPage: React.FC = () => {
|
|
|
29
30
|
.then(res => {
|
|
30
31
|
setPrograms(res.programs);
|
|
31
32
|
if (res.programs.length > 0) {
|
|
32
|
-
|
|
33
|
+
setAuthorUsername(res.programs[0].author || 'Anonymous');
|
|
34
|
+
setAuthorDisplayName((res.programs[0] as any).author_display_name || '');
|
|
33
35
|
setAuthorAvatar((res.programs[0] as any).author_avatar || '');
|
|
34
36
|
}
|
|
35
37
|
})
|
|
@@ -51,12 +53,15 @@ const AuthorPage: React.FC = () => {
|
|
|
51
53
|
<img src={authorAvatar} alt="" className="w-16 h-16 rounded-full border-2 border-gray-200" />
|
|
52
54
|
) : (
|
|
53
55
|
<div className="w-16 h-16 rounded-full bg-gray-300 flex items-center justify-center text-xl font-medium text-gray-600">
|
|
54
|
-
{(
|
|
56
|
+
{(authorUsername || '?')[0].toUpperCase()}
|
|
55
57
|
</div>
|
|
56
58
|
)}
|
|
57
59
|
<div>
|
|
58
|
-
<h1 className="text-2xl font-bold text-gray-900">{
|
|
59
|
-
|
|
60
|
+
<h1 className="text-2xl font-bold text-gray-900">{authorDisplayName || authorUsername}</h1>
|
|
61
|
+
{authorDisplayName && authorUsername !== authorDisplayName && (
|
|
62
|
+
<p className="text-sm text-gray-400">@{authorUsername}</p>
|
|
63
|
+
)}
|
|
64
|
+
<p className="text-gray-500">{programs.length} public program{programs.length !== 1 ? 's' : ''}</p>
|
|
60
65
|
</div>
|
|
61
66
|
</div>
|
|
62
67
|
</div>
|
{programasweights-0.2.1 → programasweights-0.2.2.dev1}/web-app/frontend/src/components/Footer.tsx
RENAMED
|
@@ -18,7 +18,7 @@ const Footer: React.FC = () => {
|
|
|
18
18
|
Define functions in English. Compile them into neural programs. Run them locally.
|
|
19
19
|
</p>
|
|
20
20
|
<div className="mt-4 inline-flex items-center gap-2 bg-white/5 rounded px-3 py-1.5 font-mono text-xs text-gray-300 border border-white/10">
|
|
21
|
-
pip install programasweights
|
|
21
|
+
pip install programasweights
|
|
22
22
|
</div>
|
|
23
23
|
</div>
|
|
24
24
|
|
|
@@ -18,7 +18,6 @@ const HubProgramPage: React.FC = () => {
|
|
|
18
18
|
const [testOutput, setTestOutput] = useState('');
|
|
19
19
|
const [testRunning, setTestRunning] = useState(false);
|
|
20
20
|
const [copied, setCopied] = useState(false);
|
|
21
|
-
const [copiedUsage, setCopiedUsage] = useState(false);
|
|
22
21
|
const [copiedShare, setCopiedShare] = useState(false);
|
|
23
22
|
const [showPseudo, setShowPseudo] = useState(false);
|
|
24
23
|
const [userVote, setUserVote] = useState<1 | -1 | null>(null);
|
|
@@ -263,16 +262,12 @@ console.log(result);`;
|
|
|
263
262
|
<div className="border-t border-gray-100 bg-gray-50 px-6 sm:px-8 py-3 flex flex-wrap gap-2">
|
|
264
263
|
<button
|
|
265
264
|
onClick={() => {
|
|
266
|
-
|
|
267
|
-
navigator.clipboard.writeText(code);
|
|
268
|
-
setCopiedUsage(true);
|
|
265
|
+
navigator.clipboard.writeText(usageCode);
|
|
269
266
|
toast.success('Copied!');
|
|
270
|
-
setTimeout(() => setCopiedUsage(false), 2000);
|
|
271
267
|
}}
|
|
272
268
|
className="inline-flex items-center gap-2 px-4 py-2 bg-gray-900 text-white rounded-lg hover:bg-gray-800 transition-colors text-sm font-medium"
|
|
273
269
|
>
|
|
274
|
-
|
|
275
|
-
{copiedUsage ? 'Copied!' : 'Copy usage'}
|
|
270
|
+
<Copy className="w-4 h-4" /> Copy usage
|
|
276
271
|
</button>
|
|
277
272
|
<button onClick={handleFork} className="inline-flex items-center gap-2 px-4 py-2 bg-white text-gray-700 border border-gray-200 rounded-lg hover:bg-gray-50 transition-colors text-sm font-medium">
|
|
278
273
|
<GitFork className="w-4 h-4" /> Fork & Edit
|
|
@@ -336,18 +331,9 @@ console.log(result);`;
|
|
|
336
331
|
|
|
337
332
|
{/* Usage Code */}
|
|
338
333
|
<div className="bg-white rounded-xl border border-gray-200 p-6">
|
|
339
|
-
<div className="flex items-center
|
|
340
|
-
<
|
|
341
|
-
|
|
342
|
-
<h2 className="font-semibold text-gray-900">Usage</h2>
|
|
343
|
-
</div>
|
|
344
|
-
<button
|
|
345
|
-
onClick={() => { navigator.clipboard.writeText(usageCode); setCopied(true); setTimeout(() => setCopied(false), 2000); }}
|
|
346
|
-
className="inline-flex items-center gap-1.5 px-3 py-1.5 text-xs text-gray-500 hover:text-gray-900 bg-gray-50 rounded-lg hover:bg-gray-100 transition-colors font-medium"
|
|
347
|
-
>
|
|
348
|
-
{copied ? <Check className="w-3.5 h-3.5 text-green-600" /> : <Copy className="w-3.5 h-3.5" />}
|
|
349
|
-
{copied ? 'Copied!' : 'Copy'}
|
|
350
|
-
</button>
|
|
334
|
+
<div className="flex items-center gap-2 mb-3">
|
|
335
|
+
<Code className="w-4 h-4 text-gray-400" />
|
|
336
|
+
<h2 className="font-semibold text-gray-900">Usage</h2>
|
|
351
337
|
</div>
|
|
352
338
|
{isBrowserCapable && (
|
|
353
339
|
<div className="flex gap-1 mb-3">
|
|
@@ -359,7 +345,15 @@ console.log(result);`;
|
|
|
359
345
|
>JavaScript (browser)</button>
|
|
360
346
|
</div>
|
|
361
347
|
)}
|
|
362
|
-
<
|
|
348
|
+
<div className="relative">
|
|
349
|
+
<pre className="bg-gray-900 text-gray-100 p-4 rounded-lg text-sm overflow-x-auto leading-relaxed">{usageCode}</pre>
|
|
350
|
+
<button
|
|
351
|
+
onClick={() => { navigator.clipboard.writeText(usageCode); setCopied(true); toast.success('Copied!'); setTimeout(() => setCopied(false), 2000); }}
|
|
352
|
+
className="absolute top-2 right-2 p-1.5 bg-gray-700 hover:bg-gray-600 text-gray-300 rounded transition-colors"
|
|
353
|
+
>
|
|
354
|
+
{copied ? <Check className="w-4 h-4 text-green-400" /> : <Copy className="w-4 h-4" />}
|
|
355
|
+
</button>
|
|
356
|
+
</div>
|
|
363
357
|
<p className="mt-3 text-xs text-gray-400">
|
|
364
358
|
Install with <code className="bg-gray-100 px-1.5 py-0.5 rounded text-gray-600">{installCmd}</code>
|
|
365
359
|
</p>
|
|
@@ -130,10 +130,11 @@ print(result) # "immediate"`;
|
|
|
130
130
|
<div className="mt-8">
|
|
131
131
|
<div className="inline-flex items-center gap-3 bg-black/30 rounded-lg pl-4 pr-2 py-2 border border-white/10 font-mono text-sm">
|
|
132
132
|
<span className="text-gray-400">$</span>
|
|
133
|
-
<span className="text-green-300">
|
|
133
|
+
<span className="text-green-300">pip install programasweights</span>
|
|
134
134
|
<button
|
|
135
135
|
onClick={() => copyToClipboard(installCmd, 'install')}
|
|
136
136
|
className="p-1.5 rounded hover:bg-white/10 transition-colors text-gray-400 hover:text-white"
|
|
137
|
+
title="Copy full install command"
|
|
137
138
|
>
|
|
138
139
|
{copiedInstall ? <Check className="w-4 h-4 text-green-400" /> : <Copy className="w-4 h-4" />}
|
|
139
140
|
</button>
|
|
@@ -527,10 +528,11 @@ print(result) # "immediate"`;
|
|
|
527
528
|
{/* Install snippet */}
|
|
528
529
|
<div className="mt-10 inline-flex items-center gap-3 bg-black/30 rounded-lg pl-5 pr-3 py-3 border border-white/10 font-mono text-sm">
|
|
529
530
|
<span className="text-gray-400">$</span>
|
|
530
|
-
<span className="text-green-300">
|
|
531
|
+
<span className="text-green-300">pip install programasweights</span>
|
|
531
532
|
<button
|
|
532
533
|
onClick={() => copyToClipboard(installCmd, 'install')}
|
|
533
534
|
className="p-1.5 rounded hover:bg-white/10 transition-colors text-gray-400 hover:text-white"
|
|
535
|
+
title="Copy full install command"
|
|
534
536
|
>
|
|
535
537
|
{copiedInstall ? <Check className="w-4 h-4 text-green-400" /> : <Copy className="w-4 h-4" />}
|
|
536
538
|
</button>
|