xai-review 0.33.0__py3-none-any.whl → 0.35.0__py3-none-any.whl

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.

Potentially problematic release.


This version of xai-review might be problematic. Click here for more details.

Files changed (56) hide show
  1. ai_review/clients/claude/client.py +1 -1
  2. ai_review/clients/claude/schema.py +2 -2
  3. ai_review/clients/gemini/client.py +2 -1
  4. ai_review/clients/gemini/schema.py +2 -2
  5. ai_review/clients/ollama/client.py +1 -1
  6. ai_review/clients/openai/v1/__init__.py +0 -0
  7. ai_review/clients/openai/{client.py → v1/client.py} +9 -9
  8. ai_review/clients/openai/{schema.py → v1/schema.py} +1 -1
  9. ai_review/clients/openai/v1/types.py +8 -0
  10. ai_review/clients/openai/v2/__init__.py +0 -0
  11. ai_review/clients/openai/v2/client.py +46 -0
  12. ai_review/clients/openai/v2/schema.py +47 -0
  13. ai_review/clients/openai/v2/types.py +11 -0
  14. ai_review/clients/openrouter/__init__.py +0 -0
  15. ai_review/clients/openrouter/client.py +50 -0
  16. ai_review/clients/openrouter/schema.py +36 -0
  17. ai_review/clients/openrouter/types.py +11 -0
  18. ai_review/libs/config/llm/base.py +8 -1
  19. ai_review/libs/config/llm/meta.py +2 -2
  20. ai_review/libs/config/llm/openai.py +4 -0
  21. ai_review/libs/config/llm/openrouter.py +12 -0
  22. ai_review/libs/constants/llm_provider.py +1 -0
  23. ai_review/resources/pricing.yaml +39 -1
  24. ai_review/services/llm/factory.py +3 -0
  25. ai_review/services/llm/openai/client.py +37 -9
  26. ai_review/services/llm/openrouter/__init__.py +0 -0
  27. ai_review/services/llm/openrouter/client.py +31 -0
  28. ai_review/tests/fixtures/clients/openai.py +84 -12
  29. ai_review/tests/fixtures/clients/openrouter.py +72 -0
  30. ai_review/tests/suites/clients/openai/v1/__init__.py +0 -0
  31. ai_review/tests/suites/clients/openai/v1/test_client.py +12 -0
  32. ai_review/tests/suites/clients/openai/{test_schema.py → v1/test_schema.py} +1 -1
  33. ai_review/tests/suites/clients/openai/v2/__init__.py +0 -0
  34. ai_review/tests/suites/clients/openai/v2/test_client.py +12 -0
  35. ai_review/tests/suites/clients/openai/v2/test_schema.py +80 -0
  36. ai_review/tests/suites/clients/openrouter/__init__.py +0 -0
  37. ai_review/tests/suites/clients/openrouter/test_client.py +12 -0
  38. ai_review/tests/suites/clients/openrouter/test_schema.py +57 -0
  39. ai_review/tests/suites/libs/config/llm/__init__.py +0 -0
  40. ai_review/tests/suites/libs/config/llm/test_openai.py +28 -0
  41. ai_review/tests/suites/services/llm/openai/test_client.py +23 -6
  42. ai_review/tests/suites/services/llm/openrouter/__init__.py +0 -0
  43. ai_review/tests/suites/services/llm/openrouter/test_client.py +22 -0
  44. ai_review/tests/suites/services/llm/test_factory.py +8 -1
  45. ai_review/tests/suites/services/review/gateway/test_review_comment_gateway.py +5 -5
  46. ai_review/tests/suites/services/review/gateway/test_review_dry_run_comment_gateway.py +5 -5
  47. ai_review/tests/suites/services/review/gateway/test_review_llm_gateway.py +2 -2
  48. ai_review/tests/suites/services/review/test_service.py +2 -2
  49. {xai_review-0.33.0.dist-info → xai_review-0.35.0.dist-info}/METADATA +11 -10
  50. {xai_review-0.33.0.dist-info → xai_review-0.35.0.dist-info}/RECORD +54 -30
  51. ai_review/clients/openai/types.py +0 -8
  52. ai_review/tests/suites/clients/openai/test_client.py +0 -12
  53. {xai_review-0.33.0.dist-info → xai_review-0.35.0.dist-info}/WHEEL +0 -0
  54. {xai_review-0.33.0.dist-info → xai_review-0.35.0.dist-info}/entry_points.txt +0 -0
  55. {xai_review-0.33.0.dist-info → xai_review-0.35.0.dist-info}/licenses/LICENSE +0 -0
  56. {xai_review-0.33.0.dist-info → xai_review-0.35.0.dist-info}/top_level.txt +0 -0
@@ -1,14 +1,14 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: xai-review
3
- Version: 0.33.0
4
- Summary: AI-powered code review tool
3
+ Version: 0.35.0
4
+ Summary: AI-powered code review tool for GitHub, GitLab, Bitbucket and Gitea — built with LLMs like OpenAI, Claude, Gemini, Ollama, and OpenRouter
5
5
  Author-email: Nikita Filonov <nikita.filonov@example.com>
6
6
  Maintainer-email: Nikita Filonov <nikita.filonov@example.com>
7
7
  License: Apache-2.0
8
8
  Project-URL: Issues, https://github.com/Nikita-Filonov/ai-review/issues
9
9
  Project-URL: Homepage, https://github.com/Nikita-Filonov/ai-review
10
10
  Project-URL: Repository, https://github.com/Nikita-Filonov/ai-review
11
- Keywords: ai,code review,llm,openai,claude,gemini
11
+ Keywords: ai,code review,llm,openai,claude,gemini,ollama,openrouter,ci/cd,gitlab,github,gitea,bitbucket
12
12
  Classifier: Programming Language :: Python :: 3
13
13
  Classifier: Programming Language :: Python :: 3.11
14
14
  Classifier: Programming Language :: Python :: 3.12
@@ -66,7 +66,8 @@ improve code quality, enforce consistency, and speed up the review process.
66
66
 
67
67
  ✨ Key features:
68
68
 
69
- - **Multiple LLM providers** — choose between **OpenAI**, **Claude**, **Gemini**, or **Ollama**, and switch anytime.
69
+ - **Multiple LLM providers** — choose between **OpenAI**, **Claude**, **Gemini**, **Ollama**, or **OpenRouter**, and
70
+ switch anytime.
70
71
  - **VCS integration** — works out of the box with **GitLab**, **GitHub**, **Bitbucket**, and **Gitea**.
71
72
  - **Customizable prompts** — adapt inline, context, and summary reviews to match your team’s coding guidelines.
72
73
  - **Reply modes** — AI can now **participate in existing review threads**, adding follow-up replies in both inline and
@@ -120,7 +121,7 @@ pip install xai-review
120
121
  Or run directly via Docker:
121
122
 
122
123
  ```bash
123
- docker run --rm -v $(pwd):/app nikitafilonov/ai-review:latest run-summary
124
+ docker run --rm -v $(pwd):/app nikitafilonov/ai-review:latest ai-review run-summary
124
125
  ```
125
126
 
126
127
  🐳 Pull from [DockerHub](https://hub.docker.com/r/nikitafilonov/ai-review)
@@ -146,8 +147,8 @@ vcs:
146
147
  provider: GITLAB
147
148
 
148
149
  pipeline:
149
- project_id: 1
150
- merge_request_id: 100
150
+ project_id: "1"
151
+ merge_request_id: "100"
151
152
 
152
153
  http_client:
153
154
  timeout: 120
@@ -176,7 +177,7 @@ for complete, ready-to-use examples.
176
177
 
177
178
  Key things you can customize:
178
179
 
179
- - **LLM provider** — OpenAI, Gemini, Claude, or Ollama
180
+ - **LLM provider** — OpenAI, Gemini, Claude, Ollama, or OpenRouter
180
181
  - **Model settings** — model name, temperature, max tokens
181
182
  - **VCS integration** — works out of the box with **GitLab**, **GitHub**, **Bitbucket**, and **Gitea**
182
183
  - **Review policy** — which files to include/exclude, review modes
@@ -220,7 +221,7 @@ jobs:
220
221
  with:
221
222
  fetch-depth: 0
222
223
 
223
- - uses: Nikita-Filonov/ai-review@v0.33.0
224
+ - uses: Nikita-Filonov/ai-review@v0.35.0
224
225
  with:
225
226
  review-command: ${{ inputs.review-command }}
226
227
  env:
@@ -298,7 +299,7 @@ AI Review does **not store**, **log**, or **transmit** your source code to any e
298
299
  provider** explicitly configured in your `.ai-review.yaml`.
299
300
 
300
301
  All data is sent **directly** from your CI/CD environment to the selected LLM API endpoint (e.g. OpenAI, Gemini,
301
- Claude). No intermediary servers or storage layers are involved.
302
+ Claude, OpenRouter). No intermediary servers or storage layers are involved.
302
303
 
303
304
  If you use **Ollama**, requests are sent to your **local or self-hosted Ollama runtime**
304
305
  (by default `http://localhost:11434`). This allows you to run reviews completely **offline**, keeping all data strictly
@@ -22,12 +22,12 @@ ai_review/clients/bitbucket/pr/schema/files.py,sha256=qBDfIv370TDMKM8yoLlm1c-BTH
22
22
  ai_review/clients/bitbucket/pr/schema/pull_request.py,sha256=Eq8huJmZ9smy2JlsPuMF-Vv8EmHYR3rFQ_5EFVc2QRc,845
23
23
  ai_review/clients/bitbucket/pr/schema/user.py,sha256=-TsvtifDNZSK82fqNXv6N3li2hnui1_9g2ugSBx4Ibs,125
24
24
  ai_review/clients/claude/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
25
- ai_review/clients/claude/client.py,sha256=uEadbBNBJnzjHDczbxXiiw1V1H1PdUWKu-Gn-eIDEmw,1890
26
- ai_review/clients/claude/schema.py,sha256=LE6KCjJKDXqBGU2Cno5XL5R8vUfScgskE9MqvE0Pt2A,887
25
+ ai_review/clients/claude/client.py,sha256=I1UVlUHmLygFYw3pJIP39zYenULmEx_h65JH3XW7jG4,1907
26
+ ai_review/clients/claude/schema.py,sha256=FJy5Wh5A3IJWPNn4K6KIFn4OTC713pxO9KCqdfUKwNA,915
27
27
  ai_review/clients/claude/types.py,sha256=y_-yF7zQrTvyiowS2b9xjIlAzkF8i6OfOjqo9eB8Xo4,267
28
28
  ai_review/clients/gemini/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
29
- ai_review/clients/gemini/client.py,sha256=4G1LBcpiFcrITOysQbMwhY1db4hHcSGgyI-0XazZMV0,1889
30
- ai_review/clients/gemini/schema.py,sha256=5oVvbI-h_sw8bFreS4JUmMj-aXa_frvxK3H8sg4iJIA,2264
29
+ ai_review/clients/gemini/client.py,sha256=rZsvGQG62Wu2LpBlAFr8w6_S_0oHH1fVZ8lK41995bk,1918
30
+ ai_review/clients/gemini/schema.py,sha256=mBESW6CupZaRRSzFv5K0WTEPfzk6brAFpZG_EiloKRI,2299
31
31
  ai_review/clients/gemini/types.py,sha256=D-P0THorrQ8yq5P-NKAC65zzhEYRa9HkiXTORG9QoIk,267
32
32
  ai_review/clients/gitea/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
33
  ai_review/clients/gitea/client.py,sha256=cMxp1Ic44JFvSkuqLdWkAhsgMC6CwM3qmf-1CptqnV8,1152
@@ -65,13 +65,22 @@ ai_review/clients/gitlab/mr/schema/notes.py,sha256=9wmwULegmTO6ETSjYlMC6Fc_DIeT_
65
65
  ai_review/clients/gitlab/mr/schema/position.py,sha256=oYml4x6rlrqGahEEbSB1c1ko70geL_0_otbwP0JqV6k,371
66
66
  ai_review/clients/gitlab/mr/schema/user.py,sha256=RxgCM8oryPBNPDaFxcVqe11MogchMGaO1gALkZiscrU,112
67
67
  ai_review/clients/ollama/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
68
- ai_review/clients/ollama/client.py,sha256=KoJ9J5_Vfpv5XNJREshE_gA46uo9J0Z3qVC7wJPEcX8,1720
68
+ ai_review/clients/ollama/client.py,sha256=lo_yOmB6nSdiFdIeSG1t1-AVHUZZEzKMpD6y3w2UJco,1737
69
69
  ai_review/clients/ollama/schema.py,sha256=A6oKwkkEVrduyzMR_lhLnaLyvKXqlfsXjkMIF2eXaYw,1310
70
70
  ai_review/clients/ollama/types.py,sha256=9ES8K-EClKYU7UsaMKgXvZ3sUOF9o6reEvfL6wFOJ4M,267
71
71
  ai_review/clients/openai/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
72
- ai_review/clients/openai/client.py,sha256=jY1XG_5GtNboNjkXu3UtuXFx5V9rD6UskK7VT0lOzP8,1816
73
- ai_review/clients/openai/schema.py,sha256=glxwMtBrDA6W0BQgH-ruKe0bKH3Ps1P-Y1-2jGdqaUM,764
74
- ai_review/clients/openai/types.py,sha256=4VRY45ihKjii8w0d5XLnUGnHuBSh9wRsOP6lmkseC0Q,267
72
+ ai_review/clients/openai/v1/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
73
+ ai_review/clients/openai/v1/client.py,sha256=zThyVUFWOF2wXi47PPrejK9ApXSc7I-2yaBHlDdiMaM,1861
74
+ ai_review/clients/openai/v1/schema.py,sha256=2VWAynuDsmK6f0Y4oGS3hh8NsAwwa6xX54G9i8bPNxs,778
75
+ ai_review/clients/openai/v1/types.py,sha256=giLb2LKyoHNgIq4wO__asPl4dUi1PEMiOAQIbsPpuNk,272
76
+ ai_review/clients/openai/v2/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
77
+ ai_review/clients/openai/v2/client.py,sha256=MN61bCVkNPuOxaYZEh5duaZgpUmqnnSL2ZVA_9HWTHs,1896
78
+ ai_review/clients/openai/v2/schema.py,sha256=AU9ewqgLSozSgAgVh15ql18VMMchQeTO7MW9gUT9jd0,1195
79
+ ai_review/clients/openai/v2/types.py,sha256=BE4iFUSW1OHsah3YxTwMt1bWhZCZMssBEkTlLcR0POs,304
80
+ ai_review/clients/openrouter/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
81
+ ai_review/clients/openrouter/client.py,sha256=llfdisXWXyA7XufqeToGaTKnGHkNdV0y84TrPsaa41A,2105
82
+ ai_review/clients/openrouter/schema.py,sha256=hTPLIMIUHIKD4wDJsVPidn0LTQz58SsI1fId6JVU8KQ,827
83
+ ai_review/clients/openrouter/types.py,sha256=9CFUy52GnfjjLRufz7SwY_fnzhQnn8czLl-XLWBSKGc,303
75
84
  ai_review/libs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
76
85
  ai_review/libs/json.py,sha256=g-P5_pNUomQ-bGHCXASvPKj9Og0s9MaLFVEAkzqGp1A,350
77
86
  ai_review/libs/logger.py,sha256=LbXR2Zk1btJ-83I-vHee7cUETgT1mHToSsqEI_8uM0U,370
@@ -87,12 +96,13 @@ ai_review/libs/config/logger.py,sha256=oPmjpjf6EZwW7CgOjT8mOQdGnT98CLwXepiGB_ajZ
87
96
  ai_review/libs/config/prompt.py,sha256=jPBYvi75u6BUIHOZnXCg5CiL0XRONDfW5T4WaYlxPEE,6066
88
97
  ai_review/libs/config/review.py,sha256=jCfHfGfHs7Sc6H92hVUBd8bMRbLiIiThVmk6lFNlv40,1224
89
98
  ai_review/libs/config/llm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
90
- ai_review/libs/config/llm/base.py,sha256=ovvULFhfwH66_705D1O87ZGMeaQOZO7ZQhRUzzfzguU,2089
99
+ ai_review/libs/config/llm/base.py,sha256=yhRxizyRwwYH1swKeVzZaGAVm3I3nNME_y-h0iW5WTw,2374
91
100
  ai_review/libs/config/llm/claude.py,sha256=MoalXkBA6pEp01znS8ohTRopfea9RUcqhZX5lOIuek8,293
92
101
  ai_review/libs/config/llm/gemini.py,sha256=SKtlzsRuNWOlM9m3SFvcqOIjnml8lpPidp7FiGmIEz4,265
93
- ai_review/libs/config/llm/meta.py,sha256=cEcAHOwy-mQBKo9_KJrQe0I7qppq6h99lSmoWX4ElJI,195
102
+ ai_review/libs/config/llm/meta.py,sha256=MtWboDCqoj_jZrrGoClVJNcHyskgyqJLcPMOztfxkiM,210
94
103
  ai_review/libs/config/llm/ollama.py,sha256=M6aiPb5GvYvkiGcgHTsh9bOw5JsBLqmfSKoIbHCejrU,372
95
- ai_review/libs/config/llm/openai.py,sha256=jGVL4gJ2wIacoKeK9Zc9LCgY95TxdeYOThdglVPErFU,262
104
+ ai_review/libs/config/llm/openai.py,sha256=g2EF0h2JGD5iTOtNHg-G9bdqgVtqGjg4KLf-p9V6flY,395
105
+ ai_review/libs/config/llm/openrouter.py,sha256=6G5fApCOv0fKRHCUpsuiPOcEdyUpDe5qiUUbHjA6TbE,337
96
106
  ai_review/libs/config/vcs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
97
107
  ai_review/libs/config/vcs/base.py,sha256=RJZhKysD-d8oYZQ2v1H74jyqdqtOCc8zZ0n9S4ovfHk,1471
98
108
  ai_review/libs/config/vcs/bitbucket.py,sha256=on5sQaE57kM_zSmqdDUNrttVtTPGOzqLHM5s7eFN7DA,275
@@ -101,7 +111,7 @@ ai_review/libs/config/vcs/github.py,sha256=hk-kuDLd8wecqtEb8PSqF7Yy_pkihplJhi6nB
101
111
  ai_review/libs/config/vcs/gitlab.py,sha256=ecYfU158VgVlM6P5mgZn8FOqk3Xt60xx7gUqT5e22a4,252
102
112
  ai_review/libs/config/vcs/pagination.py,sha256=S-XxWQYkIjhu3ffpHQ44d7UtRHH81fh9GaJ-xQXUUy4,175
103
113
  ai_review/libs/constants/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
104
- ai_review/libs/constants/llm_provider.py,sha256=k7GzctIZ-TDsRlhTPbpGYgym_CO2YKVFp_oXG9dTBW0,143
114
+ ai_review/libs/constants/llm_provider.py,sha256=_ysUQFFspG1oCuCyRwdEE9kVlqLyP1hxL_Kc-tWV2F0,173
105
115
  ai_review/libs/constants/vcs_provider.py,sha256=7A30fTSs9GM_A4J9B84MNY78c7do0RaoKytuiRwdhDY,147
106
116
  ai_review/libs/diff/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
107
117
  ai_review/libs/diff/models.py,sha256=RT4YJboOPA-AjNJGRj_HIZaJLEmROOhOgMh1wIGpIwY,2344
@@ -132,7 +142,7 @@ ai_review/prompts/default_system_inline_reply.md,sha256=OhWQ5PZ-QFFgVVfmrsXEmvNA
132
142
  ai_review/prompts/default_system_summary.md,sha256=unEJ09G925TKqvjkTFKgl3g2AXT9GICe8kxTO50QhRg,224
133
143
  ai_review/prompts/default_system_summary_reply.md,sha256=qGc_qQtVUpmj_gOw-6dhL2gz6saSA__9UOcS0jAjBD0,687
134
144
  ai_review/resources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
135
- ai_review/resources/pricing.yaml,sha256=jZHCGF78GTlZsXC_IGZT8JutKqpUyKikYXwtxIFEAaE,746
145
+ ai_review/resources/pricing.yaml,sha256=wxwF9sH6uUkQyaDok-cBcbXReGxg7gdsXgC2pRrQWn0,1553
136
146
  ai_review/services/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
137
147
  ai_review/services/artifacts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
138
148
  ai_review/services/artifacts/schema.py,sha256=o4dqG5LFCdAQY3wjRF5rImANe-X20g4zX_bCIKiHLSk,291
@@ -157,7 +167,7 @@ ai_review/services/hook/constants.py,sha256=GthpBviiqcb3Oj5uhiJhyYGmWuwKgLlToC8p
157
167
  ai_review/services/hook/service.py,sha256=00qai06eFqkeKtIfqxlJkWTLCpO5d2wZzc2rFsPLKTs,10680
158
168
  ai_review/services/hook/types.py,sha256=RrGFCPwRkOOLAoHpGlkcnT6Cao0B4PyPMN-Wxj6N9Uo,2461
159
169
  ai_review/services/llm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
160
- ai_review/services/llm/factory.py,sha256=AszDqufYPaZdVVR99UZBEFvnGdOildBFQ9uVOiBI1Tc,876
170
+ ai_review/services/llm/factory.py,sha256=VF5xkGgYQFiDJJ0WNHUoXFtP4yWK6uN5qMTFPYXdTLU,1027
161
171
  ai_review/services/llm/types.py,sha256=OvbJWYRDThBgLhn9TWU0mliuanOW01CS3e8ermtuS-s,353
162
172
  ai_review/services/llm/claude/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
163
173
  ai_review/services/llm/claude/client.py,sha256=JJD0FWiXjCCpO7NW3vVoBMXhTQ9VBA4Q93QqkeQqON0,1082
@@ -166,7 +176,9 @@ ai_review/services/llm/gemini/client.py,sha256=TR4HshVxtDV8_luQKCM3aFNH9tjAjpzNe
166
176
  ai_review/services/llm/ollama/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
167
177
  ai_review/services/llm/ollama/client.py,sha256=817nOQRsnaVqoY6LdO95l5JkRHkGvvS8TX7hezT2gqk,1479
168
178
  ai_review/services/llm/openai/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
169
- ai_review/services/llm/openai/client.py,sha256=c3DWwLnwTheERdSGnMiQIbg5SaICouUAGClcQZSh1fE,1159
179
+ ai_review/services/llm/openai/client.py,sha256=edOBi6pVY_jquUj8BCRj-Gn_q-JxcK_ohBmElGClXlw,2437
180
+ ai_review/services/llm/openrouter/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
181
+ ai_review/services/llm/openrouter/client.py,sha256=wrUEETrer3XmNRtu3YzLIRNa_3ODTzsR_LU9kDkl-7I,1212
170
182
  ai_review/services/prompt/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
171
183
  ai_review/services/prompt/adapter.py,sha256=9ntRxG5iON2vU54k8-BmLpiPCH5jRv2GGl01nmHj-SI,988
172
184
  ai_review/services/prompt/schema.py,sha256=ttla_lkvBQ-jfaZXzWSAAUrJROYRsozHHd5IoZc59zA,1324
@@ -232,7 +244,8 @@ ai_review/tests/fixtures/clients/gitea.py,sha256=WQLbOyFTqqtVQGHuLFgk9qANYS03eeC
232
244
  ai_review/tests/fixtures/clients/github.py,sha256=kC1L-nWZMn9O_uRfuT_B8R4sn8FRvISlBJMkRKaioS0,7814
233
245
  ai_review/tests/fixtures/clients/gitlab.py,sha256=AD6NJOJSw76hjAEiWewQ6Vu5g-cfQn0GTtdchuDBH9o,8042
234
246
  ai_review/tests/fixtures/clients/ollama.py,sha256=UUHDDPUraQAG8gBC-0UvftaK0BDYir5cJDlRKJymSQg,2109
235
- ai_review/tests/fixtures/clients/openai.py,sha256=UgfuRZWzl3X7ZVHMLKP4mZxNXVpcccitkc9tuUyffXE,2267
247
+ ai_review/tests/fixtures/clients/openai.py,sha256=sgRt7DxKqbPUv0GPFE94XUDtFwa5tIgi1DQYWPqPQHA,4749
248
+ ai_review/tests/fixtures/clients/openrouter.py,sha256=TWCojwXP0y0_dlzFMzJra4uXSQ3Dv5wZQnm_Hbvxodg,2532
236
249
  ai_review/tests/fixtures/libs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
237
250
  ai_review/tests/fixtures/libs/llm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
238
251
  ai_review/tests/fixtures/libs/llm/output_json_parser.py,sha256=Eu0tCK5cD1d9X1829ruahih7jQoehGozIEugS71AAA8,275
@@ -289,14 +302,23 @@ ai_review/tests/suites/clients/ollama/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCe
289
302
  ai_review/tests/suites/clients/ollama/test_client.py,sha256=XZ8NAd1bS_ltTuYZPgqlutPRA6kbvH3_3SKTCbNBTgA,404
290
303
  ai_review/tests/suites/clients/ollama/test_schema.py,sha256=A93wCmxwGdvudfbA97VCPYP3gT6u6EYMetAg5fgURRA,1836
291
304
  ai_review/tests/suites/clients/openai/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
292
- ai_review/tests/suites/clients/openai/test_client.py,sha256=6Wsxw6-6Uk0uPYFkzpWSwsxfCYUZhT3UYznayo-xlPI,404
293
- ai_review/tests/suites/clients/openai/test_schema.py,sha256=x1tamS4GC9pOTpjieKDbK2D73CVV4BkATppytwMevLo,1599
305
+ ai_review/tests/suites/clients/openai/v1/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
306
+ ai_review/tests/suites/clients/openai/v1/test_client.py,sha256=raN0AvAQW46FEDOY8TfTmI3vzD4F2G7mrFdeMF2YSxQ,423
307
+ ai_review/tests/suites/clients/openai/v1/test_schema.py,sha256=vLoo4nzcmVKA1hwuuZI354yYRV2N8ujSoF23iNkkipQ,1602
308
+ ai_review/tests/suites/clients/openai/v2/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
309
+ ai_review/tests/suites/clients/openai/v2/test_client.py,sha256=pe72sdUCt916BLZ6vC6xsLPzZqEI-uO-3KvCJqgGf2M,423
310
+ ai_review/tests/suites/clients/openai/v2/test_schema.py,sha256=yzwLILjI4j_MKfNlFeQ1QWISCsQTNNI87WvdWbrRlO4,2461
311
+ ai_review/tests/suites/clients/openrouter/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
312
+ ai_review/tests/suites/clients/openrouter/test_client.py,sha256=WNH0p1Bl5J6zLKB1gSQ9smQMRTOo5-U-A60iJ0n4_DI,444
313
+ ai_review/tests/suites/clients/openrouter/test_schema.py,sha256=9wt8-lR1u2KGvd6Iget_Yy-r33BllYLA-3AKe-S2E-c,1731
294
314
  ai_review/tests/suites/libs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
295
315
  ai_review/tests/suites/libs/test_json.py,sha256=q_tvFcL9EaN5jr48Ed_mxMEmW6xXS0xlZGqSooPZBa4,713
296
316
  ai_review/tests/suites/libs/asynchronous/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
297
317
  ai_review/tests/suites/libs/asynchronous/test_gather.py,sha256=Uzo0ctGFlllJU6TqA6hVWu_mcycJBAX5am8_bDO2eXk,1282
298
318
  ai_review/tests/suites/libs/config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
299
319
  ai_review/tests/suites/libs/config/test_prompt.py,sha256=H3QC6LvYAwebnLed-NeT86TY9kPaMPy7Eppk5Bfi2SM,5601
320
+ ai_review/tests/suites/libs/config/llm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
321
+ ai_review/tests/suites/libs/config/llm/test_openai.py,sha256=H9sPccXuayoYrLVHxWc2WMD2rK2zlGP1xlAaa3G03Gs,777
300
322
  ai_review/tests/suites/libs/diff/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
301
323
  ai_review/tests/suites/libs/diff/test_models.py,sha256=RBFQ97LWhU8TlupxXkJ97ryAvJrSuOHLtT9biUBUMXg,3321
302
324
  ai_review/tests/suites/libs/diff/test_parser.py,sha256=rvWEVGIdaLBlDAnSevjRY7I1Zikj12d5GOgMk9QyHQQ,3013
@@ -321,7 +343,7 @@ ai_review/tests/suites/services/diff/test_tools.py,sha256=vsOSSIDZKkuD8dMCoBBEBt
321
343
  ai_review/tests/suites/services/hook/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
322
344
  ai_review/tests/suites/services/hook/test_service.py,sha256=TjNU2xiOQfUZZa8M3L2eHbtTwxse_B7QNn2h4118z1U,6637
323
345
  ai_review/tests/suites/services/llm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
324
- ai_review/tests/suites/services/llm/test_factory.py,sha256=Lp37aXM08fHaLzgwRBw5xZEDZkPDNhJ4qwjtEwGENv8,1394
346
+ ai_review/tests/suites/services/llm/test_factory.py,sha256=HEE65FBfIrSQbwpIYRq3SyVv1NljELPTGUHpKCahiQ0,1688
325
347
  ai_review/tests/suites/services/llm/claude/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
326
348
  ai_review/tests/suites/services/llm/claude/test_client.py,sha256=ymIeuIax0Bp_CuXBSApK1RDl1JmbGc97uzXZToQOZO8,761
327
349
  ai_review/tests/suites/services/llm/gemini/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -329,18 +351,20 @@ ai_review/tests/suites/services/llm/gemini/test_client.py,sha256=RjYViMZTgTdbzmD
329
351
  ai_review/tests/suites/services/llm/ollama/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
330
352
  ai_review/tests/suites/services/llm/ollama/test_client.py,sha256=Eu4OERB00SJwCKznyOCyqSFTDBp9J2Lw-BcW7sPJQM4,760
331
353
  ai_review/tests/suites/services/llm/openai/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
332
- ai_review/tests/suites/services/llm/openai/test_client.py,sha256=yzIL8GYHyX9iLKIlaF__87aue9w0cr66feoMaCv5gms,761
354
+ ai_review/tests/suites/services/llm/openai/test_client.py,sha256=bF0MFaTq_45ob4f8eZXF3Fn0aUMy848dBaQXiAiqIPg,1373
355
+ ai_review/tests/suites/services/llm/openrouter/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
356
+ ai_review/tests/suites/services/llm/openrouter/test_client.py,sha256=9YRwhkgeRDdRi_EMFh_T0u4wgEFj2AMgAiusrYWzeEc,813
333
357
  ai_review/tests/suites/services/prompt/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
334
358
  ai_review/tests/suites/services/prompt/test_adapter.py,sha256=3BhaGW4G-72dN_ajp5rJst39k1VNiKZq5FUB9LGPNVQ,2168
335
359
  ai_review/tests/suites/services/prompt/test_schema.py,sha256=rm2__LA2_4qQwSmNAZ_Wnpy11T3yYRkYUkRUrqxUQKE,5421
336
360
  ai_review/tests/suites/services/prompt/test_service.py,sha256=jfpmM--eZH43NylwltX-ijmF58ZJ4WA83kmGshUbJfs,8312
337
361
  ai_review/tests/suites/services/prompt/test_tools.py,sha256=SmweFvrpxd-3RO5v18vCl7zonEqFE1n4eqHH7-6auYM,4511
338
362
  ai_review/tests/suites/services/review/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
339
- ai_review/tests/suites/services/review/test_service.py,sha256=9XBywDoVTzLXlfqMmrxwJbPoj8QoGFW5wDwirqu2UHI,4206
363
+ ai_review/tests/suites/services/review/test_service.py,sha256=8LYlLk4sX6R86qS9kGRPO7EJcUlXr0L1JLczADpS-nE,4252
340
364
  ai_review/tests/suites/services/review/gateway/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
341
- ai_review/tests/suites/services/review/gateway/test_review_comment_gateway.py,sha256=eueGnKY3YcLvLQ8hSdhKQuVfOlFwxP82cwgEHKyRPiQ,8831
342
- ai_review/tests/suites/services/review/gateway/test_review_dry_run_comment_gateway.py,sha256=YGSCZRyyV9BJaKpI66viHYZdM-GtuODJt4ZzEW1-29g,3862
343
- ai_review/tests/suites/services/review/gateway/test_review_llm_gateway.py,sha256=m4HKvqDQYNesY5F2wuOMeHqXwQe99K4K_depdyTs37Q,2508
365
+ ai_review/tests/suites/services/review/gateway/test_review_comment_gateway.py,sha256=-EG6bWwFX46QKROYmIxPw0WLQsYkn0munTD2Wxykm6Q,8946
366
+ ai_review/tests/suites/services/review/gateway/test_review_dry_run_comment_gateway.py,sha256=UzRo41pI0vBcHcr7u2hi8zH2Msd25MXhxLWXodsaNLA,3977
367
+ ai_review/tests/suites/services/review/gateway/test_review_llm_gateway.py,sha256=Wy9nYO_YNlBNKC2w4TvXvPqtiRUSvRfyZ7cGS-LD7Y8,2554
344
368
  ai_review/tests/suites/services/review/internal/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
345
369
  ai_review/tests/suites/services/review/internal/inline/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
346
370
  ai_review/tests/suites/services/review/internal/inline/test_schema.py,sha256=2SGF8yNHsNv8lwG-MUlgO3RT4juTt0PQSl10qNhSt7o,2377
@@ -376,9 +400,9 @@ ai_review/tests/suites/services/vcs/github/test_client.py,sha256=mNt1bA6aVU3REsJ
376
400
  ai_review/tests/suites/services/vcs/gitlab/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
377
401
  ai_review/tests/suites/services/vcs/gitlab/test_adapter.py,sha256=BYBP2g1AKF_jCSJYJj16pW7M_6PprwD9reYEpdw3StU,4340
378
402
  ai_review/tests/suites/services/vcs/gitlab/test_client.py,sha256=dnI-YxYADmVF2GS9rp6-JPkcqsn4sN8Fjbe4MkeYMaE,8476
379
- xai_review-0.33.0.dist-info/licenses/LICENSE,sha256=p-v8m7Kmz4KKc7PcvsGiGEmCw9AiSXY4_ylOPy_u--Y,11343
380
- xai_review-0.33.0.dist-info/METADATA,sha256=olP2J_qC--KQKEyDvq1JNIUtqgd029Lli6fiI6zKAc0,12689
381
- xai_review-0.33.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
382
- xai_review-0.33.0.dist-info/entry_points.txt,sha256=JyC5URanMi5io5P_PXQf7H_I1OGIpk5cZQhaPQ0g4Zs,53
383
- xai_review-0.33.0.dist-info/top_level.txt,sha256=sTsZbfzLoqvRZKdKa-BcxWvjlHdrpbeJ6DrGY0EuR0E,10
384
- xai_review-0.33.0.dist-info/RECORD,,
403
+ xai_review-0.35.0.dist-info/licenses/LICENSE,sha256=p-v8m7Kmz4KKc7PcvsGiGEmCw9AiSXY4_ylOPy_u--Y,11343
404
+ xai_review-0.35.0.dist-info/METADATA,sha256=H0R3298LHIDUiCYLLhnMvKNy5WlmsO5nitbRhS68Yh8,12911
405
+ xai_review-0.35.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
406
+ xai_review-0.35.0.dist-info/entry_points.txt,sha256=JyC5URanMi5io5P_PXQf7H_I1OGIpk5cZQhaPQ0g4Zs,53
407
+ xai_review-0.35.0.dist-info/top_level.txt,sha256=sTsZbfzLoqvRZKdKa-BcxWvjlHdrpbeJ6DrGY0EuR0E,10
408
+ xai_review-0.35.0.dist-info/RECORD,,
@@ -1,8 +0,0 @@
1
- from typing import Protocol
2
-
3
- from ai_review.clients.openai.schema import OpenAIChatRequestSchema, OpenAIChatResponseSchema
4
-
5
-
6
- class OpenAIHTTPClientProtocol(Protocol):
7
- async def chat(self, request: OpenAIChatRequestSchema) -> OpenAIChatResponseSchema:
8
- ...
@@ -1,12 +0,0 @@
1
- import pytest
2
- from httpx import AsyncClient
3
-
4
- from ai_review.clients.openai.client import get_openai_http_client, OpenAIHTTPClient
5
-
6
-
7
- @pytest.mark.usefixtures('openai_http_client_config')
8
- def test_get_openai_http_client_builds_ok():
9
- openai_http_client = get_openai_http_client()
10
-
11
- assert isinstance(openai_http_client, OpenAIHTTPClient)
12
- assert isinstance(openai_http_client.client, AsyncClient)