From 0af5f19af972e4d7419f093d00b4d0407ead4f71 Mon Sep 17 00:00:00 2001 From: zhaoawd Date: Wed, 29 Oct 2025 00:38:57 +0800 Subject: [PATCH] init,llm gateway & import_analyse --- .gitignore | 3 + app/__init__.py | 3 + app/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 202 bytes app/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 181 bytes app/__pycache__/exceptions.cpython-311.pyc | Bin 0 -> 729 bytes app/__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 610 bytes app/__pycache__/main.cpython-311.pyc | Bin 0 -> 5294 bytes app/__pycache__/main.cpython-312.pyc | Bin 0 -> 4835 bytes app/__pycache__/models.cpython-311.pyc | Bin 0 -> 5392 bytes app/__pycache__/models.cpython-312.pyc | Bin 0 -> 4329 bytes app/exceptions.py | 6 + app/main.py | 103 ++++ app/models.py | 92 +++ app/providers/__init__.py | 17 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 643 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 522 bytes .../__pycache__/anthropic.cpython-311.pyc | Bin 0 -> 5182 bytes .../__pycache__/anthropic.cpython-312.pyc | Bin 0 -> 4682 bytes .../__pycache__/base.cpython-311.pyc | Bin 0 -> 3177 bytes .../__pycache__/base.cpython-312.pyc | Bin 0 -> 2603 bytes .../__pycache__/deepseek.cpython-311.pyc | Bin 0 -> 3875 bytes .../__pycache__/deepseek.cpython-312.pyc | Bin 0 -> 3487 bytes .../__pycache__/gemini.cpython-311.pyc | Bin 0 -> 5747 bytes .../__pycache__/gemini.cpython-312.pyc | Bin 0 -> 5032 bytes .../__pycache__/openai.cpython-311.pyc | Bin 0 -> 3857 bytes .../__pycache__/openai.cpython-312.pyc | Bin 0 -> 3471 bytes .../__pycache__/openrouter.cpython-311.pyc | Bin 0 -> 4629 bytes .../__pycache__/openrouter.cpython-312.pyc | Bin 0 -> 4169 bytes .../__pycache__/qwen.cpython-311.pyc | Bin 0 -> 4705 bytes .../__pycache__/qwen.cpython-312.pyc | Bin 0 -> 4075 bytes app/providers/anthropic.py | 97 ++++ app/providers/base.py | 44 ++ app/providers/deepseek.py | 66 +++ app/providers/gemini.py | 112 ++++ app/providers/openai.py | 66 +++ app/providers/openrouter.py | 77 +++ app/providers/qwen.py | 87 +++ app/services/__init__.py | 3 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 214 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 193 bytes .../__pycache__/gateway.cpython-311.pyc | Bin 0 -> 3057 bytes .../__pycache__/gateway.cpython-312.pyc | Bin 0 -> 2806 bytes .../import_analysis.cpython-311.pyc | Bin 0 -> 5099 bytes .../import_analysis.cpython-312.pyc | Bin 0 -> 4585 bytes app/services/gateway.py | 53 ++ app/services/import_analysis.py | 91 +++ demo/GE_result_desc_prompt.txt | 47 ++ demo/e-commerce-orders_desc.md | 127 +++++ demo/snippet.json | 523 ++++++++++++++++++ demo/snippet_alias_generator.json | 499 +++++++++++++++++ demo/snippet_alias_generator.txt | 52 ++ demo/snippet_generator.txt | 46 ++ demo/table-desc.json | 277 ++++++++++ demo/user-query.json | 102 ++++ file/全国品牌.xlsx | Bin 0 -> 15007 bytes ...史工作票-向家坝-机械类-2024.01.01-2025.06.30.xlsx | Bin 0 -> 315346 bytes ge_v1.py | 332 +++++++++++ ge_v2.py | 104 ++++ requirements.txt | 11 + .../deepseek_request.cpython-312.pyc | Bin 0 -> 4748 bytes scripts/deepseek_request.py | 110 ++++ todo.md | 19 + 62 files changed, 3169 insertions(+) create mode 100644 .gitignore create mode 100644 app/__init__.py create mode 100644 app/__pycache__/__init__.cpython-311.pyc create mode 100644 app/__pycache__/__init__.cpython-312.pyc create mode 100644 app/__pycache__/exceptions.cpython-311.pyc create mode 100644 app/__pycache__/exceptions.cpython-312.pyc create mode 100644 app/__pycache__/main.cpython-311.pyc create mode 100644 app/__pycache__/main.cpython-312.pyc create mode 100644 app/__pycache__/models.cpython-311.pyc create mode 100644 app/__pycache__/models.cpython-312.pyc create mode 100644 app/exceptions.py create mode 100644 app/main.py create mode 100644 app/models.py create mode 100644 app/providers/__init__.py create mode 100644 app/providers/__pycache__/__init__.cpython-311.pyc create mode 100644 app/providers/__pycache__/__init__.cpython-312.pyc create mode 100644 app/providers/__pycache__/anthropic.cpython-311.pyc create mode 100644 app/providers/__pycache__/anthropic.cpython-312.pyc create mode 100644 app/providers/__pycache__/base.cpython-311.pyc create mode 100644 app/providers/__pycache__/base.cpython-312.pyc create mode 100644 app/providers/__pycache__/deepseek.cpython-311.pyc create mode 100644 app/providers/__pycache__/deepseek.cpython-312.pyc create mode 100644 app/providers/__pycache__/gemini.cpython-311.pyc create mode 100644 app/providers/__pycache__/gemini.cpython-312.pyc create mode 100644 app/providers/__pycache__/openai.cpython-311.pyc create mode 100644 app/providers/__pycache__/openai.cpython-312.pyc create mode 100644 app/providers/__pycache__/openrouter.cpython-311.pyc create mode 100644 app/providers/__pycache__/openrouter.cpython-312.pyc create mode 100644 app/providers/__pycache__/qwen.cpython-311.pyc create mode 100644 app/providers/__pycache__/qwen.cpython-312.pyc create mode 100644 app/providers/anthropic.py create mode 100644 app/providers/base.py create mode 100644 app/providers/deepseek.py create mode 100644 app/providers/gemini.py create mode 100644 app/providers/openai.py create mode 100644 app/providers/openrouter.py create mode 100644 app/providers/qwen.py create mode 100644 app/services/__init__.py create mode 100644 app/services/__pycache__/__init__.cpython-311.pyc create mode 100644 app/services/__pycache__/__init__.cpython-312.pyc create mode 100644 app/services/__pycache__/gateway.cpython-311.pyc create mode 100644 app/services/__pycache__/gateway.cpython-312.pyc create mode 100644 app/services/__pycache__/import_analysis.cpython-311.pyc create mode 100644 app/services/__pycache__/import_analysis.cpython-312.pyc create mode 100644 app/services/gateway.py create mode 100644 app/services/import_analysis.py create mode 100644 demo/GE_result_desc_prompt.txt create mode 100644 demo/e-commerce-orders_desc.md create mode 100644 demo/snippet.json create mode 100644 demo/snippet_alias_generator.json create mode 100644 demo/snippet_alias_generator.txt create mode 100644 demo/snippet_generator.txt create mode 100644 demo/table-desc.json create mode 100644 demo/user-query.json create mode 100644 file/全国品牌.xlsx create mode 100644 file/长江电力CYPC概览历史工作票-向家坝-机械类-2024.01.01-2025.06.30.xlsx create mode 100644 ge_v1.py create mode 100644 ge_v2.py create mode 100644 requirements.txt create mode 100644 scripts/__pycache__/deepseek_request.cpython-312.pyc create mode 100644 scripts/deepseek_request.py create mode 100644 todo.md diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..afedc66 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +.venv +gx/uncommitted/ +.vscode/ \ No newline at end of file diff --git a/app/__init__.py b/app/__init__.py new file mode 100644 index 0000000..813f14c --- /dev/null +++ b/app/__init__.py @@ -0,0 +1,3 @@ +from .main import create_app + +__all__ = ["create_app"] diff --git a/app/__pycache__/__init__.cpython-311.pyc b/app/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..976aa34e6ed18499be3aa89e736a7eb9f7a6833b GIT binary patch literal 202 zcmZ3^%ge<81U0W2GR=YXV-N=hn4pZ$5a44*;f{^AF! z(~pnO%*!l^kJl@x{Ka9Do1apelWJGQ36uvJTC4;lJ}@&fGTva2xqyluaEo{7HL!zV I5j#*B0C(6ft^fc4 literal 0 HcmV?d00001 diff --git a/app/__pycache__/__init__.cpython-312.pyc b/app/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2ae729e26a688c06aa77cb81a0daf855dbdf4717 GIT binary patch literal 181 zcmX@j%ge<81U0W2GR=YXV-N=hn4pZ$VnD`ph7^Vr#vF!R#wbQch7_iB#weyrW=)ot zj6g|E##>y;MX8A;squ*g1x3t2AwNy#TP(SWnR#H|E%x~M#GIV?_>~NwL8kuV2ddML zkI&4@EQycTE2#X%VUwGmQks)$SHuaF2N_z-4(_6axSR CzbM-P literal 0 HcmV?d00001 diff --git a/app/__pycache__/exceptions.cpython-311.pyc b/app/__pycache__/exceptions.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b9d2a6ff38848dfaf31a2edbd8277551a0271b90 GIT binary patch literal 729 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 KUE=Y>w)sEUoV#iO literal 0 HcmV?d00001 diff --git a/app/__pycache__/main.cpython-312.pyc b/app/__pycache__/main.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..649383eed1633516114b3a2655893bbec1d442ac GIT binary patch literal 4835 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 MmHsDOGsQFXZ{k`^Z2$lO literal 0 HcmV?d00001 diff --git a/app/exceptions.py b/app/exceptions.py new file mode 100644 index 0000000..5ea8ff0 --- /dev/null +++ b/app/exceptions.py @@ -0,0 +1,6 @@ +class ProviderConfigurationError(RuntimeError): + """Raised when a provider is missing required configuration.""" + + +class ProviderAPICallError(RuntimeError): + """Raised when the upstream provider responds with an error.""" diff --git a/app/main.py b/app/main.py new file mode 100644 index 0000000..c261879 --- /dev/null +++ b/app/main.py @@ -0,0 +1,103 @@ +from __future__ import annotations + +from contextlib import asynccontextmanager + +import httpx +from fastapi import Depends, FastAPI, HTTPException, Request + +from app.exceptions import ProviderAPICallError, ProviderConfigurationError +from app.models import ( + DataImportAnalysisRequest, + DataImportAnalysisResponse, + LLMRequest, + LLMResponse, +) +from app.services import LLMGateway +from app.services.import_analysis import build_import_messages, resolve_provider_from_model + + +@asynccontextmanager +async def lifespan(app: FastAPI): + client = httpx.AsyncClient(timeout=httpx.Timeout(30.0)) + gateway = LLMGateway() + try: + app.state.http_client = client # type: ignore[attr-defined] + app.state.gateway = gateway # type: ignore[attr-defined] + yield + finally: + await client.aclose() + + +def create_app() -> FastAPI: + application = FastAPI( + title="Unified LLM Gateway", + version="0.1.0", + lifespan=lifespan, + ) + + @application.post( + "/v1/chat/completions", + response_model=LLMResponse, + summary="Dispatch chat completion to upstream provider", + ) + async def create_chat_completion( + payload: LLMRequest, + gateway: LLMGateway = Depends(get_gateway), + client: httpx.AsyncClient = Depends(get_http_client), + ) -> LLMResponse: + try: + return await gateway.chat(payload, client) + except ProviderConfigurationError as exc: + raise HTTPException(status_code=422, detail=str(exc)) from exc + except ProviderAPICallError as exc: + raise HTTPException(status_code=502, detail=str(exc)) from exc + + @application.post( + "/v1/import/analyze", + response_model=DataImportAnalysisResponse, + summary="Analyze import sample data via configured LLM", + ) + async def analyze_import_data( + payload: DataImportAnalysisRequest, + gateway: LLMGateway = Depends(get_gateway), + client: httpx.AsyncClient = Depends(get_http_client), + ) -> DataImportAnalysisResponse: + try: + provider, model_name = resolve_provider_from_model(payload.llm_model) + except ValueError as exc: + raise HTTPException(status_code=422, detail=str(exc)) from exc + + messages = build_import_messages(payload) + + llm_request = LLMRequest( + provider=provider, + model=model_name, + messages=messages, + temperature=payload.temperature if payload.temperature is not None else 0.2, + max_tokens=payload.max_tokens, + ) + + try: + llm_response = await gateway.chat(llm_request, client) + except ProviderConfigurationError as exc: + raise HTTPException(status_code=422, detail=str(exc)) from exc + except ProviderAPICallError as exc: + raise HTTPException(status_code=502, detail=str(exc)) from exc + + return DataImportAnalysisResponse( + import_record_id=payload.import_record_id, + llm_response=llm_response, + ) + + return application + + +async def get_gateway(request: Request) -> LLMGateway: + return request.app.state.gateway # type: ignore[return-value, attr-defined] + + +async def get_http_client(request: Request) -> httpx.AsyncClient: + return request.app.state.http_client # type: ignore[return-value, attr-defined] + + +app = create_app() diff --git a/app/models.py b/app/models.py new file mode 100644 index 0000000..401df11 --- /dev/null +++ b/app/models.py @@ -0,0 +1,92 @@ +from __future__ import annotations + +from enum import Enum +from typing import Any, List, Optional + +from pydantic import BaseModel, Field + + +class LLMRole(str, Enum): + USER = "user" + ASSISTANT = "assistant" + SYSTEM = "system" + + +class LLMMessage(BaseModel): + role: LLMRole = Field(..., description="Message author role.") + content: str = Field(..., description="Plain text content of the message.") + + +class LLMProvider(str, Enum): + OPENAI = "openai" + ANTHROPIC = "anthropic" + OPENROUTER = "openrouter" + GEMINI = "gemini" + QWEN = "qwen" + DEEPSEEK = "deepseek" + + +class LLMRequest(BaseModel): + provider: LLMProvider = Field(..., description="Target LLM provider identifier.") + model: str = Field(..., description="Model name understood by the provider.") + messages: List[LLMMessage] = Field(..., description="Ordered chat messages.") + temperature: Optional[float] = Field( + 0.7, description="Sampling temperature when supported." + ) + top_p: Optional[float] = Field( + None, description="Top-p nucleus sampling when supported." + ) + max_tokens: Optional[int] = Field( + None, description="Maximum tokens to generate when supported." + ) + stream: Optional[bool] = Field( + False, description="Enable provider streaming if both sides support it." + ) + extra_params: Optional[dict[str, Any]] = Field( + None, description="Provider-specific parameters to merge into the payload." + ) + + +class LLMChoice(BaseModel): + index: int + message: LLMMessage + + +class LLMResponse(BaseModel): + provider: LLMProvider + model: str + choices: List[LLMChoice] + raw: Optional[dict[str, Any]] = Field( + None, description="Raw provider response for debugging." + ) + + +class DataImportAnalysisRequest(BaseModel): + import_record_id: str = Field(..., description="Unique identifier for this import run.") + example_data: str = Field( + ..., + max_length=30_000, + description="Sample rows from the import payload. Limited to 30k characters.", + ) + table_headers: List[str] = Field( + ..., + min_length=1, + description="Ordered list of table headers associated with the data.", + ) + llm_model: str = Field( + ..., + description="Model identifier. Accepts 'provider:model' format or plain model name.", + ) + temperature: Optional[float] = Field( + None, + description="Optional override for LLM temperature when generating recognition output.", + ) + max_tokens: Optional[int] = Field( + None, + description="Optional override for maximum tokens generated during recognition.", + ) + + +class DataImportAnalysisResponse(BaseModel): + import_record_id: str + llm_response: LLMResponse diff --git a/app/providers/__init__.py b/app/providers/__init__.py new file mode 100644 index 0000000..c5cf057 --- /dev/null +++ b/app/providers/__init__.py @@ -0,0 +1,17 @@ +from .anthropic import AnthropicProvider +from .base import LLMProviderClient +from .deepseek import DeepSeekProvider +from .gemini import GeminiProvider +from .openai import OpenAIProvider +from .openrouter import OpenRouterProvider +from .qwen import QwenProvider + +__all__ = [ + "LLMProviderClient", + "OpenAIProvider", + "AnthropicProvider", + "OpenRouterProvider", + "GeminiProvider", + "QwenProvider", + "DeepSeekProvider", +] diff --git a/app/providers/__pycache__/__init__.cpython-311.pyc b/app/providers/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4c12767398868e37d69d80ef584e08cf81ab09ce GIT binary patch literal 643 zcmZutyH3L}6uoZJyxQ^<0}BI4h%(S0Ku8rx2&p`~Wrx6AJsFARbj?O)~@jdo?tL1=L&p!};B7iShl&dxqlYtN~5I}$kP~;*c zb&b@h=4wi7M5lGPuCz`JYPzP z0%#+?+>Npu7AN8L1&i;)05fU!dZ%T1NJ1QC!dyDSIO$`2TYeGV!ZD^{6wW*6368oa zbIyu%uHsRK*__+Fe8ACPZ8BZNVWuQak|oKIWJ{_GI%_X-+b`3qHm(o+6sv!^6^MAL zh^LylF;vOa8Qh3P1V2>gb4M0TdI?3!|(vIhe z%VwUpmpo3beHsTNf)Ci5=#;OSz6u&^2%!RY@+u10%Bv_~JFlXE&Af{LoZTEMC}1P6 SVys(@+89cDGUaBgBHS+(#jryF literal 0 HcmV?d00001 diff --git a/app/providers/__pycache__/__init__.cpython-312.pyc b/app/providers/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4ba65f451dab41d42a48bfac7423110f64ef03c8 GIT binary patch literal 522 zcmYjNyH3L}6uoZVX;WTeU_k;TL>cH0AfyT;gjC*J788h7BJ3nMDX1eeAHdGW7w{4M zfu&4Lhy~HD6Smc$URg)y9$(*kd_RJ~2N}=bkh~*+PnFcsn3D08Brgy{j3_V^BBXeO zHkc6_nj6$)R%mH%QkyxUqq#+0=7pZ-HuYIEY-;Y%77M}v!2n|S6@~4Q*YUsPeCQyt z&`Zl(p5@8S8P6V)m~bWb`^R;^7)Dkrg3@=A*d85&J(~o}6S}U=-5|X9UK~_a z>h;|-=iYnHeVlt<*T3`mJP694{)G~L5uv}+hE;eIVOBl|Mn9W$MO`q?C54nb>NfiLq$lN#dQ)OlO!=a|lt1cE1)_meFd8(* zoynS1C>mmr106-O>jshqC3K%f=pp>f60MclGbrNzCv8R;;+4|rj3#M`Oj?a_gguzP zM!1ngTqE3xgsKsKVkVnZ#(=VJ9A~a1WCb4_KRzralZP?R;E0pBPnXS})5^y)3d~3cPAh5_7F39fHZn;C=C9enFq}*%X)V6CXXCSW0%m0z znzxaHqKu594uzfOEVAh}Nh1_>$_z-)5fx-M>Xz$d&kZi>QM_`!?7zX?2Zo0h6N-w^ z-ynxJ_50*nkkl4Zb1;^!21nsisR8#|Trwx~i)`NMMma};igr^0YAQ;j4*#bv_1H@DfD^e<^&SbM0 ztSK@a#poe5G1wXGQj1wqz)i3g@ud_zrNpw*wPZ$;%}s2jJ9&eGW=bL|vl^Cw1WPHE zxZw0LI6YZEeQfRYgv(~Y4GR|}Rf)~uBne_E0qDgHhK+%QRl*xCh`5hUOpF_D9#a#= zRJVygc3~!wl&uXKJ_%FXBW~L%5_U?_Fg4?dmvE|*yojl8;yOy^Gp{WMqDo~o;)`FB z){jeE))}``S^-;uf>mbYgp(yr!aHC@r7MQl%j#B8f*woyYL9*A-C2ldbcwkJ`&P%- zE~%ULQ~9c2gERaG{9Q*CCvy9q32jS4TjAWjpB06@C1I~F>|O5YeAe;aQpbBwrb@j#EXUZQge)zZ`0K7HV4xwJkS=7hB5Bk@B|o(zafG+kwX;o(cj0^dje;V9G76chBEB|Df(s%ae0|n_4(uY&lzMIje7Zway&U0ldi1wvWdqFOSI!mF>dDrv6*5~!%QvGfiyS?kHT?_jQNAI01hWbmP z{^#}E3LiXn>GcPS^#@Az2lTqP%fY&en-6+kAOJ5Zs36|$QK{Aa#l3%+LEkfh;a%+a z!P?IaKl1YgEU(?4=Kb+Gty43b{LtS@$47%C>+WBp#yEeZ=X3~u8fB@`x%{rV+cWbXDbBm5C1_I+NAqQ4Xxyj&8P|{Zb?<)2EgtJr-3V?UX^-Rd*V6Jtu6WHW(hbi};0f09UP;2|VSnleX z7nf__s35@&CJbPHxEu)Goc(71;?Pncq6Z@7VDqzJ>r$|_Fnn*c80;+td-Y&%IoP<| z5?=i2AGSPdUTPW8TLy0JyS4AhyYnMuvGJL>eM#J2ZfbdayGQsP z0IPnQ%&+S^rYTdE%2O3FRDKDN*XNHis9SYJ&oi&fHDz`Ry+Z4dxf_s=ji6WZ7FOm9 z8x0WlU>4a4^z5tj)ykOXG}|!1w3r-8W3vm zIW&1B&uAO=lw&rUdiDIc2Mpadeskw0lu`9wWyUn!?|NU$u}Q+ea@;%$CtxvENyCx| zw1_96CeqZ_;K{{NcZT1Baj-Z?cQ4^DBs1~LD&12!Y-s+fXD|t-2``cC(A?f1F@UOo z-aQEXQc@iP#Ns*+lc^MdMIf$$#-KH@9ISsHXj*9hZCx?2vlQ3~AqqyEXiwjFZ~y-7 z$7hS3gQd>Fr_QC$BYNkN3XgoDFOPq5{MN;V3q^59N!+n)48RyZ1@q&h0IKeXo&!$D ztkC4cdf`k8pnJ@B@UDOyodFl-mJ!H_8T%HbfX@OYBstVWY?Oj~a7sxlvspYe_tyU) z1dHkCFsn*^h?ytoEr*~Mv?mkrS&+@6bP3aI%-c*8UewIu#Eml!ke zjd-Z{q-mU{8rrH-4LAIl>BeZ9JqMxdl_zO;by{`~sMJpYTt~}++An9nm|budyv4wt zQeY1R>ZX>vjdvOgkq4)XO}(Y2-g$q;VP9!eM}>#R3wp^fDVX-Vlj9z%p@r;#$q4ONJ(?V$VPELa1#EC zl$-%0p#$)*4l^f?Dd{V?i%#500ewmmk!HS$cuLVOWn?2%U@B-FrNGckBZkz_CI$3J z>J0$b?Z2|Oq2vvhygRRtltb;;N6UeI*N>GO+jOqJ!tLV0XsW>kgPfs?qlWLSAPc-; zq3^~=X75g8+|BQ+APd;zR);ZUZjf#(Qb)ydafUvVVlhlJ5aNU|oJdb$4jPy$6Q({7 z(@Y2V03d#dx!sUnD_P^eKt`@lJhanzk*P)^Zz!%QS^A_l(|#j#hbX0;d3V!i1rAUW zLs-=UTone*I~&56frL6)_1^#>qhy#edQ-2i%P6A%x4MkP>&D+Q>d~uf#o=Nc74-iD gLB#awsCQ$nIL8R literal 0 HcmV?d00001 diff --git a/app/providers/__pycache__/anthropic.cpython-312.pyc b/app/providers/__pycache__/anthropic.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5f150c09dd5881d037318142d99ec3d2b446450f GIT binary patch literal 4682 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 literal 0 HcmV?d00001 diff --git a/app/providers/__pycache__/base.cpython-311.pyc b/app/providers/__pycache__/base.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..649358fd0f36d5ad66729c778980735a9c65615c GIT binary patch literal 3177 zcmbVO-EZ7P5Z|?ZzU030LBB{#;{;GRsT`Do1XWroO-pI>!AC)egJ3!KrZx51?%G$H z(^Wc39x8-HB_2`)NCBZjDWZMspTOf)iqOdtQYBtMyj&HY^2E&Az2=%0B<%HgXLffy z^V``Of1l512wcm55&PE^A-^MY_W~X-y5<61CKj=%Ln^dPDfT5ts>o%zqLdZE%TB7I zmQ~SLoOC%2b5c%ErMKKGWU7;?WXst~uAHMpB1egpULsZxlds5xT!SaR%6UsUL5jV9 zB3qw#E3Q=PuYM zt6VHR!nwy`ab|jY<_&hH%7QS;ihkgOT4pBS7O%t-x>f^rnJ`kO7AZ?_f%j$El9*!2 z<1k_=<&>2IP8D3btb#9!)hoE2R(44#r&*7+%Nkr#uE6|jLOGIhFUweuS=%?sv(|2F z2-f8U0>jY&nAq{hv6&mzUOHq1OfwxL2($%{YkuPH(}B-Sd%-p}^OO;4rdRPDhM2)z zTo{xh86b-k*Ql`B^$hg2x;E>%3;_0R{WM$DnS1u-NSXIMC+Z8TzVGoc&|xAoDp5L_ zWJ(=32uVX9(4uP}KxdiM3BKctkJf3Rg`HgmyeN!!R(}ccvvEG~^4F;=6mWtkzAn%@ z^{J)QiQds;5r~ZxIB*viZLBsjrg7L*o3lUzA8hWq6>wQQYjE3`cNk2O#!3+>D!dOg zb2OXhkqiQXuuuZ#EC?n*12t`ZtKs|4+{HF{W*$H<`HNAHuG_91>UwQx)7F&kjy(b@ zf;WIPNGsd7n%&tZa&KYfsCfN0xTn=Wclph)-f8yFLHlLP>anB?+#OkZr0_QZ(k4>A z&{oNg;Y;UNMlUL#<}Sj$23kp!MsFd6c@J`Gyus@Or^3)bSDFYGU2{_Gd8Bd{R=LZ2 zVV>E65Ez8`W864A`%}Qe;idqrR2x2Wj+xbvX~yP2G90HgdzBPrz73Y~AtXD21gKim zG`=0)k%9qO+qM}Wl;fHJKl%sU4RP~F#VUk&yGW(mS^1^Sz>?!$PPbo1w>I^}!o(n==`H)^mX&`Vb~iaPynJ@@PF z4sA;665uV@UYTM1B7&j`x9?d@KdfawTisK7W z?m#e<%#HRcU=)NQUE2+vWnu#sbD8%bw$D@WPx?7sr*-Lb>C@~9a+S{VVVHGQj-=AF z5j`Ezvt1jyo*75@F{2!;?c2Pq6?8yP>@JNvo@qG2!P31&kAwCAKhYq~fr+?%@%-hz zmyH{HZydNZa_RLO2k;hw@PFOlWAFjt2!9H{w=pF79+3Pm)1O3DiRnXAP0_wNyfU$J z=H}}+=g@_lb9f8WA(5o)kX3?6t@@S`GB_wBXcYnwsRAdf%djZl1zv6VKhV|CoVS5A z2&9I=LlnSVdH(zT-|qir{JU{rZVgPV4oqBBTiO0Lp}jM-l^gtQ=98J&@*j>|pZam? z>da5b-x``)1)7^)%}qCR)2+U(7xVE^?2l8vo@5zjMGDr52Oqa-um&65u-kQ}5;Tq7-MQ z=Rlfd@;E1LXKqmCEGcGsqK{d%;%3AjGF3#?aZrp|JxS?@SD$$CURFOIXZ7RFer)%r zav5rXn0t>TQ6mZuFM#Tz8YflE>msxAUD$gJ3FdGZ7XdYj0*osD1QIchGAMB9I`8jD z_n|b8bqnjhu16VN2kfd2_H(*^rfN9JNLtq|&jfLwu5b9|()GA#3Z!?SVobGM0}|x| z{4X=(pD?}`!B?H+ARHI>o0 z-BLzdyG9zXHkFaM-BL!{N-Fhan{<-`QMa@uIaLC96LLoe+0y&5G(*(Ewvh#R4L@P=&Gz2y)Cak!;MHT!EfICQ`#iA3~I?IF=Gc8U9y& zzr@a&OeFL`L~N8nAqKJ&h)OQDI0ma5!1bQ-c+U>!D0sONb9{>OV literal 0 HcmV?d00001 diff --git a/app/providers/__pycache__/base.cpython-312.pyc b/app/providers/__pycache__/base.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..df5c088dcc3279b06fccaca450899a3fb8abe845 GIT binary patch literal 2603 zcmb^zTWl0n^xk=G_t}R$q(zxlw5;M1;v+!NWO*o9T3`6V2$@W0Zt39c&T#K6bT`|i zA|{wTpZ=NnQ^43V(MUp!8h;vB6XDBqW_K&4nE2t{?78Qhd(OT0 zJnwvy&87&9)4vh-JC%^@NVEsgIA~)G;A!FzhkB$$4N4K0JgFoba!E0in3g@Yq#0U_ zD_+7#fQ;&Ol#)g==4oE4ls3|(jFF*4B2N=1ahy0EOui_`#}Ff1Rr1MSk;v01ZI#P@ zXoap{7I`U>i`%wGIcrpe+_J+G3&(v2q~v0`Is$X=bKF1TI*f1k%VX}r3Xc_ca_)0b zPVLz<`~o{%VIqvuF)jkwmf6jNo3M2Y+L!?PG-1S`4l$&cz-mKwB&Im>R#W3 zw3td58rYyX$(YJHspE=~U>!;F&(G;}(#MsHt+R|IOF3Om<`z!c>2|W9mjU~GqHeh0 zf;FDY%3*EuHcK$w_ADXvF`w%}%h-oSz-)KSwRL;k3U%8r1s+3>fh;PDLL`I3BBgAV z*vQQk;Cfvj@yiU{8@T2xtZK6Ik*6YM)c3upQ&fV$=bLYTX&91pL88v~diO z)1*!gA@{by*VU!!LB#=@k=EA;J zl2^f=wwv_9TK}NVA;KAnk3f8Voyu4nc1-gEoT?3*5%8Qk^tvf17HF74hov&)z<_Rn-3XvorCxp^XG zbMqRxd(AtO=Lb$GZ)F;=6R{Uu00iFgH4I4xkRd`LELHl6e3a&;+M1mc%&vq?x0dFH z<#~mXk4awUD?l+ypyRMKv{u&O8M?0XmAI;4YSmUOH52*0AR#mWzmUIPB{u|y`k189 zMVZq9OxTh(B0%EIX+;;vh0!jL9pt2RQnqE6*wTSCA^X9|Noi89%Tx5tWL>Ju?@DiG z6*8&BT*@D>D~IsHw~abI^godK37FA8Bm{?SEvp4N5^Gk%aQl&2n8 zRnNB^{iqv`>wbWhX?Z%EfF1^G+$xFnx_hwfbGLjjE=x#P4?=tj zUWFQkkH^9ULnj0Wd|bru)wCm|eT+^4d+ew~*a4UC-RoG-PuB=9zRKUj=$_Q*38Ehq%U9 zBaZdR?*UNj9uLD{qEHmovb{ZiF(Qq#u)@nc*;E*S>1NJx?eJx=b-fPH?E!ut>Mmc* zY`rV|Az0(7;(KJ8QOY#I!4(hjjAC{(}hm5TGyOsBq{hBnH?t#W;Z1$yH_h zwN&=C-E;R2Obwmty`l`vt?r+C_SD`hN`FI9)%)jjL|Zm5$!cM4W&ga4^Fv$X`C4+> z?<&v@xh*lDB3jSylB%viUe7#Yf8-Q3*SrLtpU~K*6#me3nwysYBrwG{{~L=_kJJDF literal 0 HcmV?d00001 diff --git a/app/providers/__pycache__/deepseek.cpython-311.pyc b/app/providers/__pycache__/deepseek.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c2fa3eff7eb9637806b96761dd015d21a0b5c971 GIT binary patch literal 3875 zcma)9Yiv`=6`t#Ref^G&W9Lc0Kmu{KBrMCLO(88LDFFgS2?BAmaCO&rNF1&oJNE{X z)ZUG{sER72s#T>>$_lGOEGp{a>cv@Qgjb&cvx;=23kFIFiXbrFVK`Ev zBBmroN;wrL?-LDKkwGRIu9RDG^FF8HNqH4-%BT2Je#M^(D1lUq(!yo35ln@YkboTM z1kznMk?zK!2O>g`;9D)q7G0b|anHY5GcHh{mQH6Z%}Qp{W?ZD=vGgL9Mw1DPN)t)b zItwb1b0l*;sbg~N+{qEmFvbYUkhqh2CMM2|%x01aOufLK!KSIrVCnJz5IBg|rd*na09Sg4}p}C4MQUo0-4lK?|b+x&gMG*ok35rX1 zC~jR;JbFm?-jozC_UT*nmYdQ881Se*2q}I&2o?y_&?v^)DU7c*b{iTU8#^~OHg;Nt zqpGLJE}dU`Z`QK1=Fs4vmQ4=mFu;TX1Bpy(@cR3MiCN7W1U_qEZb0fH)w2>GEJx)8 zKi2vdHpjxiF>^7UsGgL{1Y7eYP5hvjXj~37Jn;PtA>q|;9SEI90vtVu3edT^h352jv_E9yoPr{TD_sQ}U7%bJAnE*_}Uw(D|8o z0j-L^kn+x)v%n0xsWhKUKP6SUDc8X)`w!$mEc%xl5K3e5_Q+j#XAUd5h@bxM!b!-!|q_uYIT3AIiJmD zh=p~sizx+Cn9N``t1TKCO|On-0YPGn>|lf$j{5O}MKsVOTFRs@07&&3hU}5e0NA@f z(oC$*6N83`mIU@{hQNAYE0a1o9#YTv`Sa&^G9e64NFSTDMg3?#Y3OS0FjSnu7Dq|K z@PWGP2p#uO$;8H0!a|9#xS_84j(2lSQcE>d#0v>3>6)c+BbW?=V)a70nX<&(WGPxV zZapDz?_qPBIdJ)J;j@e?GV%nTxqH{#y@iYSuaw*e%I*V2_kkDTwrAnqwQ%o?&e+`^ zoBPz$_VN!-f*+N(o+@uWWpCeI-oD@F;%$B9ZTsx59d`#R0au`@cz>561CGxV*6`wIFOvwxUv=R*j>bWAwf{H$w+|Oi+&@za?=Oe<+mUWN6sdTeA@55Bgp|rope@i@{6g^5yj) z?`^zPE;nHpODzC?!mDApUWQ$OTWAzrUd=loA%Spn(S>I4%?e4B7p(?_B9s#gn}32A9=H!?54CPSm^-q+EA%PxJW& zbnA9bU@ywE)Kx=9Dv^wVsYf$SxDqXG0X9`pjiR`N{1~=Jjsv02WLn1y&^5}segq`$ zBnKGJ_D5xaOPtmTdr?r)z-f?j7;`d=u;6`FeSP|C>#97)*)%45xbP6?@l8H}=F;{} z;oXci-)93^ep*H^cI;Yl+HE}*Bzr!DpkQ?6CwBLadqa1I3dvIUzH;}zV)vmZ$5$qv zx5ez}j%U%nwP;`A>ceZL=ukO2WOwvF>*!zW=zrMxe7rb$so1HMI+Zd||8&_uUF6jc zMppc!2ex`PE>{tdxiW`A(#p69BkU~{m$=Eukw))P)*GO1RZVLttg6(js*u^{4aWOb z_2YTXs7g5Gl7pa6o!2#E9#e@4;6FnZ>Q$V+PJ^}VVb-z<8DuN{kPY%PyiX=l7!sV$ z?|`&3A=`NMUV@Bcgl*MK09kH)Y+qa1x4rD^TOPH;z00TVwyx!$+QFmC;}xmb39!&i zCIlphD-Mq{T0wR4QiQ&nAHLOFU7xKAe*)m}SLay*S5?A-n99~-HkqCw5;O>NBO){M zK9jY8Lk>VT!CC&?=V^<2StoxQnA}sj?^aF6FNGbAhM7`5A)5m%Ig$XIms_COD(mhe z)%zGG7eR$Rw#=`90OSgSjdm8B>x<^*CaHg!e_o)$Vso|8Wbyy2HriKgt`+%^0EXU7 QitYU`S@-MzA>)SsFCf;h-~a#s literal 0 HcmV?d00001 diff --git a/app/providers/__pycache__/deepseek.cpython-312.pyc b/app/providers/__pycache__/deepseek.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..01adbded0751155e8402245eb457ba7c95353a53 GIT binary patch literal 3487 zcmZ`*TWnOv8J@G}vUht~c6|fmHF&|>f=waimWyKWmWvIcHVR^0I6B!g*t?vwyP0#0 zFWD_lf+|NsLU}1zp|W`b1XXydBDD{s5mKbScw^|UMnpwQs;278f~nNdKJ=fnd(6dV zjx^_=|2F^pGxPoP7r)hnV>>%Drr)oKV_IlKqYjP zWY4BlOnQzU+^1+-oRBPuiPYWSe|X>y$H^c<1wPNG zy~}Ow^nB{L5E4Ka^tiNdxgK!qR^$d&xz?T`z0Rhd{W}l|6`W?f%~7SilkJ5aect(zLq!GW zubpGu7#inKpfT?E{1_MW9EnL()Uztqs7tSche5q2)^nIB<|x5bG_yH5M?JbSE}Pji zIAc)BFbP)lN#|ay5KJPI0VS8yQb`NJy3{w8qC}Xik z+6d7>%yKn8*%-~`vc$wHVds$gbxek_oKq&WtfE$}S2KafN`S16>N&zrH3_q>fr)&0 z+$0Lv5Jfkr6M#lOg8`j$SpZYldy0YOQKHcRQBpvj&Jvg#@@7zxVbeHuA2@dGs0G%< z$(%Mbr*-msqbW_5YYU_NFg6Lh%!ENGb=gQ4^H9OS+G*;nC51{!3#2Kp8^hFTucXDY zA~jg2JRVO{K~+q}N{+#tMwZ&sX4tH5JBLR15^m;TSqwBM!}ea-*xSX}Ec?bg0DM27 z|4gBZgxvm;tE1@Zm^*&$)YVh>T(3P0Hk5)L#bC$7=E!X8Olx`f+ojzHi@Oj0b?u?s z8!ivdo|-vzzjezuYY&y%HkR7972CFzYntn#rFC12>$a9#+Go3Fx*qwR{<=y4`9mdN zr09z*uJ)|ygM?5|7{>^qy~1#f2iBvxS+$XXmDcG7CCd3`XbFYa>@ju1|ci zeqrOA3&FRho!{5DJP1ch;aD*o1GP(?pLSl}Ik*4X;j4!ig4@cWHRV9)iCYYKDoAvD zetg`GTKl-lI@ENW`|_NRjcE> z_`4nT@$LNG?INRh@gPk;U&L4;0T|^LCE#8{!>GXJQ7<|<0foi^@cg_ksIsPVHfW4< z27pisN|FgasttAsrP+R>Rb-7zRAEl#B^jQ$;C?Vh*wsCLp_^qhczf z;&EWT&R9F3i;0BQ1H$5<65J@9Q3C1u-Z5V-FZ~@Hk7<=MQ>Zl z8!dXHQ@!P2$5darp=Iiwa{ZfA2P#5`=qWe0S9tdS=^NJnp*yrF!no4UAu0IS;TFS- zJW!7qRh^Jc6AQAXo*rd&Se6O9g;X*pa;eNPVJ`*3P7h(P3bK*O>fju90r=yb_2RWE z4)rjmRp1QkfLceknkZ|-*ji|iDJ|86E>_owpZT?x+{dV;G(2^^QO*8azC@{{zqdGMoSa literal 0 HcmV?d00001 diff --git a/app/providers/__pycache__/gemini.cpython-311.pyc b/app/providers/__pycache__/gemini.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..efc75078dea59c65822439afa9f2450d725cccd6 GIT binary patch literal 5747 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 BsGR@+ literal 0 HcmV?d00001 diff --git a/app/providers/__pycache__/openai.cpython-311.pyc b/app/providers/__pycache__/openai.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..477cc5716e393dcba815d6455304aa647c860214 GIT binary patch literal 3857 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 literal 0 HcmV?d00001 diff --git a/app/providers/__pycache__/openrouter.cpython-312.pyc b/app/providers/__pycache__/openrouter.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..676630675d1483153059d7c5fb2ad4662e425fc0 GIT binary patch literal 4169 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 E7r32pQvd(} literal 0 HcmV?d00001 diff --git a/app/providers/__pycache__/qwen.cpython-312.pyc b/app/providers/__pycache__/qwen.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..638d5421c91df53d0218c307472b1ba0eb74cb2c GIT binary patch literal 4075 zcmai1Yit|G5#HlHNFI-RP}IYw6i_eAv|=i$>ljg7$F?jdjT}XOG>+*ihYRmS9nF{b zj(YXjxQS6PfC0xSP{&9L%fGC^F5;i+za~us1N|dLO35x9)Id_SMgGv13p8neboNL} zb|j-mU^zE4J3BMG`_0^+yj~H(Q~Cz!F%Lpt(U;o8R|sZx3W&={MJkg(NhZQDly)Q> zNjAbJxd@l!BfQOH6GB7)8JBP-T@jbf;}h%`lXhMm#{*X4ryb+S#mT zn6}`UW@KO`4a_z^q&Jk%wUimHI9M60-ZHBb@O~L-D8i^H;?UT*>tVGD9k;XnC?7J$ zM4YN4;&P+)pDL*Ac`oACMAfNs=eZlzNfFO1A94}t=(Ltv^Ikf7a(GmRu;r2AQ*)z} zrkODY2L@Edm^7m4j22cB`fN58HNw$!azM%G15-~A7#f~}oEQU&9*Yi`+Kjm~rlmA& z=XhY9j8-GG9dN?ILm*Xw|9CN{KaTfn8 z#|1Bka;(i|;?nmmA*52z>NfJhwh(p1sAV5m6)Yj%xKXR-$tA}HKL@%wL1$DB;&oaq z<}KE8s=OTsiZ^YXZ8>3W|3?0eYVLDRRe=3z*{Jb8`i%olmJ3#bb7wi?TQ=&z%&nVn zotEpSyLL<81}yj)oP}Srm)T$PJj%H(cf4cctXiC~^X_=>?t(O{Fa?&Lf+Ak zgLq6WnW5J)i#5WV>5QBqjY(xjPG`+b)|Ack87*ZHSF(a<22A0TX;n)QUQdAn5i<%_ zlA5VuW6pU{Q?Q1Ea}7!+lhC7;OCC4UDVXLxkToaMSf8`GbJ9>cWdh9YJTaTmK+I7! z;+)hJz*b|fnL4*4)_leoDeq`}H+Hkl#bq=sXfoKa>I zX+qd~pMqygStZzzT)XK{iwU_}RVB8|Zr$g@Fs3Y{~={o;ue zV|Mw#6!0*;1*A@XBdaG=c`clnW@37NFa>qOQ49`w31?`D3F55ghX_%-WZ*Wc!<-?^ z6k(G_j5w>l;s6!6aJAkLR-1_uPE||=)3arGVF*6_eAf&+I8aNmF>n@kBb>-xTH z`@ZPj^?BFWQu9$*wp+|Q@4>PyrJiv9g?En>q|Up(mZGnx-~)#jV#V;mLipgaZz%5s ztHHi`^SX7-nolit>@Ky3!9WujD2tr?6{ghDef9K}(+mEOIzH@JJb63z-s$CzSBtH$ z=3gvH{-V@dka}07J_s_n{c7$??)^9OT#2sLTk!SHtJf#5O)ktV`j)rtUH1Jb@BF%c z>z(FcvAMU<+*|T(xxDkz&XPY+YVbdB^9^Dd@ow?k)m^CN2=ncI7wSIBl((X`lgzhY z*ZVKN`Ocg75d%Km@oifQ?OQY!wWYp8%f8{;yOyNU|CCuO`>$~tw(6||-G_HDANPvG zyM&LQ;_0}%12~`fT8E!?eG+;O=s)y!9!BU>ff?S%ed_d6I$%%x<30vnK0{51``FK# z>JN9ZpLOw+?qgwE^x-n?hP42;nbo_%eOwV&nb;b<<`|1Hc5Ytm)ip@N?Iu{QJSuBe zTSzF9oCPf-tuZ(G8ercPYE+Clj$$b1FzIcxAB(Ah@-ij?6%l$*QPp$-h@`dzj*-IC?SBDx}OHvb6ywk8{p1C==_}tRiv6cSgD-9 z!cQrQtVTF0fUmbo36{0g6sCO~evax$wCw6p=usxqs=c=#BK#5++nZfaDLT+9YaD~& zJSurwik?8h6DWE*3!ct%hf2QSxskiB*UBtxS=rUki>21iGE4va_uBt=-TqY`-pdgN z3BLP|7QS_r1?nE9D$CJDLOvSTM3(kjvWzK=5y70z=&2Z{%^;>=hUw=C?x(UkIN)KZ z)>_8?D78BUB2uQ^g&FJDqLLMRUuY!6N0rtpc$oGhnAUkaR(zaNYf1RdwYQS$efSgz zD1;kN!T>dcVZKCNe@9&f)b$mT{)PtrijIAOj(v%qdLWE2OzTop&%Y2QY-|4mH(A2d literal 0 HcmV?d00001 diff --git a/app/providers/anthropic.py b/app/providers/anthropic.py new file mode 100644 index 0000000..3cc73fa --- /dev/null +++ b/app/providers/anthropic.py @@ -0,0 +1,97 @@ +from __future__ import annotations + +from typing import Any, Dict, List, Tuple + +import httpx + +from app.exceptions import ProviderAPICallError +from app.models import ( + LLMChoice, + LLMMessage, + LLMProvider, + LLMRequest, + LLMResponse, + LLMRole, +) +from app.providers.base import LLMProviderClient + + +class AnthropicProvider(LLMProviderClient): + name = LLMProvider.ANTHROPIC.value + api_key_env = "ANTHROPIC_API_KEY" + base_url = "https://api.anthropic.com/v1/messages" + anthropic_version = "2023-06-01" + + async def chat( + self, request: LLMRequest, client: httpx.AsyncClient + ) -> LLMResponse: + self.ensure_stream_supported(request.stream) + + system_prompt, chat_messages = self._convert_messages(request.messages) + + payload = self.merge_payload( + { + "model": request.model, + "messages": chat_messages, + "max_tokens": request.max_tokens or 1024, + "temperature": request.temperature, + "top_p": request.top_p, + }, + request.extra_params, + ) + + if system_prompt: + payload["system"] = system_prompt + + headers = { + "x-api-key": self.api_key, + "anthropic-version": self.anthropic_version, + "content-type": "application/json", + } + + try: + response = await client.post(self.base_url, json=payload, headers=headers) + response.raise_for_status() + except httpx.HTTPError as exc: + raise ProviderAPICallError(f"Anthropic request failed: {exc}") from exc + + data: Dict[str, Any] = response.json() + message = self._build_message(data) + return LLMResponse( + provider=LLMProvider.ANTHROPIC, + model=data.get("model", request.model), + choices=[LLMChoice(index=0, message=message)], + raw=data, + ) + + @staticmethod + def _convert_messages( + messages: List[LLMMessage], + ) -> Tuple[str | None, List[dict[str, Any]]]: + system_parts: List[str] = [] + chat_payload: List[dict[str, Any]] = [] + + for msg in messages: + if msg.role == LLMRole.SYSTEM: + system_parts.append(msg.content) + continue + + role = "user" if msg.role == LLMRole.USER else "assistant" + chat_payload.append( + {"role": role, "content": [{"type": "text", "text": msg.content}]} + ) + + system_prompt = "\n\n".join(system_parts) if system_parts else None + return system_prompt, chat_payload + + @staticmethod + def _build_message(data: Dict[str, Any]) -> LLMMessage: + role = data.get("role", "assistant") + content_blocks = data.get("content", []) + text_parts = [ + block.get("text", "") + for block in content_blocks + if isinstance(block, dict) and block.get("type") == "text" + ] + content = "\n\n".join(part for part in text_parts if part) + return LLMMessage(role=role, content=content) diff --git a/app/providers/base.py b/app/providers/base.py new file mode 100644 index 0000000..7e86cdd --- /dev/null +++ b/app/providers/base.py @@ -0,0 +1,44 @@ +from __future__ import annotations + +from abc import ABC, abstractmethod +from typing import Any + +import httpx + +from app.exceptions import ProviderConfigurationError +from app.models import LLMRequest, LLMResponse + + +class LLMProviderClient(ABC): + """Base class for provider-specific chat completion clients.""" + + name: str + api_key_env: str | None = None + supports_stream: bool = False + + def __init__(self, api_key: str | None): + if self.api_key_env and not api_key: + raise ProviderConfigurationError( + f"Provider '{self.name}' requires environment variable '{self.api_key_env}'." + ) + self.api_key = api_key or "" + + @abstractmethod + async def chat( + self, request: LLMRequest, client: httpx.AsyncClient + ) -> LLMResponse: + """Execute a chat completion call.""" + + @staticmethod + def merge_payload(base: dict[str, Any], extra: dict[str, Any] | None) -> dict[str, Any]: + """Merge provider payload with optional extra params, ignoring None values.""" + merged = {k: v for k, v in base.items() if v is not None} + if extra: + merged.update({k: v for k, v in extra.items() if v is not None}) + return merged + + def ensure_stream_supported(self, stream_requested: bool) -> None: + if stream_requested and not self.supports_stream: + raise ProviderConfigurationError( + f"Provider '{self.name}' does not support streaming mode." + ) diff --git a/app/providers/deepseek.py b/app/providers/deepseek.py new file mode 100644 index 0000000..d51e13c --- /dev/null +++ b/app/providers/deepseek.py @@ -0,0 +1,66 @@ +from __future__ import annotations + +from typing import Any, Dict, List + +import httpx + +from app.exceptions import ProviderAPICallError +from app.models import LLMChoice, LLMMessage, LLMProvider, LLMRequest, LLMResponse +from app.providers.base import LLMProviderClient + + +class DeepSeekProvider(LLMProviderClient): + name = LLMProvider.DEEPSEEK.value + api_key_env = "DEEPSEEK_API_KEY" + supports_stream = True + base_url = "https://api.deepseek.com/v1/chat/completions" + + async def chat( + self, request: LLMRequest, client: httpx.AsyncClient + ) -> LLMResponse: + self.ensure_stream_supported(request.stream) + + payload = self.merge_payload( + { + "model": request.model, + "messages": [msg.model_dump() for msg in request.messages], + "temperature": request.temperature, + "top_p": request.top_p, + "max_tokens": request.max_tokens, + "stream": request.stream, + }, + request.extra_params, + ) + + headers = { + "Authorization": f"Bearer {self.api_key}", + "Content-Type": "application/json", + } + + try: + response = await client.post(self.base_url, json=payload, headers=headers) + response.raise_for_status() + except httpx.HTTPError as exc: + raise ProviderAPICallError(f"DeepSeek request failed: {exc}") from exc + + data: Dict[str, Any] = response.json() + choices = self._build_choices(data.get("choices", [])) + + return LLMResponse( + provider=LLMProvider.DEEPSEEK, + model=data.get("model", request.model), + choices=choices, + raw=data, + ) + + @staticmethod + def _build_choices(choices: List[dict[str, Any]]) -> List[LLMChoice]: + built: List[LLMChoice] = [] + for choice in choices: + message_data = choice.get("message") or {} + message = LLMMessage( + role=message_data.get("role", "assistant"), + content=message_data.get("content", ""), + ) + built.append(LLMChoice(index=choice.get("index", len(built)), message=message)) + return built diff --git a/app/providers/gemini.py b/app/providers/gemini.py new file mode 100644 index 0000000..ed9b2ac --- /dev/null +++ b/app/providers/gemini.py @@ -0,0 +1,112 @@ +from __future__ import annotations + +from typing import Any, Dict, List, Tuple + +import httpx + +from app.exceptions import ProviderAPICallError +from app.models import ( + LLMChoice, + LLMMessage, + LLMProvider, + LLMRequest, + LLMResponse, + LLMRole, +) +from app.providers.base import LLMProviderClient + + +class GeminiProvider(LLMProviderClient): + name = LLMProvider.GEMINI.value + api_key_env = "GEMINI_API_KEY" + base_url = "https://generativelanguage.googleapis.com/v1beta" + + async def chat( + self, request: LLMRequest, client: httpx.AsyncClient + ) -> LLMResponse: + self.ensure_stream_supported(request.stream) + + system_instruction, contents = self._convert_messages(request.messages) + config = { + "temperature": request.temperature, + "topP": request.top_p, + "maxOutputTokens": request.max_tokens, + } + + payload: Dict[str, Any] = self.merge_payload( + {"contents": contents}, request.extra_params + ) + + generation_config = {k: v for k, v in config.items() if v is not None} + if generation_config: + payload["generationConfig"] = generation_config + if system_instruction: + payload["systemInstruction"] = { + "role": "system", + "parts": [{"text": system_instruction}], + } + + endpoint = f"{self.base_url}/models/{request.model}:generateContent?key={self.api_key}" + + headers = {"Content-Type": "application/json"} + + try: + response = await client.post(endpoint, json=payload, headers=headers) + response.raise_for_status() + except httpx.HTTPError as exc: + raise ProviderAPICallError(f"Gemini request failed: {exc}") from exc + + data: Dict[str, Any] = response.json() + choices = self._build_choices(data.get("candidates", [])) + + return LLMResponse( + provider=LLMProvider.GEMINI, + model=request.model, + choices=choices, + raw=data, + ) + + @staticmethod + def _convert_messages( + messages: List[LLMMessage], + ) -> Tuple[str | None, List[dict[str, Any]]]: + system_parts: List[str] = [] + contents: List[dict[str, Any]] = [] + + for msg in messages: + if msg.role == LLMRole.SYSTEM: + system_parts.append(msg.content) + continue + + role = "user" if msg.role == LLMRole.USER else "model" + contents.append({"role": role, "parts": [{"text": msg.content}]}) + + system_instruction = "\n\n".join(system_parts) if system_parts else None + return system_instruction, contents + + @staticmethod + def _build_choices(candidates: List[dict[str, Any]]) -> List[LLMChoice]: + choices: List[LLMChoice] = [] + for idx, candidate in enumerate(candidates): + content = candidate.get("content", {}) + parts = content.get("parts", []) + text_parts = [ + part.get("text", "") + for part in parts + if isinstance(part, dict) and part.get("text") + ] + text = "\n\n".join(text_parts) + choices.append( + LLMChoice( + index=candidate.get("index", idx), + message=LLMMessage(role="assistant", content=text), + ) + ) + if not choices: + choices.append( + LLMChoice( + index=0, + message=LLMMessage(role="assistant", content=""), + ) + ) + return choices diff --git a/app/providers/openai.py b/app/providers/openai.py new file mode 100644 index 0000000..53e2dda --- /dev/null +++ b/app/providers/openai.py @@ -0,0 +1,66 @@ +from __future__ import annotations + +from typing import Any, Dict, List + +import httpx + +from app.exceptions import ProviderAPICallError +from app.models import LLMChoice, LLMMessage, LLMProvider, LLMRequest, LLMResponse +from app.providers.base import LLMProviderClient + + +class OpenAIProvider(LLMProviderClient): + name = LLMProvider.OPENAI.value + api_key_env = "OPENAI_API_KEY" + supports_stream = True + base_url = "https://api.openai.com/v1/chat/completions" + + async def chat( + self, request: LLMRequest, client: httpx.AsyncClient + ) -> LLMResponse: + self.ensure_stream_supported(request.stream) + + payload = self.merge_payload( + { + "model": request.model, + "messages": [msg.model_dump() for msg in request.messages], + "temperature": request.temperature, + "top_p": request.top_p, + "max_tokens": request.max_tokens, + "stream": request.stream, + }, + request.extra_params, + ) + + headers = { + "Authorization": f"Bearer {self.api_key}", + "Content-Type": "application/json", + } + + try: + response = await client.post(self.base_url, json=payload, headers=headers) + response.raise_for_status() + except httpx.HTTPError as exc: + raise ProviderAPICallError(f"OpenAI request failed: {exc}") from exc + + data: Dict[str, Any] = response.json() + choices = self._build_choices(data.get("choices", [])) + + return LLMResponse( + provider=LLMProvider.OPENAI, + model=data.get("model", request.model), + choices=choices, + raw=data, + ) + + @staticmethod + def _build_choices(choices: List[dict[str, Any]]) -> List[LLMChoice]: + built: List[LLMChoice] = [] + for choice in choices: + message_data = choice.get("message") or {} + message = LLMMessage( + role=message_data.get("role", "assistant"), # fallback to assistant + content=message_data.get("content", ""), + ) + built.append(LLMChoice(index=choice.get("index", len(built)), message=message)) + return built diff --git a/app/providers/openrouter.py b/app/providers/openrouter.py new file mode 100644 index 0000000..5578962 --- /dev/null +++ b/app/providers/openrouter.py @@ -0,0 +1,77 @@ +from __future__ import annotations + +import os +from typing import Any, Dict, List + +import httpx + +from app.exceptions import ProviderAPICallError +from app.models import LLMChoice, LLMMessage, LLMProvider, LLMRequest, LLMResponse +from app.providers.base import LLMProviderClient + + +class OpenRouterProvider(LLMProviderClient): + name = LLMProvider.OPENROUTER.value + api_key_env = "OPENROUTER_API_KEY" + supports_stream = True + base_url = "https://openrouter.ai/api/v1/chat/completions" + + def __init__(self, api_key: str | None): + super().__init__(api_key) + self.site_url = os.getenv("OPENROUTER_SITE_URL") + self.app_name = os.getenv("OPENROUTER_APP_NAME") + + async def chat( + self, request: LLMRequest, client: httpx.AsyncClient + ) -> LLMResponse: + self.ensure_stream_supported(request.stream) + + payload = self.merge_payload( + { + "model": request.model, + "messages": [msg.model_dump() for msg in request.messages], + "temperature": request.temperature, + "top_p": request.top_p, + "max_tokens": request.max_tokens, + "stream": request.stream, + }, + request.extra_params, + ) + + headers = { + "Authorization": f"Bearer {self.api_key}", + "Content-Type": "application/json", + } + + if self.site_url: + headers["HTTP-Referer"] = self.site_url + if self.app_name: + headers["X-Title"] = self.app_name + + try: + response = await client.post(self.base_url, json=payload, headers=headers) + response.raise_for_status() + except httpx.HTTPError as exc: + raise ProviderAPICallError(f"OpenRouter request failed: {exc}") from exc + + data: Dict[str, Any] = response.json() + choices = self._build_choices(data.get("choices", [])) + + return LLMResponse( + provider=LLMProvider.OPENROUTER, + model=data.get("model", request.model), + choices=choices, + raw=data, + ) + + @staticmethod + def _build_choices(choices: List[dict[str, Any]]) -> List[LLMChoice]: + built: List[LLMChoice] = [] + for choice in choices: + message_data = choice.get("message") or {} + message = LLMMessage( + role=message_data.get("role", "assistant"), + content=message_data.get("content", ""), + ) + built.append(LLMChoice(index=choice.get("index", len(built)), message=message)) + return built diff --git a/app/providers/qwen.py b/app/providers/qwen.py new file mode 100644 index 0000000..c2e7f1f --- /dev/null +++ b/app/providers/qwen.py @@ -0,0 +1,87 @@ +from __future__ import annotations + +from typing import Any, Dict, List + +import httpx + +from app.exceptions import ProviderAPICallError +from app.models import LLMChoice, LLMMessage, LLMProvider, LLMRequest, LLMResponse +from app.providers.base import LLMProviderClient + + +class QwenProvider(LLMProviderClient): + name = LLMProvider.QWEN.value + api_key_env = "QWEN_API_KEY" + base_url = ( + "https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation" + ) + + async def chat( + self, request: LLMRequest, client: httpx.AsyncClient + ) -> LLMResponse: + self.ensure_stream_supported(request.stream) + + parameters = { + "temperature": request.temperature, + "top_p": request.top_p, + } + if request.max_tokens is not None: + parameters["max_output_tokens"] = request.max_tokens + + # Strip None values from parameters + parameters = {k: v for k, v in parameters.items() if v is not None} + + payload: Dict[str, Any] = { + "model": request.model, + "input": {"messages": [msg.model_dump() for msg in request.messages]}, + } + if parameters: + payload["parameters"] = parameters + + payload = self.merge_payload(payload, request.extra_params) + + headers = { + "Authorization": f"Bearer {self.api_key}", + "Content-Type": "application/json", + } + + try: + response = await client.post(self.base_url, json=payload, headers=headers) + response.raise_for_status() + except httpx.HTTPError as exc: + raise ProviderAPICallError(f"Qwen request failed: {exc}") from exc + + data: Dict[str, Any] = response.json() + choices = self._build_choices(data.get("output", {})) + + return LLMResponse( + provider=LLMProvider.QWEN, + model=request.model, + choices=choices, + raw=data, + ) + + @staticmethod + def _build_choices(output: Dict[str, Any]) -> List[LLMChoice]: + choices_payload = output.get("choices", []) + if not choices_payload and output.get("text"): + return [ + LLMChoice( + index=0, + message=LLMMessage(role="assistant", content=output["text"]), + ) + ] + + choices: List[LLMChoice] = [] + for idx, choice in enumerate(choices_payload): + message_data = choice.get("message") or {} + message = LLMMessage( + role=message_data.get("role", "assistant"), + content=message_data.get("content", ""), + ) + choices.append(LLMChoice(index=choice.get("index", idx), message=message)) + if not choices: + choices.append( + LLMChoice(index=0, message=LLMMessage(role="assistant", content="")) + ) + return choices diff --git a/app/services/__init__.py b/app/services/__init__.py new file mode 100644 index 0000000..849697d --- /dev/null +++ b/app/services/__init__.py @@ -0,0 +1,3 @@ +from .gateway import LLMGateway + +__all__ = ["LLMGateway"] diff --git a/app/services/__pycache__/__init__.cpython-311.pyc b/app/services/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..38d21f5b7d3051d8c66333fc01834398b98b8f9a GIT binary patch literal 214 zcmZ3^%ge<81m9mXWLg2~#~=<2FhLogC4h|S3@HpLj5!Rsj8Tk?3@J?Mj8RM}%)tzr zEH4>>(wdC7xO{wk-4jbv%M&Y$n1Momn#{M@(~$&jvB$?J=H$f3uVnZPGWwT9VnKm^ zacWUnW^!t=etdjpUS>&ryk0@&FAkgB{FKt1RJ$ThphA!Z#Y#Zp12ZEd;|&J+3#jM; Qw|IwM13L&7u>+L>0E*}{%>V!Z literal 0 HcmV?d00001 diff --git a/app/services/__pycache__/__init__.cpython-312.pyc b/app/services/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..659873f0f59ec5576ad50480cb8db9c4b28cffe2 GIT binary patch literal 193 zcmX@j%ge<81m9mXWLg2~#~=<2FhLog#ej_I3@HpLj5!Rsj8Tk?3@J?Mj8ROL%$h7O z8G(|TjJLRae0<##OH#`dD~p(cLVlXex7gE>1a7g%$0z3G#K*5>_zW`mmqcPgfqrpn zQCVhkYO#KNd}dx|NqoFsLFF$Fo80`A(wtPgB2J(}kOjs3K;i>4BO~Ko2Kfiv;vIU8 J>_zNAF#xmcE$aXP literal 0 HcmV?d00001 diff --git a/app/services/__pycache__/gateway.cpython-311.pyc b/app/services/__pycache__/gateway.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..142ab5a7588c125e35e7f61ca46ee56a6abfc778 GIT binary patch literal 3057 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 W8LE&RD5Jrag{0n1ct7)6n9<7}GnYPubu zcxr%-QUeT6H=^Us2n`sbhA7pCWNOF~rF8rMhZ zsHu;_b&5Sh!yBUXD~LDpCSQJLY`u+|d?5YilF|BV+NQv7e$|-ydV-3YqO=2;qD(j4 zj+EjIf0W74=rdh31^N#dPa~%#@_Cye2mO5l8%iH6dxDb%o(%?ArB`76e#t8ZdBM-h z3Kj!BE}M;o(y?hu;`-SWSqVJL$?WcoxO$CyHygz3V|DtNOB3bkW&^?X)k9e57SFJv z3`2q}1e6+9!Tl^3U>6Feu2C+hRW*|B zhoA}hMQ|K{@U(z2IeFFC$N9s8YCA?6H^xD%8hk-9pc+mJ{j$2n3%Y zRcqG1sx1)266Y5q0G|bj0?V{f_zSd*-SiNK`*C>GGwzGtp{U!r{9O!*H6Tjm`*=N!(2!#U%)d$8&6dBrI^Nc*Y)HF&7M zZShQOyYT36>vOH6k0wfM;#)kiLs0$0Tsm*xHky~P*IX|tpD(E%yM3%MzOVVy#=m<0 z?1>*cF?Xydaja+Nm^gFD7jHfpKk1JbNvjOKr67gq{DPDT6_t;)Bns~uYl;`%AGh4U zV6PhW&Di%$)W_`)#tjdC^W_#)+C<63_y1H|`f#3M6VwqaYfxtc82bNEmmAJ_D&v~C zNHKs!t@yHVlNmv%9o<3#ol`;%P`agrEIe$|K?_~$>yzFsB^Yw*03q+@a!UzW7~7;n z!Oi^Np@S)>4n?^n@MhnZZ;$hqvuOPc8nZznBX@vSwr03^YZL+e+B6WiZvXKxhkwga8hP0S6*xy{*M0W^B5nBv9@p;rL$YG$Ts8 zr^mr20~Fk*%w{&UFHyr3g@#HDs2{z>(z_mV(qYKOwtox! z<$4yAYvQzHaw}AutZ-P73BQi;ro%_vtp_}+^+0RKqiu(ecpg?wkGNYrtsd3z);6+IIM8hr12m2Es78F-``T6TxOJY5=@jvk^!pDGuPYW=p({aFFV5 z_?Q0$RSeA+Y?~|Cktob_a?{W-Zt?wmDOYBLpy!iu=1BFi*#*Q~ipo7tHt+!?p*%+AEO z@0~T@t4&oU3ajFlsvAY6!`A1laD*S0%{tsOMedmAx~+8HRyScAi>45@-%ZWCTR&<3 z^i+zWtZmdP!`MwJ#28Jhu-(nKH;b_Uff-1Vsa&ZVPoE`eCb^O~l^h;S@yq}XsTcBP zv38w_q+?MEY7@-oKwvH1G7m5cNpiKKWHHj01M8yn+m=kKnv*97x<#3Fo*qczoYu&X z9>xNsJ*?a>D}n@x5YL7optF*mltUr}sTE1p^xzHzdIC=zMG7gdHOjUL6UdF*OEBS1 z=wvYg_5|rT#F$smt8^L#?0^E4h5~eiu4P-_0uaEpz@?gc1rFW-8-W13U?Ng|A}soO zZ#vJ&sF=h14+6DJJVf{Y%8rSHqYsVtjrLxtO;mQI{lBo73ZH?jZQ-NQ#gXxa$yoBj zvx_fIEIxZJIsRet+?&hePbLSiCZB$5@u_FNh&{19{{G_V6wEG7Urb(mdFkb|%dd|m zue_K1)zH$F4;KFTjL!S-4~LS2R~BD-C;86s;CO{ctPL*+{F8uUv{Hht9#e^=!8&fVt$bBym_2WVRaCSeiat!!C}W zUwM5BXjt9Upr0gg0m#6i$HQyQtMrEi=${Hh&ZzWz;dLj-&Ki~%6fKAKin0uOGFuJ1 zTzdQ03zNUoMLS{p`o7p;pMW7O!SX#l@YI8+;Rb3a=o}`nm^SsbiR4EwdK&9lZO~@Z zO}p^%>x(}hueYTKH<}p+MPLWY@%I;|Us#%kvwCvz@`a5w3zNT0%b9v+W%xa?R&snQ z`N0dxbMG#_J53I1>JPeIVGGF%gA0>SFMm9-Zb`!M z?*)jxZ~F~l)%~TEDdlodruqCkQw+2>j9b4lLaRyrA6Q}zoB#j- literal 0 HcmV?d00001 diff --git a/app/services/gateway.py b/app/services/gateway.py new file mode 100644 index 0000000..bb40725 --- /dev/null +++ b/app/services/gateway.py @@ -0,0 +1,53 @@ +from __future__ import annotations + +import os +from typing import Dict, Type + +import httpx + +from app.exceptions import ProviderConfigurationError +from app.models import LLMProvider, LLMRequest, LLMResponse +from app.providers import ( + AnthropicProvider, + DeepSeekProvider, + GeminiProvider, + LLMProviderClient, + OpenAIProvider, + OpenRouterProvider, + QwenProvider, +) + + +class LLMGateway: + """Simple registry that dispatches chat requests to provider clients.""" + + def __init__(self) -> None: + self._providers: Dict[LLMProvider, LLMProviderClient] = {} + self._factory: Dict[LLMProvider, Type[LLMProviderClient]] = { + LLMProvider.OPENAI: OpenAIProvider, + LLMProvider.ANTHROPIC: AnthropicProvider, + LLMProvider.OPENROUTER: OpenRouterProvider, + LLMProvider.GEMINI: GeminiProvider, + LLMProvider.QWEN: QwenProvider, + LLMProvider.DEEPSEEK: DeepSeekProvider, + } + + def get_provider(self, provider: LLMProvider) -> LLMProviderClient: + if provider not in self._factory: + raise ProviderConfigurationError(f"Unsupported provider '{provider.value}'.") + + if provider not in self._providers: + self._providers[provider] = self._build_provider(provider) + return self._providers[provider] + + def _build_provider(self, provider: LLMProvider) -> LLMProviderClient: + provider_cls = self._factory[provider] + api_key_env = getattr(provider_cls, "api_key_env", None) + api_key = os.getenv(api_key_env) if api_key_env else None + return provider_cls(api_key) + + async def chat( + self, request: LLMRequest, client: httpx.AsyncClient + ) -> LLMResponse: + provider_client = self.get_provider(request.provider) + return await provider_client.chat(request, client) diff --git a/app/services/import_analysis.py b/app/services/import_analysis.py new file mode 100644 index 0000000..6a20a41 --- /dev/null +++ b/app/services/import_analysis.py @@ -0,0 +1,91 @@ +from __future__ import annotations + +from typing import List, Tuple + +from app.models import ( + DataImportAnalysisRequest, + LLMMessage, + LLMProvider, + LLMRole, +) + + +def resolve_provider_from_model(llm_model: str) -> Tuple[LLMProvider, str]: + """Resolve provider based on the llm_model string. + + The llm_model may be provided as 'provider:model' or 'provider/model'. + If no provider prefix is present, try an educated guess from common model name patterns. + """ + + normalized = llm_model.strip() + provider_hint: str | None = None + model_name = normalized + + for delimiter in (":", "/", "|"): + if delimiter in normalized: + provider_hint, model_name = normalized.split(delimiter, 1) + provider_hint = provider_hint.strip().lower() + model_name = model_name.strip() + break + + provider_map = {provider.value: provider for provider in LLMProvider} + + if provider_hint: + if provider_hint not in provider_map: + raise ValueError( + f"Unsupported provider '{provider_hint}'. Expected one of: {', '.join(provider_map.keys())}." + ) + return provider_map[provider_hint], model_name + + return _guess_provider_from_model(model_name), model_name + + +def _guess_provider_from_model(model_name: str) -> LLMProvider: + lowered = model_name.lower() + + if lowered.startswith(("gpt", "o1", "text-", "dall-e", "whisper")): + return LLMProvider.OPENAI + if lowered.startswith(("claude", "anthropic")): + return LLMProvider.ANTHROPIC + if lowered.startswith(("gemini", "models/gemini")): + return LLMProvider.GEMINI + if lowered.startswith("qwen"): + return LLMProvider.QWEN + if lowered.startswith("deepseek"): + return LLMProvider.DEEPSEEK + if lowered.startswith(("openrouter", "router-")): + return LLMProvider.OPENROUTER + + supported = ", ".join(provider.value for provider in LLMProvider) + raise ValueError( + f"Unable to infer provider from model '{model_name}'. " + f"Please prefix with 'provider:model'. Supported providers: {supported}." + ) + + +def build_import_messages( + request: DataImportAnalysisRequest, +) -> List[LLMMessage]: + """Create system and user messages for the import analysis prompt.""" + headers_formatted = "\n".join(f"- {header}" for header in request.table_headers) + + system_prompt = ( + "你是一名数据导入识别助手。请根据给定的表头和示例数据,判断字段含义、" + "典型数据类型以及潜在的数据质量问题。最终请返回一个结构化的JSON。\n" + "JSON结构需包含: field_summaries (数组, 每项含 header、meaning、data_type、quality_notes), " + "detected_issues (字符串数组),以及 overall_suggestion (字符串)。" + ) + + user_prompt = ( + f"导入记录ID: {request.import_record_id}\n\n" + "表头信息:\n" + f"{headers_formatted}\n\n" + "示例数据:\n" + f"{request.example_data}\n\n" + "请仔细分析示例数据与表头之间的对应关系,并返回符合上述JSON结构的内容。" + ) + + return [ + LLMMessage(role=LLMRole.SYSTEM, content=system_prompt), + LLMMessage(role=LLMRole.USER, content=user_prompt), + ] diff --git a/demo/GE_result_desc_prompt.txt b/demo/GE_result_desc_prompt.txt new file mode 100644 index 0000000..5122d59 --- /dev/null +++ b/demo/GE_result_desc_prompt.txt @@ -0,0 +1,47 @@ +系统角色(System) +你是“数据画像抽取器”。输入是一段 Great Expectations 的 profiling/validation 结果 JSON, +可能包含:列级期望(expect_*)、统计、样例值、类型推断等;也可能带表级/批次元数据。 +请将其归一化为一个可被程序消费的“表画像”JSON,对不确定项给出置信度与理由。 +禁止臆造不存在的列、时间范围或数值。 + +用户消息(User) +【输入:GE结果JSON】 +{{GE_RESULT_JSON}} + +【输出要求(只输出JSON,不要解释文字)】 +{ + "table": "<库.表 或 表名>", + "row_count": , // 若未知可为 null + "role": "fact|dimension|unknown", // 依据指标/维度占比与唯一性启发式 + "grain": ["<列1>", "<列2>", ...], // 事实粒度猜测(如含 dt/店/类目) + "time": { "column": "|null", "granularity": "day|week|month|unknown", "range": ["YYYY-MM-DD","YYYY-MM-DD"]|null, "has_gaps": true|false|null }, + "columns": [ + { + "name": "", + "dtype": "", + "semantic_type": "dimension|metric|time|text|id|unknown", + "null_rate": <0~1|null>, + "distinct_count": , + "distinct_ratio": <0~1|null>, + "stats": { "min": ,"max": ,"mean": ,"std": ,"skewness": }, + "enumish": true|false|null, // 低熵/可枚举 + "top_values": [{"value":"","pct":<0~1>}, ...],// 取前K个(≤10) + "pk_candidate_score": <0~1>, // 唯一性+非空综合评分 + "metric_candidate_score": <0~1>, // 数值/偏态/业务词命中 + "comment": "<列注释或GE描述|可为空>" + } + ], + "primary_key_candidates": [["colA","colB"], ...], // 依据 unique/compound unique 期望 + "fk_candidates": [{"from":"","to":"","confidence":<0~1>}], + "quality": { + "failed_expectations": [{"name":"","column":"","summary":"<一句话>"}], + "warning_hints": ["空值率>0.2的列: ...", "时间列存在缺口: ..."] + }, + "confidence_notes": ["<为什么判定role/grain/time列>"] +} + +【判定规则(简要)】 +- time列:类型为日期/时间 OR 命中 dt/date/day 等命名;若有 min/max 可给出 range;若间隔缺口≥1天记 has_gaps=true。 +- semantic_type:数值+右偏/方差大→更偏 metric;高唯一/ID命名→id;高基数+文本→text;低熵+有限取值→dimension。 +- role:metric列占比高且存在time列→倾向 fact;几乎全是枚举/ID且少数值→dimension。 +- 置信不高时给出 null 或 unknown,并写入 confidence_notes。 diff --git a/demo/e-commerce-orders_desc.md b/demo/e-commerce-orders_desc.md new file mode 100644 index 0000000..2a72f2d --- /dev/null +++ b/demo/e-commerce-orders_desc.md @@ -0,0 +1,127 @@ +E-commerce Customer Order Behavior Dataset +A synthetic e-commerce dataset containing 10,000 orders with realistic customer behavior patterns, suitable for e-commerce analytics and machine learning tasks. + +Dataset Card for E-commerce Orders +Dataset Summary +This dataset simulates customer order behavior in an e-commerce platform, containing detailed information about orders, customers, products, and delivery patterns. The data is synthetically generated with realistic distributions and patterns. + +Supported Tasks +regression: Predict order quantities or prices +classification: Predict delivery status or customer segments +clustering: Identify customer behavior patterns +time-series-forecasting: Analyze order patterns over time +Languages +Not applicable (tabular data) + +Dataset Structure +Data Instances +Each instance represents a single e-commerce order with the following fields: + +{ + 'order_id': '5ea92c47-c5b2-4bdd-8a50-d77efd77ec89', + 'customer_id': 2350, + 'product_id': 995, + 'category': 'Electronics', + 'price': 403.17, + 'quantity': 3, + 'order_date': '2024-04-20 14:59:58.897063', + 'shipping_date': '2024-04-22 14:59:58.897063', + 'delivery_status': 'Delivered', + 'payment_method': 'PayPal', + 'device_type': 'Mobile', + 'channel': 'Paid Search', + 'shipping_address': '72166 Cunningham Crescent East Nicholasside Mississippi 85568', + 'billing_address': '38199 Edwin Plain Johnborough Maine 81826', + 'customer_segment': 'Returning' +} + +Data Fields +Field Name Type Description Value Range +order_id string Unique order identifier (UUID4) - +customer_id int Customer identifier 1-3,000 +product_id int Product identifier 1-1,000 +category string Product category Electronics, Clothing, Home, Books, Beauty, Toys +price float Product price $5.00-$500.00 +quantity int Order quantity 1-10 +order_date datetime Order placement timestamp Last 12 months +shipping_date datetime Shipping timestamp 1-7 days after order_date +delivery_status string Delivery status Pending, Shipped, Delivered, Returned +payment_method string Payment method used Credit Card, PayPal, Debit Card, Apple Pay, Google Pay +device_type string Ordering device Desktop, Mobile, Tablet +channel string Marketing channel Organic, Paid Search, Email, Social +shipping_address string Delivery address Street, City, State, ZIP +billing_address string Billing address Street, City, State, ZIP +customer_segment string Customer type New, Returning, VIP +Data Splits +This dataset is provided as a single CSV file without splits. + +Dataset Creation +Source Data +This is a synthetic dataset generated using Python with pandas, numpy, and Faker libraries. The data generation process ensures: + +Realistic customer behavior patterns +Proper data distributions +Valid relationships between fields +Realistic address formatting +Annotations +No manual annotations (synthetic data) + +Considerations for Using the Data +Social Impact of Dataset +This dataset is designed for: + +Development of e-commerce analytics systems +Testing of order processing systems +Training of machine learning models for e-commerce +Educational purposes in data science +Discussion of Biases +As a synthetic dataset, care has been taken to: + +Use realistic distributions for order patterns +Maintain proper relationships between dates +Create realistic customer segments +Avoid demographic biases in address generation +However, users should note that: + +The data patterns are simplified compared to real e-commerce data +The customer behavior patterns are based on general assumptions +Geographic distribution might not reflect real-world patterns +Dataset Statistics +Total Records: 10,000 + +Distribution Statistics: + +Delivery Status: + +Delivered: 70% +Shipped: 20% +Pending: 5% +Returned: 5% +Customer Segments: + +VIP: ~15% +Returning: ~35% +New: ~50% +Loading and Usage +Using Huggingface Datasets: + +from datasets import load_dataset + +dataset = load_dataset("path/to/e-commerce-orders") + +# Example: Load as pandas DataFrame +df = dataset['train'].to_pandas() + +# Example: Access specific columns +orders = dataset['train']['order_id'] +prices = dataset['train']['price'] + +Data Quality +The dataset has been validated to ensure: + +No missing values +Proper value ranges +Valid categorical values +Proper date relationships +Unique order IDs +Valid address formats \ No newline at end of file diff --git a/demo/snippet.json b/demo/snippet.json new file mode 100644 index 0000000..51e433f --- /dev/null +++ b/demo/snippet.json @@ -0,0 +1,523 @@ +[ + { + "id": "snpt_daily_gmv_trend", + "title": "日GMV趋势", + "desc": "按日统计GMV与订单量趋势", + "type": "trend", + "applicability": { + "required_columns": [ + "order_date", + "price", + "quantity" + ], + "time_column": "order_date", + "constraints": { + "dim_cardinality_hint": null, + "fk_join_available": false, + "notes": [ + "GMV=SUM(price*quantity)", + "请避免选择地址等PII字段" + ] + } + }, + "variables": [ + { + "name": "start_date", + "type": "date" + }, + { + "name": "end_date", + "type": "date" + } + ], + "dialect_sql": { + "mysql": "SELECT DATE(order_date) AS dt, SUM(price*quantity) AS gmv, COUNT(*) AS orders\nFROM {{table}}\nWHERE DATE(order_date) BETWEEN {{start_date}} AND {{end_date}}\nGROUP BY dt\nORDER BY dt;" + }, + "business_caliber": "GMV口径:price×quantity;订单量:记录条数;粒度=日。", + "examples": [ + "近30天GMV趋势", + "2025Q1每日GMV与订单数" + ] + }, + { + "id": "snpt_daily_gmv_ma7", + "title": "7日GMV均线", + "desc": "GMV按日与7日滑动平均", + "type": "trend", + "applicability": { + "required_columns": [ + "order_date", + "price", + "quantity" + ], + "time_column": "order_date", + "constraints": { + "dim_cardinality_hint": null, + "fk_join_available": false, + "notes": [ + "窗口=包含当日的过去7天", + "若日期有缺口,均线可能偏移" + ] + } + }, + "variables": [ + { + "name": "start_date", + "type": "date" + }, + { + "name": "end_date", + "type": "date" + } + ], + "dialect_sql": { + "mysql": "WITH d AS (\n SELECT DATE(order_date) AS dt, SUM(price*quantity) AS gmv\n FROM {{table}}\n WHERE DATE(order_date) BETWEEN {{start_date}} AND {{end_date}}\n GROUP BY dt\n)\nSELECT dt,\n gmv,\n AVG(gmv) OVER (ORDER BY dt ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) AS gmv_ma7\nFROM d\nORDER BY dt;" + }, + "business_caliber": "GMV=price×quantity;窗口=7天(含当日),按自然日排序计算。", + "examples": [ + "本季度GMV与7日均线", + "促销期走势平滑对比" + ] + }, + { + "id": "snpt_yoy_daily_gmv", + "title": "GMV同比(日)", + "desc": "对比去年同日GMV与同比%", + "type": "ratio", + "applicability": { + "required_columns": [ + "order_date", + "price", + "quantity" + ], + "time_column": "order_date", + "constraints": { + "dim_cardinality_hint": null, + "fk_join_available": false, + "notes": [ + "需要查询窗口覆盖到去年的对应日期", + "闰年按日期对齐处理" + ] + } + }, + "variables": [ + { + "name": "start_date", + "type": "date" + }, + { + "name": "end_date", + "type": "date" + } + ], + "dialect_sql": { + "mysql": "WITH cur AS (\n SELECT DATE(order_date) AS dt, SUM(price*quantity) AS gmv\n FROM {{table}}\n WHERE DATE(order_date) BETWEEN {{start_date}} AND {{end_date}}\n GROUP BY dt\n),\nprev AS (\n SELECT DATE(DATE_SUB(order_date, INTERVAL 1 YEAR)) AS dt, SUM(price*quantity) AS gmv_last\n FROM {{table}}\n WHERE DATE(order_date) BETWEEN DATE_SUB({{start_date}}, INTERVAL 1 YEAR) AND DATE_SUB({{end_date}}, INTERVAL 1 YEAR)\n GROUP BY DATE(DATE_SUB(order_date, INTERVAL 1 YEAR))\n)\nSELECT c.dt,\n c.gmv,\n p.gmv_last,\n CASE WHEN p.gmv_last IS NULL OR p.gmv_last=0 THEN NULL ELSE (c.gmv - p.gmv_last)/p.gmv_last END AS yoy\nFROM cur c LEFT JOIN prev p ON c.dt = p.dt\nORDER BY c.dt;" + }, + "business_caliber": "同比=当日GMV与去年同日GMV之差/去年同日GMV;GMV=price×quantity。", + "examples": [ + "最近90天GMV同比曲线", + "节假日同比表现" + ] + }, + { + "id": "snpt_topn_category_gmv", + "title": "类目GMV排行", + "desc": "按类目统计GMV并取TopN", + "type": "topn", + "applicability": { + "required_columns": [ + "order_date", + "category", + "price", + "quantity" + ], + "time_column": "order_date", + "constraints": { + "dim_cardinality_hint": 6, + "fk_join_available": false, + "notes": [ + "类目枚举较少,建议TopN<=6用于展示", + "可追加订单量与件数" + ] + } + }, + "variables": [ + { + "name": "start_date", + "type": "date" + }, + { + "name": "end_date", + "type": "date" + }, + { + "name": "top_n", + "type": "int", + "default": 10 + } + ], + "dialect_sql": { + "mysql": "SELECT category,\n SUM(price*quantity) AS gmv,\n COUNT(*) AS orders,\n SUM(quantity) AS qty\nFROM {{table}}\nWHERE DATE(order_date) BETWEEN {{start_date}} AND {{end_date}}\nGROUP BY category\nORDER BY gmv DESC\nLIMIT {{top_n}};" + }, + "business_caliber": "GMV=price×quantity;统计范围=指定日期内;粒度=类目。", + "examples": [ + "上月类目Top5", + "本季度类目GMV结构" + ] + }, + { + "id": "snpt_share_channel", + "title": "渠道GMV占比", + "desc": "统计各渠道GMV及占比", + "type": "ratio", + "applicability": { + "required_columns": [ + "order_date", + "channel", + "price", + "quantity" + ], + "time_column": "order_date", + "constraints": { + "dim_cardinality_hint": 4, + "fk_join_available": false, + "notes": [ + "占比以总GMV为分母;占比之和≈100%", + "适合饼图/堆叠柱" + ] + } + }, + "variables": [ + { + "name": "start_date", + "type": "date" + }, + { + "name": "end_date", + "type": "date" + } + ], + "dialect_sql": { + "mysql": "WITH base AS (\n SELECT channel, SUM(price*quantity) AS gmv\n FROM {{table}}\n WHERE DATE(order_date) BETWEEN {{start_date}} AND {{end_date}}\n GROUP BY channel\n), total AS (\n SELECT SUM(gmv) AS tg FROM base\n)\nSELECT b.channel, b.gmv, b.gmv/t.tg AS gmv_share\nFROM base b CROSS JOIN total t\nORDER BY b.gmv DESC;" + }, + "business_caliber": "渠道GMV占比=渠道GMV/全部渠道GMV;时间范围由参数限定。", + "examples": [ + "本月各渠道占比", + "Q1渠道结构对比" + ] + }, + { + "id": "snpt_topn_product_gmv", + "title": "商品GMV排行", + "desc": "按商品ID统计GMV并取TopN", + "type": "topn", + "applicability": { + "required_columns": [ + "order_date", + "product_id", + "price", + "quantity" + ], + "time_column": "order_date", + "constraints": { + "dim_cardinality_hint": 1000, + "fk_join_available": true, + "notes": [ + "product_id基数较高,建议LIMIT<=50", + "可与商品维表联查名称等属性" + ] + } + }, + "variables": [ + { + "name": "start_date", + "type": "date" + }, + { + "name": "end_date", + "type": "date" + }, + { + "name": "top_n", + "type": "int", + "default": 20 + } + ], + "dialect_sql": { + "mysql": "SELECT product_id,\n SUM(price*quantity) AS gmv,\n SUM(quantity) AS qty,\n COUNT(*) AS orders\nFROM {{table}}\nWHERE DATE(order_date) BETWEEN {{start_date}} AND {{end_date}}\nGROUP BY product_id\nORDER BY gmv DESC\nLIMIT {{top_n}};" + }, + "business_caliber": "GMV=price×quantity;粒度=商品ID。", + "examples": [ + "上周热销商品Top20", + "年度销量Top10商品" + ] + }, + { + "id": "snpt_join_product_dim", + "title": "商品维表联查", + "desc": "以product_id关联商品维表或使用纯ID", + "type": "join", + "applicability": { + "required_columns": [ + "product_id" + ], + "time_column": null, + "constraints": { + "dim_cardinality_hint": 1000, + "fk_join_available": true, + "notes": [ + "若无维表则保留纯ID版输出", + "谨慎选择PII字段,勿输出地址类字段" + ] + } + }, + "variables": [ + { + "name": "dim_product", + "type": "identifier" + }, + { + "name": "select_cols", + "type": "string", + "default": "f.product_id, f.price, f.quantity" + } + ], + "dialect_sql": { + "mysql": "-- 命名版\nSELECT {{select_cols}}\nFROM {{table}} f\nLEFT JOIN {{dim_product}} d ON f.product_id = d.product_id;\n\n-- 纯ID版\nSELECT product_id, price, quantity FROM {{table}};" + }, + "business_caliber": "外键:product_id→商品维表主键;度量来源于事实表price与quantity。", + "examples": [ + "联查商品名称后做TopN", + "仅用ID进行商品分析" + ] + }, + { + "id": "snpt_join_customer_dim", + "title": "客户维表联查", + "desc": "以customer_id关联客户维表或使用纯ID", + "type": "join", + "applicability": { + "required_columns": [ + "customer_id" + ], + "time_column": null, + "constraints": { + "dim_cardinality_hint": 2713, + "fk_join_available": true, + "notes": [ + "如无维表,可直接按customer_id聚合", + "避免输出shipping_address/billing_address等PII" + ] + } + }, + "variables": [ + { + "name": "dim_customer", + "type": "identifier" + }, + { + "name": "select_cols", + "type": "string", + "default": "c.customer_name, f.customer_id, SUM(f.price*f.quantity) AS gmv" + } + ], + "dialect_sql": { + "mysql": "-- 命名版\nSELECT {{select_cols}}\nFROM {{table}} f\nLEFT JOIN {{dim_customer}} c ON f.customer_id = c.customer_id\nGROUP BY c.customer_name, f.customer_id;\n\n-- 纯ID版\nSELECT customer_id, SUM(price*quantity) AS gmv\nFROM {{table}}\nGROUP BY customer_id;" + }, + "business_caliber": "外键:customer_id→客户维表主键;GMV=price×quantity。", + "examples": [ + "客户分群GMV", + "重点客户消费额排行" + ] + }, + { + "id": "snpt_quality_dup_order", + "title": "主键重复检查", + "desc": "检查order_id唯一性并抽样输出", + "type": "quality", + "applicability": { + "required_columns": [ + "order_id" + ], + "time_column": null, + "constraints": { + "dim_cardinality_hint": 10000, + "fk_join_available": false, + "notes": [ + "画像显示order_id应唯一;若结果非空为异常" + ] + } + }, + "variables": [ + { + "name": "limit_sample", + "type": "int", + "default": 50 + } + ], + "dialect_sql": { + "mysql": "WITH d AS (\n SELECT order_id, COUNT(*) AS cnt\n FROM {{table}}\n GROUP BY order_id\n HAVING COUNT(*)>1\n)\nSELECT * FROM d LIMIT {{limit_sample}};" + }, + "business_caliber": "主键口径:order_id全表唯一;用于数据质量预警与排查。", + "examples": [ + "是否存在重复订单?", + "查看重复订单样本" + ] + }, + { + "id": "snpt_quality_price_outlier", + "title": "价格异常检测", + "desc": "基于当日均值±3σ识别异常价", + "type": "quality", + "applicability": { + "required_columns": [ + "order_date", + "price" + ], + "time_column": "order_date", + "constraints": { + "dim_cardinality_hint": null, + "fk_join_available": false, + "notes": [ + "仅质量预警,不直接代表业务错误", + "当天样本过少时波动较大" + ] + } + }, + "variables": [ + { + "name": "start_date", + "type": "date" + }, + { + "name": "end_date", + "type": "date" + }, + { + "name": "limit_sample", + "type": "int", + "default": 100 + } + ], + "dialect_sql": { + "mysql": "WITH stats AS (\n SELECT DATE(order_date) AS dt, AVG(price) AS mu, STDDEV_POP(price) AS sigma\n FROM {{table}}\n WHERE DATE(order_date) BETWEEN {{start_date}} AND {{end_date}}\n GROUP BY dt\n)\nSELECT f.*\nFROM {{table}} f\nJOIN stats s ON DATE(f.order_date)=s.dt\nWHERE (f.price > s.mu + 3*s.sigma OR f.price < s.mu - 3*s.sigma)\nLIMIT {{limit_sample}};" + }, + "business_caliber": "异常定义:价格超出当日均值±3×标准差(总体标准差)。", + "examples": [ + "近30天价格异常样本", + "促销期异常价监控" + ] + }, + { + "id": "snpt_sample_recent_orders", + "title": "近期明细抽样", + "desc": "抽样查看近期订单核心字段", + "type": "sample", + "applicability": { + "required_columns": [ + "order_date", + "order_id", + "customer_id", + "product_id", + "category", + "price", + "quantity", + "channel", + "payment_method", + "delivery_status" + ], + "time_column": "order_date", + "constraints": { + "dim_cardinality_hint": null, + "fk_join_available": true, + "notes": [ + "为保护隐私,不展示shipping_address与billing_address", + "仅用于人工核验" + ] + } + }, + "variables": [ + { + "name": "start_date", + "type": "date" + }, + { + "name": "end_date", + "type": "date" + }, + { + "name": "limit_rows", + "type": "int", + "default": 100 + } + ], + "dialect_sql": { + "mysql": "SELECT DATE(order_date) AS dt,\n order_id, customer_id, product_id, category,\n price, quantity, channel, payment_method, delivery_status\nFROM {{table}}\nWHERE DATE(order_date) BETWEEN {{start_date}} AND {{end_date}}\nORDER BY dt DESC\nLIMIT {{limit_rows}};" + }, + "business_caliber": "明细抽样用于数据核验;不输出PII地址信息。", + "examples": [ + "抽样查看上周订单", + "核对节假日订单明细" + ] + }, + { + "id": "snpt_filter_paid_delivered", + "title": "支付已送达筛选", + "desc": "过滤支付方式为信用卡且配送状态为已送达", + "type": "sample", + "applicability": { + "required_columns": [ + "payment_method", + "delivery_status" + ], + "time_column": null, + "constraints": { + "dim_cardinality_hint": 5, + "fk_join_available": false, + "notes": [ + "此片段为WHERE条件模板,可拼接到任意查询", + "delivery_status枚举包含Delivered/Pending/Returned/Shipped" + ] + } + }, + "variables": [], + "dialect_sql": { + "mysql": "WHERE payment_method = 'Credit Card' AND delivery_status = 'Delivered'" + }, + "business_caliber": "口径:支付渠道=信用卡;物流状态=已送达(Delivered)。可与时间或维度条件叠加。", + "examples": [ + "筛选信用卡已送达订单", + "在TopN商品中仅看已送达信用卡订单" + ] + }, + { + "id": "snpt_filter_device_channel", + "title": "设备渠道筛选", + "desc": "按设备类型与渠道过滤分析范围", + "type": "sample", + "applicability": { + "required_columns": [ + "device_type", + "channel" + ], + "time_column": null, + "constraints": { + "dim_cardinality_hint": 7, + "fk_join_available": false, + "notes": [ + "device_type枚举:Desktop/Mobile/Tablet", + "channel枚举:Email/Organic/Paid Search/Social" + ] + } + }, + "variables": [], + "dialect_sql": { + "mysql": "WHERE device_type IN ('Mobile','Desktop') AND channel IN ('Paid Search','Social')" + }, + "business_caliber": "限制分析在指定设备与渠道;可直接作为WHERE子句片段复用。", + "examples": [ + "仅看移动端付费渠道GMV", + "桌面+社媒渠道订单明细" + ] + } +] \ No newline at end of file diff --git a/demo/snippet_alias_generator.json b/demo/snippet_alias_generator.json new file mode 100644 index 0000000..0c592dc --- /dev/null +++ b/demo/snippet_alias_generator.json @@ -0,0 +1,499 @@ +[ + { + "id": "snpt_daily_gmv_trend", + "aliases": [ + { + "text": "每日GMV走势", + "tone": "中性" + }, + { + "text": "日销售额趋势", + "tone": "中性" + }, + { + "text": "每天卖了多少", + "tone": "口语" + }, + { + "text": "按日GMV曲线", + "tone": "专业" + } + ], + "keywords": [ + "GMV", + "销售额", + "日趋势", + "每日", + "订单量", + "orders", + "price", + "quantity", + "order_date", + "time series", + "趋势图", + "按日聚合" + ], + "intent_tags": [ + "trend" + ] + }, + { + "id": "snpt_daily_gmv_ma7", + "aliases": [ + { + "text": "GMV七日均线", + "tone": "专业" + }, + { + "text": "7天滑动平均", + "tone": "中性" + }, + { + "text": "GMV周均走势", + "tone": "中性" + }, + { + "text": "GMV平滑曲线", + "tone": "专业" + } + ], + "keywords": [ + "GMV", + "移动平均", + "MA7", + "七日均线", + "滑动窗口", + "time series", + "order_date", + "price", + "quantity", + "平滑", + "趋势", + "按日聚合" + ], + "intent_tags": [ + "trend" + ] + }, + { + "id": "snpt_yoy_daily_gmv", + "aliases": [ + { + "text": "GMV日同比", + "tone": "专业" + }, + { + "text": "每日同比增速", + "tone": "中性" + }, + { + "text": "跟去年同日比", + "tone": "口语" + }, + { + "text": "GMV YoY(日)", + "tone": "专业" + } + ], + "keywords": [ + "同比", + "YoY", + "GMV", + "去年同日", + "增长率", + "price", + "quantity", + "order_date", + "对比分析", + "比值", + "日粒度", + "ratio" + ], + "intent_tags": [ + "ratio" + ] + }, + { + "id": "snpt_topn_category_gmv", + "aliases": [ + { + "text": "类目GMV排行", + "tone": "中性" + }, + { + "text": "类目TopN销量", + "tone": "中性" + }, + { + "text": "哪个分类最卖", + "tone": "口语" + }, + { + "text": "按类目GMV排序", + "tone": "专业" + } + ], + "keywords": [ + "TopN", + "分类", + "类目", + "category", + "GMV", + "price", + "quantity", + "排行", + "榜单", + "按类目聚合", + "订单量", + "销量" + ], + "intent_tags": [ + "topn", + "by_dimension" + ] + }, + { + "id": "snpt_share_channel", + "aliases": [ + { + "text": "渠道GMV占比", + "tone": "中性" + }, + { + "text": "各渠道份额", + "tone": "中性" + }, + { + "text": "哪个渠道占多", + "tone": "口语" + }, + { + "text": "渠道结构占比", + "tone": "专业" + } + ], + "keywords": [ + "占比", + "份额", + "share", + "channel", + "GMV", + "price", + "quantity", + "比例", + "结构分析", + "按渠道聚合", + "饼图", + "堆叠" + ], + "intent_tags": [ + "ratio", + "by_dimension" + ] + }, + { + "id": "snpt_topn_product_gmv", + "aliases": [ + { + "text": "商品GMV排行", + "tone": "中性" + }, + { + "text": "热销商品TopN", + "tone": "中性" + }, + { + "text": "哪款卖得最好", + "tone": "口语" + }, + { + "text": "按商品GMV排序", + "tone": "专业" + } + ], + "keywords": [ + "TopN", + "product_id", + "商品", + "GMV", + "price", + "quantity", + "热销", + "排行", + "销量", + "订单数", + "高基数", + "榜单" + ], + "intent_tags": [ + "topn", + "by_dimension" + ] + }, + { + "id": "snpt_join_product_dim", + "aliases": [ + { + "text": "关联商品维度", + "tone": "专业" + }, + { + "text": "商品ID联表", + "tone": "中性" + }, + { + "text": "把商品名连上", + "tone": "口语" + }, + { + "text": "product维表join", + "tone": "专业" + } + ], + "keywords": [ + "join", + "维表", + "product_id", + "维度扩展", + "明细补充", + "维度属性", + "联表查询", + "外键", + "选择列", + "维度贴标签", + "by id", + "映射" + ], + "intent_tags": [ + "by_dimension" + ] + }, + { + "id": "snpt_join_customer_dim", + "aliases": [ + { + "text": "关联客户维度", + "tone": "专业" + }, + { + "text": "客户ID联表", + "tone": "中性" + }, + { + "text": "把客户信息补齐", + "tone": "口语" + }, + { + "text": "customer维表join", + "tone": "专业" + } + ], + "keywords": [ + "join", + "维表", + "customer_id", + "客户属性", + "GMV聚合", + "外键关联", + "联表查询", + "ID映射", + "维度丰富", + "分群分析", + "by id", + "扩展字段" + ], + "intent_tags": [ + "by_dimension" + ] + }, + { + "id": "snpt_quality_dup_order", + "aliases": [ + { + "text": "订单主键去重检", + "tone": "专业" + }, + { + "text": "重复order_id查找", + "tone": "中性" + }, + { + "text": "有没重复订单", + "tone": "口语" + }, + { + "text": "主键唯一性校验", + "tone": "专业" + } + ], + "keywords": [ + "数据质量", + "重复", + "去重", + "order_id", + "唯一性", + "主键检查", + "异常数据", + "质量预警", + "count>1", + "样本抽取", + "校验", + "重复检测" + ], + "intent_tags": [ + "quality" + ] + }, + { + "id": "snpt_quality_price_outlier", + "aliases": [ + { + "text": "价格3σ异常检", + "tone": "专业" + }, + { + "text": "当日异常价格", + "tone": "中性" + }, + { + "text": "看哪单价格怪", + "tone": "口语" + }, + { + "text": "价格离群监控", + "tone": "专业" + } + ], + "keywords": [ + "异常检测", + "3σ", + "stddev", + "价格", + "price", + "离群点", + "质量规则", + "time series", + "order_date", + "阈值告警", + "数据监控", + "波动" + ], + "intent_tags": [ + "quality" + ] + }, + { + "id": "snpt_sample_recent_orders", + "aliases": [ + { + "text": "近期明细抽样", + "tone": "中性" + }, + { + "text": "抽查最近订单", + "tone": "口语" + }, + { + "text": "近期订单样本", + "tone": "中性" + }, + { + "text": "核验明细抽样", + "tone": "专业" + } + ], + "keywords": [ + "抽样", + "sample", + "明细", + "order_date", + "order_id", + "customer_id", + "product_id", + "category", + "channel", + "payment_method", + "delivery_status", + "核验" + ], + "intent_tags": [ + "by_dimension" + ] + }, + { + "id": "snpt_filter_paid_delivered", + "aliases": [ + { + "text": "信用卡送达筛选", + "tone": "中性" + }, + { + "text": "只看信用卡已送达", + "tone": "口语" + }, + { + "text": "信用卡且已送达", + "tone": "中性" + }, + { + "text": "付款信用卡已送达", + "tone": "专业" + } + ], + "keywords": [ + "支付方式", + "信用卡", + "Credit Card", + "配送状态", + "Delivered", + "已送达", + "过滤条件", + "where子句", + "订单筛选", + "支付渠道", + "状态筛选", + "条件片段" + ], + "intent_tags": [ + "by_dimension" + ] + }, + { + "id": "snpt_filter_device_channel", + "aliases": [ + { + "text": "设备渠道筛选", + "tone": "中性" + }, + { + "text": "只看移动付费社媒", + "tone": "口语" + }, + { + "text": "设备+渠道过滤", + "tone": "专业" + }, + { + "text": "端与渠道条件", + "tone": "中性" + } + ], + "keywords": [ + "device_type", + "channel", + "设备类型", + "渠道", + "过滤条件", + "where子句", + "Mobile", + "Desktop", + "Paid Search", + "Social", + "范围限定", + "条件片段" + ], + "intent_tags": [ + "by_dimension" + ] + } +] \ No newline at end of file diff --git a/demo/snippet_alias_generator.txt b/demo/snippet_alias_generator.txt new file mode 100644 index 0000000..2482ab0 --- /dev/null +++ b/demo/snippet_alias_generator.txt @@ -0,0 +1,52 @@ +系统角色(System) +你是“SQL片段别名生成器”。 +输入为一个或多个 SQL 片段对象(来自 snippet.json),输出为针对每个片段生成的多样化别名(口语 / 中性 / 专业)、关键词与意图标签。 +要求逐个处理所有片段对象,输出同样数量的 JSON 元素。 + +用户消息(User) +【上下文】 + +SQL片段对象数组:{{SNIPPET_ARRAY}} // snippet.json中的一个或多个片段 + +【任务要求】 +请针对输入数组中的 每个 SQL 片段,输出一个 JSON 对象,结构如下: + +{ + "id": "<与输入片段id一致>", + "aliases": [ + {"text": "…", "tone": "口语|中性|专业"}, + {"text": "…", "tone": "专业"} + ], + "keywords": [ + "GMV","销售额","TopN","category","类目","趋势","同比","客户","订单","质量","异常检测","join","过滤","sample" + ], + "intent_tags": ["aggregate","trend","topn","ratio","quality","join","sample","filter","by_dimension"] +} + +生成逻辑规范 +1.逐条输出:输入数组中每个片段对应一个输出对象(id 保持一致)。 + +2.aliases生成 +至少 3 个别名,分别覆盖语气类型:口语 / 中性 / 专业。 +≤20字,语义需等价,不得添加不存在的字段或业务口径。 +示例: + GMV趋势分析(中性) + 每天卖多少钱(口语) + 按日GMV曲线(专业) +3.keywords生成 +8~15个关键词,需涵盖片段核心维度、指标、分析类型和语义近义词。 +中英文混合(如 "GMV"/"销售额"、"同比"/"YoY"、"类目"/"category" 等)。 +包含用于匹配的分析意图关键词(如 “趋势”、“排行”、“占比”、“质量检查”、“过滤” 等)。 + +4.intent_tags生成 + +从以下集合中选取,与片段type及用途一致: +["aggregate","trend","topn","ratio","quality","join","sample","filter","by_dimension"] + +若为条件片段(WHERE句型),补充 "filter";若含维度分组逻辑,补充 "by_dimension"。 + +5.语言与内容要求 + +保持正式书面风格,不添加解释说明。 + +只输出JSON数组,不包含文字描述或额外文本。 \ No newline at end of file diff --git a/demo/snippet_generator.txt b/demo/snippet_generator.txt new file mode 100644 index 0000000..1d0e1c0 --- /dev/null +++ b/demo/snippet_generator.txt @@ -0,0 +1,46 @@ +系统角色(System) +你是“SQL片段生成器”。只能基于给定“表画像”生成可复用的分析片段。 +为每个片段产出:标题、用途描述、片段类型、变量、适用条件、SQL模板(mysql方言),并注明业务口径与安全限制。 +不要发明画像里没有的列。时间/维度/指标须与画像匹配。 + +用户消息(User) +【表画像JSON】 +{{TABLE_PROFILE_JSON}} + +【输出要求(只输出JSON数组)】 +[ + { + "id": "snpt_", + "title": "中文标题(≤16字)", + "desc": "一句话用途", + "type": "aggregate|trend|topn|ratio|quality|join|sample", + "applicability": { + "required_columns": ["", ...], + "time_column": "", + "constraints": { + "dim_cardinality_hint": , // 用于TopN限制与性能提示 + "fk_join_available": true|false, + "notes": ["高基数维度建议LIMIT<=50", "..."] + } + }, + "variables": [ + {"name":"start_date","type":"date"}, + {"name":"end_date","type":"date"}, + {"name":"top_n","type":"int","default":10} + ], + "dialect_sql": { + "mysql": "" + }, + "business_caliber": "清晰口径说明,如 UV以device_id去重;粒度=日-类目", + "examples": ["示例问法1","示例问法2"] + } +] + +【片段选择建议】 +- 若存在 time 列:生成 trend_by_day / yoy_qoq / moving_avg。 +- 若存在 enumish 维度(distinct 5~200):生成 topn_by_dimension / share_of_total。 +- 若 metric 列:生成 sum/avg/max、分位数/异常检测(3σ/箱线)。 +- 有主键/唯一:生成 去重/明细抽样/质量检查。 +- 有 fk_candidates:同时生成“join维表命名版”和“纯ID版”。 +- 高枚举维度:在 constraints.notes 中强调 LIMIT 建议与可能的性能风险。 +- 除了完整的sql片段,还有sql里部分内容的sql片段,比如 where payment_method = 'Credit Card' and delivery_status = 'Deliverd' 的含义是支付方式为信用卡且配送状态是已送达 \ No newline at end of file diff --git a/demo/table-desc.json b/demo/table-desc.json new file mode 100644 index 0000000..4f75d31 --- /dev/null +++ b/demo/table-desc.json @@ -0,0 +1,277 @@ +{ + "table": "ecommerce_orders", + "row_count": 10000, + "role": "fact", + "grain": ["order_id"], + "time": { + "column": "order_date", + "granularity": "day", + "range": ["2024-04-20", "2025-04-19"], + "has_gaps": false + }, + "columns": [ + { + "name": "order_id", + "dtype": "string", + "semantic_type": "id", + "null_rate": 0.0, + "distinct_count": 10000, + "distinct_ratio": 1.0, + "stats": {"min": null, "max": null, "mean": null, "std": null, "skewness": null}, + "enumish": false, + "top_values": [], + "pk_candidate_score": 1.0, + "metric_candidate_score": 0.0, + "comment": "" + }, + { + "name": "customer_id", + "dtype": "integer", + "semantic_type": "dimension", + "null_rate": 0.0, + "distinct_count": 2713, + "distinct_ratio": 0.2713, + "stats": {"min": 1, "max": 2999, "mean": 995.29, "std": null, "skewness": null}, + "enumish": false, + "top_values": [], + "pk_candidate_score": 0.3, + "metric_candidate_score": 0.1, + "comment": "" + }, + { + "name": "product_id", + "dtype": "integer", + "semantic_type": "dimension", + "null_rate": 0.0, + "distinct_count": 1000, + "distinct_ratio": 0.0999, + "stats": {"min": 1, "max": 1000, "mean": 504.87, "std": null, "skewness": null}, + "enumish": true, + "top_values": [], + "pk_candidate_score": 0.1, + "metric_candidate_score": 0.1, + "comment": "" + }, + { + "name": "category", + "dtype": "string", + "semantic_type": "dimension", + "null_rate": 0.0, + "distinct_count": 6, + "distinct_ratio": 0.0006, + "stats": {"min": null, "max": null, "mean": null, "std": null, "skewness": null}, + "enumish": true, + "top_values": [ + {"value": "Beauty", "pct": null}, + {"value": "Books", "pct": null}, + {"value": "Clothing", "pct": null}, + {"value": "Electronics", "pct": null}, + {"value": "Home", "pct": null}, + {"value": "Toys", "pct": null} + ], + "pk_candidate_score": 0.0, + "metric_candidate_score": 0.0, + "comment": "" + }, + { + "name": "price", + "dtype": "float", + "semantic_type": "metric", + "null_rate": 0.0, + "distinct_count": 9013, + "distinct_ratio": 0.9013, + "stats": {"min": 5.06, "max": 499.93, "mean": 252.55, "std": null, "skewness": null}, + "enumish": false, + "top_values": [], + "pk_candidate_score": 0.0, + "metric_candidate_score": 0.9, + "comment": "" + }, + { + "name": "quantity", + "dtype": "integer", + "semantic_type": "metric", + "null_rate": 0.0, + "distinct_count": 9, + "distinct_ratio": 0.0009, + "stats": {"min": 1, "max": 9, "mean": 2.12, "std": null, "skewness": null}, + "enumish": true, + "top_values": [ + {"value": 1, "pct": null}, + {"value": 2, "pct": null}, + {"value": 3, "pct": null}, + {"value": 4, "pct": null}, + {"value": 5, "pct": null} + ], + "pk_candidate_score": 0.0, + "metric_candidate_score": 0.7, + "comment": "" + }, + { + "name": "order_date", + "dtype": "string", + "semantic_type": "time", + "null_rate": 0.0, + "distinct_count": 365, + "distinct_ratio": 0.0365, + "stats": {"min": "2024-04-20", "max": "2025-04-19", "mean": null, "std": null, "skewness": null}, + "enumish": false, + "top_values": [], + "pk_candidate_score": 0.0, + "metric_candidate_score": 0.0, + "comment": "" + }, + { + "name": "shipping_date", + "dtype": "string", + "semantic_type": "time", + "null_rate": 0.0, + "distinct_count": 371, + "distinct_ratio": 0.0371, + "stats": {"min": "2024-04-21", "max": "2025-04-26", "mean": null, "std": null, "skewness": null}, + "enumish": false, + "top_values": [], + "pk_candidate_score": 0.0, + "metric_candidate_score": 0.0, + "comment": "" + }, + { + "name": "delivery_status", + "dtype": "string", + "semantic_type": "dimension", + "null_rate": 0.0, + "distinct_count": 4, + "distinct_ratio": 0.0004, + "stats": {"min": null, "max": null, "mean": null, "std": null, "skewness": null}, + "enumish": true, + "top_values": [ + {"value": "Delivered", "pct": null}, + {"value": "Pending", "pct": null}, + {"value": "Returned", "pct": null}, + {"value": "Shipped", "pct": null} + ], + "pk_candidate_score": 0.0, + "metric_candidate_score": 0.0, + "comment": "" + }, + { + "name": "payment_method", + "dtype": "string", + "semantic_type": "dimension", + "null_rate": 0.0, + "distinct_count": 5, + "distinct_ratio": 0.0005, + "stats": {"min": null, "max": null, "mean": null, "std": null, "skewness": null}, + "enumish": true, + "top_values": [ + {"value": "Apple Pay", "pct": null}, + {"value": "Credit Card", "pct": null}, + {"value": "Debit Card", "pct": null}, + {"value": "Google Pay", "pct": null}, + {"value": "PayPal", "pct": null} + ], + "pk_candidate_score": 0.0, + "metric_candidate_score": 0.0, + "comment": "" + }, + { + "name": "device_type", + "dtype": "string", + "semantic_type": "dimension", + "null_rate": 0.0, + "distinct_count": 3, + "distinct_ratio": 0.0003, + "stats": {"min": null, "max": null, "mean": null, "std": null, "skewness": null}, + "enumish": true, + "top_values": [ + {"value": "Desktop", "pct": null}, + {"value": "Mobile", "pct": null}, + {"value": "Tablet", "pct": null} + ], + "pk_candidate_score": 0.0, + "metric_candidate_score": 0.0, + "comment": "" + }, + { + "name": "channel", + "dtype": "string", + "semantic_type": "dimension", + "null_rate": 0.0, + "distinct_count": 4, + "distinct_ratio": 0.0004, + "stats": {"min": null, "max": null, "mean": null, "std": null, "skewness": null}, + "enumish": true, + "top_values": [ + {"value": "Email", "pct": null}, + {"value": "Organic", "pct": null}, + {"value": "Paid Search", "pct": null}, + {"value": "Social", "pct": null} + ], + "pk_candidate_score": 0.0, + "metric_candidate_score": 0.0, + "comment": "" + }, + { + "name": "shipping_address", + "dtype": "string", + "semantic_type": "text", + "null_rate": 0.0, + "distinct_count": 10000, + "distinct_ratio": 1.0, + "stats": {"min": null, "max": null, "mean": null, "std": null, "skewness": null}, + "enumish": false, + "top_values": [], + "pk_candidate_score": 0.9, + "metric_candidate_score": 0.0, + "comment": "" + }, + { + "name": "billing_address", + "dtype": "string", + "semantic_type": "text", + "null_rate": 0.0, + "distinct_count": 10000, + "distinct_ratio": 1.0, + "stats": {"min": null, "max": null, "mean": null, "std": null, "skewness": null}, + "enumish": false, + "top_values": [], + "pk_candidate_score": 0.9, + "metric_candidate_score": 0.0, + "comment": "" + }, + { + "name": "customer_segment", + "dtype": "string", + "semantic_type": "dimension", + "null_rate": 0.0, + "distinct_count": 3, + "distinct_ratio": 0.0003, + "stats": {"min": null, "max": null, "mean": null, "std": null, "skewness": null}, + "enumish": true, + "top_values": [ + {"value": "New", "pct": null}, + {"value": "Returning", "pct": null}, + {"value": "VIP", "pct": null} + ], + "pk_candidate_score": 0.0, + "metric_candidate_score": 0.0, + "comment": "" + } + ], + "primary_key_candidates": [["order_id"]], + "fk_candidates": [ + {"from": "customer_id", "to": "dim_customer(customer_id)", "confidence": 0.9}, + {"from": "product_id", "to": "dim_product(product_id)", "confidence": 0.9} + ], + "quality": { + "failed_expectations": [], + "warning_hints": [] + }, + "confidence_notes": [ + "表含时间列(order_date, shipping_date)且含度量列(price, quantity),推断为fact表。", + "order_id唯一性=1.0,确认主键。", + "order_date日期范围连续无缺口,粒度为日级。", + "高基数数值字段(price, quantity)符合指标特征。", + "低熵字段(category, delivery_status, payment_method等)为枚举维度。" + ] +} diff --git a/demo/user-query.json b/demo/user-query.json new file mode 100644 index 0000000..fbc0762 --- /dev/null +++ b/demo/user-query.json @@ -0,0 +1,102 @@ +[ + { + "question": "近一年每个月的销售额和订单量变化趋势如何?", + "intent": "trend_analysis", + "related_fields": ["order_date", "price", "quantity"] + }, + { + "question": "哪个产品类目的GMV最高?", + "intent": "topn_category", + "related_fields": ["category", "price", "quantity"] + }, + { + "question": "不同支付方式的订单数量和平均客单价是多少?", + "intent": "aggregate_comparison", + "related_fields": ["payment_method", "price", "quantity"] + }, + { + "question": "各营销渠道(如Paid Search、Social)的GMV占比是多少?", + "intent": "ratio_analysis", + "related_fields": ["channel", "price", "quantity"] + }, + { + "question": "移动端和桌面端的订单表现差异大吗?", + "intent": "device_comparison", + "related_fields": ["device_type", "price", "quantity"] + }, + { + "question": "已送达订单的平均配送时长是多少天?", + "intent": "shipping_time_analysis", + "related_fields": ["order_date", "shipping_date", "delivery_status"] + }, + { + "question": "退货(Returned)订单主要集中在哪些产品类目?", + "intent": "return_analysis", + "related_fields": ["delivery_status", "category"] + }, + { + "question": "不同客户类型(新客、回头客、VIP)的平均订单金额是多少?", + "intent": "segment_analysis", + "related_fields": ["customer_segment", "price", "quantity"] + }, + { + "question": "每个客户的平均下单频率是多少?", + "intent": "customer_behavior", + "related_fields": ["customer_id", "order_date"] + }, + { + "question": "近期是否存在价格异常或超高订单?", + "intent": "quality_outlier", + "related_fields": ["price", "order_date"] + }, + { + "question": "哪个支付方式的退货率最高?", + "intent": "return_ratio_by_payment", + "related_fields": ["payment_method", "delivery_status"] + }, + { + "question": "哪些商品在VIP客户中最受欢迎?", + "intent": "vip_product_preference", + "related_fields": ["customer_segment", "product_id", "price", "quantity"] + }, + { + "question": "下单后平均几天发货?", + "intent": "shipping_speed", + "related_fields": ["order_date", "shipping_date"] + }, + { + "question": "从哪些渠道来的新用户最多?", + "intent": "user_acquisition_channel", + "related_fields": ["channel", "customer_segment"] + }, + { + "question": "订单数量在周末和工作日有什么差异?", + "intent": "weekday_pattern", + "related_fields": ["order_date"] + }, + { + "question": "每个设备类型的平均订单金额是多少?", + "intent": "device_gmv_comparison", + "related_fields": ["device_type", "price", "quantity"] + }, + { + "question": "本月退货率与上月相比是否上升?", + "intent": "return_trend", + "related_fields": ["delivery_status", "order_date"] + }, + { + "question": "哪些客户下单金额最高?", + "intent": "top_customers", + "related_fields": ["customer_id", "price", "quantity"] + }, + { + "question": "不同类目的平均客单价(GMV/订单量)是多少?", + "intent": "category_avg_order_value", + "related_fields": ["category", "price", "quantity"] + }, + { + "question": "不同渠道的订单平均转化周期(下单到发货)是多少?", + "intent": "conversion_cycle", + "related_fields": ["channel", "order_date", "shipping_date"] + } +] diff --git a/file/全国品牌.xlsx b/file/全国品牌.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..1b1735a7f851c2c94f127a4153cfb604261ba673 GIT binary patch literal 15007 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�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%0A{#82$&IqM>aa@7*1~wHHq*vN5 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 YAcF*J$$zzDe1Hk8Nvd|k{4>D+0Mpwx_y7O^ literal 0 HcmV?d00001 diff --git a/ge_v1.py b/ge_v1.py new file mode 100644 index 0000000..e1165fa --- /dev/null +++ b/ge_v1.py @@ -0,0 +1,332 @@ +"""Great Expectations profiling helper for Excel sources. + +This script loads a user-provided Excel file into pandas, profiles it with +Great Expectations, writes a lightweight analysis summary to JSON, and exposes +the path to GE Data Docs for manual inspection. +""" + +from __future__ import annotations + +import argparse +import json +import os +import shutil +from pathlib import Path +from typing import Any, Dict + +import numpy as np +import pandas as pd +import great_expectations as gx +from great_expectations.core.batch import RuntimeBatchRequest +from great_expectations.data_context import FileDataContext +from great_expectations.exceptions import ( + DataContextError, + InvalidDataContextConfigError, +) + +try: + from great_expectations.profile.user_configurable_profiler import ( + UserConfigurableProfiler, + ) +except ImportError: + try: + from great_expectations.profiler.user_configurable_profiler import ( + UserConfigurableProfiler, + ) + except ImportError as err: + raise ImportError( + "UserConfigurableProfiler is not available; please install a compatible " + "version of great_expectations (>=0.15,<0.19) or add the profiling extra." + ) from err + + +RESULTS_DIR = Path("results") +DEFAULT_EXCEL_PATH = Path("file") / "全国品牌.xlsx" +DEFAULT_BATCH_ID = "initial_profile" + + +def parse_cli_args() -> argparse.Namespace: + """Parse command line options for Excel ingestion.""" + + parser = argparse.ArgumentParser(description="Profile an Excel file with GE") + parser.add_argument( + "--excel-path", + type=Path, + default=DEFAULT_EXCEL_PATH, + help="Path to the Excel file to analyse (default: ./file/全国品牌.xlsx)", + ) + parser.add_argument( + "--sheet-name", + default=0, + help="Excel sheet name or index to load (default: 0)", + ) + parser.add_argument( + "--header-row", + type=int, + default=0, + help="Row index (0-based) to use as the header (default: 0)", + ) + parser.add_argument( + "--clean-results", + action="store_true", + help="Remove the previous results directory before running", + ) + parser.add_argument( + "--ge-root", + type=Path, + default=Path("gx_project"), + help="Directory to host the Great Expectations project (default: ./gx_project)", + ) + return parser.parse_args() + + +def reset_results_dir(clean_results: bool) -> None: + """Remove prior results folder when requested and ensure directory exists.""" + + if clean_results and RESULTS_DIR.exists(): + shutil.rmtree(RESULTS_DIR) + RESULTS_DIR.mkdir(parents=True, exist_ok=True) + + +def load_excel_as_dataframe(excel_path: Path, sheet_name: Any, header_row: int) -> pd.DataFrame: + """Load Excel data into a DataFrame and provide basic logging.""" + + if not excel_path.exists(): + raise FileNotFoundError(f"Excel file not found: {excel_path}") + + df = pd.read_excel(excel_path, sheet_name=sheet_name, header=header_row) + print(f"Loaded Excel data: {excel_path} ({len(df)} rows, {len(df.columns)} columns)") + return df + + +def get_datasource_config(datasource_name: str, data_connector_name: str) -> Dict[str, Any]: + """Assemble a minimal Pandas datasource configuration.""" + + return { + "name": datasource_name, + "class_name": "Datasource", + "execution_engine": {"class_name": "PandasExecutionEngine"}, + "data_connectors": { + data_connector_name: { + "class_name": "RuntimeDataConnector", + "runtime_keys": ["batch_id"], + } + }, + } + + +def clean_value(value: Any) -> Any: + """Convert numpy/pandas scalar types into JSON serialisable values.""" + + if isinstance(value, (np.generic,)): + return value.item() + if isinstance(value, pd.Timestamp): + return value.isoformat() + if pd.isna(value): + return None + return value + + +def build_column_profile(series: pd.Series) -> Dict[str, Any]: + """Generate a compact per-column profile for JSON output.""" + + stats = series.describe() + profiled_stats = {key: clean_value(val) for key, val in stats.items()} + + return { + "name": str(series.name), + "dtype": str(series.dtype), + "non_null_count": int(series.count()), + "null_count": int(series.isna().sum()), + "unique_count": int(series.nunique(dropna=True)), + "stats": profiled_stats, + } + + +def build_analysis_summary(df: pd.DataFrame, sample_size: int = 5) -> Dict[str, Any]: + """Collate basic statistics to accompany GE outputs.""" + + summary = { + "shape": {"rows": int(df.shape[0]), "columns": int(df.shape[1])}, + "columns": [build_column_profile(df[col]) for col in df.columns], + "sample_rows": [ + {key: clean_value(value) for key, value in row.items()} for row in df.head(sample_size).to_dict(orient="records") + ], + } + return summary + + +def serialize_batch_request(batch_request: Any) -> Dict[str, Any]: + """Convert differing batch request types into plain dictionaries.""" + + if hasattr(batch_request, "to_json_dict"): + return batch_request.to_json_dict() + if hasattr(batch_request, "dict"): + return batch_request.dict() + if hasattr(batch_request, "model_dump"): + return batch_request.model_dump() + return {"repr": repr(batch_request)} + + +def ensure_data_context(ge_root: Path) -> gx.DataContext: + """Create or repair a file-backed GE data context as needed.""" + + ge_root = ge_root.resolve() + config_path = ge_root / "gx" / "great_expectations.yml" + if not config_path.exists(): + FileDataContext.create(project_root_dir=str(ge_root)) + + try: + return gx.get_context(project_root_dir=str(ge_root)) + except InvalidDataContextConfigError: + print("Existing Great Expectations config invalid; recreating project root.") + shutil.rmtree(ge_root, ignore_errors=True) + FileDataContext.create(project_root_dir=str(ge_root)) + return gx.get_context(project_root_dir=str(ge_root)) + + +def run_ge_profiling( + context: gx.DataContext, + df: pd.DataFrame, + datasource_name: str, + data_connector_name: str, + data_asset_name: str, + expectation_suite_name: str, +) -> Dict[str, Any]: + """Register datasource, build expectations, and capture validation results.""" + + if hasattr(context, "sources"): + datasource = context.sources.add_or_update_pandas(name=datasource_name) + try: + datasource.delete_asset(data_asset_name) + except (gx.exceptions.DataConnectorError, ValueError, KeyError, LookupError, AttributeError): + pass + asset = datasource.add_dataframe_asset(name=data_asset_name) + batch_request = asset.build_batch_request(dataframe=df) + print(f"Datasource registered (fluent): {datasource_name}") + else: + datasource_config = get_datasource_config(datasource_name, data_connector_name) + try: + context.add_datasource(**datasource_config) + print(f"Datasource registered: {datasource_name}") + except gx.exceptions.GreatExpectationsError as err: + print(f"Datasource registration issue: {err}") + batch_request = RuntimeBatchRequest( + datasource_name=datasource_name, + data_connector_name=data_connector_name, + data_asset_name=data_asset_name, + runtime_parameters={"batch_data": df}, + batch_identifiers={"batch_id": DEFAULT_BATCH_ID}, + ) + + try: + context.delete_expectation_suite(expectation_suite_name=expectation_suite_name) + except DataContextError: + pass + + if hasattr(context, "create_expectation_suite"): + context.create_expectation_suite( + expectation_suite_name=expectation_suite_name, overwrite_existing=True + ) + else: + context.add_expectation_suite(expectation_suite_name=expectation_suite_name) + + validator = context.get_validator( + batch_request=batch_request, expectation_suite_name=expectation_suite_name + ) + profiler = UserConfigurableProfiler(profile_dataset=validator) + expectation_suite = profiler.build_suite() + context.add_or_update_expectation_suite(expectation_suite=expectation_suite) + validation_result = validator.validate(result_format="SUMMARY") + + context.build_data_docs() + data_docs_path = ( + Path(context.root_directory) + / "uncommitted" + / "data_docs" + / "local_site" + / "index.html" + ) + + print( + f"Expectation suite saved: {expectation_suite_name} ({len(expectation_suite.expectations)} expectations)" + ) + + return { + "batch_request": serialize_batch_request(batch_request), + "expectation_suite_name": expectation_suite_name, + "expectations_count": len(expectation_suite.expectations), + "validation_result": validation_result.to_json_dict(), + "data_docs_path": os.path.abspath(data_docs_path), + } + + +def assemble_payload( + excel_path: Path, + sheet_name: Any, + dataframe_summary: Dict[str, Any], + ge_summary: Dict[str, Any], +) -> Dict[str, Any]: + """Combine pandas and GE artefacts into a single JSON payload.""" + + return { + "source": { + "excel_path": str(excel_path.resolve()), + "sheet_name": sheet_name, + }, + "analysis": dataframe_summary, + "great_expectations": ge_summary, + } + + +def save_json_payload(payload: Dict[str, Any], output_path: Path) -> None: + """Persist the combined analysis payload to disk.""" + + output_path.parent.mkdir(parents=True, exist_ok=True) + with output_path.open("w", encoding="utf-8") as f: + json.dump(payload, f, ensure_ascii=False, indent=2) + print(f"JSON analysis saved to: {output_path}") + + +def main() -> None: + args = parse_cli_args() + reset_results_dir(clean_results=args.clean_results) + + context = ensure_data_context(args.ge_root) + print(f"Great Expectations Data Context initialized at {context.root_directory}.") + + df = load_excel_as_dataframe(args.excel_path, args.sheet_name, args.header_row) + dataframe_summary = build_analysis_summary(df) + + file_stem = args.excel_path.stem + datasource_name = f"{file_stem}_datasource" + data_connector_name = "runtime_data_connector" + data_asset_name = f"{file_stem}_asset" + expectation_suite_name = f"{file_stem}_suite" + + ge_summary = run_ge_profiling( + context, + df, + datasource_name, + data_connector_name, + data_asset_name, + expectation_suite_name, + ) + + payload = assemble_payload( + excel_path=args.excel_path, + sheet_name=args.sheet_name, + dataframe_summary=dataframe_summary, + ge_summary=ge_summary, + ) + + output_path = RESULTS_DIR / f"{file_stem}_analysis.json" + save_json_payload(payload, output_path) + + print( + f"Data Docs generated. Open in browser: file://{ge_summary['data_docs_path']}" + ) + + +if __name__ == "__main__": + main() diff --git a/ge_v2.py b/ge_v2.py new file mode 100644 index 0000000..68d7a42 --- /dev/null +++ b/ge_v2.py @@ -0,0 +1,104 @@ +import great_expectations as gx +from datasets import load_dataset +import pandas as pd +import os +import webbrowser +from great_expectations.profile.user_configurable_profiler import ( + UserConfigurableProfiler, +) + +# --- 1. 加载Hugging Face数据集并转换为Pandas DataFrame --- +print("🚚 1. 从Hugging Face加载 'millat/e-commerce-orders' 数据集...") +# 加载数据集,只取训练集部分 +hf_dataset = load_dataset("millat/e-commerce-orders", split="train") +# 转换为Pandas DataFrame,这是GX最常使用的数据格式 +df = hf_dataset.to_pandas() +print(f"✅ 数据集加载成功,包含 {len(df)} 行数据。") +print("\n📝 数据集前5行预览:") +print(df.head()) + + +# --- 2. 初始化Great Expectations (GX) 项目 --- +# 这将在当前目录下创建一个名为 "ge_project" 的文件夹来存放所有GX的配置和结果 +print("\n🏗️ 2. 初始化Great Expectations项目...") +context = gx.get_context() +print("✅ GX项目上下文(Context)创建成功。") + + +# --- 3. 添加数据源并将DataFrame连接到GX --- +# 我们将Pandas DataFrame添加为一个数据源,这样GX就知道如何访问它 +print("\n🔗 3. 将DataFrame添加为GX的数据源...") +datasource_name = "my_ecommerce_datasource" +# Fluent API: add_or_update 确保多次运行脚本也不会重复出错 +datasource = context.sources.add_or_update_pandas(name=datasource_name) + +data_asset_name = "orders_table" +data_asset = datasource.add_dataframe_asset(name=data_asset_name, dataframe=df) +print("✅ 数据源和数据资产(Data Asset)配置完成。") + + +# --- 4. 使用自动剖析器生成期望套件 --- +print("\n🔍 4. 使用自动剖析器 (Profiler) 扫描数据并生成期望...") +# 创建一个请求,告诉GX我们要处理哪个数据资产 +batch_request = data_asset.build_batch_request() + +# 定义期望套件的名称 +expectation_suite_name = "ecommerce_profiling_suite" +# 创建或获取期望套件 +try: + suite = context.get_expectation_suite(expectation_suite_name=expectation_suite_name) + print(f" - 已找到现有的期望套件 '{expectation_suite_name}'。") +except gx.exceptions.DataContextError: + suite = context.add_expectation_suite(expectation_suite_name=expectation_suite_name) + print(f" - 已创建新的期望套件 '{expectation_suite_name}'。") + +# 构建一个 Validator,供剖析器消费 +validator = context.get_validator( + batch_request=batch_request, + expectation_suite_name=expectation_suite_name, +) +# 这是核心步骤:使用 UserConfigurableProfiler 自动分析数据并创建期望 +profiler = UserConfigurableProfiler(profile_dataset=validator) +suite = profiler.build_suite() +# 保存由剖析器生成的期望套件 +context.save_expectation_suite(expectation_suite=suite, expectation_suite_name=expectation_suite_name) +print("✅ 自动剖析完成,期望已生成并保存。") + + +# --- 5. 创建并运行检查点(Checkpoint)以验证数据 --- +print("\n🛡️ 5. 创建并运行检查点 (Checkpoint) 以验证数据...") +checkpoint_name = "ecommerce_profiling_checkpoint" +try: + # 检查检查点是否已存在 + checkpoint = context.get_checkpoint(name=checkpoint_name) + print(f" - 已加载现有的检查点 '{checkpoint_name}'。") +except gx.exceptions.CheckpointNotFoundError: + # 如果不存在,则创建一个新的 + checkpoint_config = { + "name": checkpoint_name, + "validations": [ + { + "batch_request": batch_request, + "expectation_suite_name": expectation_suite_name, + } + ], + } + context.add_or_update_checkpoint(**checkpoint_config) + checkpoint = context.get_checkpoint(name=checkpoint_name) + print(f" - 已创建新的检查点 '{checkpoint_name}'。") + +# 运行检查点,它会将数据与我们刚刚生成的期望套件进行对比 +checkpoint_result = checkpoint.run() +print("✅ 检查点运行完毕,数据验证完成。") + + +# --- 6. 构建并打开数据文档(Data Docs)查看结果 --- +print("\n📊 6. 构建并打开数据文档 (Data Docs) 查看剖析报告...") +# 这会生成一个HTML报告 +context.build_data_docs() + +# 获取Data Docs的路径并自动在浏览器中打开 +docs_path = os.path.join(context.root_directory, "uncommitted", "data_docs", "local_site", "index.html") +print(f"\n🎉 剖析报告已生成!请在浏览器中查看:\nfile://{os.path.abspath(docs_path)}") + +webbrowser.open(f"file://{os.path.abspath(docs_path)}") diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..bf32ac2 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,11 @@ +fastapi>=0.111.0 +uvicorn[standard]>=0.29.0 +pydantic>=2.6.0 +sqlalchemy>=2.0.28 +pymysql>=1.1.0 +great_expectations>=0.18.0,<0.19.0 +pandas>=2.0 +numpy>=1.24 +openpyxl>=3.1 +httpx==0.27.2 +python-dotenv==1.0.1 diff --git a/scripts/__pycache__/deepseek_request.cpython-312.pyc b/scripts/__pycache__/deepseek_request.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7b67e7bebf9e25ddb3b3adb4aecdfbbeb21223e3 GIT binary patch literal 4748 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 literal 0 HcmV?d00001 diff --git a/scripts/deepseek_request.py b/scripts/deepseek_request.py new file mode 100644 index 0000000..220c28e --- /dev/null +++ b/scripts/deepseek_request.py @@ -0,0 +1,110 @@ +from __future__ import annotations + +import argparse +import asyncio +import json +from typing import Any, Dict + +import httpx + + +DEFAULT_URL = "http://127.0.0.1:8000/v1/chat/completions" + + +def parse_args() -> argparse.Namespace: + parser = argparse.ArgumentParser( + description="Send a DeepSeek chat completion request to the local LLM gateway." + ) + parser.add_argument( + "--url", + default=DEFAULT_URL, + help=f"Gateway endpoint URL (default: {DEFAULT_URL})", + ) + parser.add_argument( + "--model", + default="deepseek-chat", + help="DeepSeek model to use (default: deepseek-chat).", + ) + parser.add_argument( + "--system", + default="You are a helpful assistant.", + help="Optional system prompt.", + ) + parser.add_argument( + "--prompt", + default="写一段简短的中文欢迎词。", + help="User message content to send.", + ) + parser.add_argument( + "--temperature", + type=float, + default=0.7, + help="Sampling temperature.", + ) + parser.add_argument( + "--max-tokens", + type=int, + default=512, + help="Maximum tokens for the response.", + ) + parser.add_argument( + "--stream", + action="store_true", + help="Enable streaming mode (DeepSeek supports it).", + ) + parser.add_argument( + "--extra", + help="Optional JSON string with extra provider parameters.", + ) + return parser.parse_args() + + +async def send_request(url: str, payload: Dict[str, Any]) -> Dict[str, Any]: + async with httpx.AsyncClient(timeout=httpx.Timeout(60.0)) as client: + response = await client.post(url, json=payload) + response.raise_for_status() + return response.json() + + +def build_payload(args: argparse.Namespace) -> Dict[str, Any]: + extra_params = None + if args.extra: + try: + extra_params = json.loads(args.extra) + except json.JSONDecodeError as exc: + raise SystemExit(f"Invalid JSON passed to --extra: {exc}") from exc + + payload: Dict[str, Any] = { + "provider": "deepseek", + "model": args.model, + "messages": [ + {"role": "system", "content": args.system}, + {"role": "user", "content": args.prompt}, + ], + "temperature": args.temperature, + "max_tokens": args.max_tokens, + "stream": args.stream, + } + + if extra_params: + payload["extra_params"] = extra_params + + return payload + + +async def main() -> None: + args = parse_args() + payload = build_payload(args) + try: + result = await send_request(args.url, payload) + except httpx.HTTPStatusError as exc: + detail = exc.response.text + raise SystemExit(f"Gateway returned {exc.response.status_code}: {detail}") from exc + except httpx.HTTPError as exc: + raise SystemExit(f"HTTP error calling gateway: {exc}") from exc + + print(json.dumps(result, ensure_ascii=False, indent=2)) + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/todo.md b/todo.md new file mode 100644 index 0000000..015fbef --- /dev/null +++ b/todo.md @@ -0,0 +1,19 @@ +##基础选型: +Python + Great Expectations +##设计理念: +1. 服务化 (Service-Oriented): 将 GE 的能力封装成一个独立的微服务,通过 RESTful API 对外提供数据分析质量的定义、校验、报告。 +2. 配置驱动 (Configuration-Driven): 所有的期望(Expectations)、数据源连接、校验点(Checkpoints)都是可配置的,期望有默认版本和自定义版本。 +3. 聚焦验证 (Validation):通过GE发现验证问题,解决问题留给后续的数据清洗和修改 +4. 异步(Asynchronous): 应对多任务同时分析,不阻塞流程 +5. 增量分析(Incremental- Analysis ):数据会多次分析和修改才能使用 + +##架构设计: +使用 FastAPI 构建 RESTful API 服务,具备高性能和自带 OpenAPI (Swagger UI) 文档,异步支持度高。 +1. 分析流程管理 +解析 API 请求,管理分析任务的生命周期,支持异步,接受请求-调度服务-存储报告-触发通知。 +2. GE封装 +以编程配置方式管理数据源(Datasources)、期望套件(Expectation Suites)和校验点(Checkpoints),执行数据分析(Profiling)和数据校验(Validation)。 +3. 期望仓库和结果存储 +使用 Git 仓库(mysql?,期望是json)来存储期望仓库,对数据质量规则进行版本控制、审计和协作,将每次的校验结果结构化后存入数据库,便于后续进行数据质量趋势分析、历史追溯和仪表盘展示。 +4. 提供llm api gateway服务 +llm api 调用,多供应商统一网关(OpenAI / Anthropic / Openrouter / Gemini / Qwen / DeepSeek 一键切换) \ No newline at end of file