diff --git a/trustgraph-flow/trustgraph/metering/counter.py b/trustgraph-flow/trustgraph/metering/counter.py index cb57d8af..35449151 100644 --- a/trustgraph-flow/trustgraph/metering/counter.py +++ b/trustgraph-flow/trustgraph/metering/counter.py @@ -4,10 +4,14 @@ Simple token counter for each LLM response. from prometheus_client import Counter import json +import logging from .. schema import TextCompletionResponse, Error from .. base import FlowProcessor, ConsumerSpec +# Module logger +logger = logging.getLogger(__name__) + default_ident = "metering" class Processor(FlowProcessor): @@ -59,10 +63,10 @@ class Processor(FlowProcessor): # Load token costs from the config service async def on_cost_config(self, config, version): - print("Loading configuration version", version) + logger.info(f"Loading metering configuration version {version}") if self.config_key not in config: - print(f"No key {self.config_key} in config", flush=True) + logger.warning(f"No key {self.config_key} in config") return config = config[self.config_key] @@ -102,9 +106,9 @@ class Processor(FlowProcessor): __class__.input_cost_metric.inc(cost_in) __class__.output_cost_metric.inc(cost_out) - print(f"Input Tokens: {num_in}", flush=True) - print(f"Output Tokens: {num_out}", flush=True) - print(f"Cost for call: ${cost_per_call}", flush=True) + logger.info(f"Input Tokens: {num_in}") + logger.info(f"Output Tokens: {num_out}") + logger.info(f"Cost for call: ${cost_per_call}") @staticmethod def add_args(parser): diff --git a/trustgraph-flow/trustgraph/model/text_completion/openai/llm.py b/trustgraph-flow/trustgraph/model/text_completion/openai/llm.py index 88872e8d..8aa8c6b9 100755 --- a/trustgraph-flow/trustgraph/model/text_completion/openai/llm.py +++ b/trustgraph-flow/trustgraph/model/text_completion/openai/llm.py @@ -6,10 +6,14 @@ Input is prompt, output is response. from openai import OpenAI, RateLimitError import os +import logging from .... exceptions import TooManyRequests from .... base import LlmService, LlmResult +# Module logger +logger = logging.getLogger(__name__) + default_ident = "text-completion" default_model = 'gpt-3.5-turbo' @@ -52,7 +56,7 @@ class Processor(LlmService): else: self.openai = OpenAI(api_key=api_key) - print("Initialised", flush=True) + logger.info("OpenAI LLM service initialized") async def generate_content(self, system, prompt): @@ -85,9 +89,9 @@ class Processor(LlmService): inputtokens = resp.usage.prompt_tokens outputtokens = resp.usage.completion_tokens - print(resp.choices[0].message.content, flush=True) - print(f"Input Tokens: {inputtokens}", flush=True) - print(f"Output Tokens: {outputtokens}", flush=True) + logger.debug(f"LLM response: {resp.choices[0].message.content}") + logger.info(f"Input Tokens: {inputtokens}") + logger.info(f"Output Tokens: {outputtokens}") resp = LlmResult( text = resp.choices[0].message.content, @@ -109,7 +113,7 @@ class Processor(LlmService): # Apart from rate limits, treat all exceptions as unrecoverable - print(f"Exception: {type(e)} {e}") + logger.error(f"OpenAI LLM exception ({type(e).__name__}): {e}", exc_info=True) raise e @staticmethod diff --git a/trustgraph-flow/trustgraph/prompt/template/service.py b/trustgraph-flow/trustgraph/prompt/template/service.py index 757ad04d..8ba49e3b 100755 --- a/trustgraph-flow/trustgraph/prompt/template/service.py +++ b/trustgraph-flow/trustgraph/prompt/template/service.py @@ -6,6 +6,7 @@ Language service abstracts prompt engineering from LLM. import asyncio import json import re +import logging from ...schema import Definition, Relationship, Triple from ...schema import Topic @@ -17,6 +18,9 @@ from ...base import ProducerSpec, ConsumerSpec, TextCompletionClientSpec from ...template import PromptManager +# Module logger +logger = logging.getLogger(__name__) + default_ident = "prompt" default_concurrency = 1 @@ -68,10 +72,10 @@ class Processor(FlowProcessor): async def on_prompt_config(self, config, version): - print("Loading configuration version", version) + logger.info(f"Loading prompt configuration version {version}") if self.config_key not in config: - print(f"No key {self.config_key} in config", flush=True) + logger.warning(f"No key {self.config_key} in config") return config = config[self.config_key] @@ -80,12 +84,12 @@ class Processor(FlowProcessor): self.manager.load_config(config) - print("Prompt configuration reloaded.", flush=True) + logger.info("Prompt configuration reloaded") except Exception as e: - print("Exception:", e, flush=True) - print("Configuration reload failed", flush=True) + logger.error(f"Prompt configuration exception: {e}", exc_info=True) + logger.error("Configuration reload failed") async def on_request(self, msg, consumer, flow): @@ -99,19 +103,19 @@ class Processor(FlowProcessor): try: - print(v.terms, flush=True) + logger.debug(f"Prompt terms: {v.terms}") input = { k: json.loads(v) for k, v in v.terms.items() } - print(f"Handling kind {kind}...", flush=True) + logger.debug(f"Handling prompt kind {kind}...") async def llm(system, prompt): - print(system, flush=True) - print(prompt, flush=True) + logger.debug(f"System prompt: {system}") + logger.debug(f"User prompt: {prompt}") resp = await flow("text-completion-request").text_completion( system = system, prompt = prompt, @@ -120,20 +124,20 @@ class Processor(FlowProcessor): try: return resp except Exception as e: - print("LLM Exception:", e, flush=True) + logger.error(f"LLM Exception: {e}", exc_info=True) return None try: resp = await self.manager.invoke(kind, input, llm) except Exception as e: - print("Invocation exception:", e, flush=True) + logger.error(f"Prompt invocation exception: {e}", exc_info=True) raise e - print(resp, flush=True) + logger.debug(f"Prompt response: {resp}") if isinstance(resp, str): - print("Send text response...", flush=True) + logger.debug("Sending text response...") r = PromptResponse( text=resp, @@ -147,8 +151,8 @@ class Processor(FlowProcessor): else: - print("Send object response...", flush=True) - print(json.dumps(resp, indent=4), flush=True) + logger.debug("Sending object response...") + logger.debug(f"Response object: {json.dumps(resp, indent=4)}") r = PromptResponse( text=None, @@ -162,9 +166,9 @@ class Processor(FlowProcessor): except Exception as e: - print(f"Exception: {e}", flush=True) + logger.error(f"Prompt service exception: {e}", exc_info=True) - print("Send error response...", flush=True) + logger.debug("Sending error response...") r = PromptResponse( error=Error( @@ -178,9 +182,9 @@ class Processor(FlowProcessor): except Exception as e: - print(f"Exception: {e}", flush=True) + logger.error(f"Prompt service exception: {e}", exc_info=True) - print("Send error response...", flush=True) + logger.debug("Sending error response...") r = PromptResponse( error=Error(