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.
Files changed (501) hide show
  1. programasweights-0.2.3/AGENTS.md +173 -0
  2. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/CHANGELOG.md +8 -0
  3. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/PKG-INFO +5 -1
  4. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/PYPI_README.md +4 -0
  5. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/docs/api-reference/python-sdk.md +31 -1
  6. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/programasweights/__init__.py +2 -1
  7. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/pyproject.toml +1 -1
  8. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/.env.example +0 -1
  9. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/api/config.py +1 -2
  10. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/api/main.py +50 -4
  11. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/api/models/schemas.py +1 -0
  12. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/api/routes/auth.py +0 -1
  13. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/api/routes/health.py +8 -3
  14. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/api/routes/programs.py +4 -3
  15. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/e2e/full.spec.ts +65 -0
  16. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/index.html +5 -5
  17. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/src/App.tsx +34 -1
  18. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/src/components/AboutPage.tsx +3 -1
  19. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/src/components/AgentsPage.tsx +92 -47
  20. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/src/components/AuthorPage.tsx +14 -7
  21. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/src/components/BrowserPage.tsx +26 -11
  22. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/src/components/CasesSection.tsx +8 -5
  23. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/src/components/Header.tsx +14 -11
  24. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/src/components/HubPage.tsx +5 -5
  25. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/src/components/HubProgramPage.tsx +41 -24
  26. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/src/components/HubUploadPage.tsx +8 -1
  27. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/src/components/MainInterface.tsx +39 -15
  28. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/src/components/NavigationHelper.tsx +8 -3
  29. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/src/components/ProfilePage.tsx +23 -21
  30. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/src/components/SettingsPage.tsx +18 -22
  31. programasweights-0.2.3/web-app/frontend/src/contexts/AuthContext.tsx +45 -0
  32. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/src/types/index.ts +2 -0
  33. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/src/utils/api.ts +0 -8
  34. programasweights-0.2.3/web-app/frontend/test-results/.last-run.json +4 -0
  35. programasweights-0.2.2.dev1/AGENTS.md +0 -129
  36. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/.cursor/rules/sdk-publishing.mdc +0 -0
  37. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/.cursor/rules/vllm-deployment.mdc +0 -0
  38. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/.git +0 -0
  39. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/.github/workflows/web-sdk.yml +0 -0
  40. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/.gitignore +0 -0
  41. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/.gitmodules +0 -0
  42. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/.hatch_build.toml +0 -0
  43. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/.readthedocs.yaml +0 -0
  44. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/1apple.jpg +0 -0
  45. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/1apple2.jpg +0 -0
  46. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/2apples.jpg +0 -0
  47. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/2apples2.jpg +0 -0
  48. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/3apples.jpg +0 -0
  49. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/3apples2.jpg +0 -0
  50. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/479400.png +0 -0
  51. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/4apples.jpg +0 -0
  52. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/4apples2.jpg +0 -0
  53. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/4apples3.jpg +0 -0
  54. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/4apples4.jpg +0 -0
  55. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/5apples.jpg +0 -0
  56. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/6apples.jpg +0 -0
  57. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/8apples.jpg +0 -0
  58. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/9apples.jpg +0 -0
  59. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/FLOW_SUMMARY.md +0 -0
  60. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/LICENSE +0 -0
  61. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/MANIFEST.in +0 -0
  62. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/ONNX_MIGRATION_PLAN.md +0 -0
  63. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/PREFIX_TOKENS_DESIGN.md +0 -0
  64. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/README.md +0 -0
  65. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/TRUNCATION_CHANGES.md +0 -0
  66. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/USE_CASES_AND_IDEAS.md +0 -0
  67. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/VERIFICATION_USAGE.md +0 -0
  68. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/analyze_dataset.py +0 -0
  69. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/analyze_lengths.py +0 -0
  70. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/baselines/code_prompt.md +0 -0
  71. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/baselines/evaluate_openai_python_code_baseline.py +0 -0
  72. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/baselines/openai_batch_request.py +0 -0
  73. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/baselines/prepare_alchemist_data.py +0 -0
  74. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/baselines/prepare_var_bench_data.py +0 -0
  75. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/baselines/python_code_sandbox.py +0 -0
  76. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/baselines/script_evaluation_var_bench.sh +0 -0
  77. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/baselines/script_evalution_evaluation.sh +0 -0
  78. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/baselines/script_evalution_request.sh +0 -0
  79. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/baselines/script_evalution_statistics.sh +0 -0
  80. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/benchmark_pytorch_vs_onnx.py +0 -0
  81. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/benchmark_user_experience.py +0 -0
  82. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/check_dataset.py +0 -0
  83. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/combine_datasets.py +0 -0
  84. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/compare_datasets.py +0 -0
  85. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/compare_old_vs_regen.py +0 -0
  86. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/convert_paw_to_svg.py +0 -0
  87. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/create_favicon_sizes.py +0 -0
  88. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/create_visualization_from_log.py +0 -0
  89. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/create_vqa_dataset.py +0 -0
  90. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/debug_cache.py +0 -0
  91. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/debug_eos_example.sh +0 -0
  92. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/docs/adr/001-llama-cpp-over-pytorch.md +0 -0
  93. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/docs/adr/002-q4_0-adapter-format.md +0 -0
  94. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/docs/adr/003-single-spec-field.md +0 -0
  95. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/docs/adr/004-compiler-naming.md +0 -0
  96. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/docs/adr/005-vllm-hidden-states.md +0 -0
  97. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/docs/adr/006-email-api-key-auth.md +0 -0
  98. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/docs/advanced/adrs.md +0 -0
  99. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/docs/advanced/architecture.md +0 -0
  100. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/docs/api-reference/cli.md +0 -0
  101. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/docs/api-reference/rest-api.md +0 -0
  102. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/docs/architecture.md +0 -0
  103. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/docs/getting-started/first-program.md +0 -0
  104. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/docs/getting-started/installation.md +0 -0
  105. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/docs/getting-started/naming-programs.md +0 -0
  106. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/docs/guide/browser-inference.md +0 -0
  107. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/docs/guide/how-it-works.md +0 -0
  108. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/docs/guide/local-inference.md +0 -0
  109. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/docs/guide/writing-good-specs.md +0 -0
  110. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/docs/hub/browsing-programs.md +0 -0
  111. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/docs/hub/feedback-cases.md +0 -0
  112. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/docs/hub/publishing-programs.md +0 -0
  113. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/docs/index.md +0 -0
  114. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/docs/requirements.txt +0 -0
  115. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/estimate_data_gen_cost.py +0 -0
  116. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/eval.py +0 -0
  117. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/examples/flask_app.py +0 -0
  118. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/examples/jupyter_notebook.py +0 -0
  119. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/examples/langchain_integration.py +0 -0
  120. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/examples/replace_openai.py +0 -0
  121. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/export_to_onnx.py +0 -0
  122. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/extract_models.py +0 -0
  123. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/inspect_data_dirs.py +0 -0
  124. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/latest_export.csv +0 -0
  125. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/log.train.81920.morecategories.extraprefix +0 -0
  126. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/main_no_spec_direct_ans_mix_continuous_sampleref_shorterprompt_vllm.py +0 -0
  127. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/merge_datasets.py +0 -0
  128. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/mkdocs.yml +0 -0
  129. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/paw.png +0 -0
  130. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/paw.svg +0 -0
  131. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/process_im2latex_dataset.py +0 -0
  132. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/programasweights/artifacts.py +0 -0
  133. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/programasweights/cache.py +0 -0
  134. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/programasweights/cli.py +0 -0
  135. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/programasweights/client.py +0 -0
  136. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/programasweights/compiler/__init__.py +0 -0
  137. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/programasweights/compiler/dummy.py +0 -0
  138. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/programasweights/config.py +0 -0
  139. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/programasweights/convert_peft_to_paw.py +0 -0
  140. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/programasweights/paw_format.py +0 -0
  141. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/programasweights/runtime/__init__.py +0 -0
  142. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/programasweights/runtime/interpreter.py +0 -0
  143. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/programasweights/runtime/interpreter_onnx.py +0 -0
  144. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/programasweights/runtime_llamacpp.py +0 -0
  145. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/programasweights_lora/__init__.py +0 -0
  146. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/programasweights_lora/compiler/__init__.py +0 -0
  147. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/programasweights_lora/lora_format.py +0 -0
  148. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/programasweights_lora/runtime/__init__.py +0 -0
  149. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/programasweights_lora/runtime/interpreter_lora.py +0 -0
  150. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/programasweights_lora/tests/test_compile_and_run.py +0 -0
  151. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/programasweights_lora/tests/test_lora_format.py +0 -0
  152. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/programasweights_lora/tests/test_training.py +0 -0
  153. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/programasweights_lora/train_lora.py +0 -0
  154. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/programasweights_lora/training/__init__.py +0 -0
  155. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/programasweights_lora/training/loops/lora_tuning_sft.py +0 -0
  156. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/run_eval.sh +0 -0
  157. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/run_training.sh +0 -0
  158. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/scripts/filter_table_by_length.py +0 -0
  159. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/alembic/env.py +0 -0
  160. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/alembic/script.py.mako +0 -0
  161. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/alembic/versions/001_initial_schema.py +0 -0
  162. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/alembic/versions/002_namespaced_aliases_hf_url.py +0 -0
  163. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/alembic/versions/003_fulltext_search_ranking.py +0 -0
  164. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/alembic/versions/004_fix_alias_slug_constraint.py +0 -0
  165. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/alembic.ini +0 -0
  166. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/api/__init__.py +0 -0
  167. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/api/dependencies.py +0 -0
  168. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/api/logging_config.py +0 -0
  169. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/api/middleware/__init__.py +0 -0
  170. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/api/middleware/rate_limit.py +0 -0
  171. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/api/models/__init__.py +0 -0
  172. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/api/models/database.py +0 -0
  173. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/api/models/orm.py +0 -0
  174. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/api/routes/__init__.py +0 -0
  175. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/api/routes/compile.py +0 -0
  176. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/api/routes/feedback.py +0 -0
  177. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/api/routes/infer.py +0 -0
  178. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/api/routes/models_info.py +0 -0
  179. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/api/services/__init__.py +0 -0
  180. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/api/services/auto_tag_service.py +0 -0
  181. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/api/services/auto_title_service.py +0 -0
  182. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/api/services/compile_provider.py +0 -0
  183. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/api/services/compile_service.py +0 -0
  184. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/api/services/infer_service.py +0 -0
  185. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/api/services/search_service.py +0 -0
  186. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/api/services/storage_service.py +0 -0
  187. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/benchmarks/benchmark_api.py +0 -0
  188. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/benchmarks/handcrafted_specs.json +0 -0
  189. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/benchmarks/last_benchmark_results.json +0 -0
  190. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/benchmarks/last_stress_results.json +0 -0
  191. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/benchmarks/stress_test.py +0 -0
  192. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/compiler_registry.json +0 -0
  193. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/provider_configs/gpt2.json +0 -0
  194. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/provider_configs/qwen3-0.6b.json +0 -0
  195. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/requirements.txt +0 -0
  196. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/scripts/ab_test_hf_vs_vllm.py +0 -0
  197. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/scripts/ablation_search.py +0 -0
  198. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/scripts/backfill_hf_browser_assets.py +0 -0
  199. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/scripts/backfill_hf_safetensors.py +0 -0
  200. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/scripts/backfill_interestingness.py +0 -0
  201. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/scripts/backfill_tags.py +0 -0
  202. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/scripts/backfill_titles.py +0 -0
  203. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/scripts/benchmark_gpt2.py +0 -0
  204. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/scripts/cleanup_storage.py +0 -0
  205. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/scripts/eval_search.py +0 -0
  206. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/scripts/evict_cold_programs.py +0 -0
  207. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/scripts/generate_prefix_cache.py +0 -0
  208. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/scripts/launch_gpt2_compiler.py +0 -0
  209. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/scripts/launch_qwen3_compiler.py +0 -0
  210. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/scripts/patch_vllm.sh +0 -0
  211. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/scripts/restart.sh +0 -0
  212. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/scripts/start_all.sh +0 -0
  213. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/scripts/start_gpt2_services.sh +0 -0
  214. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/scripts/start_provider.sh +0 -0
  215. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/scripts/start_services.sh +0 -0
  216. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/tests/__init__.py +0 -0
  217. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/tests/conftest.py +0 -0
  218. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/tests/test_auth.py +0 -0
  219. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/tests/test_compile.py +0 -0
  220. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/tests/test_errors.py +0 -0
  221. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/tests/test_infer.py +0 -0
  222. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/tests/test_integration_gpu.py +0 -0
  223. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/tests/test_rate_limit.py +0 -0
  224. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/tests/test_storage.py +0 -0
  225. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/vllm_models/__init__.py +0 -0
  226. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/vllm_models/gpt2_lora_patch.py +0 -0
  227. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/vllm_models/paw_compiler.py +0 -0
  228. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/vllm_models/prepare_checkpoint.py +0 -0
  229. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/server/vllm_models/register.py +0 -0
  230. {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
  231. {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
  232. {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
  233. {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
  234. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/test_1spec.py +0 -0
  235. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/test_all_caching.py +0 -0
  236. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/test_apple_count.py +0 -0
  237. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/test_batch_pilot.py +0 -0
  238. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/test_compile.py +0 -0
  239. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/test_e2e.py +0 -0
  240. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/test_execute.py +0 -0
  241. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/test_nspecs.py +0 -0
  242. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/test_one_vs_two_step.py +0 -0
  243. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/test_onnx_correctness.py +0 -0
  244. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/test_onnx_hf_model.py +0 -0
  245. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/test_onnx_hf_with_images.py +0 -0
  246. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/test_paw_format.py +0 -0
  247. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/test_thinking_comparison.py +0 -0
  248. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/tests/test_offline_cache.py +0 -0
  249. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/tests/test_sdk.py +0 -0
  250. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/tests/test_sdk.sh +0 -0
  251. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/train.py +0 -0
  252. {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
  253. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/README.md +0 -0
  254. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/__init__.py +0 -0
  255. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/DATASET_CHANGELOG.md +0 -0
  256. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/README.md +0 -0
  257. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/VERIFICATION_PIPELINE.md +0 -0
  258. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/build_user_bench.py +0 -0
  259. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/dry_run_batch.py +0 -0
  260. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/filter_test_data.py +0 -0
  261. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/generate_specs.py +0 -0
  262. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/generate_specs_batch.py +0 -0
  263. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/incremental_merge.py +0 -0
  264. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/merge_and_upload.py +0 -0
  265. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/regenerate_outputs_batch.py +0 -0
  266. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/synthesize_data.py +0 -0
  267. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/synthesize_data_batch.py +0 -0
  268. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/templates/filter_system.txt +0 -0
  269. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/templates/filter_user.txt +0 -0
  270. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/templates/pairs_system.txt +0 -0
  271. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/templates/pairs_user.txt +0 -0
  272. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/templates/specs_system.txt +0 -0
  273. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/templates/specs_user.txt +0 -0
  274. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/templates/specs_user_freeform.txt +0 -0
  275. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/templates/specs_user_freeform_with_examples.txt +0 -0
  276. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/templates/specs_user_with_examples.txt +0 -0
  277. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/templates/verify_system.txt +0 -0
  278. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/templates/verify_user.txt +0 -0
  279. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/templates_old/filter_system.txt +0 -0
  280. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/templates_old/filter_user.txt +0 -0
  281. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/templates_old/pairs_system.txt +0 -0
  282. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/templates_old/pairs_user.txt +0 -0
  283. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/templates_old/specs_system.txt +0 -0
  284. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/templates_old/specs_user.txt +0 -0
  285. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/templates_old/specs_user_freeform.txt +0 -0
  286. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/templates_old/specs_user_freeform_with_examples.txt +0 -0
  287. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/templates_old/specs_user_with_examples.txt +0 -0
  288. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/templates_old/verify_system.txt +0 -0
  289. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/templates_old/verify_user.txt +0 -0
  290. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/data_generation/verify_test_data.py +0 -0
  291. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/datasets/__init__.py +0 -0
  292. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/datasets/jsonl_text_pairs.py +0 -0
  293. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/loops/__init__.py +0 -0
  294. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/training/loops/prefix_tuning_sft.py +0 -0
  295. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/ttt.py +0 -0
  296. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/upload_model.py +0 -0
  297. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/upload_onnx_to_huggingface.py +0 -0
  298. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/upload_onnx_to_huggingface_with_token.py +0 -0
  299. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/utils.py +0 -0
  300. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/HANDOFF.md +0 -0
  301. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/README.md +0 -0
  302. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/app/__init__.py +0 -0
  303. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/app/config.py +0 -0
  304. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/app/main.py +0 -0
  305. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/app/middleware/__init__.py +0 -0
  306. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/app/middleware/rate_limit.py +0 -0
  307. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/app/models.py +0 -0
  308. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/app/services/__init__.py +0 -0
  309. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/app/services/auth_service.py +0 -0
  310. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/app/services/case_service.py +0 -0
  311. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/app/services/compiler_service.py +0 -0
  312. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/app/services/gpt_service.py +0 -0
  313. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/app/services/hub_service.py +0 -0
  314. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/app/services/image_service.py +0 -0
  315. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/app/services/interpreter_service.py +0 -0
  316. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/app/services/sql_manager.py +0 -0
  317. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/app/templates/gpt_test_generation.txt +0 -0
  318. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/app/utils/__init__.py +0 -0
  319. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/app/utils/image_placeholders.py +0 -0
  320. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/app/utils/program_hash.py +0 -0
  321. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/clear_db.sh +0 -0
  322. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/clear_tables.sql +0 -0
  323. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/data/programs.db +0 -0
  324. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/env_example.txt +0 -0
  325. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/example_images/README.md +0 -0
  326. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/get_data_examples.py +0 -0
  327. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/requirements.txt +0 -0
  328. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/run_server.py +0 -0
  329. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/setup_analytics_tables.sql +0 -0
  330. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/setup_auth_tables.sql +0 -0
  331. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/setup_cache_tables.sql +0 -0
  332. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/setup_cases_tables.sql +0 -0
  333. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/setup_database.sql +0 -0
  334. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/setup_database_simple.sql +0 -0
  335. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/setup_db.sh +0 -0
  336. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/setup_example_images.py +0 -0
  337. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/setup_hub_tables.sql +0 -0
  338. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/backend/test_compilation_cache.py +0 -0
  339. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/README.md +0 -0
  340. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/e2e/helpers.ts +0 -0
  341. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/e2e/smoke.spec.ts +0 -0
  342. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/eslint.config.js +0 -0
  343. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/package-lock.json +0 -0
  344. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/package.json +0 -0
  345. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/playwright.config.ts +0 -0
  346. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/postcss.config.js +0 -0
  347. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/public/apple-touch-icon.png +0 -0
  348. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/public/browser-worker.html +0 -0
  349. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/public/favicon-16x16.png +0 -0
  350. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/public/favicon-32x32.png +0 -0
  351. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/public/paw-192.png +0 -0
  352. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/public/paw-512.png +0 -0
  353. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/public/paw.svg +0 -0
  354. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/public/react-test.html +0 -0
  355. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/public/test.html +0 -0
  356. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/public/vite.svg +0 -0
  357. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/scripts/deploy.sh +0 -0
  358. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/src/App.css +0 -0
  359. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/src/assets/react.svg +0 -0
  360. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/src/components/CompileButtonWithConfig.tsx +0 -0
  361. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/src/components/CompileSection.tsx +0 -0
  362. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/src/components/DocsPage.tsx +0 -0
  363. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/src/components/ExamplesInput.tsx +0 -0
  364. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/src/components/Footer.tsx +0 -0
  365. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/src/components/LandingPage.tsx +0 -0
  366. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/src/components/ModelSelector.tsx +0 -0
  367. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/src/components/PrivacyPage.tsx +0 -0
  368. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/src/components/SpecSuggestions.tsx +0 -0
  369. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/src/components/TermsPage.tsx +0 -0
  370. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/src/components/TestSection.tsx +0 -0
  371. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/src/index.css +0 -0
  372. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/src/main.tsx +0 -0
  373. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/tailwind.config.js +0 -0
  374. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/tsconfig.app.json +0 -0
  375. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/tsconfig.json +0 -0
  376. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/tsconfig.node.json +0 -0
  377. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/frontend/vite.config.ts +0 -0
  378. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/nginx-paw.conf +0 -0
  379. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/nginx.conf +0 -0
  380. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/setup_mysql.sh +0 -0
  381. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/start.sh +0 -0
  382. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/test_setup.py +0 -0
  383. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-app/ttt.py +0 -0
  384. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/.gitignore +0 -0
  385. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/LICENSE +0 -0
  386. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/README.md +0 -0
  387. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/__tests__/e2e/browser.spec.ts +0 -0
  388. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/__tests__/e2e/server.ts +0 -0
  389. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/__tests__/e2e/start-server.ts +0 -0
  390. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/__tests__/e2e/test-page.html +0 -0
  391. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/__tests__/loader.test.ts +0 -0
  392. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/__tests__/prompt.test.ts +0 -0
  393. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/examples/basic.html +0 -0
  394. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/package-lock.json +0 -0
  395. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/package.json +0 -0
  396. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/playwright.config.ts +0 -0
  397. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/serve.py +0 -0
  398. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/src/index.ts +0 -0
  399. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/src/loader.ts +0 -0
  400. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/src/runtime.ts +0 -0
  401. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/src/types.ts +0 -0
  402. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/test-standalone.html +0 -0
  403. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/tsconfig.json +0 -0
  404. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/vitest.config.ts +0 -0
  405. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/.git +0 -0
  406. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/.github/workflows/build-hf-space.yml +0 -0
  407. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/.github/workflows/ci.yml +0 -0
  408. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/.github/workflows/generate-docs.yml +0 -0
  409. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/.github/workflows/verify-generated-code.yml +0 -0
  410. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/.gitignore +0 -0
  411. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/.gitmodules +0 -0
  412. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/.npmignore +0 -0
  413. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/.prettierignore +0 -0
  414. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/CMakeLists.txt +0 -0
  415. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/LICENCE +0 -0
  416. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/README.md +0 -0
  417. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/README_banner.png +0 -0
  418. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/assets/screenshot_0.png +0 -0
  419. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/cpp/actions.hpp +0 -0
  420. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/cpp/generate_glue_prototype.js +0 -0
  421. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/cpp/glue.hpp +0 -0
  422. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/cpp/helpers/wcommon.cpp +0 -0
  423. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/cpp/helpers/wcommon.h +0 -0
  424. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/cpp/helpers/wlog.cpp +0 -0
  425. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/cpp/helpers/wlog.h +0 -0
  426. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/cpp/helpers/wsampling.cpp +0 -0
  427. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/cpp/helpers/wsampling.h +0 -0
  428. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/cpp/test_glue.cpp +0 -0
  429. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/cpp/wllama.cpp +0 -0
  430. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/basic/index.html +0 -0
  431. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/embeddings/index.html +0 -0
  432. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/.eslintrc.cjs +0 -0
  433. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/.gitignore +0 -0
  434. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/README.md +0 -0
  435. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/index.html +0 -0
  436. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/package-lock.json +0 -0
  437. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/package.json +0 -0
  438. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/postcss.config.js +0 -0
  439. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/public/favicon.ico +0 -0
  440. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/public/wllama.png +0 -0
  441. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/src/App.tsx +0 -0
  442. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/src/components/ChatScreen.tsx +0 -0
  443. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/src/components/GuideScreen.tsx +0 -0
  444. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/src/components/LogScreen.tsx +0 -0
  445. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/src/components/MarkdownMessage.tsx +0 -0
  446. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/src/components/ModelScreen.tsx +0 -0
  447. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/src/components/Navbar.tsx +0 -0
  448. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/src/components/ScreenWrapper.tsx +0 -0
  449. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/src/components/Sidebar.tsx +0 -0
  450. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/src/config.ts +0 -0
  451. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/src/index.css +0 -0
  452. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/src/main.tsx +0 -0
  453. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/src/utils/benchmark.ts +0 -0
  454. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/src/utils/custom-models.tsx +0 -0
  455. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/src/utils/displayed-model.tsx +0 -0
  456. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/src/utils/messages.context.tsx +0 -0
  457. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/src/utils/nl2br.tsx +0 -0
  458. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/src/utils/types.ts +0 -0
  459. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/src/utils/use-interval-when.ts +0 -0
  460. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/src/utils/utils.ts +0 -0
  461. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/src/utils/wllama.context.tsx +0 -0
  462. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/src/vite-env.d.ts +0 -0
  463. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/tailwind.config.cjs +0 -0
  464. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/tsconfig.app.json +0 -0
  465. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/tsconfig.json +0 -0
  466. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/tsconfig.node.json +0 -0
  467. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/examples/main/vite.config.ts +0 -0
  468. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/guides/intro-v2.md +0 -0
  469. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/index.ts +0 -0
  470. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/package-lock.json +0 -0
  471. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/package.json +0 -0
  472. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/scripts/build_hf_space.sh +0 -0
  473. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/scripts/build_wasm.sh +0 -0
  474. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/scripts/build_worker.sh +0 -0
  475. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/scripts/docker-compose.yml +0 -0
  476. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/scripts/generate_wasm_from_cdn.js +0 -0
  477. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/scripts/http_server.js +0 -0
  478. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/scripts/post_build.sh +0 -0
  479. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/src/cache-manager.ts +0 -0
  480. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/src/glue/glue.ts +0 -0
  481. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/src/glue/messages.ts +0 -0
  482. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/src/index.ts +0 -0
  483. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/src/mjs.test.ts +0 -0
  484. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/src/model-manager.test.ts +0 -0
  485. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/src/model-manager.ts +0 -0
  486. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/src/multi-thread/wllama.js +0 -0
  487. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/src/multi-thread/wllama.wasm +0 -0
  488. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/src/single-thread/wllama.js +0 -0
  489. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/src/single-thread/wllama.wasm +0 -0
  490. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/src/utils.test.ts +0 -0
  491. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/src/utils.ts +0 -0
  492. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/src/wasm-from-cdn.ts +0 -0
  493. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/src/wllama.test.ts +0 -0
  494. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/src/wllama.ts +0 -0
  495. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/src/worker.ts +0 -0
  496. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/src/workers-code/generated.ts +0 -0
  497. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/src/workers-code/llama-cpp.js +0 -0
  498. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/src/workers-code/opfs-utils.js +0 -0
  499. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/tsconfig.build.json +0 -0
  500. {programasweights-0.2.2.dev1 → programasweights-0.2.3}/web-sdk/wllama/tsup.config.ts +0 -0
  501. {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.2.dev1
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.2.dev1"
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.2.dev1"
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"
@@ -44,4 +44,3 @@ LOG_FORMAT=json
44
44
  # Server
45
45
  HOST=0.0.0.0
46
46
  PORT=8000
47
- WORKERS=4
@@ -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
 
@@ -213,6 +213,7 @@ class HealthResponse(BaseModel):
213
213
  gpu_services: dict
214
214
  queue_depth: int
215
215
  uptime_s: float
216
+ warnings: list[str] = []
216
217
 
217
218
 
218
219
  # --- Error ---
@@ -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
- redis = AsyncRedis.from_url("redis://localhost:6379/0", decode_responses=True, socket_connect_timeout=1)
150
- queue_depth = int(await redis.get("paw:compile_queue_depth") or 0)
151
- await redis.aclose()
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 locally. No API calls, no latency, no cost per request." />
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. Like spaCy, but you define the function." />
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. Like spaCy, but you define the function." />
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
 
@@ -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: 'Everything runs locally. Your data never leaves your machine.' },
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.' },