programasweights 0.2.2.dev1__tar.gz → 0.2.4__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.4/AGENTS.md +173 -0
  2. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/CHANGELOG.md +8 -0
  3. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/PKG-INFO +5 -1
  4. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/PYPI_README.md +4 -0
  5. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/docs/api-reference/python-sdk.md +31 -1
  6. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/programasweights/__init__.py +2 -1
  7. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/programasweights/client.py +17 -4
  8. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/programasweights/runtime_llamacpp.py +12 -12
  9. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/pyproject.toml +1 -1
  10. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/.env.example +0 -1
  11. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/api/config.py +1 -2
  12. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/api/main.py +50 -4
  13. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/api/models/schemas.py +1 -0
  14. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/api/routes/auth.py +0 -1
  15. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/api/routes/compile.py +1 -1
  16. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/api/routes/health.py +8 -3
  17. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/api/routes/programs.py +31 -16
  18. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/api/services/compile_provider.py +15 -3
  19. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/frontend/e2e/full.spec.ts +65 -0
  20. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/frontend/index.html +5 -5
  21. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/frontend/src/App.tsx +34 -1
  22. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/frontend/src/components/AboutPage.tsx +3 -1
  23. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/frontend/src/components/AgentsPage.tsx +92 -47
  24. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/frontend/src/components/AuthorPage.tsx +14 -7
  25. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/frontend/src/components/BrowserPage.tsx +53 -17
  26. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/frontend/src/components/CasesSection.tsx +8 -5
  27. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/frontend/src/components/Header.tsx +14 -11
  28. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/frontend/src/components/HubPage.tsx +5 -5
  29. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/frontend/src/components/HubProgramPage.tsx +41 -24
  30. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/frontend/src/components/HubUploadPage.tsx +8 -1
  31. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/frontend/src/components/MainInterface.tsx +39 -15
  32. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/frontend/src/components/NavigationHelper.tsx +8 -3
  33. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/frontend/src/components/ProfilePage.tsx +23 -21
  34. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/frontend/src/components/SettingsPage.tsx +18 -22
  35. programasweights-0.2.4/web-app/frontend/src/contexts/AuthContext.tsx +45 -0
  36. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/frontend/src/types/index.ts +2 -0
  37. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/frontend/src/utils/api.ts +0 -8
  38. programasweights-0.2.4/web-app/frontend/test-results/.last-run.json +4 -0
  39. programasweights-0.2.2.dev1/AGENTS.md +0 -129
  40. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/.cursor/rules/sdk-publishing.mdc +0 -0
  41. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/.cursor/rules/vllm-deployment.mdc +0 -0
  42. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/.git +0 -0
  43. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/.github/workflows/web-sdk.yml +0 -0
  44. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/.gitignore +0 -0
  45. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/.gitmodules +0 -0
  46. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/.hatch_build.toml +0 -0
  47. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/.readthedocs.yaml +0 -0
  48. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/1apple.jpg +0 -0
  49. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/1apple2.jpg +0 -0
  50. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/2apples.jpg +0 -0
  51. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/2apples2.jpg +0 -0
  52. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/3apples.jpg +0 -0
  53. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/3apples2.jpg +0 -0
  54. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/479400.png +0 -0
  55. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/4apples.jpg +0 -0
  56. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/4apples2.jpg +0 -0
  57. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/4apples3.jpg +0 -0
  58. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/4apples4.jpg +0 -0
  59. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/5apples.jpg +0 -0
  60. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/6apples.jpg +0 -0
  61. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/8apples.jpg +0 -0
  62. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/9apples.jpg +0 -0
  63. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/FLOW_SUMMARY.md +0 -0
  64. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/LICENSE +0 -0
  65. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/MANIFEST.in +0 -0
  66. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/ONNX_MIGRATION_PLAN.md +0 -0
  67. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/PREFIX_TOKENS_DESIGN.md +0 -0
  68. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/README.md +0 -0
  69. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/TRUNCATION_CHANGES.md +0 -0
  70. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/USE_CASES_AND_IDEAS.md +0 -0
  71. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/VERIFICATION_USAGE.md +0 -0
  72. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/analyze_dataset.py +0 -0
  73. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/analyze_lengths.py +0 -0
  74. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/baselines/code_prompt.md +0 -0
  75. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/baselines/evaluate_openai_python_code_baseline.py +0 -0
  76. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/baselines/openai_batch_request.py +0 -0
  77. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/baselines/prepare_alchemist_data.py +0 -0
  78. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/baselines/prepare_var_bench_data.py +0 -0
  79. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/baselines/python_code_sandbox.py +0 -0
  80. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/baselines/script_evaluation_var_bench.sh +0 -0
  81. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/baselines/script_evalution_evaluation.sh +0 -0
  82. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/baselines/script_evalution_request.sh +0 -0
  83. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/baselines/script_evalution_statistics.sh +0 -0
  84. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/benchmark_pytorch_vs_onnx.py +0 -0
  85. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/benchmark_user_experience.py +0 -0
  86. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/check_dataset.py +0 -0
  87. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/combine_datasets.py +0 -0
  88. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/compare_datasets.py +0 -0
  89. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/compare_old_vs_regen.py +0 -0
  90. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/convert_paw_to_svg.py +0 -0
  91. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/create_favicon_sizes.py +0 -0
  92. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/create_visualization_from_log.py +0 -0
  93. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/create_vqa_dataset.py +0 -0
  94. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/debug_cache.py +0 -0
  95. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/debug_eos_example.sh +0 -0
  96. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/docs/adr/001-llama-cpp-over-pytorch.md +0 -0
  97. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/docs/adr/002-q4_0-adapter-format.md +0 -0
  98. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/docs/adr/003-single-spec-field.md +0 -0
  99. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/docs/adr/004-compiler-naming.md +0 -0
  100. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/docs/adr/005-vllm-hidden-states.md +0 -0
  101. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/docs/adr/006-email-api-key-auth.md +0 -0
  102. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/docs/advanced/adrs.md +0 -0
  103. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/docs/advanced/architecture.md +0 -0
  104. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/docs/api-reference/cli.md +0 -0
  105. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/docs/api-reference/rest-api.md +0 -0
  106. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/docs/architecture.md +0 -0
  107. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/docs/getting-started/first-program.md +0 -0
  108. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/docs/getting-started/installation.md +0 -0
  109. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/docs/getting-started/naming-programs.md +0 -0
  110. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/docs/guide/browser-inference.md +0 -0
  111. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/docs/guide/how-it-works.md +0 -0
  112. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/docs/guide/local-inference.md +0 -0
  113. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/docs/guide/writing-good-specs.md +0 -0
  114. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/docs/hub/browsing-programs.md +0 -0
  115. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/docs/hub/feedback-cases.md +0 -0
  116. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/docs/hub/publishing-programs.md +0 -0
  117. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/docs/index.md +0 -0
  118. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/docs/requirements.txt +0 -0
  119. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/estimate_data_gen_cost.py +0 -0
  120. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/eval.py +0 -0
  121. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/examples/flask_app.py +0 -0
  122. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/examples/jupyter_notebook.py +0 -0
  123. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/examples/langchain_integration.py +0 -0
  124. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/examples/replace_openai.py +0 -0
  125. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/export_to_onnx.py +0 -0
  126. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/extract_models.py +0 -0
  127. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/inspect_data_dirs.py +0 -0
  128. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/latest_export.csv +0 -0
  129. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/log.train.81920.morecategories.extraprefix +0 -0
  130. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/main_no_spec_direct_ans_mix_continuous_sampleref_shorterprompt_vllm.py +0 -0
  131. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/merge_datasets.py +0 -0
  132. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/mkdocs.yml +0 -0
  133. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/paw.png +0 -0
  134. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/paw.svg +0 -0
  135. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/process_im2latex_dataset.py +0 -0
  136. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/programasweights/artifacts.py +0 -0
  137. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/programasweights/cache.py +0 -0
  138. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/programasweights/cli.py +0 -0
  139. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/programasweights/compiler/__init__.py +0 -0
  140. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/programasweights/compiler/dummy.py +0 -0
  141. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/programasweights/config.py +0 -0
  142. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/programasweights/convert_peft_to_paw.py +0 -0
  143. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/programasweights/paw_format.py +0 -0
  144. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/programasweights/runtime/__init__.py +0 -0
  145. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/programasweights/runtime/interpreter.py +0 -0
  146. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/programasweights/runtime/interpreter_onnx.py +0 -0
  147. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/programasweights_lora/__init__.py +0 -0
  148. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/programasweights_lora/compiler/__init__.py +0 -0
  149. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/programasweights_lora/lora_format.py +0 -0
  150. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/programasweights_lora/runtime/__init__.py +0 -0
  151. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/programasweights_lora/runtime/interpreter_lora.py +0 -0
  152. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/programasweights_lora/tests/test_compile_and_run.py +0 -0
  153. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/programasweights_lora/tests/test_lora_format.py +0 -0
  154. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/programasweights_lora/tests/test_training.py +0 -0
  155. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/programasweights_lora/train_lora.py +0 -0
  156. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/programasweights_lora/training/__init__.py +0 -0
  157. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/programasweights_lora/training/loops/lora_tuning_sft.py +0 -0
  158. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/run_eval.sh +0 -0
  159. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/run_training.sh +0 -0
  160. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/scripts/filter_table_by_length.py +0 -0
  161. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/alembic/env.py +0 -0
  162. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/alembic/script.py.mako +0 -0
  163. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/alembic/versions/001_initial_schema.py +0 -0
  164. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/alembic/versions/002_namespaced_aliases_hf_url.py +0 -0
  165. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/alembic/versions/003_fulltext_search_ranking.py +0 -0
  166. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/alembic/versions/004_fix_alias_slug_constraint.py +0 -0
  167. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/alembic.ini +0 -0
  168. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/api/__init__.py +0 -0
  169. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/api/dependencies.py +0 -0
  170. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/api/logging_config.py +0 -0
  171. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/api/middleware/__init__.py +0 -0
  172. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/api/middleware/rate_limit.py +0 -0
  173. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/api/models/__init__.py +0 -0
  174. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/api/models/database.py +0 -0
  175. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/api/models/orm.py +0 -0
  176. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/api/routes/__init__.py +0 -0
  177. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/api/routes/feedback.py +0 -0
  178. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/api/routes/infer.py +0 -0
  179. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/api/routes/models_info.py +0 -0
  180. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/api/services/__init__.py +0 -0
  181. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/api/services/auto_tag_service.py +0 -0
  182. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/api/services/auto_title_service.py +0 -0
  183. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/api/services/compile_service.py +0 -0
  184. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/api/services/infer_service.py +0 -0
  185. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/api/services/search_service.py +0 -0
  186. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/api/services/storage_service.py +0 -0
  187. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/benchmarks/benchmark_api.py +0 -0
  188. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/benchmarks/handcrafted_specs.json +0 -0
  189. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/benchmarks/last_benchmark_results.json +0 -0
  190. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/benchmarks/last_stress_results.json +0 -0
  191. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/benchmarks/stress_test.py +0 -0
  192. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/compiler_registry.json +0 -0
  193. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/provider_configs/gpt2.json +0 -0
  194. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/provider_configs/qwen3-0.6b.json +0 -0
  195. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/requirements.txt +0 -0
  196. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/scripts/ab_test_hf_vs_vllm.py +0 -0
  197. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/scripts/ablation_search.py +0 -0
  198. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/scripts/backfill_hf_browser_assets.py +0 -0
  199. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/scripts/backfill_hf_safetensors.py +0 -0
  200. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/scripts/backfill_interestingness.py +0 -0
  201. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/scripts/backfill_tags.py +0 -0
  202. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/scripts/backfill_titles.py +0 -0
  203. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/scripts/benchmark_gpt2.py +0 -0
  204. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/scripts/cleanup_storage.py +0 -0
  205. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/scripts/eval_search.py +0 -0
  206. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/scripts/evict_cold_programs.py +0 -0
  207. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/scripts/generate_prefix_cache.py +0 -0
  208. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/scripts/launch_gpt2_compiler.py +0 -0
  209. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/scripts/launch_qwen3_compiler.py +0 -0
  210. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/scripts/patch_vllm.sh +0 -0
  211. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/scripts/restart.sh +0 -0
  212. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/scripts/start_all.sh +0 -0
  213. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/scripts/start_gpt2_services.sh +0 -0
  214. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/scripts/start_provider.sh +0 -0
  215. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/scripts/start_services.sh +0 -0
  216. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/tests/__init__.py +0 -0
  217. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/tests/conftest.py +0 -0
  218. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/tests/test_auth.py +0 -0
  219. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/tests/test_compile.py +0 -0
  220. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/tests/test_errors.py +0 -0
  221. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/tests/test_infer.py +0 -0
  222. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/tests/test_integration_gpu.py +0 -0
  223. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/tests/test_rate_limit.py +0 -0
  224. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/tests/test_storage.py +0 -0
  225. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/vllm_models/__init__.py +0 -0
  226. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/vllm_models/gpt2_lora_patch.py +0 -0
  227. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/vllm_models/paw_compiler.py +0 -0
  228. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/vllm_models/prepare_checkpoint.py +0 -0
  229. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/server/vllm_models/register.py +0 -0
  230. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/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.4}/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.4}/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.4}/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.4}/test_1spec.py +0 -0
  235. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/test_all_caching.py +0 -0
  236. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/test_apple_count.py +0 -0
  237. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/test_batch_pilot.py +0 -0
  238. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/test_compile.py +0 -0
  239. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/test_e2e.py +0 -0
  240. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/test_execute.py +0 -0
  241. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/test_nspecs.py +0 -0
  242. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/test_one_vs_two_step.py +0 -0
  243. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/test_onnx_correctness.py +0 -0
  244. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/test_onnx_hf_model.py +0 -0
  245. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/test_onnx_hf_with_images.py +0 -0
  246. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/test_paw_format.py +0 -0
  247. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/test_thinking_comparison.py +0 -0
  248. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/tests/test_offline_cache.py +0 -0
  249. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/tests/test_sdk.py +0 -0
  250. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/tests/test_sdk.sh +0 -0
  251. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/train.py +0 -0
  252. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/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.4}/training/README.md +0 -0
  254. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/training/__init__.py +0 -0
  255. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/training/data_generation/DATASET_CHANGELOG.md +0 -0
  256. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/training/data_generation/README.md +0 -0
  257. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/training/data_generation/VERIFICATION_PIPELINE.md +0 -0
  258. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/training/data_generation/build_user_bench.py +0 -0
  259. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/training/data_generation/dry_run_batch.py +0 -0
  260. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/training/data_generation/filter_test_data.py +0 -0
  261. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/training/data_generation/generate_specs.py +0 -0
  262. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/training/data_generation/generate_specs_batch.py +0 -0
  263. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/training/data_generation/incremental_merge.py +0 -0
  264. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/training/data_generation/merge_and_upload.py +0 -0
  265. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/training/data_generation/regenerate_outputs_batch.py +0 -0
  266. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/training/data_generation/synthesize_data.py +0 -0
  267. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/training/data_generation/synthesize_data_batch.py +0 -0
  268. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/training/data_generation/templates/filter_system.txt +0 -0
  269. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/training/data_generation/templates/filter_user.txt +0 -0
  270. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/training/data_generation/templates/pairs_system.txt +0 -0
  271. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/training/data_generation/templates/pairs_user.txt +0 -0
  272. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/training/data_generation/templates/specs_system.txt +0 -0
  273. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/training/data_generation/templates/specs_user.txt +0 -0
  274. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/training/data_generation/templates/specs_user_freeform.txt +0 -0
  275. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/training/data_generation/templates/specs_user_freeform_with_examples.txt +0 -0
  276. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/training/data_generation/templates/specs_user_with_examples.txt +0 -0
  277. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/training/data_generation/templates/verify_system.txt +0 -0
  278. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/training/data_generation/templates/verify_user.txt +0 -0
  279. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/training/data_generation/templates_old/filter_system.txt +0 -0
  280. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/training/data_generation/templates_old/filter_user.txt +0 -0
  281. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/training/data_generation/templates_old/pairs_system.txt +0 -0
  282. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/training/data_generation/templates_old/pairs_user.txt +0 -0
  283. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/training/data_generation/templates_old/specs_system.txt +0 -0
  284. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/training/data_generation/templates_old/specs_user.txt +0 -0
  285. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/training/data_generation/templates_old/specs_user_freeform.txt +0 -0
  286. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/training/data_generation/templates_old/specs_user_freeform_with_examples.txt +0 -0
  287. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/training/data_generation/templates_old/specs_user_with_examples.txt +0 -0
  288. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/training/data_generation/templates_old/verify_system.txt +0 -0
  289. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/training/data_generation/templates_old/verify_user.txt +0 -0
  290. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/training/data_generation/verify_test_data.py +0 -0
  291. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/training/datasets/__init__.py +0 -0
  292. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/training/datasets/jsonl_text_pairs.py +0 -0
  293. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/training/loops/__init__.py +0 -0
  294. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/training/loops/prefix_tuning_sft.py +0 -0
  295. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/ttt.py +0 -0
  296. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/upload_model.py +0 -0
  297. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/upload_onnx_to_huggingface.py +0 -0
  298. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/upload_onnx_to_huggingface_with_token.py +0 -0
  299. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/utils.py +0 -0
  300. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/HANDOFF.md +0 -0
  301. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/README.md +0 -0
  302. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/backend/app/__init__.py +0 -0
  303. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/backend/app/config.py +0 -0
  304. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/backend/app/main.py +0 -0
  305. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/backend/app/middleware/__init__.py +0 -0
  306. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/backend/app/middleware/rate_limit.py +0 -0
  307. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/backend/app/models.py +0 -0
  308. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/backend/app/services/__init__.py +0 -0
  309. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/backend/app/services/auth_service.py +0 -0
  310. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/backend/app/services/case_service.py +0 -0
  311. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/backend/app/services/compiler_service.py +0 -0
  312. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/backend/app/services/gpt_service.py +0 -0
  313. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/backend/app/services/hub_service.py +0 -0
  314. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/backend/app/services/image_service.py +0 -0
  315. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/backend/app/services/interpreter_service.py +0 -0
  316. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/backend/app/services/sql_manager.py +0 -0
  317. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/backend/app/templates/gpt_test_generation.txt +0 -0
  318. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/backend/app/utils/__init__.py +0 -0
  319. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/backend/app/utils/image_placeholders.py +0 -0
  320. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/backend/app/utils/program_hash.py +0 -0
  321. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/backend/clear_db.sh +0 -0
  322. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/backend/clear_tables.sql +0 -0
  323. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/backend/data/programs.db +0 -0
  324. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/backend/env_example.txt +0 -0
  325. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/backend/example_images/README.md +0 -0
  326. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/backend/get_data_examples.py +0 -0
  327. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/backend/requirements.txt +0 -0
  328. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/backend/run_server.py +0 -0
  329. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/backend/setup_analytics_tables.sql +0 -0
  330. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/backend/setup_auth_tables.sql +0 -0
  331. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/backend/setup_cache_tables.sql +0 -0
  332. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/backend/setup_cases_tables.sql +0 -0
  333. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/backend/setup_database.sql +0 -0
  334. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/backend/setup_database_simple.sql +0 -0
  335. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/backend/setup_db.sh +0 -0
  336. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/backend/setup_example_images.py +0 -0
  337. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/backend/setup_hub_tables.sql +0 -0
  338. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/backend/test_compilation_cache.py +0 -0
  339. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/frontend/README.md +0 -0
  340. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/frontend/e2e/helpers.ts +0 -0
  341. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/frontend/e2e/smoke.spec.ts +0 -0
  342. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/frontend/eslint.config.js +0 -0
  343. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/frontend/package-lock.json +0 -0
  344. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/frontend/package.json +0 -0
  345. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/frontend/playwright.config.ts +0 -0
  346. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/frontend/postcss.config.js +0 -0
  347. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/frontend/public/apple-touch-icon.png +0 -0
  348. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/frontend/public/browser-worker.html +0 -0
  349. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/frontend/public/favicon-16x16.png +0 -0
  350. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/frontend/public/favicon-32x32.png +0 -0
  351. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/frontend/public/paw-192.png +0 -0
  352. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/frontend/public/paw-512.png +0 -0
  353. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/frontend/public/paw.svg +0 -0
  354. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/frontend/public/react-test.html +0 -0
  355. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/frontend/public/test.html +0 -0
  356. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/frontend/public/vite.svg +0 -0
  357. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/frontend/scripts/deploy.sh +0 -0
  358. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/frontend/src/App.css +0 -0
  359. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/frontend/src/assets/react.svg +0 -0
  360. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/frontend/src/components/CompileButtonWithConfig.tsx +0 -0
  361. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/frontend/src/components/CompileSection.tsx +0 -0
  362. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/frontend/src/components/DocsPage.tsx +0 -0
  363. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/frontend/src/components/ExamplesInput.tsx +0 -0
  364. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/frontend/src/components/Footer.tsx +0 -0
  365. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/frontend/src/components/LandingPage.tsx +0 -0
  366. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/frontend/src/components/ModelSelector.tsx +0 -0
  367. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/frontend/src/components/PrivacyPage.tsx +0 -0
  368. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/frontend/src/components/SpecSuggestions.tsx +0 -0
  369. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/frontend/src/components/TermsPage.tsx +0 -0
  370. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/frontend/src/components/TestSection.tsx +0 -0
  371. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/frontend/src/index.css +0 -0
  372. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/frontend/src/main.tsx +0 -0
  373. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/frontend/tailwind.config.js +0 -0
  374. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/frontend/tsconfig.app.json +0 -0
  375. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/frontend/tsconfig.json +0 -0
  376. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/frontend/tsconfig.node.json +0 -0
  377. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/frontend/vite.config.ts +0 -0
  378. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/nginx-paw.conf +0 -0
  379. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/nginx.conf +0 -0
  380. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/setup_mysql.sh +0 -0
  381. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/start.sh +0 -0
  382. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/test_setup.py +0 -0
  383. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-app/ttt.py +0 -0
  384. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/.gitignore +0 -0
  385. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/LICENSE +0 -0
  386. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/README.md +0 -0
  387. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/__tests__/e2e/browser.spec.ts +0 -0
  388. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/__tests__/e2e/server.ts +0 -0
  389. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/__tests__/e2e/start-server.ts +0 -0
  390. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/__tests__/e2e/test-page.html +0 -0
  391. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/__tests__/loader.test.ts +0 -0
  392. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/__tests__/prompt.test.ts +0 -0
  393. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/examples/basic.html +0 -0
  394. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/package-lock.json +0 -0
  395. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/package.json +0 -0
  396. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/playwright.config.ts +0 -0
  397. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/serve.py +0 -0
  398. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/src/index.ts +0 -0
  399. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/src/loader.ts +0 -0
  400. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/src/runtime.ts +0 -0
  401. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/src/types.ts +0 -0
  402. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/test-standalone.html +0 -0
  403. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/tsconfig.json +0 -0
  404. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/vitest.config.ts +0 -0
  405. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/.git +0 -0
  406. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/.github/workflows/build-hf-space.yml +0 -0
  407. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/.github/workflows/ci.yml +0 -0
  408. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/.github/workflows/generate-docs.yml +0 -0
  409. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/.github/workflows/verify-generated-code.yml +0 -0
  410. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/.gitignore +0 -0
  411. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/.gitmodules +0 -0
  412. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/.npmignore +0 -0
  413. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/.prettierignore +0 -0
  414. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/CMakeLists.txt +0 -0
  415. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/LICENCE +0 -0
  416. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/README.md +0 -0
  417. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/README_banner.png +0 -0
  418. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/assets/screenshot_0.png +0 -0
  419. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/cpp/actions.hpp +0 -0
  420. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/cpp/generate_glue_prototype.js +0 -0
  421. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/cpp/glue.hpp +0 -0
  422. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/cpp/helpers/wcommon.cpp +0 -0
  423. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/cpp/helpers/wcommon.h +0 -0
  424. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/cpp/helpers/wlog.cpp +0 -0
  425. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/cpp/helpers/wlog.h +0 -0
  426. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/cpp/helpers/wsampling.cpp +0 -0
  427. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/cpp/helpers/wsampling.h +0 -0
  428. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/cpp/test_glue.cpp +0 -0
  429. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/cpp/wllama.cpp +0 -0
  430. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/examples/basic/index.html +0 -0
  431. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/examples/embeddings/index.html +0 -0
  432. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/examples/main/.eslintrc.cjs +0 -0
  433. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/examples/main/.gitignore +0 -0
  434. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/examples/main/README.md +0 -0
  435. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/examples/main/index.html +0 -0
  436. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/examples/main/package-lock.json +0 -0
  437. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/examples/main/package.json +0 -0
  438. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/examples/main/postcss.config.js +0 -0
  439. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/examples/main/public/favicon.ico +0 -0
  440. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/examples/main/public/wllama.png +0 -0
  441. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/examples/main/src/App.tsx +0 -0
  442. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/examples/main/src/components/ChatScreen.tsx +0 -0
  443. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/examples/main/src/components/GuideScreen.tsx +0 -0
  444. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/examples/main/src/components/LogScreen.tsx +0 -0
  445. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/examples/main/src/components/MarkdownMessage.tsx +0 -0
  446. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/examples/main/src/components/ModelScreen.tsx +0 -0
  447. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/examples/main/src/components/Navbar.tsx +0 -0
  448. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/examples/main/src/components/ScreenWrapper.tsx +0 -0
  449. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/examples/main/src/components/Sidebar.tsx +0 -0
  450. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/examples/main/src/config.ts +0 -0
  451. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/examples/main/src/index.css +0 -0
  452. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/examples/main/src/main.tsx +0 -0
  453. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/examples/main/src/utils/benchmark.ts +0 -0
  454. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/examples/main/src/utils/custom-models.tsx +0 -0
  455. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/examples/main/src/utils/displayed-model.tsx +0 -0
  456. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/examples/main/src/utils/messages.context.tsx +0 -0
  457. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/examples/main/src/utils/nl2br.tsx +0 -0
  458. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/examples/main/src/utils/types.ts +0 -0
  459. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/examples/main/src/utils/use-interval-when.ts +0 -0
  460. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/examples/main/src/utils/utils.ts +0 -0
  461. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/examples/main/src/utils/wllama.context.tsx +0 -0
  462. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/examples/main/src/vite-env.d.ts +0 -0
  463. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/examples/main/tailwind.config.cjs +0 -0
  464. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/examples/main/tsconfig.app.json +0 -0
  465. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/examples/main/tsconfig.json +0 -0
  466. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/examples/main/tsconfig.node.json +0 -0
  467. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/examples/main/vite.config.ts +0 -0
  468. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/guides/intro-v2.md +0 -0
  469. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/index.ts +0 -0
  470. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/package-lock.json +0 -0
  471. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/package.json +0 -0
  472. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/scripts/build_hf_space.sh +0 -0
  473. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/scripts/build_wasm.sh +0 -0
  474. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/scripts/build_worker.sh +0 -0
  475. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/scripts/docker-compose.yml +0 -0
  476. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/scripts/generate_wasm_from_cdn.js +0 -0
  477. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/scripts/http_server.js +0 -0
  478. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/scripts/post_build.sh +0 -0
  479. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/src/cache-manager.ts +0 -0
  480. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/src/glue/glue.ts +0 -0
  481. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/src/glue/messages.ts +0 -0
  482. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/src/index.ts +0 -0
  483. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/src/mjs.test.ts +0 -0
  484. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/src/model-manager.test.ts +0 -0
  485. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/src/model-manager.ts +0 -0
  486. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/src/multi-thread/wllama.js +0 -0
  487. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/src/multi-thread/wllama.wasm +0 -0
  488. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/src/single-thread/wllama.js +0 -0
  489. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/src/single-thread/wllama.wasm +0 -0
  490. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/src/utils.test.ts +0 -0
  491. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/src/utils.ts +0 -0
  492. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/src/wasm-from-cdn.ts +0 -0
  493. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/src/wllama.test.ts +0 -0
  494. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/src/wllama.ts +0 -0
  495. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/src/worker.ts +0 -0
  496. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/src/workers-code/generated.ts +0 -0
  497. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/src/workers-code/llama-cpp.js +0 -0
  498. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/src/workers-code/opfs-utils.js +0 -0
  499. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/tsconfig.build.json +0 -0
  500. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/web-sdk/wllama/tsup.config.ts +0 -0
  501. {programasweights-0.2.2.dev1 → programasweights-0.2.4}/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.4
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.4"
26
27
 
27
28
  from .config import get_api_url, get_api_key, set_api_key
28
29
 
@@ -108,25 +108,38 @@ 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
+ Handles 202 Accepted (assets still generating) and 302 redirects (HF CDN).
112
112
  """
113
113
  program_dir = config.get_programs_dir() / program_id
114
114
  if (program_dir / "prompt_template.txt").exists():
115
115
  return program_dir
116
116
 
117
- max_retries = 10
118
- for attempt in range(max_retries):
117
+ max_wait = 30
118
+ elapsed = 0
119
+ resp = None
120
+ while elapsed < max_wait:
119
121
  resp = httpx.get(
120
122
  f"{self._api_url}/api/v1/programs/{program_id}/download",
121
123
  headers=self._headers(),
122
124
  timeout=60.0,
123
125
  follow_redirects=True,
124
126
  )
125
- if resp.status_code == 404 and attempt < max_retries - 1:
127
+ if resp.status_code == 202:
128
+ retry_after = int(resp.headers.get("Retry-After", "3"))
129
+ time.sleep(retry_after)
130
+ elapsed += retry_after
131
+ continue
132
+ if resp.status_code == 404 and elapsed < max_wait - 3:
126
133
  time.sleep(3)
134
+ elapsed += 3
127
135
  continue
128
136
  resp.raise_for_status()
129
137
  break
138
+ else:
139
+ raise RuntimeError(
140
+ f"Program {program_id} assets not ready after {max_wait}s. "
141
+ "The program may still be generating. Try again shortly."
142
+ )
130
143
 
131
144
  program_dir.mkdir(parents=True, exist_ok=True)
132
145
  paw_path = program_dir / f"{program_id}.paw"
@@ -67,24 +67,24 @@ class PawFunction:
67
67
  n_gpu_layers=n_gpu_layers,
68
68
  verbose=verbose,
69
69
  )
70
+
71
+ adapter_path = program_dir / "adapter.gguf"
72
+ if adapter_path.exists():
73
+ self._adapter = llama_cpp.llama_adapter_lora_init(
74
+ self._llm.model, str(adapter_path).encode("utf-8"),
75
+ )
76
+ if self._adapter:
77
+ llama_cpp.llama_set_adapter_lora(self._llm.ctx, self._adapter, 1.0)
78
+ else:
79
+ raise RuntimeError(f"Failed to load LoRA adapter: {adapter_path}")
80
+ else:
81
+ self._adapter = None
70
82
  finally:
71
83
  if not verbose:
72
84
  _os.dup2(_old_stderr, _stderr_fd)
73
85
  _os.close(_devnull)
74
86
  _os.close(_old_stderr)
75
87
 
76
- adapter_path = program_dir / "adapter.gguf"
77
- if adapter_path.exists():
78
- self._adapter = llama_cpp.llama_adapter_lora_init(
79
- self._llm.model, str(adapter_path).encode("utf-8"),
80
- )
81
- if self._adapter:
82
- llama_cpp.llama_set_adapter_lora(self._llm.ctx, self._adapter, 1.0)
83
- else:
84
- raise RuntimeError(f"Failed to load LoRA adapter: {adapter_path}")
85
- else:
86
- self._adapter = None
87
-
88
88
  placeholder = "{INPUT_PLACEHOLDER}"
89
89
  self._use_special = interpreter not in ("gpt2",)
90
90
 
@@ -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.4"
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
@@ -140,7 +140,7 @@ async def submit_compile(
140
140
  public=req.public,
141
141
  name=req.name,
142
142
  tags=req.tags,
143
- hf_url=f"https://huggingface.co/programasweights/paw-programs/resolve/main/{pid}.paw",
143
+ hf_url=None,
144
144
  ))
145
145
 
146
146
  db.add(CompileLog(
@@ -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
  )
@@ -6,7 +6,7 @@ import re
6
6
  from pathlib import Path
7
7
 
8
8
  from fastapi import APIRouter, Depends, HTTPException, Request
9
- from fastapi.responses import FileResponse, RedirectResponse
9
+ from fastapi.responses import FileResponse, JSONResponse, RedirectResponse
10
10
 
11
11
  from api.config import get_settings
12
12
  from sqlalchemy import func, select, or_
@@ -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
@@ -413,6 +414,10 @@ async def download_program(
413
414
  program.downloads = (program.downloads or 0) + 1
414
415
  await db.commit()
415
416
 
417
+ if program.hf_url:
418
+ hf_url = f"https://huggingface.co/programasweights/paw-programs/resolve/main/{program.id}.paw"
419
+ return RedirectResponse(url=hf_url, status_code=302)
420
+
416
421
  settings = get_settings()
417
422
  local_paw = Path(settings.STORAGE_PATH) / program.id / f"{program.id}.paw"
418
423
  if local_paw.exists():
@@ -422,8 +427,11 @@ async def download_program(
422
427
  filename=f"{program.id}.paw",
423
428
  )
424
429
 
425
- hf_url = f"https://huggingface.co/programasweights/paw-programs/resolve/main/{program.id}.paw"
426
- return RedirectResponse(url=hf_url, status_code=302)
430
+ return JSONResponse(
431
+ status_code=202,
432
+ content={"status": "generating", "message": "Program assets are being prepared. Retry shortly."},
433
+ headers={"Retry-After": "3"},
434
+ )
427
435
 
428
436
 
429
437
  ALLOWED_ASSETS = {"adapter.gguf", "prompt_template.txt", "prefix_cache.bin", "prefix_tokens.json"}
@@ -442,18 +450,25 @@ async def serve_program_asset(
442
450
  if not program:
443
451
  raise HTTPException(status_code=404, detail="Asset not found")
444
452
 
453
+ if program.hf_url:
454
+ hf_url = f"https://huggingface.co/programasweights/paw-programs/resolve/main/{program.id}/{filename}"
455
+ return RedirectResponse(url=hf_url, status_code=302)
456
+
445
457
  settings = get_settings()
446
458
  asset_path = Path(settings.STORAGE_PATH) / program.id / filename
447
- if not asset_path.exists():
448
- raise HTTPException(status_code=404, detail="Asset not found on this server")
449
-
450
- media_type = "application/octet-stream"
451
- if filename.endswith(".txt"):
452
- media_type = "text/plain"
453
- elif filename.endswith(".json"):
454
- media_type = "application/json"
455
-
456
- return FileResponse(path=str(asset_path), media_type=media_type, filename=filename)
459
+ if asset_path.exists():
460
+ media_type = "application/octet-stream"
461
+ if filename.endswith(".txt"):
462
+ media_type = "text/plain"
463
+ elif filename.endswith(".json"):
464
+ media_type = "application/json"
465
+ return FileResponse(path=str(asset_path), media_type=media_type, filename=filename)
466
+
467
+ return JSONResponse(
468
+ status_code=202,
469
+ content={"status": "generating", "message": "Program assets are being prepared. Retry shortly."},
470
+ headers={"Retry-After": "3"},
471
+ )
457
472
 
458
473
 
459
474
  # --- Update program ---
@@ -509,10 +509,22 @@ class CompileProvider:
509
509
  upload_all_to_hf, program_id, adapter_dir,
510
510
  self.interpreter, paw_path,
511
511
  )
512
- logger.info("hf_upload_done", program_id=program_id, hf_url=hf_url)
513
512
 
514
- await asyncio.sleep(300)
515
- cleanup_after_upload(adapter_dir, program_id)
513
+ if hf_url:
514
+ from api.models.database import get_engine
515
+ from sqlalchemy import text as sa_text
516
+ engine = get_engine()
517
+ with engine.connect() as conn:
518
+ conn.execute(
519
+ sa_text("UPDATE programs SET hf_url = :url WHERE id = :pid"),
520
+ {"url": hf_url, "pid": program_id},
521
+ )
522
+ conn.commit()
523
+ logger.info("hf_upload_done", program_id=program_id, hf_url=hf_url)
524
+ await asyncio.sleep(300)
525
+ cleanup_after_upload(adapter_dir, program_id)
526
+ else:
527
+ logger.warning("hf_upload_failed_keeping_local", program_id=program_id)
516
528
  except Exception:
517
529
  logger.exception("background_failed", program_id=program_id)
518
530